From 1a308a406938191e34e7664b311092697438ed4d Mon Sep 17 00:00:00 2001 From: Behzad Alizadeh Date: Wed, 20 Aug 2025 11:07:36 +0330 Subject: [PATCH] Add project files. --- .dockerignore | 25 + .github/dependabot.yml | 11 + .github/workflows/packages.yml | 240 + .gitignore | 168 + Directory.Build.props | 32 + Directory.Packages.props | 62 + Elsa.Studio-Core.sln | 287 + Elsa.Studio-Core.sln.DotSettings | 12 + Elsa.Studio.sln | 264 + Elsa.Studio.sln.DotSettings | 13 + LICENSE | 21 + NuGet.Config | 10 + NuGet.rar | Bin 0 -> 380 bytes README.md | 54 + artwork/screenshot-1.png | Bin 0 -> 236077 bytes icon.png | Bin 0 -> 5249 bytes samples/BlazorApp1/BlazorApp1.csproj | 11 + samples/BlazorApp1/Components/App.razor | 33 + .../Components/Layout/MainLayout.razor | 15 + .../Components/Layout/MainLayout.razor.css | 96 + .../BlazorApp1/Components/Pages/Counter.razor | 20 + .../BlazorApp1/Components/Pages/Error.razor | 36 + .../BlazorApp1/Components/Pages/Weather.razor | 67 + .../Pages/WorkflowDefinitionEditor.razor | 28 + .../Pages/WorkflowDefinitions.razor | 12 + .../Pages/WorkflowInstanceViewer.razor | 12 + .../Components/Pages/WorkflowInstances.razor | 15 + samples/BlazorApp1/Components/Routes.razor | 6 + samples/BlazorApp1/Components/_Imports.razor | 12 + samples/BlazorApp1/Program.cs | 58 + .../BlazorApp1/Properties/launchSettings.json | 38 + .../BlazorApp1/appsettings.Development.json | 8 + samples/BlazorApp1/appsettings.json | 9 + samples/BlazorApp1/wwwroot/favicon.png | Bin 0 -> 1148 bytes .../workflow-definition-editor-app/.gitignore | 23 + .../workflow-definition-editor-app/.npmrc | 1 + .../workflow-definition-editor-app/README.md | 70 + .../package-lock.json | 29962 ++++++++++++++++ .../package.json | 42 + .../workflow-definition-editor-app/src/App.js | 12 + .../src/App.test.js | 8 + .../components/WorkflowDefinitionEditor.js | 30 + .../src/index.css | 13 + .../src/index.js | 17 + .../src/logo.svg | 1 + .../src/reportWebVitals.js | 13 + .../src/setupTests.js | 5 + src/Directory.Build.props | 14 + src/bundles/Elsa.Studio/Elsa.Studio.csproj | 14 + src/bundles/Elsa.Studio/FodyWeavers.xml | 3 + src/bundles/Elsa.Studio/FodyWeavers.xsd | 30 + src/bundles/Elsa.Studio/Readme.md | 8 + .../Elsa.Studio.Core.BlazorServer.csproj | 18 + .../Extensions/ServiceCollectionExtensions.cs | 23 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../RunStartupTasksHostedService.cs | 37 + .../Elsa.Studio.Core.BlazorWasm.csproj | 17 + .../Extensions/ServiceCollectionExtensions.cs | 21 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../Abstractions/FeatureBase.cs | 12 + .../Abstractions/FieldExtensionHandlerBase.cs | 54 + .../Attributes/RemoteFeatureAttribute.cs | 18 + .../Contracts/IActivityTab.cs | 15 + .../Contracts/IAppBarService.cs | 22 + .../Contracts/IBackendApiClientProvider.cs | 19 + .../Contracts/IBlazorServiceAccessor.cs | 10 + .../Contracts/IClientInformationProvider.cs | 14 + .../Contracts/IExpressionProvider.cs | 14 + .../Contracts/IExpressionService.cs | 19 + .../Elsa.Studio.Core/Contracts/IFeature.cs | 13 + .../Contracts/IFeatureService.cs | 22 + .../Elsa.Studio.Core/Contracts/IMediator.cs | 30 + .../Contracts/IMenuGroupProvider.cs | 16 + .../Contracts/IMenuProvider.cs | 10 + .../Contracts/IMenuService.cs | 23 + .../Contracts/INotification.cs | 5 + .../Contracts/INotificationHandler.cs | 22 + .../Contracts/IRemoteBackendAccessor.cs | 14 + .../Contracts/IRemoteFeatureProvider.cs | 22 + .../Contracts/IServerInformationProvider.cs | 14 + .../Contracts/IStartupTask.cs | 13 + .../Contracts/IStartupTaskRunner.cs | 12 + .../Contracts/IThemeService.cs | 36 + .../Contracts/IUIFieldExtensionHandler.cs | 52 + .../Contracts/IUIFieldExtensionService.cs | 17 + .../Contracts/IUIHintHandler.cs | 25 + .../Contracts/IUIHintService.cs | 7 + .../IUnauthorizedComponentProvider.cs | 14 + .../Elsa.Studio.Core/Contracts/IWidget.cs | 25 + .../Contracts/IWidgetRegistry.cs | 17 + .../Elsa.Studio.Core/Elsa.Studio.Core.csproj | 36 + .../Elsa.Studio.Core/ElsaStudioIcons.cs | 41 + .../Enums/FieldExtensionPosition.cs | 17 + .../Extensions/MediatorExtensions.cs | 39 + .../Extensions/ObjectExtension.cs | 33 + .../Extensions/RateLimitedFuncExtensions.cs | 31 + .../Extensions/RenderTreeBuilderExtensions.cs | 28 + .../Extensions/ServiceCollectionExtensions.cs | 90 + .../Elsa.Studio.Core/FodyWeavers.xml | 3 + .../Elsa.Studio.Core/FodyWeavers.xsd | 30 + .../DefaultLocalizationProvider.cs | 9 + .../Localization/DefaultLocalizer.cs | 58 + .../Localization/ILocalizationProvider.cs | 6 + .../Localization/ILocalizer.cs | 22 + .../Elsa.Studio.Core/MenuItemGroups.cs | 9 + .../Models/BackendApiConfig.cs | 10 + .../Models/ClientInformation.cs | 7 + .../Models/DisplayInputEditorContext.cs | 198 + .../Elsa.Studio.Core/Models/MenuItem.cs | 44 + .../Elsa.Studio.Core/Models/MenuItemGroup.cs | 4 + .../Elsa.Studio.Core/Models/RemoteBackend.cs | 21 + .../Elsa.Studio.Core/Models/Result.cs | 90 + .../Models/ServerInformation.cs | 7 + .../Options/BackendOptions.cs | 12 + .../AssemblyClientInformationProvider.cs | 26 + .../Services/BlazorScopedProxyApi.cs | 34 + .../Services/BlazorServiceAccessor.cs | 35 + .../Services/DefaultAppBarService.cs | 20 + .../DefaultBackendApiClientProvider.cs | 24 + .../Services/DefaultFeatureService.cs | 59 + .../Services/DefaultMediator.cs | 53 + .../Services/DefaultMenuGroupProvider.cs | 18 + .../Services/DefaultMenuService.cs | 48 + .../Services/DefaultRemoteBackendAccessor.cs | 25 + .../Services/DefaultStartupTaskRunner.cs | 25 + .../Services/DefaultSyntaxService.cs | 38 + .../Services/DefaultThemeService.cs | 70 + .../DefaultUIFieldExtensionService.cs | 27 + .../Services/DefaultUIHintService.cs | 35 + .../Services/DefaultWidgetRegistry.cs | 29 + .../EmptyServerInformationProvider.cs | 16 + .../Services/RemoteExpressionProvider.cs | 29 + .../Services/RemoteFeatureProvider.cs | 37 + .../StaticClientInformationProvider.cs | 17 + .../Services/UnsupportedUIHintHandler.cs | 31 + src/framework/Elsa.Studio.Core/TokenNames.cs | 8 + src/framework/Elsa.Studio.Core/ToolVersion.cs | 18 + .../ClientLib/package.json | 19 + .../ClientLib/src/clipboard.ts | 1 + .../ClientLib/src/clipboard/copy-text.ts | 7 + .../ClientLib/src/clipboard/index.ts | 1 + .../ClientLib/src/dom.ts | 1 + .../src/dom/element/click-element.ts | 7 + .../dom/element/get-bounding-client-rect.ts | 6 + .../ClientLib/src/dom/element/get-element.ts | 3 + .../src/dom/element/get-visible-height.ts | 18 + .../ClientLib/src/dom/element/index.ts | 5 + .../ClientLib/src/dom/index.ts | 1 + .../ClientLib/src/files.ts | 1 + .../src/files/download-file-from-stream.ts | 11 + .../ClientLib/src/files/index.ts | 1 + .../ClientLib/tsconfig.json | 15 + .../ClientLib/webpack.config.js | 45 + .../Contracts/IClipboard.cs | 9 + .../Contracts/IDomAccessor.cs | 13 + .../Contracts/IFiles.cs | 14 + .../Elsa.Studio.DomInterop.csproj | 28 + .../Extensions/ServiceCollectionExtensions.cs | 30 + .../Elsa.Studio.DomInterop/FodyWeavers.xml | 3 + .../Elsa.Studio.DomInterop/FodyWeavers.xsd | 30 + .../Interop/ClipboardJsInterop.cs | 17 + .../Interop/DomJsInterop.cs | 17 + .../Interop/FilesJsInterop.cs | 25 + .../Interop/JsInteropBase.cs | 49 + .../Elsa.Studio.DomInterop/Models/DomRect.cs | 13 + .../Models/ElementRef.cs | 12 + .../Elsa.Studio.DomInterop/Models/Union.cs | 33 + .../Branding/DefaultBrandingProvider.cs | 33 + .../Branding/IBrandingProvider.cs | 29 + .../Components/ClientPackageVersion.razor | 16 + .../Components/DataPanel.razor | 88 + .../Components/DefaultBranding.razor | 13 + .../Components/ExpressionEditor.razor | 56 + .../Components/ExpressionEditor.razor.cs | 231 + .../Components/ExpressionInput.razor | 54 + .../Components/ExpressionInput.razor.cs | 244 + .../Components/FieldExtension.razor | 79 + .../Components/NavMenu.razor | 33 + .../Components/NavMenuItem.razor | 20 + .../Components/PageHeading.razor | 5 + .../Components/ProductInfoDialog.razor | 17 + .../Components/ScrollableWell.razor | 20 + .../Components/ServerPackageVersion.razor | 16 + .../Components/StudioComponentBase.cs | 8 + .../Components/Unauthorized.razor | 1 + .../Components/VerticalWell.razor | 16 + .../Elsa.Studio.Shared/Components/Well.razor | 11 + .../Elsa.Studio.Shared/Components/Zone.razor | 4 + .../Components/Zone.razor.cs | 45 + .../JsonPrimitiveToStringConverter.cs | 43 + .../Converters/JsonStringToIntConverter.cs | 35 + .../Elsa.Studio.Shared.csproj | 23 + .../Elsa.Studio.Shared.csproj.DotSettings | 3 + .../Extensions/ClaimsExtensions.cs | 20 + .../Extensions/ServiceCollectionExtensions.cs | 33 + .../Elsa.Studio.Shared/FodyWeavers.xml | 3 + .../Elsa.Studio.Shared/FodyWeavers.xsd | 30 + .../Layouts/BasicLayout.razor | 30 + .../Layouts/MainLayout.razor | 61 + .../Layouts/MainLayout.razor.cs | 94 + .../Time/Components/Timestamp.razor | 1 + .../Time/Components/Timestamp.razor.cs | 28 + .../Time/Contracts/ITimeFormatter.cs | 15 + .../Time/Contracts/ITimeZoneProvider.cs | 12 + .../Implementations/DefaultTimeFormatter.cs | 20 + .../Time/Providers/LocalTimeZoneProvider.cs | 14 + .../Time/Providers/UtcTimeZoneProvider.cs | 13 + .../Models/DataPanelItem.cs | 3 + .../Models/DataPanelModel.cs | 19 + .../Monaco/Contracts/IMonacoHandler.cs | 14 + .../Handlers/JavaScriptMonacoHandler.cs | 33 + .../Monaco/Models/MonacoContext.cs | 9 + .../Services/TypeDefinitionService.cs | 20 + .../WellKnownSyntaxNames.cs | 7 + .../Elsa.Studio.Shared/_Imports.razor | 6 + src/framework/Elsa.Studio.Shell/App.razor | 32 + src/framework/Elsa.Studio.Shell/App.razor.cs | 27 + .../DefaultUnauthorizedComponentProvider.cs | 23 + .../Elsa.Studio.Shell.csproj | 17 + .../Extensions/ServiceCollectionExtensions.cs | 41 + .../Elsa.Studio.Shell/FodyWeavers.xml | 3 + .../Elsa.Studio.Shell/FodyWeavers.xsd | 30 + .../Elsa.Studio.Shell/Options/ShellOptions.cs | 12 + .../Elsa.Studio.Shell/_Imports.razor | 9 + .../Elsa.Studio.Translations.csproj | 26 + .../ResxLocalizationProvider.cs | 13 + .../ServiceCollectionExtensions.cs | 13 + .../Translations.ar.resx | 109 + .../Translations.de.resx | 313 + .../Translations.es.resx | 454 + .../Translations.fa.resx | 442 + .../Translations.fr.resx | 544 + .../Translations.nl.resx | 991 + .../Translations.pt.resx | 304 + .../Translations.resx | 1632 + .../Translations.ru.resx | 991 + .../Translations.uk.resx | 1573 + .../Translations.zh-Hans.resx | 1558 + .../Translations.zh-Hant.resx | 127 + .../Components/BackendComponentBase.cs | 34 + .../Components/BackendProvider.razor | 1 + .../Components/ThemedComponentWrapper.razor | 18 + .../WorkflowDefinitionEditorWrapper.razor | 54 + .../WorkflowDefinitionListWrapper.razor | 13 + .../WorkflowInstanceListWrapper.razor | 14 + .../WorkflowInstanceViewerWrapper.razor | 20 + .../Elsa.Studio.Host.CustomElements.csproj | 32 + .../ApiKeyHttpMessageHandler.cs | 38 + .../Program.cs | 69 + .../Properties/launchSettings.json | 37 + .../Services/BackendService.cs | 65 + .../ComponentRemoteBackendAccessor.cs | 25 + .../_Imports.razor | 9 + .../appsettings.Development.json | 8 + .../appsettings.json | 12 + .../npm/package.json | 22 + .../wwwroot/appsettings.json | 11 + .../wwwroot/index.html | 43 + .../Elsa.Studio.Host.HostedWasm.csproj | 11 + .../WasmAssetsRewritingMiddleware.cs | 63 + .../Pages/_Host.cshtml | 79 + .../Elsa.Studio.Host.HostedWasm/Program.cs | 43 + .../Properties/launchSettings.json | 14 + .../appsettings.Development.json | 8 + .../appsettings.json | 12 + src/hosts/Elsa.Studio.Host.Server/Dockerfile | 20 + .../Elsa.Studio.Host.Server.csproj | 27 + .../Pages/_Host.cshtml | 56 + src/hosts/Elsa.Studio.Host.Server/Program.cs | 122 + .../Properties/launchSettings.json | 35 + .../StudioBrandingProvider.cs | 10 + .../Elsa.Studio.Host.Server/_Imports.razor | 5 + .../appsettings.Development.json | 9 + .../Elsa.Studio.Host.Server/appsettings.json | 22 + src/hosts/Elsa.Studio.Host.Wasm/Dockerfile | 20 + .../Elsa.Studio.Host.Wasm.csproj | 30 + src/hosts/Elsa.Studio.Host.Wasm/Program.cs | 63 + .../Properties/launchSettings.json | 38 + .../Elsa.Studio.Host.Wasm/_Imports.razor | 6 + .../wwwroot/appsettings.json | 11 + .../Elsa.Studio.Host.Wasm/wwwroot/index.html | 47 + .../Elsa.Studio.ActivityPortProviders.csproj | 13 + .../Extensions/ServiceCollectionExtensions.cs | 26 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../Providers/DynamicOutcomesPortProvider.cs | 96 + .../Providers/FlowHttpRequestPortProvider.cs | 97 + .../Providers/FlowSwitchPortProvider.cs | 51 + .../Providers/HttpEndpointPortProvider.cs | 52 + .../Providers/SendHttpRequestPortProvider.cs | 110 + .../Providers/SwitchPortProvider.cs | 103 + .../Elsa.Studio.Counter.csproj | 16 + .../Extensions/ServiceCollectionExtensions.cs | 17 + .../Elsa.Studio.Counter/FodyWeavers.xml | 3 + .../Elsa.Studio.Counter/FodyWeavers.xsd | 30 + .../Elsa.Studio.Counter/Menu/CounterMenu.cs | 37 + src/modules/Elsa.Studio.Counter/Module.cs | 8 + .../Elsa.Studio.Counter/Pages/Counter.razor | 19 + .../Elsa.Studio.Counter/_Imports.razor | 7 + .../Elsa.Studio.Dashboard.csproj | 17 + .../Extensions/ServiceCollectionExtensions.cs | 15 + src/modules/Elsa.Studio.Dashboard/Feature.cs | 8 + .../Elsa.Studio.Dashboard/FodyWeavers.xml | 3 + .../Elsa.Studio.Dashboard/FodyWeavers.xsd | 30 + .../Menu/DashboardMenu.cs | 32 + .../Elsa.Studio.Dashboard/Pages/Index.razor | 13 + .../Elsa.Studio.Dashboard/_Imports.razor | 6 + .../Components/EnvironmentPicker.razor | 49 + .../Contracts/IEnvironmentService.cs | 42 + .../Contracts/IEnvironmentsClient.cs | 20 + .../Elsa.Studio.Environments.csproj | 22 + .../Extensions/ServiceCollectionExtensions.cs | 25 + .../Elsa.Studio.Environments/FodyWeavers.xml | 3 + .../Elsa.Studio.Environments/FodyWeavers.xsd | 30 + .../Models/ServerEnvironment.cs | 22 + .../Elsa.Studio.Environments/Module.cs | 15 + .../Services/DefaultEnvironmentService.cs | 38 + .../EnvironmentBackendApiClientProvider.cs | 38 + .../Tasks/LoadEnvironmentsStartupTask.cs | 13 + .../Elsa.Studio.Environments/_Imports.razor | 4 + .../Controllers/CultureController.cs | 27 + ...sa.Studio.Localization.BlazorServer.csproj | 15 + .../Extensions/ServiceCollectionExtensions.cs | 19 + .../Extensions/WebApplicationExtensions.cs | 28 + .../Services/BlazorServerCultureService.cs | 31 + ...Elsa.Studio.Localization.BlazorWasm.csproj | 19 + .../Extensions/ServiceCollectionExtensions.cs | 20 + .../Extensions/WebAssemblyHostExtensions.cs | 35 + .../Services/BlazorWasmCultureService.cs | 25 + .../Components/LanguagePicker.razor | 32 + .../Elsa.Studio.Localization.csproj | 21 + .../Extensions/ServiceCollectionExtensions.cs | 19 + .../Elsa.Studio.Localization/FodyWeavers.xml | 3 + .../Elsa.Studio.Localization/FodyWeavers.xsd | 30 + .../LocalizationFeature.cs | 14 + .../Models/LocalizationConfig.cs | 8 + .../Options/LocalizationOptions.cs | 26 + .../Elsa.Studio.Localization/README.md | 71 + .../Services/ICultureService.cs | 14 + .../Elsa.Studio.Localization/_Imports.razor | 9 + .../Elsa.Studio.Login.BlazorServer.csproj | 17 + .../Extensions/ServiceCollectionExtensions.cs | 34 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../Services/BlazorServerJwtAccessor.cs | 40 + .../Services/BlazorServerJwtParser.cs | 17 + .../Elsa.Studio.Login.BlazorWasm.csproj | 12 + .../Extensions/ServiceCollectionExtensions.cs | 31 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../Services/BlazorWasmJwtAccessor.cs | 31 + .../Services/BlazorWasmJwtParser.cs | 43 + ...ectToLoginUnauthorizedComponentProvider.cs | 16 + .../Components/LoginState.razor | 42 + .../Components/ReceiveAuthorizationCode.cs | 30 + .../Components/RedirectToLogin.cs | 21 + .../Contracts/IAuthorizationService.cs | 17 + .../Contracts/ICredentialsValidator.cs | 18 + .../Contracts/IEndSessionService.cs | 12 + .../Contracts/IJwtAccessor.cs | 17 + .../Elsa.Studio.Login/Contracts/IJwtParser.cs | 14 + .../Contracts/IRefreshTokenService.cs | 14 + .../Elsa.Studio.Login.csproj | 26 + .../Extensions/ServiceCollectionExtensions.cs | 80 + src/modules/Elsa.Studio.Login/FodyWeavers.xml | 3 + src/modules/Elsa.Studio.Login/FodyWeavers.xsd | 30 + .../AuthenticatingApiHttpMessageHandler.cs | 36 + src/modules/Elsa.Studio.Login/LoginFeature.cs | 16 + .../Models/IdentityTokenOptions.cs | 20 + .../OAuth2CredentialsValidatorOptions.cs | 29 + .../Models/OpenIdConnectConfiguration.cs | 32 + .../Elsa.Studio.Login/Models/TokenResponse.cs | 11 + .../Models/ValidateCredentialsResult.cs | 3 + .../Elsa.Studio.Login/Pages/Login/Login.razor | 35 + .../Pages/Login/Login.razor.cs | 77 + .../Pages/Login/Login.razor.css | 8 + .../Pages/Login/Models/LoginModel.cs | 8 + .../AccessTokenAuthenticationStateProvider.cs | 45 + .../ElsaIdentityAuthorizationService.cs | 30 + .../ElsaIdentityCredentialsValidator.cs | 33 + .../Services/ElsaIdentityEndSessionService.cs | 16 + .../ElsaIdentityRefreshTokenService.cs | 40 + .../Services/OAuth2CredentialsValidator.cs | 24 + .../Services/OAuth2HttpClient.cs | 45 + .../OpenIdConnectAuthorizationService.cs | 61 + .../OpenIdConnectEndSessionService.cs | 31 + .../OpenIdConnectRefreshTokenService.cs | 47 + src/modules/Elsa.Studio.Login/_Imports.razor | 7 + .../Elsa.Studio.Secrets/Client/ISecretsApi.cs | 47 + .../Elsa.Studio.Secrets.csproj | 21 + .../Elsa.Studio.Secrets.csproj.DotSettings | 2 + .../Extensions/ServiceCollectionExtensions.cs | 25 + .../Extensions/TimeSpanExtensions.cs | 30 + .../Elsa.Studio.Secrets/FodyWeavers.xml | 3 + .../Elsa.Studio.Secrets/FodyWeavers.xsd | 30 + .../Elsa.Studio.Secrets/Menu/SecretsMenu.cs | 29 + src/modules/Elsa.Studio.Secrets/Module.cs | 8 + .../UI/Components/CreateSecretDialog.razor | 34 + .../UI/Components/CreateSecretDialog.razor.cs | 54 + .../Elsa.Studio.Secrets/UI/Pages/Secret.razor | 68 + .../UI/Pages/Secret.razor.cs | 51 + .../UI/Pages/Secrets.razor | 90 + .../UI/Pages/Secrets.razor.cs | 126 + .../Validators/SecretInputModelValidator.cs | 32 + .../Elsa.Studio.Secrets/_Imports.razor | 12 + .../Elsa.Studio.Security.csproj | 16 + .../Extensions/ServiceCollectionExtensions.cs | 15 + .../Elsa.Studio.Security/FodyWeavers.xml | 3 + .../Elsa.Studio.Security/FodyWeavers.xsd | 30 + .../Elsa.Studio.Security/Menu/SecurityMenu.cs | 39 + src/modules/Elsa.Studio.Security/Module.cs | 8 + .../Elsa.Studio.Security/Pages/Roles.razor | 8 + .../Elsa.Studio.Security/Pages/Users.razor | 8 + .../Elsa.Studio.Security/_Imports.razor | 7 + .../Components/Cases.razor | 62 + .../Components/Cases.razor.cs | 210 + .../Components/CheckList.razor | 19 + .../Components/CheckList.razor.cs | 70 + .../Components/Checkbox.razor | 50 + .../Elsa.Studio.UIHints/Components/Code.razor | 21 + .../Components/Code.razor.cs | 130 + .../Components/DateTimePicker.razor | 111 + .../Components/Dropdown.razor | 30 + .../Components/Dropdown.razor.cs | 37 + .../Components/DynamicOutcomes.razor | 30 + .../Components/DynamicOutcomes.razor.cs | 63 + .../Components/ExpressionEditor.razor | 10 + .../Components/HttpStatusCodes.razor | 33 + .../Components/HttpStatusCodes.razor.cs | 54 + .../Elsa.Studio.UIHints/Components/Json.razor | 21 + .../Components/Json.razor.cs | 92 + .../Components/MultiLine.razor | 40 + .../Components/MultiText.razor | 32 + .../Components/MultiText.razor.cs | 63 + .../Components/OutcomePicker.razor | 29 + .../Components/OutcomePicker.razor.cs | 38 + .../Components/OutputPicker.razor | 28 + .../Components/OutputPicker.razor.cs | 41 + .../Components/RadioList.razor | 21 + .../Components/RadioList.razor.cs | 46 + .../Components/SingleLine.razor | 72 + .../Components/TypePicker.razor | 37 + .../Components/TypePicker.razor.cs | 40 + .../Components/VariablePicker.razor | 29 + .../Components/VariablePicker.razor.cs | 70 + .../Components/WorkflowDefinitionPicker.razor | 31 + .../WorkflowDefinitionPicker.razor.cs | 49 + .../Elsa.Studio.UIHints.csproj | 17 + .../InputDescriptorCheckListExtensions.cs | 31 + .../InputDescriptorCodeEditorExtensions.cs | 30 + .../InputDescriptorRadioListExtensions.cs | 31 + .../InputDescriptorSelectListExtensions.cs | 31 + .../InputDescriptorSingleLineExtensions.cs | 30 + .../Extensions/ServiceCollectionExtensions.cs | 39 + .../Extensions/StringExtensions.cs | 23 + .../Elsa.Studio.UIHints/FodyWeavers.xml | 3 + .../Elsa.Studio.UIHints/FodyWeavers.xsd | 30 + .../Handlers/CheckListHandler.cs | 29 + .../Handlers/CheckboxHandler.cs | 29 + .../Handlers/CodeEditorHandler.cs | 29 + .../Handlers/DateTimePickerHandler.cs | 23 + .../Handlers/DropDownHandler.cs | 29 + .../Handlers/DynamicOutcomesHandler.cs | 29 + .../Handlers/ExpressionEditorHandler.cs | 29 + .../Handlers/HttpStatusCodesHandler.cs | 29 + .../Handlers/JsonEditorHandler.cs | 29 + .../Handlers/MultiLineHandler.cs | 29 + .../Handlers/MultiTextHandler.cs | 29 + .../Handlers/OutcomePickerHandler.cs | 29 + .../Handlers/OutputPickerHandler.cs | 29 + .../Handlers/RadioListHandler.cs | 23 + .../Handlers/SingleLineHandler.cs | 29 + .../Handlers/SwitchEditorHandler.cs | 29 + .../Handlers/TypePickerHandler.cs | 29 + .../Handlers/VariablePickerHandler.cs | 29 + .../WorkflowDefinitionPickerHandler.cs | 29 + .../Elsa.Studio.UIHints/Helpers/JsonParser.cs | 34 + .../Elsa.Studio.UIHints/InputUIHints.cs | 28 + .../Elsa.Studio.UIHints/_Imports.razor | 5 + .../Elsa.Studio.Webhooks.csproj | 17 + .../Extensions/ServiceCollectionExtensions.cs | 15 + .../Elsa.Studio.Webhooks/FodyWeavers.xml | 3 + .../Elsa.Studio.Webhooks/FodyWeavers.xsd | 30 + .../Elsa.Studio.Webhooks/Menu/WebhooksMenu.cs | 26 + src/modules/Elsa.Studio.Webhooks/Module.cs | 8 + .../Elsa.Studio.Webhooks/Pages/Index.razor | 8 + .../Elsa.Studio.Webhooks/_Imports.razor | 7 + .../WorkflowContextActivityTab.cs | 28 + .../WorkflowContextActivityTabPanel.razor | 35 + .../WorkflowContextActivityTabPanel.razor.cs | 125 + .../WorkflowContextProviderPicker.razor | 24 + .../WorkflowContextProviderPicker.razor.cs | 52 + .../Components/WorkflowContextsEditor.razor | 13 + .../WorkflowContextsEditor.razor.cs | 55 + .../Contracts/IWorkflowContextsProvider.cs | 14 + .../Elsa.Studio.WorkflowContexts.csproj | 14 + .../Extensions/ActivityExtensions.cs | 20 + .../Extensions/ServiceCollectionExtensions.cs | 28 + .../WorkflowDefinitionExtensions.cs | 39 + .../Elsa.Studio.WorkflowContexts/Feature.cs | 28 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../WorkflowContextProviderPickerHandler.cs | 26 + .../Models/ActivityWorkflowContextSettings.cs | 20 + .../RemoteWorkflowContextsProvider.cs | 30 + .../Widgets/WorkflowContextsEditorWidget.cs | 27 + .../_Imports.razor | 15 + .../Domain/Contexts/PortProviderContext.cs | 11 + .../Contracts/CompatWorkflowJsonDetector.cs | 22 + .../Contracts/IActivityExecutionService.cs | 37 + .../Domain/Contracts/IActivityIdGenerator.cs | 12 + .../Contracts/IActivityNameGenerator.cs | 20 + .../Domain/Contracts/IActivityPortProvider.cs | 49 + .../Domain/Contracts/IActivityPortService.cs | 10 + .../Domain/Contracts/IActivityRegistry.cs | 45 + .../Contracts/IActivityRegistryProvider.cs | 14 + .../Domain/Contracts/IActivityResolver.cs | 29 + .../Domain/Contracts/IActivityVisitor.cs | 18 + .../Contracts/ICommitStrategiesProvider.cs | 19 + .../Contracts/IIncidentStrategiesProvider.cs | 14 + .../ILogPersistenceStrategyService.cs | 15 + .../Contracts/IResilienceStrategyCatalog.cs | 14 + .../Domain/Contracts/IStorageDriverService.cs | 16 + .../Domain/Contracts/IVariableTypeService.cs | 15 + .../IWorkflowActivationStrategyService.cs | 15 + .../IWorkflowDefinitionEditorService.cs | 34 + .../IWorkflowDefinitionHistoryService.cs | 21 + .../Contracts/IWorkflowDefinitionImporter.cs | 15 + .../Contracts/IWorkflowDefinitionService.cs | 120 + .../Contracts/IWorkflowInstanceService.cs | 22 + .../Domain/Contracts/IWorkflowJsonDetector.cs | 12 + .../Extensions/ActivityNodeExtensions.cs | 25 + .../Extensions/ActivityRegistryExtensions.cs | 16 + .../Extensions/ProblemDetailsExtensions.cs | 22 + .../ValidationApiExceptionExtensions.cs | 23 + .../Domain/Models/ActivityGraph.cs | 31 + .../Domain/Models/ActivityStats.cs | 37 + .../Domain/Models/EmbeddedActivity.cs | 10 + .../Domain/Models/ExecuteWorkflowResult.cs | 3 + .../Models/ExpressionDescriptorProvider.cs | 35 + .../Domain/Models/FileDownload.cs | 6 + .../Domain/Models/ImportOptions.cs | 11 + .../Domain/Models/ValidationError.cs | 13 + .../Domain/Models/ValidationErrors.cs | 6 + .../Models/WorkflowDefinitionVersion.cs | 21 + .../Domain/Models/WorkflowImportFailure.cs | 3 + .../Models/WorkflowImportFailureType.cs | 7 + .../Domain/Models/WorkflowImportResult.cs | 11 + .../ActivityRegistryRefreshed.cs | 10 + .../BulkWorkflowDefinitionReverted.cs | 5 + .../BulkWorkflowDefinitionReverting.cs | 5 + .../BulkWorkflowDefinitionVersionsDeleted.cs | 6 + .../BulkWorkflowDefinitionVersionsDeleting.cs | 6 + .../BulkWorkflowDefinitionsDeleted.cs | 5 + .../BulkWorkflowDefinitionsDeleting.cs | 5 + .../BulkWorkflowDefinitionsPublished.cs | 5 + .../BulkWorkflowDefinitionsPublishing.cs | 5 + .../BulkWorkflowDefinitionsRetracted.cs | 5 + .../BulkWorkflowDefinitionsRetracting.cs | 5 + .../Domain/Notifications/ImportedFile.cs | 8 + .../Domain/Notifications/ImportedJson.cs | 7 + .../ImportedWorkflowDefinition.cs | 6 + .../Domain/Notifications/ImportingFile.cs | 8 + .../Domain/Notifications/ImportingJson.cs | 8 + .../ImportingWorkflowDefinition.cs | 6 + .../WorkflowDefinitionDeleted.cs | 5 + .../WorkflowDefinitionDeleting.cs | 5 + .../WorkflowDefinitionExported.cs | 7 + .../WorkflowDefinitionExporting.cs | 6 + .../WorkflowDefinitionIdExported.cs | 7 + .../WorkflowDefinitionIdExporting.cs | 6 + .../WorkflowDefinitionIdPublishing.cs | 8 + .../WorkflowDefinitionIdRetracting.cs | 5 + .../WorkflowDefinitionIdRetractingFailed.cs | 6 + .../WorkflowDefinitionPublished.cs | 7 + .../WorkflowDefinitionPublishing.cs | 7 + .../WorkflowDefinitionPublishingFailed.cs | 10 + .../WorkflowDefinitionRetracted.cs | 6 + .../WorkflowDefinitionRetracting.cs | 6 + .../WorkflowDefinitionRetractingFailed.cs | 7 + .../WorkflowDefinitionReverted.cs | 6 + .../Notifications/WorkflowDefinitionSaved.cs | 7 + .../Notifications/WorkflowDefinitionSaving.cs | 7 + .../WorkflowDefinitionSavingFailed.cs | 10 + .../WorkflowDefinitionVersionDeleted.cs | 6 + .../WorkflowDefinitionVersionDeleting.cs | 6 + .../WorkflowDefinitionVersionReverted.cs | 6 + .../WorkflowDefinitionVersionReverting.cs | 6 + .../PortProviders/ActivityPortProviderBase.cs | 45 + .../DefaultActivityPortProvider.cs | 23 + .../DefaultActivityDisplaySettingsRegistry.cs | 53 + .../Services/DefaultActivityNameGenerator.cs | 38 + .../Services/DefaultActivityPortService.cs | 34 + .../Services/DefaultActivityRegistry.cs | 82 + .../Domain/Services/DefaultActivityVisitor.cs | 64 + .../Services/RandomLongIdentityGenerator.cs | 19 + .../RemoteActivityExecutionService.cs | 73 + .../RemoteActivityRegistryProvider.cs | 26 + .../RemoteCommitStrategiesProvider.cs | 41 + .../RemoteIncidentStrategiesProvider.cs | 21 + .../RemoteLogPersistenceStrategyService.cs | 24 + .../RemoteResilienceStrategyCatalog.cs | 19 + .../RemoteServerInformationProvider.cs | 31 + .../Services/RemoteStorageDriverService.cs | 31 + .../Services/RemoteVariableTypeService.cs | 30 + ...RemoteWorkflowActivationStrategyService.cs | 20 + .../Services/RemoteWorkflowInstanceService.cs | 130 + .../Services/SchemaWorkflowJsonDetector.cs | 27 + .../Services/ShortGuidActivityIdGenerator.cs | 13 + .../Services/SimpleWorkflowJsonDetector.cs | 33 + .../WorkflowDefinitionEditorService.cs | 140 + .../WorkflowDefinitionHistoryService.cs | 54 + .../Services/WorkflowDefinitionImporter.cs | 158 + .../Services/WorkflowDefinitionService.cs | 293 + .../Elsa.Studio.Workflows.Core.csproj | 22 + .../Extensions/ActivityExtensions.cs | 29 + .../Extensions/ActivityVisitorExtensions.cs | 62 + .../Extensions/ServiceCollectionExtensions.cs | 85 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../Resolvers/DefaultActivityResolver.cs | 33 + .../Args/ActivityEmbeddedPortSelectedArgs.cs | 10 + .../UI/Contexts/DisplayContext.cs | 26 + .../IActivityDisplaySettingsProvider.cs | 17 + .../IActivityDisplaySettingsRegistry.cs | 21 + .../UI/Contracts/IDiagramDesigner.cs | 50 + .../UI/Contracts/IDiagramDesignerProvider.cs | 13 + .../UI/Contracts/IDiagramDesignerService.cs | 14 + .../IDiagramDesignerToolboxProvider.cs | 11 + .../UI/Contracts/IWorkspace.cs | 17 + .../UI/Models/ActivityDisplaySettings.cs | 33 + .../UI/Models/DefaultActivityColors.cs | 20 + .../DefaultActivityDisplaySettingsProvider.cs | 86 + .../Services/DefaultDiagramDesignerService.cs | 28 + .../ClientLib/css/designer.v1.css | 26 + .../ClientLib/css/designer.v2.css | 101 + .../ClientLib/package.json | 32 + .../ClientLib/src/designer.ts | 7 + .../src/designer/api/add-activity-node.ts | 19 + .../ClientLib/src/designer/api/auto-layout.ts | 21 + .../designer/api/calculate-activity-size.ts | 47 + .../src/designer/api/center-content.ts | 10 + .../src/designer/api/create-graph.ts | 392 + .../src/designer/api/dispose-graph.ts | 5 + .../designer/api/dotnet-flowchart-designer.ts | 56 + .../src/designer/api/graph-bindings.ts | 18 + .../ClientLib/src/designer/api/index.ts | 19 + .../ClientLib/src/designer/api/load-graph.ts | 27 + .../ClientLib/src/designer/api/paste-cells.ts | 21 + .../raise-activity-embedded-port-selected.ts | 21 + .../designer/api/raise-activity-selected.ts | 21 + .../ClientLib/src/designer/api/read-graph.ts | 28 + .../src/designer/api/select-activity.ts | 34 + .../src/designer/api/set-grid-color.ts | 6 + .../src/designer/api/update-activity-size.ts | 49 + .../src/designer/api/update-activity-stats.ts | 31 + .../src/designer/api/update-activity.ts | 41 + .../ClientLib/src/designer/api/zoom-to-fit.ts | 10 + .../internal/create-activity-element.ts | 24 + .../ClientLib/src/designer/internal/init.ts | 80 + .../src/designer/models/activity-stats.ts | 6 + .../ClientLib/src/designer/models/activity.ts | 14 + .../src/designer/models/connection.ts | 6 + .../src/designer/models/container.ts | 5 + .../ClientLib/src/designer/models/index.ts | 6 + .../ClientLib/src/designer/models/metadata.ts | 12 + .../ClientLib/src/designer/models/size.ts | 4 + .../ClientLib/src/designer/models/x6.ts | 17 + .../ClientLib/tsconfig.json | 15 + .../ClientLib/webpack.config.js | 53 + .../ActivityWrappers/ActivityWrapperBase.cs | 102 + .../EmbeddedActivityWrapper.razor.cs | 52 + .../ActivityWrappers/V1/ActivityWrapper.razor | 70 + .../V1/ActivityWrapper.razor.cs | 19 + .../V1/EmbeddedActivityWrapper.razor | 25 + .../V1/EmbeddedActivityWrapper.razor.cs | 3 + .../ActivityWrappers/V2/ActivityWrapper.razor | 105 + .../V2/ActivityWrapper.razor.cs | 6 + .../V2/EmbeddedActivityWrapper.razor | 21 + .../V2/EmbeddedActivityWrapper.razor.cs | 3 + .../Components/FlowchartDesigner.razor | 9 + .../Components/FlowchartDesigner.razor.cs | 416 + .../Contracts/IActivityMapper.cs | 37 + .../Contracts/IFlowchartMapper.cs | 26 + .../Contracts/IMapperFactory.cs | 7 + .../Elsa.Studio.Workflows.Designer.csproj | 30 + .../ComponentConfigurationExtensions.cs | 21 + .../Extensions/ServiceCollectionExtensions.cs | 18 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 + .../Interop/DesignerJsInterop.cs | 70 + .../Interop/JsInteropBase.cs | 81 + .../Interop/X6GraphApi.cs | 150 + .../Models/X6ActivityNode.cs | 17 + .../Models/X6Attrs.cs | 6 + .../Models/X6Edge.cs | 9 + .../Models/X6Endpoint.cs | 7 + .../Models/X6Graph.cs | 20 + .../Models/X6Port.cs | 10 + .../Models/X6Ports.cs | 6 + .../Models/X6Position.cs | 20 + .../Models/X6Size.cs | 20 + .../Elsa.Studio.Workflows.Designer/Module.cs | 8 + .../Options/DesignerOptions.cs | 7 + .../Options/X6GraphSettings.cs | 9 + .../Options/X6Grid.cs | 9 + .../Options/X6GridArgs.cs | 7 + .../Options/X6Mousewheel.cs | 9 + .../Options/X6Panning.cs | 6 + .../Services/ActivityMapper.cs | 148 + .../Services/FlowchartMapper.cs | 102 + .../Services/MapperFactory.cs | 20 + .../Services/PendingActionsQueue.cs | 72 + .../_Imports.razor | 4 + .../Components/ActivityPicker.razor | 68 + .../Components/ActivityPicker.razor.cs | 72 + .../ActivityPropertiesPanel.razor | 134 + .../ActivityPropertiesPanel.razor.cs | 67 + .../Components/ActivityProperties/Models.cs | 5 + .../Tabs/CommitStrategyTab.razor | 21 + .../Tabs/CommitStrategyTab.razor.cs | 48 + .../ActivityProperties/Tabs/CommonTab.razor | 83 + .../Tabs/CommonTab.razor.cs | 67 + .../ActivityProperties/Tabs/InfoTab.razor | 5 + .../ActivityProperties/Tabs/InfoTab.razor.cs | 31 + .../ActivityProperties/Tabs/InputsTab.razor | 10 + .../Tabs/InputsTab.razor.cs | 228 + .../Tabs/LogPersistenceTab.razor | 123 + .../Tabs/LogPersistenceTab.razor.cs | 313 + .../Tabs/Outputs/Components/OutputsTab.razor | 51 + .../Outputs/Components/OutputsTab.razor.cs | 109 + .../Tabs/Outputs/Models/BindingKind.cs | 7 + .../Tabs/Outputs/Models/BindingTargetGroup.cs | 3 + .../Outputs/Models/BindingTargetOption.cs | 3 + .../Tabs/ResilienceTab.razor | 30 + .../Tabs/ResilienceTab.razor.cs | 130 + .../ActivityProperties/Tabs/TaskTab.razor | 22 + .../ActivityProperties/Tabs/TaskTab.razor.cs | 42 + .../ActivityProperties/Tabs/VersionTab.razor | 43 + .../Tabs/VersionTab.razor.cs | 90 + .../WorkflowDefinitionVersionViewer.razor | 23 + .../WorkflowDefinitionVersionViewer.razor.cs | 125 + .../WorkflowDefinitionWorkspace.razor | 55 + .../WorkflowDefinitionWorkspace.razor.cs | 124 + .../Components/WorkflowEditor.razor | 57 + .../Components/WorkflowEditor.razor.cs | 408 + .../Components/WorkflowEditorComponentBase.cs | 91 + .../Components/InputOutputTab.razor | 11 + .../Components/InputOutputTab.razor.cs | 15 + .../Components/Inputs/EditInputDialog.razor | 51 + .../Inputs/EditInputDialog.razor.cs | 136 + .../Components/Inputs/InputsSection.razor | 58 + .../Components/Inputs/InputsSection.razor.cs | 99 + .../Components/Outcomes/OutcomesSection.razor | 29 + .../Outcomes/OutcomesSection.razor.cs | 34 + .../Components/Outputs/EditOutputDialog.razor | 37 + .../Outputs/EditOutputDialog.razor.cs | 110 + .../Components/Outputs/OutputsSection.razor | 54 + .../Outputs/OutputsSection.razor.cs | 98 + .../Models/ArgumentDefinitionModel.cs | 13 + .../Models/InputDefinitionModel.cs | 11 + .../Models/OutputDefinitionModel.cs | 5 + .../Validators/InputModelValidator.cs | 23 + .../Validators/OutputModelValidator.cs | 23 + .../Tabs/Properties/PropertiesTab.razor | 6 + .../Tabs/Properties/PropertiesTab.razor.cs | 24 + .../Tabs/Properties/Sections/Info/Info.razor | 4 + .../Properties/Sections/Info/Info.razor.cs | 26 + .../Sections/Metadata/Metadata.razor | 15 + .../Sections/Metadata/Metadata.razor.cs | 59 + .../Sections/Settings/Settings.razor | 122 + .../Sections/Settings/Settings.razor.cs | 192 + .../Components/EditVariableDialog.razor | 44 + .../Components/EditVariableDialog.razor.cs | 110 + .../Variables/Components/VariablesTab.razor | 60 + .../Components/VariablesTab.razor.cs | 98 + .../Tabs/Variables/Models/VariableModel.cs | 14 + .../Validators/VariableModelValidator.cs | 26 + .../VersionHistory/VersionHistoryTab.razor | 60 + .../VersionHistory/VersionHistoryTab.razor.cs | 144 + .../WorkflowProperties.razor | 23 + .../WorkflowProperties.razor.cs | 10 + .../WorkflowDefinitionEditor.razor | 69 + .../CreateWorkflowDialog.razor | 20 + .../CreateWorkflowDialog.razor.cs | 56 + .../WorkflowDefinitionList.razor | 142 + .../WorkflowDefinitionList.razor.cs | 402 + .../Components/BulkCancelDialog.razor | 15 + .../Components/BulkCancelDialog.razor.cs | 14 + .../Models/TimestampFilter.cs | 30 + .../Models/WorkflowInstanceRow.cs | 18 + .../WorkflowInstanceList.razor | 302 + .../WorkflowInstanceList.razor.cs | 438 + .../Components/ActivityDetailsTab.razor | 51 + .../Components/ActivityDetailsTab.razor.cs | 153 + .../Components/ActivityExecutionsTab.razor | 68 + .../Components/ActivityExecutionsTab.razor.cs | 138 + .../Components/ElapsedTime.razor | 1 + .../Components/ElapsedTime.razor.cs | 35 + .../Components/Journal.razor | 88 + .../Components/Journal.razor.cs | 209 + .../Components/JournalEntryDetailsTab.razor | 29 + .../JournalEntryDetailsTab.razor.cs | 56 + .../Components/RetriesTab.razor | 45 + .../Components/RetriesTab.razor.cs | 39 + .../Components/WorkflowInstanceDesigner.razor | 55 + .../WorkflowInstanceDesigner.razor.cs | 404 + .../Components/WorkflowInstanceDetails.razor | 144 + .../WorkflowInstanceDetails.razor.cs | 347 + .../WorkflowInstanceWorkspace.razor | 39 + .../WorkflowInstanceWorkspace.razor.cs | 58 + .../Models/JournalEntry.cs | 13 + .../Models/TimeMetricMode.cs | 14 + .../WorkflowInstanceViewer.razor | 17 + .../WorkflowInstanceViewer.razor.cs | 117 + .../Constants/ZoneNames.cs | 12 + .../Contracts/IWorkflowInstanceObserver.cs | 16 + .../IWorkflowInstanceObserverFactory.cs | 13 + .../Fallback/FallbackDesigner.razor | 17 + .../Fallback/FallbackDesignerProvider.cs | 13 + .../Fallback/FallbackDiagramDesigner.cs | 59 + .../Flowcharts/FlowchartDesignerWrapper.razor | 19 + .../FlowchartDesignerWrapper.razor.cs | 197 + .../Flowcharts/FlowchartDiagramDesigner.cs | 115 + .../FlowchartDiagramDesignerProvider.cs | 24 + .../Elsa.Studio.Workflows.csproj | 25 + .../ActivityExecutionRecordExtensions.cs | 18 + .../Extensions/HubConnectionExtensions.cs | 15 + .../Extensions/ServiceCollectionExtensions.cs | 54 + .../WorkflowDefinitionExtensions.cs | 17 + src/modules/Elsa.Studio.Workflows/Feature.cs | 10 + .../Elsa.Studio.Workflows/FodyWeavers.xml | 3 + .../Elsa.Studio.Workflows/FodyWeavers.xsd | 30 + .../Handlers/RefreshActivityRegistry.cs | 40 + .../Menu/WorkflowsMenu.cs | 38 + .../Models/DragDropManager.cs | 12 + .../Models/PagedResult.cs | 3 + .../Models/WorkflowInstanceObserverContext.cs | 10 + .../Models/WorkflowMetadataModel.cs | 24 + .../WorkflowDefinitions/Edit/Index.razor | 18 + .../WorkflowDefinitions/List/Index.razor | 17 + .../Pages/WorkflowInstances/List/Index.razor | 16 + .../Pages/WorkflowInstances/View/Index.razor | 13 + .../DisconnectedWorkflowInstanceObserver.cs | 20 + .../PollingWorkflowInstanceObserver.cs | 102 + .../SignalRWorkflowInstanceObserver.cs | 51 + .../WorkflowInstanceObserverFactory.cs | 74 + .../Shared/Args/DesignerPathChangedArgs.cs | 6 + .../Components/DiagramDesignerWrapper.razor | 38 + .../DiagramDesignerWrapper.razor.cs | 539 + .../Shared/Components/GraphSegment.cs | 5 + .../WorkflowPropertiesModelValidator.cs | 25 + .../Widgets/WorkflowDefinitionInfoWidget.cs | 24 + .../WorkflowDefinitionMetadataWidget.cs | 25 + .../WorkflowDefinitionPropertiesWidgetBase.cs | 20 + .../WorkflowDefinitionSettingsWidget.cs | 25 + .../Elsa.Studio.Workflows/_Imports.razor | 25 + src/wrappers/.gitignore | 2 + src/wrappers/lerna.json | 4 + src/wrappers/package-lock.json | 14173 ++++++++ src/wrappers/package.json | 12 + .../wrappers/react-wrapper/.eslintrc.cjs | 24 + .../wrappers/react-wrapper/.gitignore | 24 + .../wrappers/react-wrapper/.storybook/main.js | 30 + .../.storybook/preview-body.html | 9 + .../.storybook/preview-head.html | 10 + .../react-wrapper/.storybook/preview.js | 14 + src/wrappers/wrappers/react-wrapper/README.md | 3 + .../wrappers/react-wrapper/package.json | 53 + .../BackendProvider/BackendProvider.jsx | 39 + .../WorkflowDefinitionEditor.jsx | 40 + .../WorkflowDefinitionList.jsx | 46 + .../WorkflowInstanceList.jsx | 34 + .../WorkflowInstanceViewer.jsx | 39 + .../wrappers/react-wrapper/src/main.js | 6 + .../wrappers/react-wrapper/src/remote-args.js | 4 + .../react-wrapper/src/stories/Configure.mdx | 364 + .../WorkflowDefinitionEditor.stories.js | 21 + .../stories/WorkflowDefinitionList.stories.js | 20 + .../stories/WorkflowInstanceList.stories.js | 20 + .../stories/WorkflowInstanceViewer.stories.js | 21 + .../src/stories/assets/accessibility.png | Bin 0 -> 42336 bytes .../src/stories/assets/accessibility.svg | 5 + .../src/stories/assets/addon-library.png | Bin 0 -> 467366 bytes .../src/stories/assets/assets.png | Bin 0 -> 3899 bytes .../src/stories/assets/context.png | Bin 0 -> 6119 bytes .../src/stories/assets/discord.svg | 15 + .../react-wrapper/src/stories/assets/docs.png | Bin 0 -> 27875 bytes .../src/stories/assets/figma-plugin.png | Bin 0 -> 44246 bytes .../src/stories/assets/github.svg | 3 + .../src/stories/assets/share.png | Bin 0 -> 40767 bytes .../src/stories/assets/styling.png | Bin 0 -> 7237 bytes .../src/stories/assets/testing.png | Bin 0 -> 49313 bytes .../src/stories/assets/theming.png | Bin 0 -> 44374 bytes .../src/stories/assets/tutorials.svg | 12 + .../src/stories/assets/youtube.svg | 4 + .../wrappers/react-wrapper/vite.config.js | 22 + 899 files changed, 85379 insertions(+) create mode 100644 .dockerignore create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/packages.yml create mode 100644 .gitignore create mode 100644 Directory.Build.props create mode 100644 Directory.Packages.props create mode 100644 Elsa.Studio-Core.sln create mode 100644 Elsa.Studio-Core.sln.DotSettings create mode 100644 Elsa.Studio.sln create mode 100644 Elsa.Studio.sln.DotSettings create mode 100644 LICENSE create mode 100644 NuGet.Config create mode 100644 NuGet.rar create mode 100644 README.md create mode 100644 artwork/screenshot-1.png create mode 100644 icon.png create mode 100644 samples/BlazorApp1/BlazorApp1.csproj create mode 100644 samples/BlazorApp1/Components/App.razor create mode 100644 samples/BlazorApp1/Components/Layout/MainLayout.razor create mode 100644 samples/BlazorApp1/Components/Layout/MainLayout.razor.css create mode 100644 samples/BlazorApp1/Components/Pages/Counter.razor create mode 100644 samples/BlazorApp1/Components/Pages/Error.razor create mode 100644 samples/BlazorApp1/Components/Pages/Weather.razor create mode 100644 samples/BlazorApp1/Components/Pages/WorkflowDefinitionEditor.razor create mode 100644 samples/BlazorApp1/Components/Pages/WorkflowDefinitions.razor create mode 100644 samples/BlazorApp1/Components/Pages/WorkflowInstanceViewer.razor create mode 100644 samples/BlazorApp1/Components/Pages/WorkflowInstances.razor create mode 100644 samples/BlazorApp1/Components/Routes.razor create mode 100644 samples/BlazorApp1/Components/_Imports.razor create mode 100644 samples/BlazorApp1/Program.cs create mode 100644 samples/BlazorApp1/Properties/launchSettings.json create mode 100644 samples/BlazorApp1/appsettings.Development.json create mode 100644 samples/BlazorApp1/appsettings.json create mode 100644 samples/BlazorApp1/wwwroot/favicon.png create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/.gitignore create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/.npmrc create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/README.md create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/package-lock.json create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/package.json create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.js create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.test.js create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/components/WorkflowDefinitionEditor.js create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.css create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.js create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/logo.svg create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/reportWebVitals.js create mode 100644 samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/setupTests.js create mode 100644 src/Directory.Build.props create mode 100644 src/bundles/Elsa.Studio/Elsa.Studio.csproj create mode 100644 src/bundles/Elsa.Studio/FodyWeavers.xml create mode 100644 src/bundles/Elsa.Studio/FodyWeavers.xsd create mode 100644 src/bundles/Elsa.Studio/Readme.md create mode 100644 src/framework/Elsa.Studio.Core.BlazorServer/Elsa.Studio.Core.BlazorServer.csproj create mode 100644 src/framework/Elsa.Studio.Core.BlazorServer/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xml create mode 100644 src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xsd create mode 100644 src/framework/Elsa.Studio.Core.BlazorServer/HostedServices/RunStartupTasksHostedService.cs create mode 100644 src/framework/Elsa.Studio.Core.BlazorWasm/Elsa.Studio.Core.BlazorWasm.csproj create mode 100644 src/framework/Elsa.Studio.Core.BlazorWasm/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xml create mode 100644 src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xsd create mode 100644 src/framework/Elsa.Studio.Core/Abstractions/FeatureBase.cs create mode 100644 src/framework/Elsa.Studio.Core/Abstractions/FieldExtensionHandlerBase.cs create mode 100644 src/framework/Elsa.Studio.Core/Attributes/RemoteFeatureAttribute.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IActivityTab.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IAppBarService.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IBackendApiClientProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IBlazorServiceAccessor.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IClientInformationProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IExpressionProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IExpressionService.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IFeature.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IFeatureService.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IMediator.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IMenuGroupProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IMenuProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IMenuService.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/INotification.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/INotificationHandler.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IRemoteBackendAccessor.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IRemoteFeatureProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IServerInformationProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IStartupTask.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IStartupTaskRunner.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IThemeService.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionHandler.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionService.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IUIHintHandler.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IUIHintService.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IUnauthorizedComponentProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IWidget.cs create mode 100644 src/framework/Elsa.Studio.Core/Contracts/IWidgetRegistry.cs create mode 100644 src/framework/Elsa.Studio.Core/Elsa.Studio.Core.csproj create mode 100644 src/framework/Elsa.Studio.Core/ElsaStudioIcons.cs create mode 100644 src/framework/Elsa.Studio.Core/Enums/FieldExtensionPosition.cs create mode 100644 src/framework/Elsa.Studio.Core/Extensions/MediatorExtensions.cs create mode 100644 src/framework/Elsa.Studio.Core/Extensions/ObjectExtension.cs create mode 100644 src/framework/Elsa.Studio.Core/Extensions/RateLimitedFuncExtensions.cs create mode 100644 src/framework/Elsa.Studio.Core/Extensions/RenderTreeBuilderExtensions.cs create mode 100644 src/framework/Elsa.Studio.Core/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/framework/Elsa.Studio.Core/FodyWeavers.xml create mode 100644 src/framework/Elsa.Studio.Core/FodyWeavers.xsd create mode 100644 src/framework/Elsa.Studio.Core/Localization/DefaultLocalizationProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Localization/DefaultLocalizer.cs create mode 100644 src/framework/Elsa.Studio.Core/Localization/ILocalizationProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Localization/ILocalizer.cs create mode 100644 src/framework/Elsa.Studio.Core/MenuItemGroups.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/BackendApiConfig.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/ClientInformation.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/DisplayInputEditorContext.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/MenuItem.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/MenuItemGroup.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/RemoteBackend.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/Result.cs create mode 100644 src/framework/Elsa.Studio.Core/Models/ServerInformation.cs create mode 100644 src/framework/Elsa.Studio.Core/Options/BackendOptions.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/AssemblyClientInformationProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/BlazorScopedProxyApi.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/BlazorServiceAccessor.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultAppBarService.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultBackendApiClientProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultFeatureService.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultMediator.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultMenuGroupProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultMenuService.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultRemoteBackendAccessor.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultStartupTaskRunner.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultSyntaxService.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultThemeService.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultUIFieldExtensionService.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultUIHintService.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/DefaultWidgetRegistry.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/EmptyServerInformationProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/RemoteExpressionProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/RemoteFeatureProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/StaticClientInformationProvider.cs create mode 100644 src/framework/Elsa.Studio.Core/Services/UnsupportedUIHintHandler.cs create mode 100644 src/framework/Elsa.Studio.Core/TokenNames.cs create mode 100644 src/framework/Elsa.Studio.Core/ToolVersion.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/package.json create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/copy-text.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/index.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/click-element.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-bounding-client-rect.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-element.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-visible-height.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/index.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/index.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/files.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/download-file-from-stream.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/index.ts create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/tsconfig.json create mode 100644 src/framework/Elsa.Studio.DomInterop/ClientLib/webpack.config.js create mode 100644 src/framework/Elsa.Studio.DomInterop/Contracts/IClipboard.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Contracts/IDomAccessor.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Contracts/IFiles.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Elsa.Studio.DomInterop.csproj create mode 100644 src/framework/Elsa.Studio.DomInterop/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/FodyWeavers.xml create mode 100644 src/framework/Elsa.Studio.DomInterop/FodyWeavers.xsd create mode 100644 src/framework/Elsa.Studio.DomInterop/Interop/ClipboardJsInterop.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Interop/DomJsInterop.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Interop/FilesJsInterop.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Interop/JsInteropBase.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Models/DomRect.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Models/ElementRef.cs create mode 100644 src/framework/Elsa.Studio.DomInterop/Models/Union.cs create mode 100644 src/framework/Elsa.Studio.Shared/Branding/DefaultBrandingProvider.cs create mode 100644 src/framework/Elsa.Studio.Shared/Branding/IBrandingProvider.cs create mode 100644 src/framework/Elsa.Studio.Shared/Components/ClientPackageVersion.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/DataPanel.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/DefaultBranding.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor.cs create mode 100644 src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor.cs create mode 100644 src/framework/Elsa.Studio.Shared/Components/FieldExtension.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/NavMenu.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/NavMenuItem.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/PageHeading.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/ProductInfoDialog.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/ScrollableWell.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/ServerPackageVersion.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/StudioComponentBase.cs create mode 100644 src/framework/Elsa.Studio.Shared/Components/Unauthorized.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/VerticalWell.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/Well.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/Zone.razor create mode 100644 src/framework/Elsa.Studio.Shared/Components/Zone.razor.cs create mode 100644 src/framework/Elsa.Studio.Shared/Converters/JsonPrimitiveToStringConverter.cs create mode 100644 src/framework/Elsa.Studio.Shared/Converters/JsonStringToIntConverter.cs create mode 100644 src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj create mode 100644 src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj.DotSettings create mode 100644 src/framework/Elsa.Studio.Shared/Extensions/ClaimsExtensions.cs create mode 100644 src/framework/Elsa.Studio.Shared/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/framework/Elsa.Studio.Shared/FodyWeavers.xml create mode 100644 src/framework/Elsa.Studio.Shared/FodyWeavers.xsd create mode 100644 src/framework/Elsa.Studio.Shared/Layouts/BasicLayout.razor create mode 100644 src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor create mode 100644 src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor.cs create mode 100644 src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor create mode 100644 src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor.cs create mode 100644 src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeFormatter.cs create mode 100644 src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeZoneProvider.cs create mode 100644 src/framework/Elsa.Studio.Shared/Localization/Time/Implementations/DefaultTimeFormatter.cs create mode 100644 src/framework/Elsa.Studio.Shared/Localization/Time/Providers/LocalTimeZoneProvider.cs create mode 100644 src/framework/Elsa.Studio.Shared/Localization/Time/Providers/UtcTimeZoneProvider.cs create mode 100644 src/framework/Elsa.Studio.Shared/Models/DataPanelItem.cs create mode 100644 src/framework/Elsa.Studio.Shared/Models/DataPanelModel.cs create mode 100644 src/framework/Elsa.Studio.Shared/Monaco/Contracts/IMonacoHandler.cs create mode 100644 src/framework/Elsa.Studio.Shared/Monaco/Handlers/JavaScriptMonacoHandler.cs create mode 100644 src/framework/Elsa.Studio.Shared/Monaco/Models/MonacoContext.cs create mode 100644 src/framework/Elsa.Studio.Shared/Services/TypeDefinitionService.cs create mode 100644 src/framework/Elsa.Studio.Shared/WellKnownSyntaxNames.cs create mode 100644 src/framework/Elsa.Studio.Shared/_Imports.razor create mode 100644 src/framework/Elsa.Studio.Shell/App.razor create mode 100644 src/framework/Elsa.Studio.Shell/App.razor.cs create mode 100644 src/framework/Elsa.Studio.Shell/ComponentProviders/DefaultUnauthorizedComponentProvider.cs create mode 100644 src/framework/Elsa.Studio.Shell/Elsa.Studio.Shell.csproj create mode 100644 src/framework/Elsa.Studio.Shell/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/framework/Elsa.Studio.Shell/FodyWeavers.xml create mode 100644 src/framework/Elsa.Studio.Shell/FodyWeavers.xsd create mode 100644 src/framework/Elsa.Studio.Shell/Options/ShellOptions.cs create mode 100644 src/framework/Elsa.Studio.Shell/_Imports.razor create mode 100644 src/framework/Elsa.Studio.Translations/Elsa.Studio.Translations.csproj create mode 100644 src/framework/Elsa.Studio.Translations/ResxLocalizationProvider.cs create mode 100644 src/framework/Elsa.Studio.Translations/ServiceCollectionExtensions.cs create mode 100644 src/framework/Elsa.Studio.Translations/Translations.ar.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.de.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.es.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.fa.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.fr.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.nl.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.pt.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.ru.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.uk.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.zh-Hans.resx create mode 100644 src/framework/Elsa.Studio.Translations/Translations.zh-Hant.resx create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendComponentBase.cs create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendProvider.razor create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Components/ThemedComponentWrapper.razor create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionEditorWrapper.razor create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionListWrapper.razor create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceListWrapper.razor create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceViewerWrapper.razor create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Elsa.Studio.Host.CustomElements.csproj create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/HttpMessageHandlers/ApiKeyHttpMessageHandler.cs create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Program.cs create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Properties/launchSettings.json create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Services/BackendService.cs create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/Services/ComponentRemoteBackendAccessor.cs create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/_Imports.razor create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/appsettings.Development.json create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/appsettings.json create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/npm/package.json create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/appsettings.json create mode 100644 src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/index.html create mode 100644 src/hosts/Elsa.Studio.Host.HostedWasm/Elsa.Studio.Host.HostedWasm.csproj create mode 100644 src/hosts/Elsa.Studio.Host.HostedWasm/Middleware/WasmAssetsRewritingMiddleware.cs create mode 100644 src/hosts/Elsa.Studio.Host.HostedWasm/Pages/_Host.cshtml create mode 100644 src/hosts/Elsa.Studio.Host.HostedWasm/Program.cs create mode 100644 src/hosts/Elsa.Studio.Host.HostedWasm/Properties/launchSettings.json create mode 100644 src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.Development.json create mode 100644 src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.json create mode 100644 src/hosts/Elsa.Studio.Host.Server/Dockerfile create mode 100644 src/hosts/Elsa.Studio.Host.Server/Elsa.Studio.Host.Server.csproj create mode 100644 src/hosts/Elsa.Studio.Host.Server/Pages/_Host.cshtml create mode 100644 src/hosts/Elsa.Studio.Host.Server/Program.cs create mode 100644 src/hosts/Elsa.Studio.Host.Server/Properties/launchSettings.json create mode 100644 src/hosts/Elsa.Studio.Host.Server/StudioBrandingProvider.cs create mode 100644 src/hosts/Elsa.Studio.Host.Server/_Imports.razor create mode 100644 src/hosts/Elsa.Studio.Host.Server/appsettings.Development.json create mode 100644 src/hosts/Elsa.Studio.Host.Server/appsettings.json create mode 100644 src/hosts/Elsa.Studio.Host.Wasm/Dockerfile create mode 100644 src/hosts/Elsa.Studio.Host.Wasm/Elsa.Studio.Host.Wasm.csproj create mode 100644 src/hosts/Elsa.Studio.Host.Wasm/Program.cs create mode 100644 src/hosts/Elsa.Studio.Host.Wasm/Properties/launchSettings.json create mode 100644 src/hosts/Elsa.Studio.Host.Wasm/_Imports.razor create mode 100644 src/hosts/Elsa.Studio.Host.Wasm/wwwroot/appsettings.json create mode 100644 src/hosts/Elsa.Studio.Host.Wasm/wwwroot/index.html create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Elsa.Studio.ActivityPortProviders.csproj create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Providers/DynamicOutcomesPortProvider.cs create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowHttpRequestPortProvider.cs create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowSwitchPortProvider.cs create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Providers/HttpEndpointPortProvider.cs create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Providers/SendHttpRequestPortProvider.cs create mode 100644 src/modules/Elsa.Studio.ActivityPortProviders/Providers/SwitchPortProvider.cs create mode 100644 src/modules/Elsa.Studio.Counter/Elsa.Studio.Counter.csproj create mode 100644 src/modules/Elsa.Studio.Counter/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Counter/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Counter/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Counter/Menu/CounterMenu.cs create mode 100644 src/modules/Elsa.Studio.Counter/Module.cs create mode 100644 src/modules/Elsa.Studio.Counter/Pages/Counter.razor create mode 100644 src/modules/Elsa.Studio.Counter/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Dashboard/Elsa.Studio.Dashboard.csproj create mode 100644 src/modules/Elsa.Studio.Dashboard/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Dashboard/Feature.cs create mode 100644 src/modules/Elsa.Studio.Dashboard/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Dashboard/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Dashboard/Menu/DashboardMenu.cs create mode 100644 src/modules/Elsa.Studio.Dashboard/Pages/Index.razor create mode 100644 src/modules/Elsa.Studio.Dashboard/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Environments/Components/EnvironmentPicker.razor create mode 100644 src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentService.cs create mode 100644 src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentsClient.cs create mode 100644 src/modules/Elsa.Studio.Environments/Elsa.Studio.Environments.csproj create mode 100644 src/modules/Elsa.Studio.Environments/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Environments/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Environments/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Environments/Models/ServerEnvironment.cs create mode 100644 src/modules/Elsa.Studio.Environments/Module.cs create mode 100644 src/modules/Elsa.Studio.Environments/Services/DefaultEnvironmentService.cs create mode 100644 src/modules/Elsa.Studio.Environments/Services/EnvironmentBackendApiClientProvider.cs create mode 100644 src/modules/Elsa.Studio.Environments/Tasks/LoadEnvironmentsStartupTask.cs create mode 100644 src/modules/Elsa.Studio.Environments/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Localization.BlazorServer/Controllers/CultureController.cs create mode 100644 src/modules/Elsa.Studio.Localization.BlazorServer/Elsa.Studio.Localization.BlazorServer.csproj create mode 100644 src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/WebApplicationExtensions.cs create mode 100644 src/modules/Elsa.Studio.Localization.BlazorServer/Services/BlazorServerCultureService.cs create mode 100644 src/modules/Elsa.Studio.Localization.BlazorWasm/Elsa.Studio.Localization.BlazorWasm.csproj create mode 100644 src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/WebAssemblyHostExtensions.cs create mode 100644 src/modules/Elsa.Studio.Localization.BlazorWasm/Services/BlazorWasmCultureService.cs create mode 100644 src/modules/Elsa.Studio.Localization/Components/LanguagePicker.razor create mode 100644 src/modules/Elsa.Studio.Localization/Elsa.Studio.Localization.csproj create mode 100644 src/modules/Elsa.Studio.Localization/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Localization/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Localization/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Localization/LocalizationFeature.cs create mode 100644 src/modules/Elsa.Studio.Localization/Models/LocalizationConfig.cs create mode 100644 src/modules/Elsa.Studio.Localization/Options/LocalizationOptions.cs create mode 100644 src/modules/Elsa.Studio.Localization/README.md create mode 100644 src/modules/Elsa.Studio.Localization/Services/ICultureService.cs create mode 100644 src/modules/Elsa.Studio.Localization/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Login.BlazorServer/Elsa.Studio.Login.BlazorServer.csproj create mode 100644 src/modules/Elsa.Studio.Login.BlazorServer/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtAccessor.cs create mode 100644 src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtParser.cs create mode 100644 src/modules/Elsa.Studio.Login.BlazorWasm/Elsa.Studio.Login.BlazorWasm.csproj create mode 100644 src/modules/Elsa.Studio.Login.BlazorWasm/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtAccessor.cs create mode 100644 src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtParser.cs create mode 100644 src/modules/Elsa.Studio.Login/ComponentProviders/RedirectToLoginUnauthorizedComponentProvider.cs create mode 100644 src/modules/Elsa.Studio.Login/Components/LoginState.razor create mode 100644 src/modules/Elsa.Studio.Login/Components/ReceiveAuthorizationCode.cs create mode 100644 src/modules/Elsa.Studio.Login/Components/RedirectToLogin.cs create mode 100644 src/modules/Elsa.Studio.Login/Contracts/IAuthorizationService.cs create mode 100644 src/modules/Elsa.Studio.Login/Contracts/ICredentialsValidator.cs create mode 100644 src/modules/Elsa.Studio.Login/Contracts/IEndSessionService.cs create mode 100644 src/modules/Elsa.Studio.Login/Contracts/IJwtAccessor.cs create mode 100644 src/modules/Elsa.Studio.Login/Contracts/IJwtParser.cs create mode 100644 src/modules/Elsa.Studio.Login/Contracts/IRefreshTokenService.cs create mode 100644 src/modules/Elsa.Studio.Login/Elsa.Studio.Login.csproj create mode 100644 src/modules/Elsa.Studio.Login/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Login/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Login/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Login/HttpMessageHandlers/AuthenticatingApiHttpMessageHandler.cs create mode 100644 src/modules/Elsa.Studio.Login/LoginFeature.cs create mode 100644 src/modules/Elsa.Studio.Login/Models/IdentityTokenOptions.cs create mode 100644 src/modules/Elsa.Studio.Login/Models/OAuth2CredentialsValidatorOptions.cs create mode 100644 src/modules/Elsa.Studio.Login/Models/OpenIdConnectConfiguration.cs create mode 100644 src/modules/Elsa.Studio.Login/Models/TokenResponse.cs create mode 100644 src/modules/Elsa.Studio.Login/Models/ValidateCredentialsResult.cs create mode 100644 src/modules/Elsa.Studio.Login/Pages/Login/Login.razor create mode 100644 src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.cs create mode 100644 src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.css create mode 100644 src/modules/Elsa.Studio.Login/Pages/Login/Models/LoginModel.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/AccessTokenAuthenticationStateProvider.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/ElsaIdentityAuthorizationService.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/ElsaIdentityCredentialsValidator.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/ElsaIdentityEndSessionService.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/ElsaIdentityRefreshTokenService.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/OAuth2CredentialsValidator.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/OAuth2HttpClient.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/OpenIdConnectEndSessionService.cs create mode 100644 src/modules/Elsa.Studio.Login/Services/OpenIdConnectRefreshTokenService.cs create mode 100644 src/modules/Elsa.Studio.Login/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Secrets/Client/ISecretsApi.cs create mode 100644 src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj create mode 100644 src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj.DotSettings create mode 100644 src/modules/Elsa.Studio.Secrets/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Secrets/Extensions/TimeSpanExtensions.cs create mode 100644 src/modules/Elsa.Studio.Secrets/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Secrets/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Secrets/Menu/SecretsMenu.cs create mode 100644 src/modules/Elsa.Studio.Secrets/Module.cs create mode 100644 src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor create mode 100644 src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor.cs create mode 100644 src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor create mode 100644 src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor.cs create mode 100644 src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor create mode 100644 src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor.cs create mode 100644 src/modules/Elsa.Studio.Secrets/UI/Validators/SecretInputModelValidator.cs create mode 100644 src/modules/Elsa.Studio.Secrets/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Security/Elsa.Studio.Security.csproj create mode 100644 src/modules/Elsa.Studio.Security/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Security/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Security/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Security/Menu/SecurityMenu.cs create mode 100644 src/modules/Elsa.Studio.Security/Module.cs create mode 100644 src/modules/Elsa.Studio.Security/Pages/Roles.razor create mode 100644 src/modules/Elsa.Studio.Security/Pages/Users.razor create mode 100644 src/modules/Elsa.Studio.Security/_Imports.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Cases.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Cases.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/CheckList.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/CheckList.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Checkbox.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Code.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Code.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/DateTimePicker.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/ExpressionEditor.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Json.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/Json.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/MultiLine.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/MultiText.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/MultiText.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/RadioList.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/RadioList.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/SingleLine.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor create mode 100644 src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Elsa.Studio.UIHints.csproj create mode 100644 src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCheckListExtensions.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCodeEditorExtensions.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorRadioListExtensions.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSelectListExtensions.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSingleLineExtensions.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Extensions/StringExtensions.cs create mode 100644 src/modules/Elsa.Studio.UIHints/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.UIHints/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/CheckListHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/CheckboxHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/CodeEditorHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/DateTimePickerHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/DropDownHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/DynamicOutcomesHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/ExpressionEditorHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/HttpStatusCodesHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/JsonEditorHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/MultiLineHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/MultiTextHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/OutcomePickerHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/OutputPickerHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/RadioListHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/SingleLineHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/SwitchEditorHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/TypePickerHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/VariablePickerHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Handlers/WorkflowDefinitionPickerHandler.cs create mode 100644 src/modules/Elsa.Studio.UIHints/Helpers/JsonParser.cs create mode 100644 src/modules/Elsa.Studio.UIHints/InputUIHints.cs create mode 100644 src/modules/Elsa.Studio.UIHints/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Webhooks/Elsa.Studio.Webhooks.csproj create mode 100644 src/modules/Elsa.Studio.Webhooks/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Webhooks/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Webhooks/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Webhooks/Menu/WebhooksMenu.cs create mode 100644 src/modules/Elsa.Studio.Webhooks/Module.cs create mode 100644 src/modules/Elsa.Studio.Webhooks/Pages/Index.razor create mode 100644 src/modules/Elsa.Studio.Webhooks/_Imports.razor create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/ActivityTabs/WorkflowContextActivityTab.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Contracts/IWorkflowContextsProvider.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Elsa.Studio.WorkflowContexts.csproj create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Extensions/ActivityExtensions.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Extensions/WorkflowDefinitionExtensions.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Feature.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Handlers/WorkflowContextProviderPickerHandler.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Models/ActivityWorkflowContextSettings.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Services/RemoteWorkflowContextsProvider.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/Widgets/WorkflowContextsEditorWidget.cs create mode 100644 src/modules/Elsa.Studio.WorkflowContexts/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contexts/PortProviderContext.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/CompatWorkflowJsonDetector.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityExecutionService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityIdGenerator.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityNameGenerator.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistry.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistryProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityResolver.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityVisitor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ICommitStrategiesProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IIncidentStrategiesProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ILogPersistenceStrategyService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IResilienceStrategyCatalog.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IStorageDriverService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IVariableTypeService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowActivationStrategyService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionEditorService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionHistoryService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionImporter.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowInstanceService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowJsonDetector.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityNodeExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityRegistryExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ProblemDetailsExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ValidationApiExceptionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityGraph.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityStats.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/EmbeddedActivity.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExecuteWorkflowResult.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExpressionDescriptorProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/FileDownload.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ImportOptions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationError.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationErrors.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowDefinitionVersion.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailure.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailureType.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportResult.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ActivityRegistryRefreshed.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublished.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublishing.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedFile.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedJson.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedWorkflowDefinition.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingFile.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingJson.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingWorkflowDefinition.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExported.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExporting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExported.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExporting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdPublishing.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetracting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetractingFailed.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublished.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishing.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishingFailed.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetractingFailed.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionReverted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaved.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaving.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSavingFailed.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverted.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverting.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/ActivityPortProviderBase.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/DefaultActivityPortProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityDisplaySettingsRegistry.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityNameGenerator.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityPortService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityRegistry.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityVisitor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RandomLongIdentityGenerator.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityExecutionService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityRegistryProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteCommitStrategiesProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteIncidentStrategiesProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteLogPersistenceStrategyService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteResilienceStrategyCatalog.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteServerInformationProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteStorageDriverService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteVariableTypeService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowActivationStrategyService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowInstanceService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SchemaWorkflowJsonDetector.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/ShortGuidActivityIdGenerator.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SimpleWorkflowJsonDetector.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionEditorService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionHistoryService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionImporter.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Elsa.Studio.Workflows.Core.csproj create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityVisitorExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Workflows.Core/Resolvers/DefaultActivityResolver.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Args/ActivityEmbeddedPortSelectedArgs.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contexts/DisplayContext.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsRegistry.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesigner.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerToolboxProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IWorkspace.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Models/ActivityDisplaySettings.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Models/DefaultActivityColors.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Providers/DefaultActivityDisplaySettingsProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Core/UI/Services/DefaultDiagramDesignerService.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v1.css create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v2.css create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/package.json create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/add-activity-node.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/auto-layout.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/calculate-activity-size.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/center-content.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/create-graph.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dispose-graph.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dotnet-flowchart-designer.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/graph-bindings.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/index.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/load-graph.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/paste-cells.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-embedded-port-selected.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-selected.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/read-graph.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/select-activity.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/set-grid-color.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-size.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-stats.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/zoom-to-fit.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/create-activity-element.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/init.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity-stats.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/connection.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/container.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/index.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/metadata.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/size.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/x6.ts create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/tsconfig.json create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/ClientLib/webpack.config.js create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/ActivityWrapperBase.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/EmbeddedActivityWrapper.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Contracts/IActivityMapper.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Contracts/IFlowchartMapper.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Contracts/IMapperFactory.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Elsa.Studio.Workflows.Designer.csproj create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Extensions/ComponentConfigurationExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Interop/DesignerJsInterop.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Interop/JsInteropBase.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Interop/X6GraphApi.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6ActivityNode.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Attrs.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Edge.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Endpoint.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Graph.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Port.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Ports.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Position.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Models/X6Size.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Module.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Options/DesignerOptions.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Options/X6GraphSettings.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Options/X6Grid.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Options/X6GridArgs.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Options/X6Mousewheel.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Options/X6Panning.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Services/ActivityMapper.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Services/FlowchartMapper.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Services/MapperFactory.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/Services/PendingActionsQueue.cs create mode 100644 src/modules/Elsa.Studio.Workflows.Designer/_Imports.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Models.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingKind.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetGroup.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetOption.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditorComponentBase.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/ArgumentDefinitionModel.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/InputDefinitionModel.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/OutputDefinitionModel.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/InputModelValidator.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/OutputModelValidator.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Models/VariableModel.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Validators/VariableModelValidator.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/TimestampFilter.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/WorkflowInstanceRow.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/JournalEntry.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/TimeMetricMode.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Constants/ZoneNames.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserver.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserverFactory.cs create mode 100644 src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesigner.razor create mode 100644 src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesignerProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDiagramDesigner.cs create mode 100644 src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor create mode 100644 src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesigner.cs create mode 100644 src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesignerProvider.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Elsa.Studio.Workflows.csproj create mode 100644 src/modules/Elsa.Studio.Workflows/Extensions/ActivityExecutionRecordExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Extensions/HubConnectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Extensions/WorkflowDefinitionExtensions.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Feature.cs create mode 100644 src/modules/Elsa.Studio.Workflows/FodyWeavers.xml create mode 100644 src/modules/Elsa.Studio.Workflows/FodyWeavers.xsd create mode 100644 src/modules/Elsa.Studio.Workflows/Handlers/RefreshActivityRegistry.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Menu/WorkflowsMenu.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Models/DragDropManager.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Models/PagedResult.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Models/WorkflowInstanceObserverContext.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Models/WorkflowMetadataModel.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/Edit/Index.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/List/Index.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/List/Index.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/View/Index.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Services/DisconnectedWorkflowInstanceObserver.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Services/PollingWorkflowInstanceObserver.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Services/SignalRWorkflowInstanceObserver.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Services/WorkflowInstanceObserverFactory.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Shared/Args/DesignerPathChangedArgs.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor create mode 100644 src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Shared/Components/GraphSegment.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Validators/WorkflowPropertiesModelValidator.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionInfoWidget.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionMetadataWidget.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionPropertiesWidgetBase.cs create mode 100644 src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionSettingsWidget.cs create mode 100644 src/modules/Elsa.Studio.Workflows/_Imports.razor create mode 100644 src/wrappers/.gitignore create mode 100644 src/wrappers/lerna.json create mode 100644 src/wrappers/package-lock.json create mode 100644 src/wrappers/package.json create mode 100644 src/wrappers/wrappers/react-wrapper/.eslintrc.cjs create mode 100644 src/wrappers/wrappers/react-wrapper/.gitignore create mode 100644 src/wrappers/wrappers/react-wrapper/.storybook/main.js create mode 100644 src/wrappers/wrappers/react-wrapper/.storybook/preview-body.html create mode 100644 src/wrappers/wrappers/react-wrapper/.storybook/preview-head.html create mode 100644 src/wrappers/wrappers/react-wrapper/.storybook/preview.js create mode 100644 src/wrappers/wrappers/react-wrapper/README.md create mode 100644 src/wrappers/wrappers/react-wrapper/package.json create mode 100644 src/wrappers/wrappers/react-wrapper/src/components/BackendProvider/BackendProvider.jsx create mode 100644 src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.jsx create mode 100644 src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionList/WorkflowDefinitionList.jsx create mode 100644 src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceList/WorkflowInstanceList.jsx create mode 100644 src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceViewer/WorkflowInstanceViewer.jsx create mode 100644 src/wrappers/wrappers/react-wrapper/src/main.js create mode 100644 src/wrappers/wrappers/react-wrapper/src/remote-args.js create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/Configure.mdx create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionEditor.stories.js create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionList.stories.js create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceList.stories.js create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceViewer.stories.js create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/accessibility.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/accessibility.svg create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/addon-library.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/assets.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/context.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/discord.svg create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/docs.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/figma-plugin.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/github.svg create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/share.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/styling.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/testing.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/theming.png create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/tutorials.svg create mode 100644 src/wrappers/wrappers/react-wrapper/src/stories/assets/youtube.svg create mode 100644 src/wrappers/wrappers/react-wrapper/vite.config.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..cd967fc --- /dev/null +++ b/.dockerignore @@ -0,0 +1,25 @@ +**/.dockerignore +**/.env +**/.git +**/.gitignore +**/.project +**/.settings +**/.toolstarget +**/.vs +**/.vscode +**/.idea +**/*.*proj.user +**/*.dbmdl +**/*.jfm +**/azds.yaml +**/bin +**/charts +**/docker-compose* +**/Dockerfile* +**/node_modules +**/npm-debug.log +**/obj +**/secrets.dev.yaml +**/values.dev.yaml +LICENSE +README.md \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..8ca517d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "nuget" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml new file mode 100644 index 0000000..6617470 --- /dev/null +++ b/.github/workflows/packages.yml @@ -0,0 +1,240 @@ +name: Elsa Studio 3 Packages +on: + workflow_dispatch: + push: + branches: + - 'main' + - 'vnext' + - 'bug/*' + - 'enh/*' + - 'feature/*' + - 'issue/*' + - 'patch/*' + - 'rc/*' + - 'develop/*' + release: + types: [ prereleased, published ] +env: + base_version: '3.5.0' + nuget_feed_feedzio: 'https://f.feedz.io/elsa-workflows/elsa-3/nuget/index.json' + nuget_feed_nuget: 'https://api.nuget.org/v3/index.json' + npm_feed_feedzio: 'https://f.feedz.io/elsa-workflows/elsa-3/npm/' + npm_feed_npm: 'https://registry.npmjs.org/' + +jobs: + build: + name: Build packages + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Extract branch name + run: | + BRANCH_NAME=${{ github.ref }} # e.g., refs/heads/main + BRANCH_NAME=${BRANCH_NAME#refs/heads/} # remove the refs/heads/ prefix + # Extract the last part after the last slash of the branch name, if any, e.g., feature/issue-123 -> issue-123 and use it as the version prefix. + PACKAGE_PREFIX=$(echo $BRANCH_NAME | rev | cut -d/ -f1 | rev | tr '_' '-') + + # If the branch name is main, use the preview version. Otherwise, use the branch name as the version prefix. + if [[ "${BRANCH_NAME}" == "main" || "${BRANCH_NAME}" =~ ^rc/ || "${BRANCH_NAME}" =~ ^develop/ ]]; then + PACKAGE_PREFIX="preview" + fi + + echo "Ref: ${{ github.ref }}" + echo "Branch name: ${BRANCH_NAME}" + echo "Package prefix: ${PACKAGE_PREFIX}" + echo "BRANCH_NAME=${BRANCH_NAME}" >> $GITHUB_ENV + echo "PACKAGE_PREFIX=${PACKAGE_PREFIX}" >> $GITHUB_ENV + - name: Checkout + uses: actions/checkout@v3 + - name: Verify commit exists in remote branch + run: | + if [[ "${{ github.ref }}" == refs/tags/* && "${{ github.event_name }}" == "release" && ("${{ github.event.action }}" == "published" || "${{ github.event.action }}" == "prereleased") ]]; then + git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/* + git branch --remote --contains | grep origin/develop/3.5.0 + else + git fetch --no-tags --prune --depth=1 origin +refs/heads/*:refs/remotes/origin/* + git branch --remote --contains | grep origin/${BRANCH_NAME} + fi + - name: Set VERSION variable + run: | + if [[ "${{ github.ref }}" == refs/tags/* && "${{ github.event_name }}" == "release" && ("${{ github.event.action }}" == "published" || "${{ github.event.action }}" == "prereleased") ]]; then + TAG_NAME=${{ github.ref }} # e.g., refs/tags/3.0.0 + TAG_NAME=${TAG_NAME#refs/tags/} # remove the refs/tags/ prefix + echo "VERSION=${TAG_NAME}" >> $GITHUB_ENV + else + echo "VERSION=${{env.base_version}}-${PACKAGE_PREFIX}.${{github.run_number}}" >> $GITHUB_ENV + fi + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.x + - name: Build workflow designer client assets + working-directory: ./src/modules/Elsa.Studio.Workflows.Designer/ClientLib + run: | + npm install --force + npm run build + - name: Build DOM interop client assets + working-directory: ./src/framework/Elsa.Studio.DomInterop/ClientLib + run: | + npm install --force + npm run build + - name: Build nuget packages + run: dotnet build Elsa.Studio.sln --configuration Release /p:Version=${VERSION} + - name: Test + run: dotnet test Elsa.Studio.sln --configuration Release /p:Version=${VERSION} --no-build + - name: Pack nuget packages + run: dotnet pack Elsa.Studio.sln --configuration Release /p:Version=${VERSION} /p:PackageOutputPath=$(pwd)/packages/nuget + - name: Publish Custom Elements packages # This generates client assets that we then package as an NPM package. + run: dotnet publish ./src/hosts/Elsa.Studio.Host.CustomElements --configuration Release -o ./packages/wasm /p:Version=${VERSION} -f net8.0 + + # Pack npm wasm package + - name: Pack elsa-studio-wasm npm package + run: | + cp ./packages/wasm/npm/package.json ./packages/wasm/wwwroot/package.json # Copy the package.json file from the NPM package to the wwwroot folder. + cd ./packages/wasm/wwwroot + npm version $VERSION --allow-same-version + npm pack + + # Build npm react wrapper package + - name: Pack elsa-studio-wasm-react npm package + run: | + cd ./src/wrappers/wrappers/react-wrapper + npm version $VERSION --allow-same-version + npm run build + npm pack + + # Upload nuget packages + - name: Upload nuget packages + uses: actions/upload-artifact@v4 + with: + name: elsa-studio-nuget-packages + path: ./packages/nuget/*nupkg + + # Upload npm wasm package + - name: Upload npm wasm package + uses: actions/upload-artifact@v4 + with: + name: elsa-studio-npm-packages + path: ./packages/wasm/wwwroot/*.tgz + + # Upload npm react wrapper package + - name: Upload npm react wrapper package + uses: actions/upload-artifact@v4 + with: + name: elsa-studio-npm-react-packages + path: ./src/wrappers/wrappers/react-wrapper/*.tgz + + publish_npm_preview_feedzio: + name: Publish npm packages to feedz.io + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + if: ${{ github.event_name == 'release' || github.event_name == 'push'}} + steps: + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18.12.1 + registry-url: ${{ env.npm_feed_feedzio }} + + - name: Download npm Packages + uses: actions/download-artifact@v4 + with: + name: elsa-studio-npm-packages + path: elsa-studio-npm-packages + + - name: Publish npm packages to feedz.io + run: | + for file in ./elsa-studio-npm-packages/*.tgz + do + npm publish "$file" --access public + done + env: + NODE_AUTH_TOKEN: ${{secrets.FEEDZ_API_KEY_BASE64}} + + - name: Download npm react Packages + uses: actions/download-artifact@v4 + with: + name: elsa-studio-npm-react-packages + path: elsa-studio-npm-react-packages + + - name: Publish npm react packages to feedz.io + run: | + for file in ./elsa-studio-npm-react-packages/*.tgz + do + npm publish "$file" --access public + done + env: + NODE_AUTH_TOKEN: ${{secrets.FEEDZ_API_KEY_BASE64}} + + publish_npm_npm: + name: Publish npm packages to npmjs.com + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + if: ${{ github.event_name == 'release' && github.event.action == 'published' }} + steps: + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18.12.1 + registry-url: ${{ env.npm_feed_npm }} + + - name: Download npm Packages + uses: actions/download-artifact@v4 + with: + name: elsa-studio-npm-packages + path: elsa-studio-npm-packages + + - run: | + for file in ./elsa-studio-npm-packages/*.tgz + do + npm publish "$file" --access public + done + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} + + - name: Download npm react Packages + uses: actions/download-artifact@v4 + with: + name: elsa-studio-npm-react-packages + path: elsa-studio-npm-react-packages + + - run: | + for file in ./elsa-studio-npm-react-packages/*.tgz + do + npm publish "$file" --access public + done + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_API_KEY }} + + publish_nuget_preview_feedzio: + name: Publish nuget packages to feedz.io + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + if: ${{ github.event_name == 'release' || github.event_name == 'push'}} + steps: + - name: Download Packages + uses: actions/download-artifact@v4 + with: + name: elsa-studio-nuget-packages + path: elsa-studio-nuget-packages + + - name: Publish to feedz.io + run: dotnet nuget push ./elsa-studio-nuget-packages/*.nupkg -k ${{ secrets.FEEDZ_API_KEY }} -s ${{ env.nuget_feed_feedzio }} --skip-duplicate + + publish_nuget_nuget: + name: Publish to nuget.org + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + if: ${{ github.event_name == 'release' && github.event.action == 'published' }} + steps: + - name: Download Packages + uses: actions/download-artifact@v4 + with: + name: elsa-studio-nuget-packages + path: elsa-studio-nuget-packages + + - name: Publish to nuget.org + run: dotnet nuget push ./elsa-studio-nuget-packages/*.nupkg -k ${{ secrets.NUGET_API_KEY }} -s ${{ env.nuget_feed_nuget }} --skip-duplicate diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..464d916 --- /dev/null +++ b/.gitignore @@ -0,0 +1,168 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates +.DS_Store + +# Release output from CustomElements - Wasm +src/hosts/Elsa.Studio.Host.CustomElements/wasm + +# React public folder +samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/public + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# Rider is a cross-platform .NET IDE +.idea/ + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +bower_components/ + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# OpenCover UI analysis results +OpenCover/ + +# MSBuild Binary and Structured Log +*.binlog + +# Local History for Visual Studio +.localhistory/ + +src/modules/**/wwwroot/ +src/framework/**/wwwroot/ +src/modules/Elsa.Studio.Workflows.Designer/ClientLib/package-lock.json +src/modules/Elsa.Studio.DomInterop/ClientLib/package-lock.json +src/framework/Elsa.Studio.DomInterop/ClientLib/package-lock.json + +src/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/package-lock.json + +src/wrappers/.npmrc +.vs \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..089dc31 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,32 @@ + + + net8.0;net9.0 + latest + Elsa Workflows Community + 2023 + https://github.com/elsa-workflows/elsa-studio + https://github.com/elsa-workflows/elsa-studio + git + enable + enable + MIT + icon.png + + + https://v3.elsaworkflows.io/nuget-icon.png + + true + Default + latest + + + true + snupkg + true + + + + + + + \ No newline at end of file diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 0000000..91c3cee --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,62 @@ + + + true + false + + + 3.5.0 + 9.0.8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Elsa.Studio-Core.sln b/Elsa.Studio-Core.sln new file mode 100644 index 0000000..738f724 --- /dev/null +++ b/Elsa.Studio-Core.sln @@ -0,0 +1,287 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{875A7E2E-4B7C-4AF0-A71E-3980B73AF363}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{C5E5655F-9B0D-4A93-9D0D-58216E8DE9C1}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + README.md = README.md + LICENSE = LICENSE + NuGet.Config = NuGet.Config + Directory.Build.props = Directory.Build.props + Directory.Packages.props = Directory.Packages.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{B7464426-9B29-4CF9-9B9C-6941D9E99060}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{0D17508F-2117-49C0-B661-4F3118C8126C}" + ProjectSection(SolutionItems) = preProject + .github\workflows\packages.yml = .github\workflows\packages.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "apps", "apps", "{2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{D66B9A40-8608-46F3-9868-625C50EACE43}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Host.Wasm", "src\hosts\Elsa.Studio.Host.Wasm\Elsa.Studio.Host.Wasm.csproj", "{B61B3A06-5AF3-4007-9D22-18A319549156}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Host.Server", "src\hosts\Elsa.Studio.Host.Server\Elsa.Studio.Host.Server.csproj", "{CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "framework", "framework", "{C5288F1B-F4E5-423C-AEE8-049996613668}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Shell", "src\framework\Elsa.Studio.Shell\Elsa.Studio.Shell.csproj", "{7F1322EB-7314-47A7-9F03-7D8CB31097C8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.DomInterop", "src\framework\Elsa.Studio.DomInterop\Elsa.Studio.DomInterop.csproj", "{B15E4EAF-62C3-4D3B-B12D-4119D517728C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Shared", "src\framework\Elsa.Studio.Shared\Elsa.Studio.Shared.csproj", "{21B6A662-8DB2-452E-95E7-3E4227D1544A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bundles", "bundles", "{6BF88129-D74E-46FA-89A4-29B9FBAEC241}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio", "src\bundles\Elsa.Studio\Elsa.Studio.csproj", "{6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Host.CustomElements", "src\hosts\Elsa.Studio.Host.CustomElements\Elsa.Studio.Host.CustomElements.csproj", "{8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.ActivityPortProviders", "src\modules\Elsa.Studio.ActivityPortProviders\Elsa.Studio.ActivityPortProviders.csproj", "{B831EE86-F713-4466-B91D-FA66EDCC2E30}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Core", "src\framework\Elsa.Studio.Core\Elsa.Studio.Core.csproj", "{C5D998F4-4523-49AF-9F0F-7BCDACA58790}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Core.BlazorServer", "src\framework\Elsa.Studio.Core.BlazorServer\Elsa.Studio.Core.BlazorServer.csproj", "{2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Core.BlazorWasm", "src\framework\Elsa.Studio.Core.BlazorWasm\Elsa.Studio.Core.BlazorWasm.csproj", "{565B61D8-C67A-449B-BAE6-BEAC95E52B8F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Counter", "src\modules\Elsa.Studio.Counter\Elsa.Studio.Counter.csproj", "{5DE5EFD1-00C0-4797-BFC3-8989ACF52165}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Dashboard", "src\modules\Elsa.Studio.Dashboard\Elsa.Studio.Dashboard.csproj", "{5161EB5E-9301-4A43-A7CC-CDC665CD7B93}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Environments", "src\modules\Elsa.Studio.Environments\Elsa.Studio.Environments.csproj", "{7A30797E-A1BF-4128-BB23-D8B00CDD59FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Login", "src\modules\Elsa.Studio.Login\Elsa.Studio.Login.csproj", "{AC76C31B-75F0-473C-8F96-DE77AFF76536}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Login.BlazorServer", "src\modules\Elsa.Studio.Login.BlazorServer\Elsa.Studio.Login.BlazorServer.csproj", "{B5CF2E45-29A0-4101-90C3-2E6C31142F8F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Login.BlazorWasm", "src\modules\Elsa.Studio.Login.BlazorWasm\Elsa.Studio.Login.BlazorWasm.csproj", "{5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Secrets", "src\modules\Elsa.Studio.Secrets\Elsa.Studio.Secrets.csproj", "{00956738-21BD-4D78-B9AF-67CD0A8B6440}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Security", "src\modules\Elsa.Studio.Security\Elsa.Studio.Security.csproj", "{435D5AF5-D06C-47A6-94B0-9B31016250DC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.UIHints", "src\modules\Elsa.Studio.UIHints\Elsa.Studio.UIHints.csproj", "{C15D23AC-26CA-447D-B441-75407FD79A6A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Webhooks", "src\modules\Elsa.Studio.Webhooks\Elsa.Studio.Webhooks.csproj", "{C18714D2-7205-491D-AD2E-154876F7A77F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Workflows.Core", "src\modules\Elsa.Studio.Workflows.Core\Elsa.Studio.Workflows.Core.csproj", "{F85F11D4-8D22-4119-B212-2CD19DDFB0B4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Workflows", "src\modules\Elsa.Studio.Workflows\Elsa.Studio.Workflows.csproj", "{AF48A447-22AF-4C94-8C5D-2B47FD90484C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Workflows.Designer", "src\modules\Elsa.Studio.Workflows.Designer\Elsa.Studio.Workflows.Designer.csproj", "{E55917F6-388C-47FB-922B-ADE3D1AF5D6E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.WorkflowContexts", "src\modules\Elsa.Studio.WorkflowContexts\Elsa.Studio.WorkflowContexts.csproj", "{2C40C5CB-634B-45DA-8F65-F0D460C1CB63}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{D2254084-0C4A-42F3-A2D9-A2C9BCE1114E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorApp1", "samples\BlazorApp1\BlazorApp1.csproj", "{FAE56DEE-A51D-4FC7-AF42-D298BE59D8EE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "shared", "{F4B408E1-5169-4FA9-B2D7-2377634C4DEE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Api.Client", "..\..\elsa-core\main\src\clients\Elsa.Api.Client\Elsa.Api.Client.csproj", "{26ECE061-0F39-4945-8356-EF14E67A8F39}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Agents", "src\modules\Elsa.Studio.Agents\Elsa.Studio.Agents.csproj", "{BDAB9EEA-3083-41D8-933A-E848D346EB2E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Secrets.Models", "..\..\elsa-core\main\src\modules\Elsa.Secrets.Models\Elsa.Secrets.Models.csproj", "{C3681176-1FB1-4B63-BEC7-34DB9813E88D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Localization", "src\modules\Elsa.Studio.Localization\Elsa.Studio.Localization.csproj", "{69695115-160C-498F-A6FE-528A908391AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Localization.BlazorServer", "src\modules\Elsa.Studio.Localization.BlazorServer\Elsa.Studio.Localization.BlazorServer.csproj", "{A37FA04C-BDEE-4790-9433-9BAE05C06B4D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Localization.BlazorWasm", "src\modules\Elsa.Studio.Localization.BlazorWasm\Elsa.Studio.Localization.BlazorWasm.csproj", "{2B7AB46C-F269-4FF5-B6B2-C73CF1C772DB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Translations", "src\framework\Elsa.Studio.Translations\Elsa.Studio.Translations.csproj", "{DEFD3B1C-BCD1-4442-BF4B-6517FF19ECBC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elsa", "elsa", "{7A0B2C03-0725-499E-B739-3FB41983B679}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Api.Client", "..\..\elsa-core\3.5.0\src\clients\Elsa.Api.Client\Elsa.Api.Client.csproj", "{CED02683-4B65-496B-B0B6-2EB0F1F179F9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B61B3A06-5AF3-4007-9D22-18A319549156}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B61B3A06-5AF3-4007-9D22-18A319549156}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B61B3A06-5AF3-4007-9D22-18A319549156}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B61B3A06-5AF3-4007-9D22-18A319549156}.Release|Any CPU.Build.0 = Release|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Release|Any CPU.Build.0 = Release|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Release|Any CPU.Build.0 = Release|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Release|Any CPU.Build.0 = Release|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Release|Any CPU.Build.0 = Release|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Release|Any CPU.Build.0 = Release|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Release|Any CPU.Build.0 = Release|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Release|Any CPU.Build.0 = Release|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Release|Any CPU.Build.0 = Release|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Release|Any CPU.Build.0 = Release|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Release|Any CPU.Build.0 = Release|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Release|Any CPU.Build.0 = Release|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Release|Any CPU.Build.0 = Release|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Release|Any CPU.Build.0 = Release|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Release|Any CPU.Build.0 = Release|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Release|Any CPU.Build.0 = Release|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Release|Any CPU.Build.0 = Release|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Release|Any CPU.Build.0 = Release|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Release|Any CPU.Build.0 = Release|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Release|Any CPU.Build.0 = Release|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Release|Any CPU.Build.0 = Release|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Release|Any CPU.Build.0 = Release|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Release|Any CPU.Build.0 = Release|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Release|Any CPU.Build.0 = Release|Any CPU + {2C40C5CB-634B-45DA-8F65-F0D460C1CB63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C40C5CB-634B-45DA-8F65-F0D460C1CB63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C40C5CB-634B-45DA-8F65-F0D460C1CB63}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C40C5CB-634B-45DA-8F65-F0D460C1CB63}.Release|Any CPU.Build.0 = Release|Any CPU + {FAE56DEE-A51D-4FC7-AF42-D298BE59D8EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAE56DEE-A51D-4FC7-AF42-D298BE59D8EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAE56DEE-A51D-4FC7-AF42-D298BE59D8EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAE56DEE-A51D-4FC7-AF42-D298BE59D8EE}.Release|Any CPU.Build.0 = Release|Any CPU + {26ECE061-0F39-4945-8356-EF14E67A8F39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26ECE061-0F39-4945-8356-EF14E67A8F39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26ECE061-0F39-4945-8356-EF14E67A8F39}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26ECE061-0F39-4945-8356-EF14E67A8F39}.Release|Any CPU.Build.0 = Release|Any CPU + {BDAB9EEA-3083-41D8-933A-E848D346EB2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BDAB9EEA-3083-41D8-933A-E848D346EB2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDAB9EEA-3083-41D8-933A-E848D346EB2E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BDAB9EEA-3083-41D8-933A-E848D346EB2E}.Release|Any CPU.Build.0 = Release|Any CPU + {C3681176-1FB1-4B63-BEC7-34DB9813E88D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3681176-1FB1-4B63-BEC7-34DB9813E88D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3681176-1FB1-4B63-BEC7-34DB9813E88D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3681176-1FB1-4B63-BEC7-34DB9813E88D}.Release|Any CPU.Build.0 = Release|Any CPU + {69695115-160C-498F-A6FE-528A908391AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69695115-160C-498F-A6FE-528A908391AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69695115-160C-498F-A6FE-528A908391AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69695115-160C-498F-A6FE-528A908391AF}.Release|Any CPU.Build.0 = Release|Any CPU + {A37FA04C-BDEE-4790-9433-9BAE05C06B4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A37FA04C-BDEE-4790-9433-9BAE05C06B4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A37FA04C-BDEE-4790-9433-9BAE05C06B4D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A37FA04C-BDEE-4790-9433-9BAE05C06B4D}.Release|Any CPU.Build.0 = Release|Any CPU + {2B7AB46C-F269-4FF5-B6B2-C73CF1C772DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B7AB46C-F269-4FF5-B6B2-C73CF1C772DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B7AB46C-F269-4FF5-B6B2-C73CF1C772DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B7AB46C-F269-4FF5-B6B2-C73CF1C772DB}.Release|Any CPU.Build.0 = Release|Any CPU + {DEFD3B1C-BCD1-4442-BF4B-6517FF19ECBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEFD3B1C-BCD1-4442-BF4B-6517FF19ECBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEFD3B1C-BCD1-4442-BF4B-6517FF19ECBC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEFD3B1C-BCD1-4442-BF4B-6517FF19ECBC}.Release|Any CPU.Build.0 = Release|Any CPU + {CED02683-4B65-496B-B0B6-2EB0F1F179F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CED02683-4B65-496B-B0B6-2EB0F1F179F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CED02683-4B65-496B-B0B6-2EB0F1F179F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CED02683-4B65-496B-B0B6-2EB0F1F179F9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {D66B9A40-8608-46F3-9868-625C50EACE43} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {B61B3A06-5AF3-4007-9D22-18A319549156} = {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6} = {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} + {C5288F1B-F4E5-423C-AEE8-049996613668} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {7F1322EB-7314-47A7-9F03-7D8CB31097C8} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {B15E4EAF-62C3-4D3B-B12D-4119D517728C} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {21B6A662-8DB2-452E-95E7-3E4227D1544A} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {6BF88129-D74E-46FA-89A4-29B9FBAEC241} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D} = {6BF88129-D74E-46FA-89A4-29B9FBAEC241} + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8} = {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} + {C5D998F4-4523-49AF-9F0F-7BCDACA58790} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {B831EE86-F713-4466-B91D-FA66EDCC2E30} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {AF48A447-22AF-4C94-8C5D-2B47FD90484C} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {AC76C31B-75F0-473C-8F96-DE77AFF76536} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {00956738-21BD-4D78-B9AF-67CD0A8B6440} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {435D5AF5-D06C-47A6-94B0-9B31016250DC} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {C15D23AC-26CA-447D-B441-75407FD79A6A} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {C18714D2-7205-491D-AD2E-154876F7A77F} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {2C40C5CB-634B-45DA-8F65-F0D460C1CB63} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {FAE56DEE-A51D-4FC7-AF42-D298BE59D8EE} = {D2254084-0C4A-42F3-A2D9-A2C9BCE1114E} + {26ECE061-0F39-4945-8356-EF14E67A8F39} = {F4B408E1-5169-4FA9-B2D7-2377634C4DEE} + {BDAB9EEA-3083-41D8-933A-E848D346EB2E} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {C3681176-1FB1-4B63-BEC7-34DB9813E88D} = {F4B408E1-5169-4FA9-B2D7-2377634C4DEE} + {69695115-160C-498F-A6FE-528A908391AF} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {A37FA04C-BDEE-4790-9433-9BAE05C06B4D} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {2B7AB46C-F269-4FF5-B6B2-C73CF1C772DB} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {DEFD3B1C-BCD1-4442-BF4B-6517FF19ECBC} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {CED02683-4B65-496B-B0B6-2EB0F1F179F9} = {7A0B2C03-0725-499E-B739-3FB41983B679} + EndGlobalSection +EndGlobal diff --git a/Elsa.Studio-Core.sln.DotSettings b/Elsa.Studio-Core.sln.DotSettings new file mode 100644 index 0000000..410d494 --- /dev/null +++ b/Elsa.Studio-Core.sln.DotSettings @@ -0,0 +1,12 @@ + + IF_OWNER_IS_SINGLE_LINE + UI + True + True + True + True + True + True + True + True + True \ No newline at end of file diff --git a/Elsa.Studio.sln b/Elsa.Studio.sln new file mode 100644 index 0000000..ca16b88 --- /dev/null +++ b/Elsa.Studio.sln @@ -0,0 +1,264 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.11.35327.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{875A7E2E-4B7C-4AF0-A71E-3980B73AF363}" + ProjectSection(SolutionItems) = preProject + src\Directory.Build.props = src\Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution", "solution", "{C5E5655F-9B0D-4A93-9D0D-58216E8DE9C1}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + Directory.Build.props = Directory.Build.props + Directory.Packages.props = Directory.Packages.props + LICENSE = LICENSE + NuGet.Config = NuGet.Config + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{B7464426-9B29-4CF9-9B9C-6941D9E99060}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{0D17508F-2117-49C0-B661-4F3118C8126C}" + ProjectSection(SolutionItems) = preProject + .github\workflows\packages.yml = .github\workflows\packages.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hosts", "hosts", "{2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{D66B9A40-8608-46F3-9868-625C50EACE43}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Host.Wasm", "src\hosts\Elsa.Studio.Host.Wasm\Elsa.Studio.Host.Wasm.csproj", "{B61B3A06-5AF3-4007-9D22-18A319549156}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Host.Server", "src\hosts\Elsa.Studio.Host.Server\Elsa.Studio.Host.Server.csproj", "{CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "framework", "framework", "{C5288F1B-F4E5-423C-AEE8-049996613668}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Shell", "src\framework\Elsa.Studio.Shell\Elsa.Studio.Shell.csproj", "{7F1322EB-7314-47A7-9F03-7D8CB31097C8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.DomInterop", "src\framework\Elsa.Studio.DomInterop\Elsa.Studio.DomInterop.csproj", "{B15E4EAF-62C3-4D3B-B12D-4119D517728C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Shared", "src\framework\Elsa.Studio.Shared\Elsa.Studio.Shared.csproj", "{21B6A662-8DB2-452E-95E7-3E4227D1544A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bundles", "bundles", "{6BF88129-D74E-46FA-89A4-29B9FBAEC241}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio", "src\bundles\Elsa.Studio\Elsa.Studio.csproj", "{6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Host.CustomElements", "src\hosts\Elsa.Studio.Host.CustomElements\Elsa.Studio.Host.CustomElements.csproj", "{8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.ActivityPortProviders", "src\modules\Elsa.Studio.ActivityPortProviders\Elsa.Studio.ActivityPortProviders.csproj", "{B831EE86-F713-4466-B91D-FA66EDCC2E30}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Core", "src\framework\Elsa.Studio.Core\Elsa.Studio.Core.csproj", "{C5D998F4-4523-49AF-9F0F-7BCDACA58790}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Core.BlazorServer", "src\framework\Elsa.Studio.Core.BlazorServer\Elsa.Studio.Core.BlazorServer.csproj", "{2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Core.BlazorWasm", "src\framework\Elsa.Studio.Core.BlazorWasm\Elsa.Studio.Core.BlazorWasm.csproj", "{565B61D8-C67A-449B-BAE6-BEAC95E52B8F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Counter", "src\modules\Elsa.Studio.Counter\Elsa.Studio.Counter.csproj", "{5DE5EFD1-00C0-4797-BFC3-8989ACF52165}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Dashboard", "src\modules\Elsa.Studio.Dashboard\Elsa.Studio.Dashboard.csproj", "{5161EB5E-9301-4A43-A7CC-CDC665CD7B93}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Environments", "src\modules\Elsa.Studio.Environments\Elsa.Studio.Environments.csproj", "{7A30797E-A1BF-4128-BB23-D8B00CDD59FD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Login", "src\modules\Elsa.Studio.Login\Elsa.Studio.Login.csproj", "{AC76C31B-75F0-473C-8F96-DE77AFF76536}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Login.BlazorServer", "src\modules\Elsa.Studio.Login.BlazorServer\Elsa.Studio.Login.BlazorServer.csproj", "{B5CF2E45-29A0-4101-90C3-2E6C31142F8F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Login.BlazorWasm", "src\modules\Elsa.Studio.Login.BlazorWasm\Elsa.Studio.Login.BlazorWasm.csproj", "{5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Secrets", "src\modules\Elsa.Studio.Secrets\Elsa.Studio.Secrets.csproj", "{00956738-21BD-4D78-B9AF-67CD0A8B6440}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Security", "src\modules\Elsa.Studio.Security\Elsa.Studio.Security.csproj", "{435D5AF5-D06C-47A6-94B0-9B31016250DC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.UIHints", "src\modules\Elsa.Studio.UIHints\Elsa.Studio.UIHints.csproj", "{C15D23AC-26CA-447D-B441-75407FD79A6A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Webhooks", "src\modules\Elsa.Studio.Webhooks\Elsa.Studio.Webhooks.csproj", "{C18714D2-7205-491D-AD2E-154876F7A77F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Workflows.Core", "src\modules\Elsa.Studio.Workflows.Core\Elsa.Studio.Workflows.Core.csproj", "{F85F11D4-8D22-4119-B212-2CD19DDFB0B4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Workflows", "src\modules\Elsa.Studio.Workflows\Elsa.Studio.Workflows.csproj", "{AF48A447-22AF-4C94-8C5D-2B47FD90484C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Workflows.Designer", "src\modules\Elsa.Studio.Workflows.Designer\Elsa.Studio.Workflows.Designer.csproj", "{E55917F6-388C-47FB-922B-ADE3D1AF5D6E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.WorkflowContexts", "src\modules\Elsa.Studio.WorkflowContexts\Elsa.Studio.WorkflowContexts.csproj", "{AFF99B0F-8243-449C-8AA3-4A087D3DE575}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Localization", "src\modules\Elsa.Studio.Localization\Elsa.Studio.Localization.csproj", "{F3C53AFF-EBE5-447D-AF4D-136F18761733}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Studio.Localization.BlazorServer", "src\modules\Elsa.Studio.Localization.BlazorServer\Elsa.Studio.Localization.BlazorServer.csproj", "{F5BBEF8A-D75E-442E-A2E7-EEF5F04335A5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Localization.BlazorWasm", "src\modules\Elsa.Studio.Localization.BlazorWasm\Elsa.Studio.Localization.BlazorWasm.csproj", "{DE57FD2C-3874-486A-89B1-D982726A1189}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Translations", "src\framework\Elsa.Studio.Translations\Elsa.Studio.Translations.csproj", "{76C60D97-FA22-4023-BDB3-6BC47D097E40}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Studio.Host.HostedWasm", "src\hosts\Elsa.Studio.Host.HostedWasm\Elsa.Studio.Host.HostedWasm.csproj", "{25BA3052-4F17-4D24-9AE9-01FBD75E8804}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B61B3A06-5AF3-4007-9D22-18A319549156}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B61B3A06-5AF3-4007-9D22-18A319549156}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B61B3A06-5AF3-4007-9D22-18A319549156}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B61B3A06-5AF3-4007-9D22-18A319549156}.Release|Any CPU.Build.0 = Release|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6}.Release|Any CPU.Build.0 = Release|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F1322EB-7314-47A7-9F03-7D8CB31097C8}.Release|Any CPU.Build.0 = Release|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B15E4EAF-62C3-4D3B-B12D-4119D517728C}.Release|Any CPU.Build.0 = Release|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21B6A662-8DB2-452E-95E7-3E4227D1544A}.Release|Any CPU.Build.0 = Release|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D}.Release|Any CPU.Build.0 = Release|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8}.Release|Any CPU.Build.0 = Release|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B831EE86-F713-4466-B91D-FA66EDCC2E30}.Release|Any CPU.Build.0 = Release|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5D998F4-4523-49AF-9F0F-7BCDACA58790}.Release|Any CPU.Build.0 = Release|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48}.Release|Any CPU.Build.0 = Release|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F}.Release|Any CPU.Build.0 = Release|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165}.Release|Any CPU.Build.0 = Release|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93}.Release|Any CPU.Build.0 = Release|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD}.Release|Any CPU.Build.0 = Release|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC76C31B-75F0-473C-8F96-DE77AFF76536}.Release|Any CPU.Build.0 = Release|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F}.Release|Any CPU.Build.0 = Release|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD}.Release|Any CPU.Build.0 = Release|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00956738-21BD-4D78-B9AF-67CD0A8B6440}.Release|Any CPU.Build.0 = Release|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {435D5AF5-D06C-47A6-94B0-9B31016250DC}.Release|Any CPU.Build.0 = Release|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C15D23AC-26CA-447D-B441-75407FD79A6A}.Release|Any CPU.Build.0 = Release|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C18714D2-7205-491D-AD2E-154876F7A77F}.Release|Any CPU.Build.0 = Release|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4}.Release|Any CPU.Build.0 = Release|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF48A447-22AF-4C94-8C5D-2B47FD90484C}.Release|Any CPU.Build.0 = Release|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E}.Release|Any CPU.Build.0 = Release|Any CPU + {AFF99B0F-8243-449C-8AA3-4A087D3DE575}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFF99B0F-8243-449C-8AA3-4A087D3DE575}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFF99B0F-8243-449C-8AA3-4A087D3DE575}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFF99B0F-8243-449C-8AA3-4A087D3DE575}.Release|Any CPU.Build.0 = Release|Any CPU + {F3C53AFF-EBE5-447D-AF4D-136F18761733}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3C53AFF-EBE5-447D-AF4D-136F18761733}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3C53AFF-EBE5-447D-AF4D-136F18761733}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3C53AFF-EBE5-447D-AF4D-136F18761733}.Release|Any CPU.Build.0 = Release|Any CPU + {F5BBEF8A-D75E-442E-A2E7-EEF5F04335A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F5BBEF8A-D75E-442E-A2E7-EEF5F04335A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5BBEF8A-D75E-442E-A2E7-EEF5F04335A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F5BBEF8A-D75E-442E-A2E7-EEF5F04335A5}.Release|Any CPU.Build.0 = Release|Any CPU + {DE57FD2C-3874-486A-89B1-D982726A1189}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE57FD2C-3874-486A-89B1-D982726A1189}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE57FD2C-3874-486A-89B1-D982726A1189}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE57FD2C-3874-486A-89B1-D982726A1189}.Release|Any CPU.Build.0 = Release|Any CPU + {76C60D97-FA22-4023-BDB3-6BC47D097E40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76C60D97-FA22-4023-BDB3-6BC47D097E40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76C60D97-FA22-4023-BDB3-6BC47D097E40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76C60D97-FA22-4023-BDB3-6BC47D097E40}.Release|Any CPU.Build.0 = Release|Any CPU + {25BA3052-4F17-4D24-9AE9-01FBD75E8804}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25BA3052-4F17-4D24-9AE9-01FBD75E8804}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25BA3052-4F17-4D24-9AE9-01FBD75E8804}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25BA3052-4F17-4D24-9AE9-01FBD75E8804}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {D66B9A40-8608-46F3-9868-625C50EACE43} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {B61B3A06-5AF3-4007-9D22-18A319549156} = {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} + {CE71F7A2-3AB3-4475-B7F4-CF5128D0A4F6} = {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} + {C5288F1B-F4E5-423C-AEE8-049996613668} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {7F1322EB-7314-47A7-9F03-7D8CB31097C8} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {B15E4EAF-62C3-4D3B-B12D-4119D517728C} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {21B6A662-8DB2-452E-95E7-3E4227D1544A} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {6BF88129-D74E-46FA-89A4-29B9FBAEC241} = {875A7E2E-4B7C-4AF0-A71E-3980B73AF363} + {6029D546-A5DB-4B75-8DE4-BFB83EB2A24D} = {6BF88129-D74E-46FA-89A4-29B9FBAEC241} + {8A9DBE4A-A03F-44C9-9AB2-74AA973D72A8} = {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} + {B831EE86-F713-4466-B91D-FA66EDCC2E30} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {C5D998F4-4523-49AF-9F0F-7BCDACA58790} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {2FC3CE4B-02D3-4808-828E-F4D84FFD1E48} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {565B61D8-C67A-449B-BAE6-BEAC95E52B8F} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {5DE5EFD1-00C0-4797-BFC3-8989ACF52165} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {5161EB5E-9301-4A43-A7CC-CDC665CD7B93} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {7A30797E-A1BF-4128-BB23-D8B00CDD59FD} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {AC76C31B-75F0-473C-8F96-DE77AFF76536} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {B5CF2E45-29A0-4101-90C3-2E6C31142F8F} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {5A3139DC-0FFB-4B44-8BF1-38F29C6133CD} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {00956738-21BD-4D78-B9AF-67CD0A8B6440} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {435D5AF5-D06C-47A6-94B0-9B31016250DC} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {C15D23AC-26CA-447D-B441-75407FD79A6A} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {C18714D2-7205-491D-AD2E-154876F7A77F} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {F85F11D4-8D22-4119-B212-2CD19DDFB0B4} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {AF48A447-22AF-4C94-8C5D-2B47FD90484C} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {E55917F6-388C-47FB-922B-ADE3D1AF5D6E} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {AFF99B0F-8243-449C-8AA3-4A087D3DE575} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {F3C53AFF-EBE5-447D-AF4D-136F18761733} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {F5BBEF8A-D75E-442E-A2E7-EEF5F04335A5} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {DE57FD2C-3874-486A-89B1-D982726A1189} = {D66B9A40-8608-46F3-9868-625C50EACE43} + {76C60D97-FA22-4023-BDB3-6BC47D097E40} = {C5288F1B-F4E5-423C-AEE8-049996613668} + {25BA3052-4F17-4D24-9AE9-01FBD75E8804} = {2AA1AEE9-017E-4F8B-B5FC-2BEA37E83514} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5B8719CC-CF87-45E1-BE1A-13842F951B28} + EndGlobalSection +EndGlobal diff --git a/Elsa.Studio.sln.DotSettings b/Elsa.Studio.sln.DotSettings new file mode 100644 index 0000000..2c114d9 --- /dev/null +++ b/Elsa.Studio.sln.DotSettings @@ -0,0 +1,13 @@ + + False + JS + UI + True + True + True + True + True + True + True + True + True \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..737c5cd --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Elsa Workflows + +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: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 0000000..85089f0 --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/NuGet.rar b/NuGet.rar new file mode 100644 index 0000000000000000000000000000000000000000..9779f4394c7daeb4da19ceac4fc12baebc67154b GIT binary patch literal 380 zcmV-?0fYWhVR9iF2LS-{;ezW60R;yD1_1$pfPer)gSFf#0s{-K0tCwkfB{%nvZR0m z01QrbM`d&_LvLFvjW~$S&CJKTKcU5~?&i0x=6l~i7OlTD8p5fwE}bxU zpSlATF|AWmE|@EHkoZBX%Qk3$RLL~8)R$ar0BgL7iH>y2TGj@Po4`%BAAk}Gm>{{n+F@yz^WWkYyLb4ye;xmaHoSlCw^-CGKE;ea? z#vIRxmyQ^F6Jkhj%=f`^V;u(G4HwdGdR$ZO>_bP-mN%`{s6HRD;V)|P`i=|R_RpQy aPrvd7WTdc({rC_&{ha_EcUDmY1q1+3ZmReI literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..c8fabe3 --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# Elsa Studio + + +

+ Elsa Studio workflow designer +

+
+ +[![Nuget](https://img.shields.io/nuget/v/elsa)](https://www.nuget.org/packages/Elsa.Studio.Shell/) +[![Build status](https://github.com/elsa-workflows/elsa-studio/actions/workflows/packages.yml/badge.svg?branch=main)](https://github.com/elsa-workflows/elsa-studio/actions/workflows/packages.yml) +[![Discord](https://img.shields.io/discord/814605913783795763?label=chat&logo=discord)](https://discord.gg/hhChk5H472) +[![Stack Overflow questions](https://img.shields.io/badge/stackoverflow-elsa_workflows-orange.svg)]( http://stackoverflow.com/questions/tagged/elsa-workflows ) +[![Translation status](https://hosted.weblate.org/widget/elsa-studio/svg-badge.svg)](https://hosted.weblate.org/engage/elsa-studio/) + +Elsa Studio is a modular, extensible application framework built with MudBlazor and is used to manage Elsa workflows and related entities. + +## Prerequisites + +- **.NET SDK**: Ensure you have both [.NET 8](https://dotnet.microsoft.com/download/dotnet/8.0) and [.NET 9](https://dotnet.microsoft.com/download/dotnet/9.0) SDKs installed. +- **Node.js and npm**: Install [Node.js](https://nodejs.org/) (which includes npm) for the frontend tooling. + +## Setup + +1. **Clone the repository**: `git clone https://github.com/elsa-workflows/elsa-studio.git` +2. **Navigate to the project directory**: `cd elsa-studio` + +## Before you build + +There are some assets that require `NPM` to build the assets prior to the project building. These have been configured to use an MSBUILD pre-build step and should not require any extra +steps but should you run into any issues or want to build these ahead of time, take the following steps + +1. **Navigate to ClientLib folder in Elsa.Studio.DomInterop**: `cd .\src\framework\Elsa.Studio.DomInterop\ClientLib` +1. **Get `NPM` ready to run**: `npm install` +1. **Build the assets**: `npm run build` +1. **Navigate to ClientLib folder in Elsa.Studio.Workflows.Designer**: `cd .\src\modules\Elsa.Studio.Workflows.Designer\ClientLib` +1. **Get `NPM` ready to run**: `npm install` +1. **Build the assets**: `npm run build` + +## Build and Run + +1. **Restore .NET dependencies**: `dotnet restore Elsa.Studio.sln` +1. **Build the project**: `dotnet build Elsa.Studio.sln` +1. **For Blazor Server Host**: `dotnet run --project .\src\hosts\Elsa.Studio.Host.Server\Elsa.Studio.Host.Server.csproj ` +1. **For Blazor Server WASM**: `dotnet run --project .\src\hosts\Elsa.Studio.Host.Wasm\Elsa.Studio.Host.Wasm.csproj` + +Explore the [Elsa Studio GitHub repository](https://github.com/elsa-workflows/elsa-studio) for more detailed information. + +## Localization + +Elsa Studio is translated using [Weblate](https://hosted.weblate.org/engage/elsa-studio/) + + +Translation status + diff --git a/artwork/screenshot-1.png b/artwork/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..854f7309592e90f2a94550e71154ba8d1a2dc68b GIT binary patch literal 236077 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 z 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 Hu0mjfYPIgV literal 0 HcmV?d00001 diff --git a/samples/BlazorApp1/BlazorApp1.csproj b/samples/BlazorApp1/BlazorApp1.csproj new file mode 100644 index 0000000..c815dfa --- /dev/null +++ b/samples/BlazorApp1/BlazorApp1.csproj @@ -0,0 +1,11 @@ + + + + net8.0 + + + + + + + diff --git a/samples/BlazorApp1/Components/App.razor b/samples/BlazorApp1/Components/App.razor new file mode 100644 index 0000000..d92228e --- /dev/null +++ b/samples/BlazorApp1/Components/App.razor @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Layout/MainLayout.razor b/samples/BlazorApp1/Components/Layout/MainLayout.razor new file mode 100644 index 0000000..ebc70e0 --- /dev/null +++ b/samples/BlazorApp1/Components/Layout/MainLayout.razor @@ -0,0 +1,15 @@ +@inherits LayoutComponentBase + + + + +@Body + +
+ An unhandled error has occurred. + Reload + 🗙 +
\ No newline at end of file diff --git a/samples/BlazorApp1/Components/Layout/MainLayout.razor.css b/samples/BlazorApp1/Components/Layout/MainLayout.razor.css new file mode 100644 index 0000000..038baf1 --- /dev/null +++ b/samples/BlazorApp1/Components/Layout/MainLayout.razor.css @@ -0,0 +1,96 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/samples/BlazorApp1/Components/Pages/Counter.razor b/samples/BlazorApp1/Components/Pages/Counter.razor new file mode 100644 index 0000000..b72f6bf --- /dev/null +++ b/samples/BlazorApp1/Components/Pages/Counter.razor @@ -0,0 +1,20 @@ +@page "/" +@rendermode InteractiveServer + +Counter + +

Counter

+ +

Current count: @currentCount

+ + + +@code { + private int currentCount = 0; + + private void IncrementCount() + { + currentCount++; + } + +} \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Pages/Error.razor b/samples/BlazorApp1/Components/Pages/Error.razor new file mode 100644 index 0000000..9d7c6be --- /dev/null +++ b/samples/BlazorApp1/Components/Pages/Error.razor @@ -0,0 +1,36 @@ +@page "/Error" +@using System.Diagnostics + +Error + +

Error.

+

An error occurred while processing your request.

+ +@if (ShowRequestId) +{ +

+ Request ID: @RequestId +

+} + +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+ +@code{ + [CascadingParameter] private HttpContext? HttpContext { get; set; } + + private string? RequestId { get; set; } + private bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + protected override void OnInitialized() => + RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier; + +} \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Pages/Weather.razor b/samples/BlazorApp1/Components/Pages/Weather.razor new file mode 100644 index 0000000..f31f2ee --- /dev/null +++ b/samples/BlazorApp1/Components/Pages/Weather.razor @@ -0,0 +1,67 @@ +@page "/weather" +@attribute [StreamRendering] + +Weather + +

Weather

+ +

This component demonstrates showing data.

+ +@if (forecasts == null) +{ +

+ Loading... +

+} +else +{ + + + + + + + + + + + @foreach (var forecast in forecasts) + { + + + + + + + } + +
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
+} + +@code { + private WeatherForecast[]? forecasts; + + protected override async Task OnInitializedAsync() + { + // Simulate asynchronous loading to demonstrate streaming rendering + await Task.Delay(500); + + var startDate = DateOnly.FromDateTime(DateTime.Now); + var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; + forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = startDate.AddDays(index), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = summaries[Random.Shared.Next(summaries.Length)] + }).ToArray(); + } + + private class WeatherForecast + { + public DateOnly Date { get; set; } + public int TemperatureC { get; set; } + public string? Summary { get; set; } + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + } + +} \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Pages/WorkflowDefinitionEditor.razor b/samples/BlazorApp1/Components/Pages/WorkflowDefinitionEditor.razor new file mode 100644 index 0000000..dc10b99 --- /dev/null +++ b/samples/BlazorApp1/Components/Pages/WorkflowDefinitionEditor.razor @@ -0,0 +1,28 @@ +@page "/workflow-definitions/{definitionId}" +@using Elsa.Api.Client.Resources.WorkflowDefinitions.Models +@rendermode InteractiveServer + + +Get Current Version + +@code +{ + /// + /// The ID of the workflow definition to edit. + /// + [Parameter] + public string DefinitionId { get; set; } = default!; + + private WorkflowDefinitionEditorWrapper Editor { get; set; } = default!; + + private Task WorkflowDefinitionVersionSelected(WorkflowDefinition arg) + { + return Task.CompletedTask; + } + + private Task OnClick() + { + var selectedVersion = Editor.GetSelectedWorkflowDefinitionVersion(); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Pages/WorkflowDefinitions.razor b/samples/BlazorApp1/Components/Pages/WorkflowDefinitions.razor new file mode 100644 index 0000000..258542e --- /dev/null +++ b/samples/BlazorApp1/Components/Pages/WorkflowDefinitions.razor @@ -0,0 +1,12 @@ +@page "/workflow-definitions" +@rendermode InteractiveServer + + +@code { + [Inject] NavigationManager NavigationManager { get; set; } = default!; + + private void OnEditWorkflowDefinition(string definitionId) + { + NavigationManager.NavigateTo($"workflow-definitions/{definitionId}"); + } +} \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Pages/WorkflowInstanceViewer.razor b/samples/BlazorApp1/Components/Pages/WorkflowInstanceViewer.razor new file mode 100644 index 0000000..f74c041 --- /dev/null +++ b/samples/BlazorApp1/Components/Pages/WorkflowInstanceViewer.razor @@ -0,0 +1,12 @@ +@page "/workflow-instances/{instanceId}" +@rendermode InteractiveServer + + +@code +{ + /// + /// The ID of the workflow instance to edit. + /// + [Parameter] + public string InstanceId { get; set; } = default!; +} \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Pages/WorkflowInstances.razor b/samples/BlazorApp1/Components/Pages/WorkflowInstances.razor new file mode 100644 index 0000000..587e923 --- /dev/null +++ b/samples/BlazorApp1/Components/Pages/WorkflowInstances.razor @@ -0,0 +1,15 @@ +@page "/workflow-instances" + +@rendermode InteractiveServer + + +@code { + + [Inject] NavigationManager NavigationManager { get; set; } = default!; + + private void OnViewWorkflowInstance(string instanceId) + { + NavigationManager.NavigateTo($"workflow-instances/{instanceId}"); + } + +} \ No newline at end of file diff --git a/samples/BlazorApp1/Components/Routes.razor b/samples/BlazorApp1/Components/Routes.razor new file mode 100644 index 0000000..bf0ce0b --- /dev/null +++ b/samples/BlazorApp1/Components/Routes.razor @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/samples/BlazorApp1/Components/_Imports.razor b/samples/BlazorApp1/Components/_Imports.razor new file mode 100644 index 0000000..4ac6dfa --- /dev/null +++ b/samples/BlazorApp1/Components/_Imports.razor @@ -0,0 +1,12 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using BlazorApp1 +@using BlazorApp1.Components +@using Elsa.Studio.Host.CustomElements.Components +@using MudBlazor \ No newline at end of file diff --git a/samples/BlazorApp1/Program.cs b/samples/BlazorApp1/Program.cs new file mode 100644 index 0000000..d5505d7 --- /dev/null +++ b/samples/BlazorApp1/Program.cs @@ -0,0 +1,58 @@ +using BlazorApp1.Components; +using Elsa.Studio.Contracts; +using Elsa.Studio.Core.BlazorWasm.Extensions; +using Elsa.Studio.Extensions; +using Elsa.Studio.Host.CustomElements.HttpMessageHandlers; +using Elsa.Studio.Host.CustomElements.Services; +using Elsa.Studio.Models; +using Elsa.Studio.Shell.Extensions; +using Elsa.Studio.Workflows.Designer.Extensions; +using Elsa.Studio.Workflows.Extensions; +using Microsoft.Extensions.DependencyInjection.Extensions; + +var builder = WebApplication.CreateBuilder(args); +var configuration = builder.Configuration; + +// Add services to the container. +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(circuitOptions => circuitOptions.RootComponents.RegisterCustomElsaStudioElements()); + +// Register local services. +builder.Services.AddSingleton(); + +// Register the modules. +var backendApiConfig = new BackendApiConfig +{ + ConfigureBackendOptions = options => configuration.GetSection("Backend").Bind(options), + ConfigureHttpClientBuilder = options => + { + options.ApiKey = configuration["Backend:ApiKey"]; + options.AuthenticationHandler = typeof(AuthHttpMessageHandler); + } +}; + +builder.Services.AddCore(); +builder.Services.AddShell(); +builder.Services.AddRemoteBackend(backendApiConfig); +builder.Services.Replace(ServiceDescriptor.Scoped()); +builder.Services.AddWorkflowsModule(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error", createScopeForErrors: true); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); + +app.UseStaticFiles(); +app.UseAntiforgery(); + +app.MapRazorComponents() + .AddInteractiveServerRenderMode(); + +app.Run(); \ No newline at end of file diff --git a/samples/BlazorApp1/Properties/launchSettings.json b/samples/BlazorApp1/Properties/launchSettings.json new file mode 100644 index 0000000..d331b3d --- /dev/null +++ b/samples/BlazorApp1/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:22097", + "sslPort": 44321 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5046", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7231;http://localhost:5046", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } + } diff --git a/samples/BlazorApp1/appsettings.Development.json b/samples/BlazorApp1/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/samples/BlazorApp1/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/samples/BlazorApp1/appsettings.json b/samples/BlazorApp1/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/samples/BlazorApp1/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/samples/BlazorApp1/wwwroot/favicon.png b/samples/BlazorApp1/wwwroot/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8422b59695935d180d11d5dbe99653e711097819 GIT binary patch literal 1148 zcmV-?1cUpDP)9h26h2-Cs%i*@Moc3?#6qJID|D#|3|2Hn7gTIYEkr|%Xjp);YgvFmB&0#2E2b=| zkVr)lMv9=KqwN&%obTp-$<51T%rx*NCwceh-E+=&e(oLO`@Z~7gybJ#U|^tB2Pai} zRN@5%1qsZ1e@R(XC8n~)nU1S0QdzEYlWPdUpH{wJ2Pd4V8kI3BM=)sG^IkUXF2-j{ zrPTYA6sxpQ`Q1c6mtar~gG~#;lt=s^6_OccmRd>o{*=>)KS=lM zZ!)iG|8G0-9s3VLm`bsa6e ze*TlRxAjXtm^F8V`M1%s5d@tYS>&+_ga#xKGb|!oUBx3uc@mj1%=MaH4GR0tPBG_& z9OZE;->dO@`Q)nr<%dHAsEZRKl zedN6+3+uGHejJp;Q==pskSAcRcyh@6mjm2z-uG;s%dM-u0*u##7OxI7wwyCGpS?4U zBFAr(%GBv5j$jS@@t@iI8?ZqE36I^4t+P^J9D^ELbS5KMtZ z{Qn#JnSd$15nJ$ggkF%I4yUQC+BjDF^}AtB7w348EL>7#sAsLWs}ndp8^DsAcOIL9 zTOO!!0!k2`9BLk25)NeZp7ev>I1Mn={cWI3Yhx2Q#DnAo4IphoV~R^c0x&nw*MoIV zPthX?{6{u}sMS(MxD*dmd5rU(YazQE59b|TsB5Tm)I4a!VaN@HYOR)DwH1U5y(E)z zQqQU*B%MwtRQ$%x&;1p%ANmc|PkoFJZ%<-uq%PX&C!c-7ypis=eP+FCeuv+B@h#{4 zGx1m0PjS~FJt}3mdt4c!lel`1;4W|03kcZRG+DzkTy|7-F~eDsV2Tx!73dM0H0CTh zl)F-YUkE1zEzEW(;JXc|KR5{ox%YTh{$%F$a36JP6Nb<0%#NbSh$dMYF-{ z1_x(Vx)}fs?5_|!5xBTWiiIQHG<%)*e=45Fhjw_tlnmlixq;mUdC$R8v#j( zhQ$9YR-o%i5Uc`S?6EC51!bTRK=Xkyb<18FkCKnS2;o*qlij1YA@-nRpq#OMTX&RbL<^2q@0qja!uIvI;j$6>~k@IMwD42=8$$!+R^@5o6HX(*n~=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz", + "integrity": "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "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-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/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "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.22.5", + "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.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz", + "integrity": "sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", + "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", + "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-flow-strip-types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", + "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@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-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", + "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@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.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@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-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "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 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", + "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "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-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "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.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "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.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "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.2" + } + }, + "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/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@elsa-workflows/elsa-studio-wasm": { + "version": "3.0.0-preview.1", + "resolved": "https://f.feedz.io/elsa-workflows/elsa-3/npm/%40elsa-workflows%2felsa-studio-wasm/3.0.0-preview.1/download", + "integrity": "sha512-18Bxv9FBaGoUZHsmvFV9VN8wGvt8b2VO5dlXdNk5D6akNYdwypwkNakrgOhmr8+1TNnv2hc3sHTgaHyfaMex4A==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "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/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/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/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "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", + "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/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "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/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/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/@nicolo-ribaudo/eslint-scope-5-internals/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/@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.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "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 <4.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/@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.3.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", + "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "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/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/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/@testing-library/dom": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", + "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/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==", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "peer": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": 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/@testing-library/dom/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==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/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==", + "peer": true + }, + "node_modules/@testing-library/dom/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==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/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==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/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/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/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/@testing-library/jest-dom/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/@testing-library/jest-dom/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/@testing-library/jest-dom/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/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/react/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/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/react/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/@testing-library/react/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/@testing-library/react/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/@testing-library/react/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/@testing-library/react/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/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "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/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@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.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz", + "integrity": "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dependencies": { + "@types/node": "*" + } + }, + "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-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "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/jest": { + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dependencies": { + "@jest/schemas": "^29.6.0", + "@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": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@types/jest/node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/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/@types/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/@types/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/@types/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/@types/jest/node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dependencies": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/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/@types/jest/node_modules/jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/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/@types/jest/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@types/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/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "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": "20.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz", + "integrity": "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==" + }, + "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.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "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": "18.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.16.tgz", + "integrity": "sha512-LLFWr12ZhBJ4YVw7neWLe6Pk7Ey5R9OCydfuMsz1L8bZxzaawJj2p06Q8/EFEHDeTBQNFLF62X+CG7B2zIyu0Q==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "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.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.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "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.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@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/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "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/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "dependencies": { + "@typescript-eslint/utils": "5.62.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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "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/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "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.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.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.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@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.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "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.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "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.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "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-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.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.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.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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-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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "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": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "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.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "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/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "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": "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": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "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/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "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/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "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-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": "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-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.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.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/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": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "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.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "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.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "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": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.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.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/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/check-types": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", + "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==" + }, + "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/chokidar/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/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.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "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/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/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "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.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "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": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "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-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "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": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-js": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.1.tgz", + "integrity": "sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==", + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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/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/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.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "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.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.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.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.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/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "node_modules/cssdb": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.7.0.tgz", + "integrity": "sha512-1hN+I3r4VqSNQ+OmMXxYexnumbOONkSil0TWMebVXHtzYW4tRRPovUNHPHj2d4nrgOuYJ8Vs3XwvywsuwwXNNA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, + "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.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "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.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "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.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "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.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "node_modules/deep-equal": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "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/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.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "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.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "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", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "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-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "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-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "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.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "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/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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.471", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz", + "integrity": "sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA==" + }, + "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": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "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.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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", + "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-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "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/eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "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.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", + "@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.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "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.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "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-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.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.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": "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-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/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz", + "integrity": "sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "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.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "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.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dependencies": { + "is-core-module": "^2.9.0", + "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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz", + "integrity": "sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==", + "dependencies": { + "@typescript-eslint/utils": "^5.58.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.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "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-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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/eslint-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/eslint-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/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-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/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint-webpack-plugin/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/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/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/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "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/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/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "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": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "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.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "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.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "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": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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-glob/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/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": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "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/filelist": { + "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": "^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.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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.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.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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-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.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "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/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/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/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": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "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/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/functions-have-names": { + "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" + } + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "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.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.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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-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/global-prefix/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/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/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "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.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" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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/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", + "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.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "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.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "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-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "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": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "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.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", + "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.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "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": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "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": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "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-fresh/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/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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "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-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "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": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "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.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "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-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "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-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": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "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": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "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-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "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": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "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/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "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-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "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/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.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "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/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.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": "^28.0.0", + "jest-watcher": "^28.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 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "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.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@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.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@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.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "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/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/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", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "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.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dependencies": { + "@jest/types": "^28.1.3", + "@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.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "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.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "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.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "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/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.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "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/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", + "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/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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-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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "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.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.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.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "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/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "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": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "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": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "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/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/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "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/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "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/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "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.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.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.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.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" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "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/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": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "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/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/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "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.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "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.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" + }, + "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": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "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.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "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/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/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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "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": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "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/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "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": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.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.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "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-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "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.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "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.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "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/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "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.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "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.2" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "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.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "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-load-config/node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "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-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.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "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.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "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.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "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.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "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.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "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.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "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.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "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.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "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.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "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/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.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "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.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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/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.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": "2.0.0", + "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/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "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-dev-utils": { + "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", + "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.11", + "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/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/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.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "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-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-error-overlay": { + "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-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-scripts": { + "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", + "@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.1", + "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.1", + "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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "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.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "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": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "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": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "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": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "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-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-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.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "engines": { + "node": ">=10" + } + }, + "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.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "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==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "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-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/semver/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/send": { + "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": "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": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "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": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "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/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "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", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "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": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "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.18.0" + }, + "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": "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/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/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/sockjs/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/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.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "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==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "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": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "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.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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-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.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "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/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-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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/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.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "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.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "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/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/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": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "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/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "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/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "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": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + }, + "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/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "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": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "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-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "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==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "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.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "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/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + }, + "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.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "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.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.3", + "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.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "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/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "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": "^2.0.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", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "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.17", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", + "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + }, + "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": "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/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/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "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.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "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.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "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.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "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.6.0" + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "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": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "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/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/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": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "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": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" + }, + "@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==" + }, + "@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/eslint-parser": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz", + "integrity": "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==", + "requires": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "dependencies": { + "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": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" + }, + "@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "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.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz", + "integrity": "sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.5" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "requires": {} + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@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.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", + "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", + "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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.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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", + "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.22.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "requires": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "requires": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", + "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@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.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@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-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "requires": { + "@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" + } + }, + "@babel/preset-react": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", + "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + } + }, + "@babel/preset-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "@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==" + }, + "@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "requires": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "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" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "requires": {} + }, + "@elsa-workflows/elsa-studio-wasm": { + "version": "3.0.0-preview.1", + "resolved": "https://f.feedz.io/elsa-workflows/elsa-3/npm/%40elsa-workflows%2felsa-studio-wasm/3.0.0-preview.1/download", + "integrity": "sha512-18Bxv9FBaGoUZHsmvFV9VN8wGvt8b2VO5dlXdNk5D6akNYdwypwkNakrgOhmr8+1TNnv2hc3sHTgaHyfaMex4A==" + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==" + }, + "@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "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": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "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==" + } + } + }, + "@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==" + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" + }, + "@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", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "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" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "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" + } + } + } + }, + "@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==" + }, + "@jest/console": { + "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.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^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" + } + }, + "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" + } + } + } + }, + "@jest/core": { + "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.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" + }, + "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" + } + }, + "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" + } + } + } + }, + "@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==", + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + } + }, + "@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "requires": { + "jest-get-type": "^29.4.3" + }, + "dependencies": { + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==" + } + } + }, + "@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==", + "requires": { + "@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" + } + }, + "@jest/globals": { + "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.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + } + }, + "@jest/reporters": { + "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.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" + }, + "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" + } + }, + "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==" + }, + "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": "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" + } + } + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@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==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "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==" + } + } + }, + "@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==", + "requires": { + "@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.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.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + } + }, + "@jest/transform": { + "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.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" + }, + "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" + } + }, + "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==" + }, + "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": "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" + } + } + } + }, + "@jest/types": { + "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", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.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" + } + }, + "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" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + } + } + }, + "@leichtgewicht/ip-codec": { + "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==" + }, + "@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "requires": { + "eslint-scope": "5.1.1" + }, + "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" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "@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==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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==" + }, + "@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==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + } + }, + "@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==", + "requires": { + "@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.19.0" + } + }, + "@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==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@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==" + } + } + }, + "@rushstack/eslint-patch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", + "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==" + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "requires": { + "type-detect": "4.0.8" + } + }, + "@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==", + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@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==", + "requires": { + "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": { + "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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==" + }, + "@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==", + "requires": { + "@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" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@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==", + "requires": { + "@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" + } + }, + "@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==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@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" + } + }, + "@testing-library/dom": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", + "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", + "peer": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "peer": true, + "requires": { + "deep-equal": "^2.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "peer": true, + "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==", + "peer": 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==", + "peer": 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==", + "peer": true + }, + "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==", + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "requires": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^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" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "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" + } + } + } + }, + "@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "dependencies": { + "@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + } + }, + "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" + } + }, + "aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "requires": { + "deep-equal": "^2.0.5" + } + }, + "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" + } + } + } + }, + "@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "requires": { + "@babel/runtime": "^7.12.5" + } + }, + "@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/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + }, + "@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@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==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@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==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@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.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz", + "integrity": "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "requires": { + "@types/node": "*" + } + }, + "@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==" + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "requires": { + "@types/node": "*" + } + }, + "@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==" + }, + "@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==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@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==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + }, + "dependencies": { + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "requires": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "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==" + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==" + }, + "expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "requires": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + } + }, + "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-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + } + }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==" + }, + "jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + } + }, + "jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "requires": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "requires": { + "@jest/schemas": "^29.6.0", + "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.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "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" + } + } + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@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": "20.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz", + "integrity": "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==" + }, + "@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==" + }, + "@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@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==" + }, + "@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": "18.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.16.tgz", + "integrity": "sha512-LLFWr12ZhBJ4YVw7neWLe6Pk7Ey5R9OCydfuMsz1L8bZxzaawJj2p06Q8/EFEHDeTBQNFLF62X+CG7B2zIyu0Q==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "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.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@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.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@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.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "requires": { + "@types/jest": "*" + } + }, + "@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + }, + "@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@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==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "requires": { + "@typescript-eslint/utils": "5.62.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "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" + } + }, + "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": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@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==" + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "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==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "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==", + "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.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "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==" + }, + "address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" + }, + "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==", + "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" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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==", + "requires": {} + }, + "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" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "requires": { + "dequal": "^2.0.3" + } + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-flatten": { + "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.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "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==" + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "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": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "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==" + }, + "autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "requires": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, + "axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==" + }, + "axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "requires": { + "dequal": "^2.0.3" + } + }, + "babel-jest": { + "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.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" + }, + "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" + } + }, + "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" + } + } + } + }, + "babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@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" + } + }, + "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==", + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "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/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "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": {} + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + } + }, + "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==" + }, + "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==", + "requires": { + "@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" + } + }, + "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==", + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "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==", + "requires": { + "@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" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "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==" + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "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==" + }, + "builtin-modules": { + "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": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "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" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "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", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==" + }, + "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==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==" + }, + "check-types": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", + "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==" + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "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.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" + }, + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "requires": { + "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==" + } + } + }, + "cliui": { + "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": "^7.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "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==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "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.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": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "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": { + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==" + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + }, + "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==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "cookie": { + "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", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-js": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==" + }, + "core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "requires": { + "browserslist": "^4.21.9" + } + }, + "core-js-pure": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.1.tgz", + "integrity": "sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==" + }, + "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==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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" + } + }, + "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" + } + }, + "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.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.9" + } + }, + "css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "requires": {} + }, + "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==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + } + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.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==" + } + } + }, + "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": {} + }, + "css-select": { + "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": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "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==" + }, + "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==", + "requires": { + "mdn-data": "2.0.4", + "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==" + } + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "cssdb": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.7.0.tgz", + "integrity": "sha512-1hN+I3r4VqSNQ+OmMXxYexnumbOONkSil0TWMebVXHtzYW4tRRPovUNHPHj2d4nrgOuYJ8Vs3XwvywsuwwXNNA==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "requires": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "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": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "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==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "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==" + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "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" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "deep-equal": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, + "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==" + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "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==", + "requires": { + "execa": "^5.0.0" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, + "destroy": { + "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", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + }, + "detect-node": { + "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", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "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.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", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "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", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, + "domhandler": { + "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" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dotenv": { + "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", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.471", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.471.tgz", + "integrity": "sha512-GpmGRC1vTl60w/k6YpQ18pSiqnmr0j3un//5TV1idPi6aheNfkT1Ye71tMEabWyNDO6sBMgAR+95Eb0eUUr1tA==" + }, + "emittery": { + "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": "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", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "requires": { + "stackframe": "^1.3.4" + } + }, + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "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-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + } + }, + "es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "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", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "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==", + "optional": true + } + } + }, + "eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.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==", + "requires": { + "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.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==" + }, + "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==" + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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" + } + }, + "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" + } + }, + "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==" + } + } + }, + "eslint-config-react-app": { + "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", + "@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.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.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" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "requires": { + "debug": "^3.2.7" + }, + "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-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==", + "requires": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + } + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.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" + } + }, + "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" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "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==", + "requires": { + "@typescript-eslint/experimental-utils": "^5.0.0" + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "requires": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "eslint-plugin-react": { + "version": "7.33.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz", + "integrity": "sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "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.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "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" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "requires": {} + }, + "eslint-plugin-testing-library": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz", + "integrity": "sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==", + "requires": { + "@typescript-eslint/utils": "^5.58.0" + } + }, + "eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" + }, + "eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "requires": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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" + } + }, + "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": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.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==" + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "supports-color": { + "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" + } + } + } + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "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", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + }, + "expect": { + "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.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "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.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "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": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "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-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "requires": { + "@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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "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" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "requires": { + "bser": "2.1.1" + } + }, + "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==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "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" + } + }, + "filelist": { + "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": "^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.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "filesize": { + "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", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "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.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "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==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "requires": { + "@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" + }, + "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" + } + }, + "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": "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" + } + }, + "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/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "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": "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" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "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", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "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==" + }, + "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" + } + }, + "functions-have-names": { + "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", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "glob": { + "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.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.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" + } + }, + "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-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "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.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "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==", + "requires": { + "duplexer": "^0.1.2" + } + }, + "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==" + }, + "harmony-reflect": { + "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", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "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", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "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", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + } + } + }, + "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==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "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==", + "requires": { + "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" + } + }, + "html-webpack-plugin": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "requires": { + "@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": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "http-errors": { + "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": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "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==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "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": "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", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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==" + }, + "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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "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==" + } + } + }, + "import-local": { + "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" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "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", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "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-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==" + }, + "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-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-bigint": { + "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", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "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==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "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==" + }, + "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==" + }, + "is-glob": { + "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-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "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==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "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==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + }, + "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==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "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.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.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" + }, + "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==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "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==" + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@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" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.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==" + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "requires": { + "semver": "^7.5.3" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "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==" + } + } + }, + "istanbul-reports": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "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" + } + }, + "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" + } + } + } + }, + "jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "requires": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + } + }, + "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==", + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + } + }, + "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==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-config": { + "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.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" + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-diff": { + "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.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.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" + } + }, + "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" + } + } + } + }, + "jest-docblock": { + "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.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.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@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" + } + }, + "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==", + "requires": { + "@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" + } + }, + "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==" + }, + "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==", + "requires": { + "@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.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.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "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==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-mock": { + "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.5.1", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "requires": {} + }, + "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==" + }, + "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==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + } + }, + "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==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-serializer": { + "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.9" + } + }, + "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==", + "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.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" + }, + "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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@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" + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-validate": { + "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.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" + }, + "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" + } + }, + "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" + } + } + } + }, + "jest-watch-typeahead": { + "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": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "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.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "requires": { + "@jest/schemas": "^28.1.3", + "@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.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "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" + } + }, + "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==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "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.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "requires": { + "@jest/types": "^28.1.3", + "@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.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "requires": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "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.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "requires": { + "@jest/schemas": "^28.1.3", + "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.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "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" + }, + "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": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "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": { + "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" + } + } + } + }, + "jest-watcher": { + "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.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" + }, + "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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.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==" + }, + "supports-color": { + "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" + } + } + } + }, + "jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "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.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" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "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==" + }, + "json-schema": { + "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", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==" + }, + "jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "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==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==" + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "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==" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + }, + "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==" + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "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.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "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" + } + }, + "lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==" + }, + "magic-string": { + "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.8" + } + }, + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "requires": { + "tmpl": "1.0.5" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "requires": { + "fs-monkey": "^1.0.4" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "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.2", + "picomatch": "^2.3.1" + } + }, + "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.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, + "mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "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==" + }, + "minimatch": { + "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" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "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.6" + } + }, + "ms": { + "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": "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" + } + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "negotiator": { + "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", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-forge": { + "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", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "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" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "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", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "requires": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "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" + } + }, + "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", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.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" + } + }, + "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==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-retry": { + "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", + "retry": "^0.13.1" + } + }, + "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==" + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "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==", + "requires": { + "@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" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "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==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.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==", + "requires": { + "locate-path": "^3.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==", + "requires": { + "p-locate": "^3.0.0", + "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", + "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": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, + "postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "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": {} + }, + "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==", + "requires": { + "postcss-selector-parser": "^6.0.9", + "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.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "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==", + "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==", + "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==", + "requires": {} + }, + "postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "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": {} + }, + "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==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "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==", + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "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": {} + }, + "postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "requires": {} + }, + "postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.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": {} + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "dependencies": { + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" + } + } + }, + "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==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "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": {} + }, + "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": {} + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "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": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "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==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "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==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "requires": { + "postcss-selector-parser": "^6.0.11" + } + }, + "postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "requires": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-normalize": { + "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": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + } + }, + "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": {} + }, + "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==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "requires": {} + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "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": {} + }, + "postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "requires": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "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.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "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": {} + }, + "postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "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.2.0", + "svgo": "^2.7.0" + }, + "dependencies": { + "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": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "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==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "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": "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": "^3.0.0" + } + }, + "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==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "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==" + } + } + }, + "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==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "prompts": { + "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.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.13.1" + }, + "dependencies": { + "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==" + } + } + }, + "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==", + "requires": { + "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==" + } + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "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.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": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "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", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "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==", + "requires": { + "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" + } + }, + "react-dev-utils": { + "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", + "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.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.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==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==" + }, + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" + }, + "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" + } + } + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-error-overlay": { + "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-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-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" + }, + "react-scripts": { + "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", + "@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.1", + "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.1", + "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" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "requires": { + "minimatch": "^3.0.5" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "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.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "renderkid": { + "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": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "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==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "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==", + "requires": { + "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": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==" + }, + "retry": { + "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==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "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==", + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "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": "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": "^7.0.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" + } + }, + "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" + } + } + } + }, + "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==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "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-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "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==" + }, + "sass-loader": { + "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" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "send": { + "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": "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": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "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" + }, + "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" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "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": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "serve-static": { + "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.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==" + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" + }, + "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.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", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sockjs": { + "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": "^8.3.2", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "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==" + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + }, + "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==" + }, + "source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + } + }, + "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==", + "requires": { + "buffer-from": "^1.0.0", + "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==" + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "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==", + "requires": { + "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" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "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.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "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==" + } + } + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, + "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" + } + }, + "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" + } + }, + "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==" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.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.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.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" + } + }, + "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==" + }, + "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==" + }, + "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==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "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==" + }, + "style-loader": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "requires": {} + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "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" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.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==" + }, + "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" + } + } + } + }, + "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", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "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" + }, + "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-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==" + }, + "tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "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==" + }, + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "requires": { + "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.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, + "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==", + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "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==" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + } + }, + "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==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "tmpl": { + "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } + } + }, + "tr46": { + "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" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "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": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + } + } + }, + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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==" + }, + "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==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "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==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "peer": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "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==" + }, + "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==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + }, + "unique-string": { + "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": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "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==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "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==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "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==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "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" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "webpack-dev-middleware": { + "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.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "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/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "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": "^2.0.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", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "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.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "requires": {} + } + } + }, + "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==", + "requires": { + "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", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "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==" + }, + "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==", + "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": { + "version": "3.6.17", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", + "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + }, + "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==" + }, + "whatwg-url": { + "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.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "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" + } + }, + "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==", + "requires": { + "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" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "requires": { + "@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.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "dependencies": { + "@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "requires": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "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.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": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "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": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + }, + "workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "requires": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "requires": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "requires": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "requires": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "requires": { + "workbox-core": "6.6.0" + } + }, + "workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "requires": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + }, + "workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "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.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==" + }, + "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": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.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" + }, + "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==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + }, + "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==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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.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==" + } + } +} diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/package.json b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/package.json new file mode 100644 index 0000000..0bfa776 --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/package.json @@ -0,0 +1,42 @@ +{ + "name": "workflow-definition-editor-app", + "version": "0.1.0", + "private": true, + "dependencies": { + "@elsa-workflows/elsa-studio-wasm": "^3.0.0-preview.1", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4", + "uuid": "^9.0.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "postinstall": "npm run copy:elsa-studio-wasm", + "copy:elsa-studio-wasm": "cp -r node_modules/@elsa-workflows/elsa-studio-wasm/_content public/ && cp -r node_modules/@elsa-workflows/elsa-studio-wasm/_framework public/ && cp -r node_modules/@elsa-workflows/elsa-studio-wasm/appsettings.json public/" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.js b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.js new file mode 100644 index 0000000..dfd33e3 --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.js @@ -0,0 +1,12 @@ +import WorkflowDefinitionEditor from "./components/WorkflowDefinitionEditor"; + +function App() { + return ( +
+ + {/**/} +
+ ); +} + +export default App; diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.test.js b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.test.js new file mode 100644 index 0000000..1f03afe --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/App.test.js @@ -0,0 +1,8 @@ +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/components/WorkflowDefinitionEditor.js b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/components/WorkflowDefinitionEditor.js new file mode 100644 index 0000000..87297c7 --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/components/WorkflowDefinitionEditor.js @@ -0,0 +1,30 @@ +import React from "react"; +import {v4 as uuid} from "uuid"; + +export default class WorkflowDefinitionEditor extends React.Component { + + constructor(props) { + super(props); + + debugger; + + if (!this.props.id) + this.id = uuid(); + } + + id = ""; + + onValueChanged = function (value) { + }; + + render() { + return React.createElement('elsa-studio-workflow-definition-editor', { ...this.props, id: this.id, "definition-id": this.props.definitionId }); + } + + componentDidMount() { + let element = document.getElementById(this.id); + element.valueChanged = (x) => { + this.props.onValueChanged(x); + }; + } +} \ No newline at end of file diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.css b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.css new file mode 100644 index 0000000..ec2585e --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.js b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.js new file mode 100644 index 0000000..d563c0f --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/logo.svg b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/logo.svg new file mode 100644 index 0000000..9dfc1c0 --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/reportWebVitals.js b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/reportWebVitals.js new file mode 100644 index 0000000..5253d3a --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/setupTests.js b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/setupTests.js new file mode 100644 index 0000000..8f2609b --- /dev/null +++ b/samples/react/workflow-definition-editor-sample/workflow-definition-editor-app/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..fc7ca96 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/bundles/Elsa.Studio/Elsa.Studio.csproj b/src/bundles/Elsa.Studio/Elsa.Studio.csproj new file mode 100644 index 0000000..622a2d7 --- /dev/null +++ b/src/bundles/Elsa.Studio/Elsa.Studio.csproj @@ -0,0 +1,14 @@ + + + + Elsa Studio bundle of commonly used packages. + elsa studio framework bundle + + + + + + + + + diff --git a/src/bundles/Elsa.Studio/FodyWeavers.xml b/src/bundles/Elsa.Studio/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/bundles/Elsa.Studio/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/bundles/Elsa.Studio/FodyWeavers.xsd b/src/bundles/Elsa.Studio/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/bundles/Elsa.Studio/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/bundles/Elsa.Studio/Readme.md b/src/bundles/Elsa.Studio/Readme.md new file mode 100644 index 0000000..209c898 --- /dev/null +++ b/src/bundles/Elsa.Studio/Readme.md @@ -0,0 +1,8 @@ +# Elsa.Studio + +This is a bundle package that includes the following packages: + +- Elsa.Studio.Backend +- Elsa.Studio.Dashboard +- Elsa.Studio.Workflows +- Elsa.Studio.Shell \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core.BlazorServer/Elsa.Studio.Core.BlazorServer.csproj b/src/framework/Elsa.Studio.Core.BlazorServer/Elsa.Studio.Core.BlazorServer.csproj new file mode 100644 index 0000000..4f3ac09 --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorServer/Elsa.Studio.Core.BlazorServer.csproj @@ -0,0 +1,18 @@ + + + + Blazor Server impementation for certain abstractions provided by Elsa.Studio.Core. + elsa studio blazor server + + + + + + + + + + + + + diff --git a/src/framework/Elsa.Studio.Core.BlazorServer/Extensions/ServiceCollectionExtensions.cs b/src/framework/Elsa.Studio.Core.BlazorServer/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..3dbfbab --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorServer/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,23 @@ +using Elsa.Studio.Core.BlazorServer.HostedServices; +using Elsa.Studio.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Core.BlazorServer.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds core services with Blazor Server implementations. + /// + public static IServiceCollection AddCore(this IServiceCollection services) + { + services.AddCoreInternal(); + services.AddSharedServices(); + services.AddHostedService(); + + return services; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xml b/src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xsd b/src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorServer/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core.BlazorServer/HostedServices/RunStartupTasksHostedService.cs b/src/framework/Elsa.Studio.Core.BlazorServer/HostedServices/RunStartupTasksHostedService.cs new file mode 100644 index 0000000..a491976 --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorServer/HostedServices/RunStartupTasksHostedService.cs @@ -0,0 +1,37 @@ +using Elsa.Studio.Contracts; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace Elsa.Studio.Core.BlazorServer.HostedServices; + +/// +/// Executes all registered services. +/// +public class RunStartupTasksHostedService : IHostedService +{ + private readonly IServiceScopeFactory _serviceScopeFactory; + + /// + /// Initializes a new instance of . + /// + /// + public RunStartupTasksHostedService(IServiceScopeFactory serviceScopeFactory) + { + _serviceScopeFactory = serviceScopeFactory; + } + + + /// + /// Resolves all registered services and executes them. + /// + public async Task StartAsync(CancellationToken cancellationToken) + { + using var scope = _serviceScopeFactory.CreateScope(); + var startupTaskRunner = scope.ServiceProvider.GetRequiredService(); + + await startupTaskRunner.RunStartupTasksAsync(cancellationToken); + } + + /// + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core.BlazorWasm/Elsa.Studio.Core.BlazorWasm.csproj b/src/framework/Elsa.Studio.Core.BlazorWasm/Elsa.Studio.Core.BlazorWasm.csproj new file mode 100644 index 0000000..8086486 --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorWasm/Elsa.Studio.Core.BlazorWasm.csproj @@ -0,0 +1,17 @@ + + + + Blazor WebAssembly impementation for certain abstractions provided by Elsa.Studio.Core. + elsa studio blazor webassembly + + + + + + + + + + + + diff --git a/src/framework/Elsa.Studio.Core.BlazorWasm/Extensions/ServiceCollectionExtensions.cs b/src/framework/Elsa.Studio.Core.BlazorWasm/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..7460896 --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorWasm/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,21 @@ +using Elsa.Studio.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Core.BlazorWasm.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds core services with WASM implementations. + /// + public static IServiceCollection AddCore(this IServiceCollection services) + { + services.AddSharedServices(); + services.AddCoreInternal(); + + return services; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xml b/src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xsd b/src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/framework/Elsa.Studio.Core.BlazorWasm/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Abstractions/FeatureBase.cs b/src/framework/Elsa.Studio.Core/Abstractions/FeatureBase.cs new file mode 100644 index 0000000..3a22ba9 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Abstractions/FeatureBase.cs @@ -0,0 +1,12 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Abstractions; + +/// +/// A base class for modules. +/// +public abstract class FeatureBase : IFeature +{ + /// + public virtual ValueTask InitializeAsync(CancellationToken cancellationToken = default) => ValueTask.CompletedTask; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Abstractions/FieldExtensionHandlerBase.cs b/src/framework/Elsa.Studio.Core/Abstractions/FieldExtensionHandlerBase.cs new file mode 100644 index 0000000..fc97ef5 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Abstractions/FieldExtensionHandlerBase.cs @@ -0,0 +1,54 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Enums; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Abstractions; + +/// +/// Provides a base handler for field extensions. +/// +public abstract class FieldExtensionHandlerBase : IUIFieldExtensionHandler +{ + /// + /// + /// + public virtual int DisplayOrder { get; set; } = 1; + + /// + /// + /// + public virtual bool IncludeForAll { get; set; } = false; + + /// + /// + /// + public virtual FieldExtensionPosition Position { get; set; } = FieldExtensionPosition.Top; + + /// + /// + /// + public virtual string UIHintComponent { get; set; } = string.Empty; + + /// + /// + /// + public virtual List ActivityTypes { get; set; } = []; + + /// + /// + /// + public virtual List Syntaxes { get; set; } = []; + + /// + /// + /// + public virtual bool GetExtensionForInputComponent(string componentName) => + (string.IsNullOrEmpty(UIHintComponent) && !ActivityTypes.Any() && !Syntaxes.Any() && IncludeForAll) + || UIHintComponent.Equals(componentName, StringComparison.OrdinalIgnoreCase); + + /// + /// + /// + public abstract RenderFragment DisplayExtension(DisplayInputEditorContext context); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Attributes/RemoteFeatureAttribute.cs b/src/framework/Elsa.Studio.Core/Attributes/RemoteFeatureAttribute.cs new file mode 100644 index 0000000..89a6b80 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Attributes/RemoteFeatureAttribute.cs @@ -0,0 +1,18 @@ +namespace Elsa.Studio.Attributes; + +/// +/// Marks a class as a remote feature. +/// +public class RemoteFeatureAttribute : Attribute +{ + /// + public RemoteFeatureAttribute(string name) + { + Name = name; + } + + /// + /// Gets the name of the remote feature. + /// + public string Name { get; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IActivityTab.cs b/src/framework/Elsa.Studio.Core/Contracts/IActivityTab.cs new file mode 100644 index 0000000..e2b767a --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IActivityTab.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Components; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Studio.Contracts; + +public interface IActivityTab +{ + string Title { get; } + + Func, RenderFragment> Render { get; } +} diff --git a/src/framework/Elsa.Studio.Core/Contracts/IAppBarService.cs b/src/framework/Elsa.Studio.Core/Contracts/IAppBarService.cs new file mode 100644 index 0000000..2e80d2e --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IAppBarService.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Contracts; + +public interface IAppBarService +{ + /// + /// Invoked when the app bar items change. + /// + event Action AppBarItemsChanged; + + /// + /// A collection of components to render in the app bar. + /// + IEnumerable AppBarItems { get; } + + /// + /// Adds a component to the app bar. + /// + /// The type of the component. + void AddAppBarItem() where T : IComponent; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IBackendApiClientProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IBackendApiClientProvider.cs new file mode 100644 index 0000000..0e699cc --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IBackendApiClientProvider.cs @@ -0,0 +1,19 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Provides connection details to the backend. +/// +public interface IBackendApiClientProvider +{ + /// + /// Gets the URL to the backend. + /// + Uri Url { get; } + + /// + /// Gets an API client from the backend connection provider. + /// + /// The API client type. + /// The API client. + ValueTask GetApiAsync(CancellationToken cancellationToken = default) where T : class; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IBlazorServiceAccessor.cs b/src/framework/Elsa.Studio.Core/Contracts/IBlazorServiceAccessor.cs new file mode 100644 index 0000000..f9425da --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IBlazorServiceAccessor.cs @@ -0,0 +1,10 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Represents an interface for accessing the current IServiceProvider in Blazor. +/// +public interface IBlazorServiceAccessor +{ + /// Gets or sets the current IServiceProvider. + IServiceProvider Services { get; set; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IClientInformationProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IClientInformationProvider.cs new file mode 100644 index 0000000..b0d406e --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IClientInformationProvider.cs @@ -0,0 +1,14 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides information about the client. +/// +public interface IClientInformationProvider +{ + /// + /// Gets information about the client. + /// + ValueTask GetInfoAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IExpressionProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IExpressionProvider.cs new file mode 100644 index 0000000..79359e1 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IExpressionProvider.cs @@ -0,0 +1,14 @@ +using Elsa.Api.Client.Resources.Scripting.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides available expression descriptors. +/// +public interface IExpressionProvider +{ + /// + /// Lists all expression descriptors. + /// + ValueTask> ListAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IExpressionService.cs b/src/framework/Elsa.Studio.Core/Contracts/IExpressionService.cs new file mode 100644 index 0000000..3950dc4 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IExpressionService.cs @@ -0,0 +1,19 @@ +using Elsa.Api.Client.Resources.Scripting.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides syntax services. +/// +public interface IExpressionService +{ + /// + /// Lists all expression descriptors. + /// + Task> ListDescriptorsAsync(CancellationToken cancellationToken = default); + + /// + /// Gets a syntax provider by name. + /// + Task GetByTypeAsync(string type, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IFeature.cs b/src/framework/Elsa.Studio.Core/Contracts/IFeature.cs new file mode 100644 index 0000000..5d6d292 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IFeature.cs @@ -0,0 +1,13 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Represents a feature that can be registered with the dashboard. +/// +public interface IFeature +{ + /// + /// Called by the dashboard to initialize the feature. + /// + /// A cancellation token. + ValueTask InitializeAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IFeatureService.cs b/src/framework/Elsa.Studio.Core/Contracts/IFeatureService.cs new file mode 100644 index 0000000..a068d37 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IFeatureService.cs @@ -0,0 +1,22 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Manages features. +/// +public interface IFeatureService +{ + /// + /// Event that is triggered when the features have been initialized. + /// + event Action? Initialized; + + /// + /// Returns all features. + /// + IEnumerable GetFeatures(); + + /// + /// Initializes all features. + /// + Task InitializeFeaturesAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IMediator.cs b/src/framework/Elsa.Studio.Core/Contracts/IMediator.cs new file mode 100644 index 0000000..fb40357 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IMediator.cs @@ -0,0 +1,30 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Represents a mediator that can be used to publish notifications and subscribe to notifications. +/// +public interface IMediator +{ + /// + /// Subscribes to a notification. + /// + /// + /// + /// + void Subscribe(THandler handler) where THandler : INotificationHandler where TNotification : INotification; + + /// + /// Unsubscribes from a notification. + /// + void Unsubscribe(THandler handler) where THandler : INotificationHandler where TNotification : INotification; + + /// + /// Unsubscribes from a notification. + /// + void Unsubscribe(INotificationHandler handler); + + /// + /// Publishes a notification. + /// + Task NotifyAsync(TNotification notification, CancellationToken cancellationToken = default) where TNotification : INotification; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IMenuGroupProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IMenuGroupProvider.cs new file mode 100644 index 0000000..9bf5d88 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IMenuGroupProvider.cs @@ -0,0 +1,16 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Returns menu item groups to the dashboard. +/// +public interface IMenuGroupProvider +{ + /// + /// Returns menu item groups to the dashboard. + /// + /// The cancellation token. + /// A collection of instances. + ValueTask> GetMenuGroupsAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IMenuProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IMenuProvider.cs new file mode 100644 index 0000000..c1a0e85 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IMenuProvider.cs @@ -0,0 +1,10 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// Provides menu items to the dashboard. +public interface IMenuProvider +{ + /// Returns a list of menu items. + ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IMenuService.cs b/src/framework/Elsa.Studio.Core/Contracts/IMenuService.cs new file mode 100644 index 0000000..0509064 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IMenuService.cs @@ -0,0 +1,23 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// A service that provides menu items and menu item groups. +/// +public interface IMenuService +{ + /// + /// Returns all menu items from all menu providers. + /// + /// The cancellation token. + /// A list of instances. + ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default); + + /// + /// Returns all menu item groups from all menu group providers. + /// + /// The cancellation token. + /// A list of instances. + ValueTask> GetMenuItemGroupsAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/INotification.cs b/src/framework/Elsa.Studio.Core/Contracts/INotification.cs new file mode 100644 index 0000000..71585a6 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/INotification.cs @@ -0,0 +1,5 @@ +namespace Elsa.Studio.Contracts; + +public interface INotification +{ +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/INotificationHandler.cs b/src/framework/Elsa.Studio.Core/Contracts/INotificationHandler.cs new file mode 100644 index 0000000..3e4e678 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/INotificationHandler.cs @@ -0,0 +1,22 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Represents a notification handler. +/// +public interface INotificationHandler +{ +} + +/// +/// Represents a notification handler. +/// +/// The type of the notification. +public interface INotificationHandler : INotificationHandler where T : INotification +{ + /// + /// Handles the given notification. + /// + /// The notification to handle. + /// The cancellation token. + Task HandleAsync(T notification, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IRemoteBackendAccessor.cs b/src/framework/Elsa.Studio.Core/Contracts/IRemoteBackendAccessor.cs new file mode 100644 index 0000000..4e087f8 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IRemoteBackendAccessor.cs @@ -0,0 +1,14 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides access to the current remote backend. +/// +public interface IRemoteBackendAccessor +{ + /// + /// Gets or sets the current backend. + /// + RemoteBackend RemoteBackend { get; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IRemoteFeatureProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IRemoteFeatureProvider.cs new file mode 100644 index 0000000..433ca0a --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IRemoteFeatureProvider.cs @@ -0,0 +1,22 @@ +using Elsa.Api.Client.Resources.Features.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides a way to check if a feature is enabled. +/// +public interface IRemoteFeatureProvider +{ + /// + /// Returns a value indicating whether the feature with the specified name is enabled. + /// + /// The name of the feature. + /// An optional cancellation token. + /// A value indicating whether the feature with the specified name is enabled. + Task IsEnabledAsync(string featureName, CancellationToken cancellationToken = default); + + /// + /// Returns a list of installed features. + /// + Task> ListAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IServerInformationProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IServerInformationProvider.cs new file mode 100644 index 0000000..e06abb2 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IServerInformationProvider.cs @@ -0,0 +1,14 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides information about the server. +/// +public interface IServerInformationProvider +{ + /// + /// Gets information about the server. + /// + ValueTask GetInfoAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IStartupTask.cs b/src/framework/Elsa.Studio.Core/Contracts/IStartupTask.cs new file mode 100644 index 0000000..200d635 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IStartupTask.cs @@ -0,0 +1,13 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Represents a startup task that is invoked once during application startup. +/// +public interface IStartupTask +{ + /// + /// Invoked during application startup. + /// + /// A cancellation token. + ValueTask ExecuteAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IStartupTaskRunner.cs b/src/framework/Elsa.Studio.Core/Contracts/IStartupTaskRunner.cs new file mode 100644 index 0000000..71dbebe --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IStartupTaskRunner.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Runs startup tasks. +/// +public interface IStartupTaskRunner +{ + /// + /// Runs startup tasks. + /// + Task RunStartupTasksAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IThemeService.cs b/src/framework/Elsa.Studio.Core/Contracts/IThemeService.cs new file mode 100644 index 0000000..a5e6d04 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IThemeService.cs @@ -0,0 +1,36 @@ +using MudBlazor; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides theme information to the dashboard. +/// +public interface IThemeService +{ + /// + /// Raised when the current theme changes. + /// + event Action CurrentThemeChanged; + + /// + /// Raised when the dark mode changes. + /// + event Action IsDarkModeChanged; + + /// + /// The current theme. + /// + MudTheme CurrentTheme { get; set; } + + /// + /// Returns the current palette, depending on whether the dashboard is in dark mode. + /// +#pragma warning disable CS0618 + Palette CurrentPalette => IsDarkMode ? CurrentTheme.PaletteDark : CurrentTheme.PaletteLight; +#pragma warning restore CS0618 + + /// + /// Whether the dashboard is in dark mode. + /// + public bool IsDarkMode { get; set; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionHandler.cs b/src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionHandler.cs new file mode 100644 index 0000000..6a4e080 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionHandler.cs @@ -0,0 +1,52 @@ +using Elsa.Studio.Enums; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Contracts +{ + /// + /// Provides a contract for UI field extension handlers. + /// + public interface IUIFieldExtensionHandler + { + /// + /// The order in which the extensions should be displayed. + /// + int DisplayOrder { get; set; } + + /// + /// If set to true and no restricting types are set, either with UIHintComponent, ActivityTypes or Syntaxes, this extension will be rendered for in all field types. + /// + bool IncludeForAll { get; set; } + + /// + /// The position to render the extension within the field. + /// + FieldExtensionPosition Position { get; set; } + + /// + /// The UIHint component this extension should be rendered for. + /// + string UIHintComponent { get; set; } + + /// + /// The activities this extension should be rendered for. + /// + List ActivityTypes { get; set; } + + /// + /// The syntaxes this extension should be rendered for. + /// + List Syntaxes { get; set; } + + /// + /// Returns true if the handler extension the specified or is empty. + /// + bool GetExtensionForInputComponent(string componentName); + + /// + /// Returns a of the added extension. + /// + RenderFragment DisplayExtension(DisplayInputEditorContext context); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionService.cs b/src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionService.cs new file mode 100644 index 0000000..68ad356 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IUIFieldExtensionService.cs @@ -0,0 +1,17 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides a service contact for resolving UI field extensions +/// +public interface IUIFieldExtensionService +{ + /// + /// Try to return a list of extension handlers for a component + /// + /// The component name to get the handler for. This should be the name of the component calling this function. + /// The display input editor context + /// + List? TryGetHandlers(string componentName, DisplayInputEditorContext context); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IUIHintHandler.cs b/src/framework/Elsa.Studio.Core/Contracts/IUIHintHandler.cs new file mode 100644 index 0000000..6ede80e --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IUIHintHandler.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides a contract for UI hint handlers. +/// +public interface IUIHintHandler +{ + /// + /// Returns true if the handler supports the specified UI hint. + /// + bool GetSupportsUIHint(string uiHint); + + /// + /// Returns the UI syntax for the handler. + /// + string UISyntax { get; } + + /// + /// Returns a that renders the input editor. + /// + RenderFragment DisplayInputEditor(DisplayInputEditorContext context); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IUIHintService.cs b/src/framework/Elsa.Studio.Core/Contracts/IUIHintService.cs new file mode 100644 index 0000000..37c1030 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IUIHintService.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Contracts; + +public interface IUIHintService +{ + IUIHintHandler GetHandler(string uiHint); + //RenderFragment DisplayInputEditor(DisplayInputEditorContext context); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IUnauthorizedComponentProvider.cs b/src/framework/Elsa.Studio.Core/Contracts/IUnauthorizedComponentProvider.cs new file mode 100644 index 0000000..c3b5311 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IUnauthorizedComponentProvider.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Contracts; + +/// +/// Provides the to display the login page. +/// +public interface IUnauthorizedComponentProvider +{ + /// + /// Returns the to display the login page. + /// + RenderFragment GetUnauthorizedComponent(); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Contracts/IWidget.cs b/src/framework/Elsa.Studio.Core/Contracts/IWidget.cs new file mode 100644 index 0000000..6bac207 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IWidget.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Contracts; + +/// +/// Represents a widget. +/// +public interface IWidget +{ + /// + /// Gets the zone in which the widget should be rendered. + /// + string Zone { get; } + + /// + /// Gets the order in which the widget should be rendered. + /// + double Order { get; } + + /// + /// Gets the fragment to render. + /// + Func, RenderFragment> Render { get; } +} + diff --git a/src/framework/Elsa.Studio.Core/Contracts/IWidgetRegistry.cs b/src/framework/Elsa.Studio.Core/Contracts/IWidgetRegistry.cs new file mode 100644 index 0000000..1dbbef7 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Contracts/IWidgetRegistry.cs @@ -0,0 +1,17 @@ +namespace Elsa.Studio.Contracts; + +/// +/// Provides a registry of widgets. +/// +public interface IWidgetRegistry +{ + /// + /// Adds the specified widget to the registry. + /// + void Add(IWidget widget); + + /// + /// Returns a list of widgets for the specified zone. + /// + IEnumerable List(string zone); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Elsa.Studio.Core.csproj b/src/framework/Elsa.Studio.Core/Elsa.Studio.Core.csproj new file mode 100644 index 0000000..a87df28 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Elsa.Studio.Core.csproj @@ -0,0 +1,36 @@ + + + + Core Elsa Studio services. + elsa studio core + Elsa.Studio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/framework/Elsa.Studio.Core/ElsaStudioIcons.cs b/src/framework/Elsa.Studio.Core/ElsaStudioIcons.cs new file mode 100644 index 0000000..b2bd2dc --- /dev/null +++ b/src/framework/Elsa.Studio.Core/ElsaStudioIcons.cs @@ -0,0 +1,41 @@ +namespace Elsa.Studio; + +/// +/// Provides Elsa Studio icons. +/// +public static class ElsaStudioIcons +{ + /// + /// Provides Tabler icons. + /// + public static class Tabler + { + public const string Pencil = """ """; + public const string Text = """ """; + public const string Cloud = """ """; + public const string SwitchDiagonal = """ """; + public const string CheckCircle = """ """; + public const string CheckShield = """ """; + public const string Hexagon = """ """; + public const string GitMerge = """ """; + public const string GitFork = """ """; + public const string World = """ """; + public const string RepeatOne = """ """; + public const string Back1 = """ """; + public const string Italic = """ """; + public const string RotateClockwise2 = """ """; + } + + /// + /// Provides Heroicons. + /// + public static class Heroicons + { + public const string Question = """"""; + public const string Exclamation = """"""; + public const string PencilPaper = """"""; + + public const string Outgoing = """"""; + public const string Incoming = """"""; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Enums/FieldExtensionPosition.cs b/src/framework/Elsa.Studio.Core/Enums/FieldExtensionPosition.cs new file mode 100644 index 0000000..dea864e --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Enums/FieldExtensionPosition.cs @@ -0,0 +1,17 @@ +namespace Elsa.Studio.Enums; + +/// +/// Provides field extension render positions. +/// +public enum FieldExtensionPosition +{ + /// + /// Positions the extension at the top of the field. + /// + Top = 0, + + /// + /// Positions the extension at the bottom of the field. + /// + Bottom = 1 +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Extensions/MediatorExtensions.cs b/src/framework/Elsa.Studio.Core/Extensions/MediatorExtensions.cs new file mode 100644 index 0000000..bca4133 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Extensions/MediatorExtensions.cs @@ -0,0 +1,39 @@ +using Elsa.Studio.Contracts; +using JetBrains.Annotations; + +namespace Elsa.Studio.Extensions; + +/// +/// Contains extension methods for . +/// +[UsedImplicitly] +public static class MediatorExtensions +{ + /// + /// Subscribes the given handler to the given notification. + /// Use this from components' Initialize methods. + /// The component itself can be the handler + /// to subscribe itself if it implements . + /// + public static void Subscribe(this IMediator mediator, INotificationHandler handler) where TNotification : INotification + { + var handlerType = handler.GetType(); + var subscribeMethod = typeof(IMediator).GetMethod(nameof(IMediator.Subscribe))!; + var genericSubscribeMethod = subscribeMethod.MakeGenericMethod(typeof(TNotification), handlerType); + genericSubscribeMethod.Invoke(mediator, [handler]); + } + + /// + /// Unsubscribes the given handler from the given notification. + /// Use this from components' Dispose methods. + /// The component itself can be the handler + /// to unsubscribe itself if it implements . + /// + public static void Unsubscribe(this IMediator mediator, INotificationHandler handler) where TNotification : INotification + { + var handlerType = handler.GetType(); + var unsubscribeMethod = typeof(IMediator).GetMethod(nameof(IMediator.Unsubscribe))!; + var genericUnsubscribeMethod = unsubscribeMethod.MakeGenericMethod(typeof(TNotification), handlerType); + genericUnsubscribeMethod.Invoke(mediator, [handler]); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Extensions/ObjectExtension.cs b/src/framework/Elsa.Studio.Core/Extensions/ObjectExtension.cs new file mode 100644 index 0000000..a0365d0 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Extensions/ObjectExtension.cs @@ -0,0 +1,33 @@ +using System.Reflection; + +namespace Elsa.Studio.Extensions; + +/// +/// Provides extension methods for the class. +/// +public static class ObjectExtension +{ + /// + /// Converts the specified object to a dictionary. + /// + /// + /// + /// + public static Dictionary ToDictionary(this object obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + var dictionary = new Dictionary(); + foreach (var property in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) + { + if (!property.CanRead) + continue; + + var value = property.GetValue(obj); + dictionary.Add(property.Name, value); + } + + return dictionary; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Extensions/RateLimitedFuncExtensions.cs b/src/framework/Elsa.Studio.Core/Extensions/RateLimitedFuncExtensions.cs new file mode 100644 index 0000000..5e27c97 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Extensions/RateLimitedFuncExtensions.cs @@ -0,0 +1,31 @@ +using ThrottleDebounce; + +namespace Elsa.Studio.Extensions; + +/// +/// Adds extension methods for and . +/// +public static class RateLimitedFuncExtensions +{ + /// + /// Invokes the specified rate limited function. + /// + public static async Task InvokeAsync(this RateLimitedFunc rateLimitedFunc) + { + var task = rateLimitedFunc.Invoke(); + + if (task != null) + await task; + } + + /// + /// Invokes the specified rate limited function. + /// + public static async Task InvokeAsync(this RateLimitedFunc rateLimitedFunc, T arg1) + { + var task = rateLimitedFunc.Invoke(arg1); + + if (task != null) + await task; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Extensions/RenderTreeBuilderExtensions.cs b/src/framework/Elsa.Studio.Core/Extensions/RenderTreeBuilderExtensions.cs new file mode 100644 index 0000000..e657479 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Extensions/RenderTreeBuilderExtensions.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Rendering; + +namespace Elsa.Studio.Extensions; + +/// +/// Provides extension methods for the class. +/// +public static class RenderTreeBuilderExtensions +{ + /// + /// Creates a component of the specified type. + /// + public static void CreateComponent(this RenderTreeBuilder builder) where T : IComponent + { + var sequence = 0; + CreateComponent(builder, ref sequence); + } + + /// + /// Creates a component of the specified type. + /// + public static void CreateComponent(this RenderTreeBuilder builder, ref int sequence) where T : IComponent + { + builder.OpenComponent(sequence++); + builder.CloseComponent(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Extensions/ServiceCollectionExtensions.cs b/src/framework/Elsa.Studio.Core/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..9cf6169 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,90 @@ +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Options; +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using Elsa.Studio.Options; +using Elsa.Studio.Services; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Elsa.Studio.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the core services. + /// + public static IServiceCollection AddCoreInternal(this IServiceCollection services) + { + services + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + ; + + // Mediator. + services.AddScoped(); + + //Localization + services.AddSingleton(); + services.AddSingleton(); + return services; + } + + /// + /// Adds backend services to the service collection. + /// + public static IServiceCollection AddRemoteBackend(this IServiceCollection services, BackendApiConfig? config = null) + { + services.Configure(config?.ConfigureBackendOptions ?? (_ => { })); + services.AddDefaultApiClients(config?.ConfigureHttpClientBuilder); + services.TryAddScoped(); + services.TryAddScoped(); + return services; + } + + public static IServiceCollection AddRemoteApi(this IServiceCollection services, BackendApiConfig? config = null) where TApi : class + { + services.Configure(config?.ConfigureBackendOptions ?? (_ => { })); + services.AddApiClient(config?.ConfigureHttpClientBuilder); + return services; + } + + /// + /// Adds the specified . + /// + public static IServiceCollection AddNotificationHandler(this IServiceCollection services) where T: class, INotificationHandler + { + return services.AddScoped(); + } + + /// + /// Adds the specified . + /// + public static IServiceCollection AddUIHintHandler(this IServiceCollection services) where T : class, IUIHintHandler + { + return services.AddScoped(); + } + + /// + /// Adds the specified . + /// + public static IServiceCollection AddUIFieldEnhancerHandler(this IServiceCollection services) where T : class, IUIFieldExtensionHandler + { + return services.AddScoped(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/FodyWeavers.xml b/src/framework/Elsa.Studio.Core/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/framework/Elsa.Studio.Core/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/FodyWeavers.xsd b/src/framework/Elsa.Studio.Core/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/framework/Elsa.Studio.Core/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Localization/DefaultLocalizationProvider.cs b/src/framework/Elsa.Studio.Core/Localization/DefaultLocalizationProvider.cs new file mode 100644 index 0000000..1296549 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Localization/DefaultLocalizationProvider.cs @@ -0,0 +1,9 @@ +namespace Elsa.Studio.Localization; + +internal class DefaultLocalizationProvider : ILocalizationProvider +{ + public string GetTranslation(string key) + { + return key; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Localization/DefaultLocalizer.cs b/src/framework/Elsa.Studio.Core/Localization/DefaultLocalizer.cs new file mode 100644 index 0000000..937a8d9 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Localization/DefaultLocalizer.cs @@ -0,0 +1,58 @@ +using Microsoft.Extensions.Localization; + +namespace Elsa.Studio.Localization; + +/// +public class DefaultLocalizer(ILocalizationProvider provider) : ILocalizer +{ + /// + public LocalizedString this[string key] + { + get + { + if (string.IsNullOrWhiteSpace(key)) + return new LocalizedString(string.Empty, string.Empty, true); + + var notFound = false; + var translation = provider.GetTranslation(key); + + if (string.IsNullOrEmpty(translation)) + { + translation = key; + notFound = true; + } + + return new LocalizedString(key, translation, notFound); + } + } + + /// + /// Gets the localized string with the specified key and formats it with the provided arguments. + /// + /// The key of the localized string. + /// The arguments to format the localized string with. + /// The localized string formatted with the provided arguments. + public LocalizedString this[string key, params object[] arguments] + { + get + { + if (string.IsNullOrWhiteSpace(key)) + return new LocalizedString(string.Empty, string.Empty, true); + + var notFound = false; + var translation = provider.GetTranslation(key); + + if (string.IsNullOrEmpty(translation)) + { + translation = string.Format(key, arguments); + notFound = true; + } + else + { + translation = string.Format(translation, arguments); + } + + return new LocalizedString(key, translation, notFound); + } + } +} diff --git a/src/framework/Elsa.Studio.Core/Localization/ILocalizationProvider.cs b/src/framework/Elsa.Studio.Core/Localization/ILocalizationProvider.cs new file mode 100644 index 0000000..dd31284 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Localization/ILocalizationProvider.cs @@ -0,0 +1,6 @@ +namespace Elsa.Studio.Localization; + +public interface ILocalizationProvider +{ + string GetTranslation(string key); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Localization/ILocalizer.cs b/src/framework/Elsa.Studio.Core/Localization/ILocalizer.cs new file mode 100644 index 0000000..085ca26 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Localization/ILocalizer.cs @@ -0,0 +1,22 @@ +using Microsoft.Extensions.Localization; + +namespace Elsa.Studio.Localization; + +/// +/// Interface for localization. +/// +public interface ILocalizer +{ + /// + /// Gets the localized string for the given key. + /// + /// The key for the localized string. + LocalizedString this[string key] { get; } + + /// + /// Gets the localized string for the given key and formats it with the provided arguments. + /// + /// The key for the localized string. + /// The arguments to format the localized string with. + LocalizedString this[string key, params object[] arguments] { get; } +} diff --git a/src/framework/Elsa.Studio.Core/MenuItemGroups.cs b/src/framework/Elsa.Studio.Core/MenuItemGroups.cs new file mode 100644 index 0000000..1cb6f9f --- /dev/null +++ b/src/framework/Elsa.Studio.Core/MenuItemGroups.cs @@ -0,0 +1,9 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio; + +public static class MenuItemGroups +{ + public static readonly MenuItemGroup General = new("general", "General", 0f); + public static readonly MenuItemGroup Settings = new("security", "Settings", 1000f); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/BackendApiConfig.cs b/src/framework/Elsa.Studio.Core/Models/BackendApiConfig.cs new file mode 100644 index 0000000..bd80646 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/BackendApiConfig.cs @@ -0,0 +1,10 @@ +using Elsa.Api.Client.Options; +using Elsa.Studio.Options; + +namespace Elsa.Studio.Models; + +public class BackendApiConfig +{ + public Action? ConfigureHttpClientBuilder { get; set; } + public Action? ConfigureBackendOptions { get; set; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/ClientInformation.cs b/src/framework/Elsa.Studio.Core/Models/ClientInformation.cs new file mode 100644 index 0000000..330e698 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/ClientInformation.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Models; + +/// +/// Contains information about the client. +/// +/// The installed package version of Elsa Studio. +public record ClientInformation(string PackageVersion); \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/DisplayInputEditorContext.cs b/src/framework/Elsa.Studio.Core/Models/DisplayInputEditorContext.cs new file mode 100644 index 0000000..2a0de6c --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/DisplayInputEditorContext.cs @@ -0,0 +1,198 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Models; + +/// +/// Provides contextual information to the input editor. +/// +public class DisplayInputEditorContext +{ + /// + /// The workflow definition. + /// + public WorkflowDefinition WorkflowDefinition { get; set; } = null!; + + /// + /// The activity. + /// + public JsonObject Activity { get; set; } = null!; + + /// + /// The activity descriptor. + /// + public ActivityDescriptor ActivityDescriptor { get; set; } = null!; + + /// + /// The input descriptor. + /// + public InputDescriptor InputDescriptor { get; set; } = null!; + + /// + /// The input value. + /// + public object? Value { get; set; } + + /// + /// The UI hint handler. + /// + public IUIHintHandler UIHintHandler { get; set; } = null!; + + /// + /// The syntax provider. + /// + public ExpressionDescriptor? SelectedExpressionDescriptor { get; set; } + + /// + /// A delegate that is invoked when the input value changes. + /// + public Func OnValueChanged { get; set; } = null!; + + /// + /// A value indicating whether the input is read-only. + /// + public bool IsReadOnly { get; set; } + + /// + /// Returns the input value or the default value if the input value is null. + /// + public T? GetValueOrDefault() + { + return (Value ?? InputDescriptor.DefaultValue).ConvertTo(); + } + + /// + /// Returns the wrapped input literal value. + /// + /// + public string GetLiteralValueOrDefault() + { + if (!InputDescriptor.IsWrapped) + return Value?.ToString() ?? InputDescriptor.DefaultValue?.ToString() ?? string.Empty; + + var wrappedInput = Value as WrappedInput; + var expression = wrappedInput?.Expression; + + if (expression?.Type != "Literal") + return InputDescriptor.DefaultValue?.ToString() ?? string.Empty; + + var value = expression.Value; + return value?.ToString() ?? InputDescriptor.DefaultValue?.ToString() ?? string.Empty; + } + + /// + /// Returns the wrapped input object value. + /// + /// + public string GetObjectValueOrDefault() + { + if (!InputDescriptor.IsWrapped) + return Serialize(Value ?? InputDescriptor.DefaultValue); + + var wrappedInput = Value as WrappedInput; + var expression = wrappedInput?.Expression; + + if (expression?.Type != "Object") + return Serialize(InputDescriptor.DefaultValue); + + var value = expression.Value; + return value?.ToString() ?? InputDescriptor.DefaultValue?.ToString() ?? string.Empty; + } + + /// + /// Returns the input expression value if this is a wrapped input (i.e. Input{T}) or naked value otherwise. If either value is null, the default value is returned. + /// + public string GetExpressionValueOrDefault() + { + if (!InputDescriptor.IsWrapped) + return Value?.ToString() ?? InputDescriptor.DefaultValue?.ToString() ?? string.Empty; + + var wrappedInput = Value as WrappedInput; + var expression = wrappedInput?.Expression; + var value = expression?.ToString(); + return value ?? InputDescriptor.DefaultValue?.ToString() ?? string.Empty; + } + + /// + /// Updates the naked input value. + /// + public async Task UpdateValueAsync(object? value) + { + await OnValueChanged(value); + } + + /// + /// Updates the wrapped input expression. + /// + /// + public async Task UpdateExpressionAsync(Expression expression) + { + var wrappedInput = Value as WrappedInput; + + // Update input. + wrappedInput ??= new(); + wrappedInput.Expression = expression; + + Value = wrappedInput; + + // Notify that the input has changed. + await OnValueChanged(wrappedInput); + } + + /// + /// Updates the input value or sets it as a literal expression, + /// depending on the wrapping configuration of the . + /// + /// The new value to be set, either directly or wrapped as a literal expression. + public Task UpdateValueOrLiteralExpressionAsync(string value) + { + return UpdateValueOrExpressionAsync(value, _ => value, "Literal"); + } + + /// + /// Updates the input value or sets it as an object expression, + /// depending on the wrapping configuration of the . + /// + /// The new value to be set, either directly or wrapped as an object expression. + public Task UpdateValueOrObjectExpressionAsync(object value) + { + return UpdateValueOrExpressionAsync(value, Serialize, "Object"); + } + + /// + /// Updates the input value or sets it as an expression, + /// depending on the wrapping configuration of the . + /// + /// The new value to be set, either directly or wrapped as an expression. + /// A delegate to a function that stringifies the value for storing inside an object. + /// The expression type + public async Task UpdateValueOrExpressionAsync(object? value, Func toString, string expressionType) + { + if (InputDescriptor.IsWrapped) + { + var stringValue = toString(value); + var expression = new Expression(expressionType, stringValue); + + await UpdateExpressionAsync(expression); + return; + } + + await UpdateValueAsync(value); + } + + private static string Serialize(object? value) + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + return value != null ? JsonSerializer.Serialize(value, options) : string.Empty; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/MenuItem.cs b/src/framework/Elsa.Studio.Core/Models/MenuItem.cs new file mode 100644 index 0000000..6b8bff2 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/MenuItem.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNetCore.Components.Routing; + +namespace Elsa.Studio.Models; + +/// +/// A menu item. +/// +public class MenuItem +{ + /// + /// The icon to use in SVG format. + /// + public string? Icon { get; set; } + + /// + /// The path to navigate to. + /// + public string Href { get; set; } = default!; + + /// + /// The to use. + /// + public NavLinkMatch Match { get; set; } = NavLinkMatch.Prefix; + + /// + /// The text to display. + /// + public string Text { get; set; } = default!; + + /// + /// The order of the menu item. + /// + public float Order { get; set; } + + /// + /// A list of sub menu items. + /// + public ICollection SubMenuItems { get; set; } = new List(); + + /// + /// The name of the group this menu item belongs to. + /// + public string GroupName { get; set; } = "General"; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/MenuItemGroup.cs b/src/framework/Elsa.Studio.Core/Models/MenuItemGroup.cs new file mode 100644 index 0000000..7b7a58f --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/MenuItemGroup.cs @@ -0,0 +1,4 @@ +namespace Elsa.Studio.Models; + +/// A menu item group. +public record MenuItemGroup(string Name, string Text, float Order = 0f); \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/RemoteBackend.cs b/src/framework/Elsa.Studio.Core/Models/RemoteBackend.cs new file mode 100644 index 0000000..321d11d --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/RemoteBackend.cs @@ -0,0 +1,21 @@ +namespace Elsa.Studio.Models; + +/// +/// Represent a remote backend. +/// +public class RemoteBackend +{ + /// + /// Initializes a new instance of the class. + /// + /// The URL of the backend. + public RemoteBackend(Uri url) + { + Url = url; + } + + /// + /// The URL of the backend. + /// + public Uri Url { get; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/Result.cs b/src/framework/Elsa.Studio.Core/Models/Result.cs new file mode 100644 index 0000000..4ac17d4 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/Result.cs @@ -0,0 +1,90 @@ +namespace Elsa.Studio.Models; + +/// +/// Represents a result that is either successful or failed. +/// +/// The type of the success value. +/// The type of the failure value. +public class Result +{ + /// + /// Creates a new successful result. + /// + public Result(TSuccess success) + { + Success = success; + } + + /// + /// Creates a new failed result. + /// + /// + public Result(TFailure failure) + { + Failure = failure; + } + + /// + /// The success value. + /// + public TSuccess? Success { get; set; } + + /// + /// The failure value. + /// + public TFailure? Failure { get; set; } + + /// + /// Returns true if the result is successful. + /// + public bool IsSuccess => Success is not null; + + /// + /// Returns true if the result is failed. + /// + public bool IsFailed => Failure is not null; + + /// + /// Invokes the specified handler if the result is successful. + /// + /// The success result. + public async Task OnSuccessAsync(Func handler) + { + if (!IsSuccess) return default!; + await handler(Success!); + return Success!; + } + + /// + /// Invokes the specified handler if the result is successful. + /// + /// The success result. + public TSuccess OnSuccess(Action handler) + { + if (!IsSuccess) return default!; + handler(Success!); + return Success!; + } + + /// + /// Invokes the specified handler if the result is failed. + /// + /// The failed result. + public async Task OnFailedAsync(Func handler) + { + if (!IsFailed) return default!; + await handler(Failure!); + return Failure!; + } + + /// + /// Invokes the specified handler if the result is failed. + /// + /// The failed result. + public TFailure OnFailed(Action handler) + { + if (!IsFailed) return default!; + handler(Failure!); + return Failure!; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Models/ServerInformation.cs b/src/framework/Elsa.Studio.Core/Models/ServerInformation.cs new file mode 100644 index 0000000..250b5bd --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Models/ServerInformation.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Models; + +/// +/// Contains information about the server. +/// +/// The installed package version of Elsa. +public record ServerInformation(string PackageVersion); \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Options/BackendOptions.cs b/src/framework/Elsa.Studio.Core/Options/BackendOptions.cs new file mode 100644 index 0000000..e20d9c0 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Options/BackendOptions.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Options; + +/// +/// Provides options about the backend. +/// +public class BackendOptions +{ + /// + /// The URL of the backend. + /// + public Uri Url { get; set; } = default!; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/AssemblyClientInformationProvider.cs b/src/framework/Elsa.Studio.Core/Services/AssemblyClientInformationProvider.cs new file mode 100644 index 0000000..a2c5ced --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/AssemblyClientInformationProvider.cs @@ -0,0 +1,26 @@ +using System.Reflection; +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; + +namespace Elsa.Studio.Services; + +/// +/// Provides client information by extracting metadata from the executing assembly. +/// +public class AssemblyClientInformationProvider : IClientInformationProvider +{ + /// + public ValueTask GetInfoAsync(CancellationToken cancellationToken = default) + { + var assembly = Assembly.GetExecutingAssembly(); + var versionAttribute = assembly.GetCustomAttribute(); + var version = RemoveAutoGeneratedPostfix(versionAttribute); + + return new(new ClientInformation(version)); + } + + private static string RemoveAutoGeneratedPostfix(AssemblyInformationalVersionAttribute? versionAttribute) + { + return versionAttribute?.InformationalVersion.Split("+")[0]!; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/BlazorScopedProxyApi.cs b/src/framework/Elsa.Studio.Core/Services/BlazorScopedProxyApi.cs new file mode 100644 index 0000000..e9bc00a --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/BlazorScopedProxyApi.cs @@ -0,0 +1,34 @@ +using System.Reflection; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +/// Decorates an API client with a Blazor service accessor, ensuring that the service provider is available to the API client when calling DI-resolved delegating handlers. +/// +public class BlazorScopedProxyApi : DispatchProxy +{ + private T _decoratedApi = default!; + private IBlazorServiceAccessor _blazorServiceAccessor = null!; + private IServiceProvider _serviceProvider = null!; + + /// + /// Initializes the BlazorScopedProxyApi instance with the specified parameters. + /// + /// The API client instance to be decorated. + /// The Blazor service accessor instance for setting the scoped service provider. + /// The service provider for dependency injection. + public void Initialize(T decoratedApi, IBlazorServiceAccessor blazorServiceAccessor, IServiceProvider serviceProvider) + { + _decoratedApi = decoratedApi; + _blazorServiceAccessor = blazorServiceAccessor; + _serviceProvider = serviceProvider; + } + + /// + protected override object? Invoke(MethodInfo? targetMethod, object?[]? args) + { + _blazorServiceAccessor.Services = _serviceProvider; + return targetMethod?.Invoke(_decoratedApi, args); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/BlazorServiceAccessor.cs b/src/framework/Elsa.Studio.Core/Services/BlazorServiceAccessor.cs new file mode 100644 index 0000000..0f6ec2a --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/BlazorServiceAccessor.cs @@ -0,0 +1,35 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// This class is used to access the IServiceProvider from a different DI scope. +/// See: https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/dependency-injection?view=aspnetcore-7.0#access-server-side-blazor-services-from-a-different-di-scope +public sealed class BlazorServiceAccessor : IBlazorServiceAccessor +{ + private static readonly AsyncLocal CurrentServiceHolder = new(); + + /// + /// Gets or sets the current IServiceProvider. + /// + public IServiceProvider Services + { + get => CurrentServiceHolder.Value!.Services!; + set + { + if (CurrentServiceHolder.Value is { } holder) + { + // Clear the current IServiceProvider trapped in the AsyncLocal. + holder.Services = null; + } + + // Use object indirection to hold the IServiceProvider in an AsyncLocal + // so it can be cleared in all ExecutionContexts when it's cleared. + CurrentServiceHolder.Value = new() { Services = value }; + } + } + + private sealed class BlazorServiceHolder + { + public IServiceProvider? Services { get; set; } + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultAppBarService.cs b/src/framework/Elsa.Studio.Core/Services/DefaultAppBarService.cs new file mode 100644 index 0000000..1881bc0 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultAppBarService.cs @@ -0,0 +1,20 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Services; + +public class DefaultAppBarService : IAppBarService +{ + private readonly ICollection _appBarItems = new List(); + private int _appBarSequence; + + public event Action? AppBarItemsChanged; + public IEnumerable AppBarItems => _appBarItems.ToList(); + + public void AddAppBarItem() where T : IComponent + { + _appBarItems.Add(builder => builder.CreateComponent(ref _appBarSequence)); + AppBarItemsChanged?.Invoke(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultBackendApiClientProvider.cs b/src/framework/Elsa.Studio.Core/Services/DefaultBackendApiClientProvider.cs new file mode 100644 index 0000000..dc91bf6 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultBackendApiClientProvider.cs @@ -0,0 +1,24 @@ +using System.Reflection; +using Elsa.Api.Client.Extensions; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +/// Provides API clients to the remote backend. +/// +public class DefaultBackendApiClientProvider(IRemoteBackendAccessor remoteBackendAccessor, IBlazorServiceAccessor blazorServiceAccessor, IServiceProvider serviceProvider) : IBackendApiClientProvider +{ + /// + public Uri Url => remoteBackendAccessor.RemoteBackend.Url; + + /// + public ValueTask GetApiAsync(CancellationToken cancellationToken) where T : class + { + var backendUrl = remoteBackendAccessor.RemoteBackend.Url; + var client = serviceProvider.CreateApi(backendUrl); + var decorator = DispatchProxy.Create>(); + (decorator as BlazorScopedProxyApi)!.Initialize(client, blazorServiceAccessor, serviceProvider); + return new(decorator); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultFeatureService.cs b/src/framework/Elsa.Studio.Core/Services/DefaultFeatureService.cs new file mode 100644 index 0000000..64d5481 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultFeatureService.cs @@ -0,0 +1,59 @@ +using System.Reflection; +using Elsa.Studio.Attributes; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +public class DefaultFeatureService : IFeatureService +{ + private readonly IEnumerable _features; + private readonly IRemoteFeatureProvider _remoteFeatureProvider; + + /// + /// Initializes a new instance of the class. + /// + public DefaultFeatureService(IEnumerable features, IRemoteFeatureProvider remoteFeatureProvider) + { + _features = features; + _remoteFeatureProvider = remoteFeatureProvider; + } + + /// + public event Action? Initialized; + + /// + public IEnumerable GetFeatures() + { + return _features.ToList(); + } + + /// + public async Task InitializeFeaturesAsync(CancellationToken cancellationToken = default) + { + var remoteFeatures = (await _remoteFeatureProvider.ListAsync(cancellationToken)).ToList(); + + foreach (var feature in GetFeatures()) + { + var remoteFeatureName = feature.GetType().GetCustomAttribute()?.Name; + + if (!string.IsNullOrWhiteSpace(remoteFeatureName)) + { + // Check if the remote feature is enabled. + var remoteFeatureIsEnabled = remoteFeatures.Any(x => x.FullName == remoteFeatureName); + + if (!remoteFeatureIsEnabled) + continue; + } + + await feature.InitializeAsync(cancellationToken); + } + + OnInitialized(); + } + + private void OnInitialized() + { + Initialized?.Invoke(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultMediator.cs b/src/framework/Elsa.Studio.Core/Services/DefaultMediator.cs new file mode 100644 index 0000000..64c9980 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultMediator.cs @@ -0,0 +1,53 @@ +using Elsa.Studio.Contracts; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Services; + +/// +/// A default implementation of . +/// +public class DefaultMediator : IMediator +{ + private readonly IServiceProvider _serviceProvider; + private readonly ISet _handlers = new HashSet(); + + /// + /// Initializes a new instance of the class. + /// + public DefaultMediator(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public void Subscribe(THandler handler) where TNotification : INotification where THandler : INotificationHandler + { + _handlers.Add(handler); + } + + /// + public void Unsubscribe(THandler handler) where TNotification : INotification where THandler : INotificationHandler + { + _handlers.Remove(handler); + } + + /// + public void Unsubscribe(INotificationHandler handler) + { + var handlers =_handlers.Where(x => x == handler).ToList(); + + foreach (var h in handlers) + _handlers.Remove(h); + } + + /// + public Task NotifyAsync(TNotification notification, CancellationToken cancellationToken = default) where TNotification : INotification + { + // Collect handlers registered manually, and handlers registered via DI. + var manualHandlers = _handlers.OfType>().ToList(); + var registeredHandlers = _serviceProvider.GetServices().OfType>().ToList(); + var handlers = manualHandlers.Concat(registeredHandlers).ToList(); + var tasks = handlers.Select(x => x.HandleAsync(notification, cancellationToken)); + return Task.WhenAll(tasks); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultMenuGroupProvider.cs b/src/framework/Elsa.Studio.Core/Services/DefaultMenuGroupProvider.cs new file mode 100644 index 0000000..d05bde0 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultMenuGroupProvider.cs @@ -0,0 +1,18 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; + +namespace Elsa.Studio.Services; + +public class DefaultMenuGroupProvider : IMenuGroupProvider +{ + public ValueTask> GetMenuGroupsAsync(CancellationToken cancellationToken = default) + { + var groups = new List + { + MenuItemGroups.General, + MenuItemGroups.Settings + }; + + return new(groups); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultMenuService.cs b/src/framework/Elsa.Studio.Core/Services/DefaultMenuService.cs new file mode 100644 index 0000000..8733927 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultMenuService.cs @@ -0,0 +1,48 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; + +namespace Elsa.Studio.Services; + +/// +public class DefaultMenuService : IMenuService +{ + private readonly IEnumerable _menuProviders; + private readonly IEnumerable _menuGroupProviders; + + /// + /// Initializes a new instance of the class. + /// + public DefaultMenuService(IEnumerable menuProviders, IEnumerable menuGroupProviders) + { + _menuProviders = menuProviders; + _menuGroupProviders = menuGroupProviders; + } + + /// + public async ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default) + { + var menu = new List(); + + foreach (var menuProvider in _menuProviders) + { + var menuItems = await menuProvider.GetMenuItemsAsync(cancellationToken); + menu.AddRange(menuItems); + } + + return menu.OrderBy(x => x.Order).ToList(); + } + + /// + public async ValueTask> GetMenuItemGroupsAsync(CancellationToken cancellationToken = default) + { + var groups = new List(); + + foreach (var menuGroupProvider in _menuGroupProviders) + { + var menuGroups = await menuGroupProvider.GetMenuGroupsAsync(cancellationToken); + groups.AddRange(menuGroups); + } + + return groups.DistinctBy(x => x.Name).OrderBy(x => x.Order).ToList(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultRemoteBackendAccessor.cs b/src/framework/Elsa.Studio.Core/Services/DefaultRemoteBackendAccessor.cs new file mode 100644 index 0000000..70600f5 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultRemoteBackendAccessor.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.Options; +using Microsoft.Extensions.Options; + +namespace Elsa.Studio.Services; + +/// +/// A default implementation of that uses the to determine the URL of the remote backend. +/// +public class DefaultRemoteBackendAccessor : IRemoteBackendAccessor +{ + private readonly IOptions _options; + + /// + /// Initializes a new instance of the class. + /// + public DefaultRemoteBackendAccessor(IOptions options) + { + _options = options; + } + + /// + public RemoteBackend RemoteBackend => new(_options.Value.Url); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultStartupTaskRunner.cs b/src/framework/Elsa.Studio.Core/Services/DefaultStartupTaskRunner.cs new file mode 100644 index 0000000..b0766ed --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultStartupTaskRunner.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +public class DefaultStartupTaskRunner : IStartupTaskRunner +{ + private readonly IEnumerable _startupTasks; + + /// + /// + /// + /// + public DefaultStartupTaskRunner(IEnumerable startupTasks) + { + _startupTasks = startupTasks; + } + + /// + public async Task RunStartupTasksAsync(CancellationToken cancellationToken = default) + { + foreach (var task in _startupTasks) + await task.ExecuteAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultSyntaxService.cs b/src/framework/Elsa.Studio.Core/Services/DefaultSyntaxService.cs new file mode 100644 index 0000000..433c0cd --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultSyntaxService.cs @@ -0,0 +1,38 @@ +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +public class DefaultExpressionService : IExpressionService +{ + private readonly IExpressionProvider _expressionProvider; + private ICollection _descriptors = default!; + + /// + /// Initializes a new instance of the class. + /// + public DefaultExpressionService(IExpressionProvider expressionProvider) + { + _expressionProvider = expressionProvider; + } + + /// + public async Task> ListDescriptorsAsync(CancellationToken cancellationToken = default) + { + if (_descriptors == null!) + { + var descriptors = await _expressionProvider.ListAsync(cancellationToken); + _descriptors = descriptors.ToList(); + } + + return _descriptors; + } + + /// + public async Task GetByTypeAsync(string type, CancellationToken cancellationToken = default) + { + var descriptors = await ListDescriptorsAsync(cancellationToken); + return descriptors.FirstOrDefault(x => x.Type == type); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultThemeService.cs b/src/framework/Elsa.Studio.Core/Services/DefaultThemeService.cs new file mode 100644 index 0000000..03b413f --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultThemeService.cs @@ -0,0 +1,70 @@ +using Elsa.Studio.Contracts; +using MudBlazor; +using MudBlazor.Utilities; + +namespace Elsa.Studio.Services; + +/// +public class DefaultThemeService : IThemeService +{ + private MudTheme _currentTheme = CreateDefaultTheme(); + private bool _isDarkMode; + + /// + public event Action? CurrentThemeChanged; + + /// + public event Action? IsDarkModeChanged; + + /// + public MudTheme CurrentTheme + { + get => _currentTheme; + set + { + _currentTheme = value; + CurrentThemeChanged?.Invoke(); + } + } + + /// + public bool IsDarkMode + { + get => _isDarkMode; + set + { + _isDarkMode = value; + IsDarkModeChanged?.Invoke(); + } + } + + private static MudTheme CreateDefaultTheme() + { + var theme = new MudTheme + { + LayoutProperties = + { + DefaultBorderRadius = "4px", + }, + PaletteLight = + { + Primary = new("0ea5e9"), + DrawerBackground = new("#f8fafc"), + AppbarBackground = new("#0ea5e9"), + AppbarText = new("#ffffff"), + Background = new("#ffffff"), + Surface = new("#f8fafc") + }, + PaletteDark = + { + Primary = new("0ea5e9"), + AppbarBackground = new("#0f172a"), + DrawerBackground = new("#0f172a"), + Background = new("#0f172a"), + Surface = new("#182234"), + } + }; + + return theme; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultUIFieldExtensionService.cs b/src/framework/Elsa.Studio.Core/Services/DefaultUIFieldExtensionService.cs new file mode 100644 index 0000000..e321a83 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultUIFieldExtensionService.cs @@ -0,0 +1,27 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; + +namespace Elsa.Studio.Services; + +/// +/// Provides a default implementation of UI field extension services. +/// +/// +public class DefaultUIFieldExtensionService(IEnumerable handlers) : IUIFieldExtensionService +{ + /// + /// + /// + public List? TryGetHandlers(string componentName, DisplayInputEditorContext context) + { + var activityName = context.ActivityDescriptor.Name; + var syntax = context.InputDescriptor.DefaultSyntax ?? string.Empty; + var matchingHandlers = handlers + .Where(x => x.GetExtensionForInputComponent(componentName) + && (!x.ActivityTypes.Any() || x.ActivityTypes.Contains(activityName)) + && (!x.Syntaxes.Any() || x.Syntaxes.Contains(syntax))) + .OrderBy(x => x.DisplayOrder) + .ToList(); + return matchingHandlers; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultUIHintService.cs b/src/framework/Elsa.Studio.Core/Services/DefaultUIHintService.cs new file mode 100644 index 0000000..f3a071d --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultUIHintService.cs @@ -0,0 +1,35 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +public class DefaultUIHintService(IEnumerable handlers) : IUIHintService +{ + public IUIHintHandler GetHandler(string uiHint) + { + var handler = handlers.FirstOrDefault(x => x.GetSupportsUIHint(uiHint)); + return handler ?? new UnsupportedUIHintHandler(); + } + + // public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + // { + // var handler = _handlers.FirstOrDefault(x => x.GetSupportsUIHint(context.InputDescriptor.UIHint)); + // return handler == null ? DisplayUnsupportedUIHint(context) : handler.DisplayInputEditor(context); + // } + + // private RenderFragment DisplayUnsupportedUIHint(DisplayInputEditorContext context) + // { + // return builder => + // { + // builder.OpenComponent(0); + // builder.AddAttribute(1, nameof(MudAlert.Severity), Severity.Warning); + // builder.AddAttribute(2, nameof(MudAlert.Class), "my-2"); + // builder.AddAttribute(3, nameof(MudText.ChildContent), (RenderFragment)(textBuilder => + // { + // textBuilder.AddContent(0, $"Unsupported UI hint: {context.InputDescriptor.UIHint}"); + // })); + // builder.CloseElement(); + // }; + // } + + +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/DefaultWidgetRegistry.cs b/src/framework/Elsa.Studio.Core/Services/DefaultWidgetRegistry.cs new file mode 100644 index 0000000..d67f35c --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/DefaultWidgetRegistry.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +public class DefaultWidgetRegistry : IWidgetRegistry +{ + private HashSet Widgets { get; set; } = new(); + + /// + /// Initializes a new instance of the class. + /// + public DefaultWidgetRegistry(IEnumerable widgets) + { + foreach (var widget in widgets) Add(widget); + } + + /// + public void Add(IWidget widget) + { + Widgets.Add(widget); + } + + /// + public IEnumerable List(string zone) + { + return Widgets.Where(x => x.Zone == zone).OrderBy(x => x.Order); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/EmptyServerInformationProvider.cs b/src/framework/Elsa.Studio.Core/Services/EmptyServerInformationProvider.cs new file mode 100644 index 0000000..9dfb9ad --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/EmptyServerInformationProvider.cs @@ -0,0 +1,16 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; + +namespace Elsa.Studio.Services; + +/// +/// A default implementation of that returns dummy data. +/// +public class EmptyServerInformationProvider : IServerInformationProvider +{ + /// + public ValueTask GetInfoAsync(CancellationToken cancellationToken = default) + { + return new (new ServerInformation("0.0.0")); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/RemoteExpressionProvider.cs b/src/framework/Elsa.Studio.Core/Services/RemoteExpressionProvider.cs new file mode 100644 index 0000000..04e6335 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/RemoteExpressionProvider.cs @@ -0,0 +1,29 @@ +using Elsa.Api.Client.Resources.Scripting.Contracts; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +/// Provides available expression descriptors from a remote API. +/// +public class RemoteExpressionProvider : IExpressionProvider +{ + private readonly IBackendApiClientProvider _backendApiClientProvider; + + /// + /// Initializes a new instance of the class. + /// + public RemoteExpressionProvider(IBackendApiClientProvider backendApiClientProvider) + { + _backendApiClientProvider = backendApiClientProvider; + } + + /// + public async ValueTask> ListAsync(CancellationToken cancellationToken = default) + { + var api = await _backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + return response.Items; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/RemoteFeatureProvider.cs b/src/framework/Elsa.Studio.Core/Services/RemoteFeatureProvider.cs new file mode 100644 index 0000000..3b4e4da --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/RemoteFeatureProvider.cs @@ -0,0 +1,37 @@ +using System.Net; +using Elsa.Api.Client.Resources.Features.Contracts; +using Elsa.Api.Client.Resources.Features.Models; +using Elsa.Studio.Contracts; +using Refit; + +namespace Elsa.Studio.Services; + +/// +/// A feature service that uses a remote backend to retrieve feature flags. +/// +public class RemoteFeatureProvider(IBackendApiClientProvider remoteBackendApiClientProvider) : IRemoteFeatureProvider +{ + /// + public async Task IsEnabledAsync(string featureName, CancellationToken cancellationToken = default) + { + var api = await remoteBackendApiClientProvider.GetApiAsync(cancellationToken); + + try + { + _ = await api.GetAsync(featureName, cancellationToken); + return true; + } + catch (ApiException e) when(e.StatusCode == HttpStatusCode.NotFound) + { + return false; + } + } + + /// + public async Task> ListAsync(CancellationToken cancellationToken = default) + { + var api = await remoteBackendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + return response.Items; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/StaticClientInformationProvider.cs b/src/framework/Elsa.Studio.Core/Services/StaticClientInformationProvider.cs new file mode 100644 index 0000000..6e3c59f --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/StaticClientInformationProvider.cs @@ -0,0 +1,17 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; + +namespace Elsa.Studio.Services; + +/// +/// +/// +public class StaticClientInformationProvider : IClientInformationProvider +{ + /// + public ValueTask GetInfoAsync(CancellationToken cancellationToken = default) + { + var version = ToolVersion.Version.ToString(); + return new(new ClientInformation(version)); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/Services/UnsupportedUIHintHandler.cs b/src/framework/Elsa.Studio.Core/Services/UnsupportedUIHintHandler.cs new file mode 100644 index 0000000..a190c2a --- /dev/null +++ b/src/framework/Elsa.Studio.Core/Services/UnsupportedUIHintHandler.cs @@ -0,0 +1,31 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Services; + +/// +/// A fallback UI handler that is used when no other handler is found for a given UI hint. +/// +public class UnsupportedUIHintHandler : IUIHintHandler +{ + public bool GetSupportsUIHint(string uiHint) => false; + + public string UISyntax => "Unsupported"; + + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(MudAlert.Severity), Severity.Warning); + builder.AddAttribute(2, nameof(MudAlert.Class), "my-2"); + builder.AddAttribute(3, nameof(MudText.ChildContent), (RenderFragment)(textBuilder => + { + textBuilder.AddContent(0, $"Unsupported UI hint: {context.InputDescriptor.UIHint}"); + })); + builder.CloseElement(); + }; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/TokenNames.cs b/src/framework/Elsa.Studio.Core/TokenNames.cs new file mode 100644 index 0000000..fe66282 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/TokenNames.cs @@ -0,0 +1,8 @@ +namespace Elsa.Studio; + +public static class TokenNames +{ + public const string AccessToken = "accessToken"; + public const string IdToken = "idToken"; + public const string RefreshToken = "refreshToken"; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Core/ToolVersion.cs b/src/framework/Elsa.Studio.Core/ToolVersion.cs new file mode 100644 index 0000000..9c04976 --- /dev/null +++ b/src/framework/Elsa.Studio.Core/ToolVersion.cs @@ -0,0 +1,18 @@ +namespace Elsa.Studio; + +/// +/// Represents the version of the tool. +/// +public static class ToolVersion +{ + /// + /// The version of the tool. + /// + public static readonly Version Version = new(3, 5, 0, 0); + + /// + /// Gets the display version of the tool. + /// + /// + public static string GetDisplayVersion() => Version.ToString(2); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/package.json b/src/framework/Elsa.Studio.DomInterop/ClientLib/package.json new file mode 100644 index 0000000..176de95 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/package.json @@ -0,0 +1,19 @@ +{ + "name": "elsa-studio-dom-interop", + "description": "Bundle DOM interop functions.", + "repository": "https://github.com/elsa-workflows/elsa-dashboard", + "license": "MIT", + "version": "1.0.0", + "dependencies": { + + }, + "devDependencies": { + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4", + "typescript": "^5.3.3", + "ts-loader": "^9.5.1" + }, + "scripts": { + "build": "webpack" + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard.ts new file mode 100644 index 0000000..1a6ae49 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard.ts @@ -0,0 +1 @@ +export * from "./clipboard/"; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/copy-text.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/copy-text.ts new file mode 100644 index 0000000..6a667f3 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/copy-text.ts @@ -0,0 +1,7 @@ +export const copyText = async function (text) { + await navigator.clipboard + .writeText(text) + .catch(function (error) { + alert(error); + }); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/index.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/index.ts new file mode 100644 index 0000000..6f79720 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/clipboard/index.ts @@ -0,0 +1 @@ +export * from './copy-text'; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom.ts new file mode 100644 index 0000000..aa3f7df --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom.ts @@ -0,0 +1 @@ +export * from "./dom/"; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/click-element.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/click-element.ts new file mode 100644 index 0000000..a08e054 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/click-element.ts @@ -0,0 +1,7 @@ +import {getElement} from "./get-element"; + +export function clickElement(elementOrQuerySelector: Element | string) { + const element = getElement(elementOrQuerySelector) as HTMLElement; + + element.click(); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-bounding-client-rect.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-bounding-client-rect.ts new file mode 100644 index 0000000..b379f79 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-bounding-client-rect.ts @@ -0,0 +1,6 @@ +import {getElement} from "./get-element"; + +export function getBoundingClientRect(elementOrQuerySelector: Element | string): DOMRect { + const element = getElement(elementOrQuerySelector); + return element.getBoundingClientRect(); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-element.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-element.ts new file mode 100644 index 0000000..7ad8263 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-element.ts @@ -0,0 +1,3 @@ +export function getElement(elementOrQuerySelector: Element | string): Element { + return typeof elementOrQuerySelector === 'string' ? document.querySelector(elementOrQuerySelector) : elementOrQuerySelector; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-visible-height.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-visible-height.ts new file mode 100644 index 0000000..51a4e2c --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/get-visible-height.ts @@ -0,0 +1,18 @@ +import {getElement} from "./get-element"; + +export function getVisibleHeight(elementOrQuerySelector: Element | string): number { + const element = getElement(elementOrQuerySelector); + + if(!element) + return 0; + + const rect = element.getBoundingClientRect(); + const windowHeight = window.innerHeight; + + if (rect.bottom > windowHeight) { + const visibleHeight = windowHeight - rect.top; + return visibleHeight > 0 ? visibleHeight : 0; + } + + return rect.height; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/index.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/index.ts new file mode 100644 index 0000000..f803a88 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/element/index.ts @@ -0,0 +1,5 @@ +export * from './click-element'; +export * from './get-bounding-client-rect'; +export * from './get-element'; +export * from './get-visible-height'; + diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/index.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/index.ts new file mode 100644 index 0000000..e72854e --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/dom/index.ts @@ -0,0 +1 @@ +export * from './element'; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files.ts new file mode 100644 index 0000000..8c5d833 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files.ts @@ -0,0 +1 @@ +export * from "./files/"; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/download-file-from-stream.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/download-file-from-stream.ts new file mode 100644 index 0000000..fbbf17a --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/download-file-from-stream.ts @@ -0,0 +1,11 @@ +export const downloadFileFromStream = async (fileName, contentStreamReference) => { + const arrayBuffer = await contentStreamReference.arrayBuffer(); + const blob = new Blob([arrayBuffer]); + const url = URL.createObjectURL(blob); + const anchorElement = document.createElement('a'); + anchorElement.href = url; + anchorElement.download = fileName ?? ''; + anchorElement.click(); + anchorElement.remove(); + URL.revokeObjectURL(url); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/index.ts b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/index.ts new file mode 100644 index 0000000..b6db309 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/src/files/index.ts @@ -0,0 +1 @@ +export * from './download-file-from-stream'; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/tsconfig.json b/src/framework/Elsa.Studio.DomInterop/ClientLib/tsconfig.json new file mode 100644 index 0000000..5b77e76 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "outDir": "../wwwroot", + "sourceMap": true, + "noImplicitAny": false, + "module": "ES2022", + "target": "ES2022", + "jsx": "react", + "allowJs": true, + "moduleResolution": "node" + }, + "include": [ + "./src/**/*" + ] +} diff --git a/src/framework/Elsa.Studio.DomInterop/ClientLib/webpack.config.js b/src/framework/Elsa.Studio.DomInterop/ClientLib/webpack.config.js new file mode 100644 index 0000000..0b912cf --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/ClientLib/webpack.config.js @@ -0,0 +1,45 @@ +const path = require('path'); + +module.exports = { + entry: { + dom: './src/dom.ts', + clipboard: './src/clipboard.ts', + files: './src/files.ts', + }, + output: { + filename: '[name].entry.js', + path: path.resolve(__dirname, '..', 'wwwroot'), + library: { + type: "module", + }, + module: true, // Enable outputting ES6 modules. + environment: { + module: true, // The environment supports ES6 modules. + }, + }, + experiments: { + outputModule: true, // This enables the experimental support for outputting ES6 modules + }, + devtool: 'source-map', + mode: 'development', + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + { + test: /\.css$/, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.(eot|woff(2)?|ttf|otf|svg)$/i, + type: 'asset' + }, + ] + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, +}; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Contracts/IClipboard.cs b/src/framework/Elsa.Studio.DomInterop/Contracts/IClipboard.cs new file mode 100644 index 0000000..11a1ad2 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Contracts/IClipboard.cs @@ -0,0 +1,9 @@ +namespace Elsa.Studio.DomInterop.Contracts; + +/// +/// Provides access to the browser's DOM. +/// +public interface IClipboard +{ + Task CopyText(string text, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Contracts/IDomAccessor.cs b/src/framework/Elsa.Studio.DomInterop/Contracts/IDomAccessor.cs new file mode 100644 index 0000000..33c77cc --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Contracts/IDomAccessor.cs @@ -0,0 +1,13 @@ +using Elsa.Studio.DomInterop.Models; + +namespace Elsa.Studio.DomInterop.Contracts; + +/// +/// Provides access to the browser's DOM. +/// +public interface IDomAccessor +{ + Task GetBoundingClientRectAsync(ElementRef elementRef, CancellationToken cancellationToken = default); + Task GetVisibleHeightAsync(ElementRef elementRef, CancellationToken cancellationToken = default); + Task ClickElementAsync(ElementRef elementRef, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Contracts/IFiles.cs b/src/framework/Elsa.Studio.DomInterop/Contracts/IFiles.cs new file mode 100644 index 0000000..e3ceeb2 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Contracts/IFiles.cs @@ -0,0 +1,14 @@ +namespace Elsa.Studio.DomInterop.Contracts; + +/// +/// Provides JS interop methods for the files module. +/// +public interface IFiles +{ + /// + /// Downloads a file from a stream. + /// + /// The name of the file. + /// The stream to download from. + Task DownloadFileFromStreamAsync(string fileName, Stream stream); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Elsa.Studio.DomInterop.csproj b/src/framework/Elsa.Studio.DomInterop/Elsa.Studio.DomInterop.csproj new file mode 100644 index 0000000..d7f377d --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Elsa.Studio.DomInterop.csproj @@ -0,0 +1,28 @@ + + + + Elsa Studio DOM interop services. + elsa studio framework + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/framework/Elsa.Studio.DomInterop/Extensions/ServiceCollectionExtensions.cs b/src/framework/Elsa.Studio.DomInterop/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..4918f51 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,30 @@ +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.DomInterop.Interop; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Elsa.Studio.DomInterop.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddDomInterop(this IServiceCollection services) + { + services.TryAddScoped(); + + return services; + } + + public static IServiceCollection AddClipboardInterop(this IServiceCollection services) + { + services.TryAddScoped(); + + return services; + } + + public static IServiceCollection AddDownloadInterop(this IServiceCollection services) + { + services.TryAddScoped(); + + return services; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/FodyWeavers.xml b/src/framework/Elsa.Studio.DomInterop/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/FodyWeavers.xsd b/src/framework/Elsa.Studio.DomInterop/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Interop/ClipboardJsInterop.cs b/src/framework/Elsa.Studio.DomInterop/Interop/ClipboardJsInterop.cs new file mode 100644 index 0000000..8fd604a --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Interop/ClipboardJsInterop.cs @@ -0,0 +1,17 @@ +using Elsa.Studio.DomInterop.Contracts; +using Microsoft.JSInterop; + +namespace Elsa.Studio.DomInterop.Interop; + +/// +/// Provides access to the dom JavaScript module. +/// +public class ClipboardJsInterop(IJSRuntime jsRuntime) : JsInteropBase(jsRuntime), IClipboard +{ + protected override string ModuleName => "clipboard"; + + public async Task CopyText(string text, CancellationToken cancellationToken = default) + { + await InvokeAsync(async module => await module.InvokeVoidAsync("copyText", cancellationToken, text)); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Interop/DomJsInterop.cs b/src/framework/Elsa.Studio.DomInterop/Interop/DomJsInterop.cs new file mode 100644 index 0000000..fd9acdd --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Interop/DomJsInterop.cs @@ -0,0 +1,17 @@ +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.DomInterop.Models; +using Microsoft.JSInterop; + +namespace Elsa.Studio.DomInterop.Interop; + +/// +/// Provides access to the dom JavaScript module. +/// +public class DomJsInterop(IJSRuntime jsRuntime) : JsInteropBase(jsRuntime), IDomAccessor +{ + protected override string ModuleName => "dom"; + + public async Task GetBoundingClientRectAsync(ElementRef element, CancellationToken cancellationToken = default) => await InvokeAsync(async module => await module.InvokeAsync("getBoundingClientRect", cancellationToken, element.Match())); + public async Task GetVisibleHeightAsync(ElementRef elementRef, CancellationToken cancellationToken = default) => await InvokeAsync(async module => await module.InvokeAsync("getVisibleHeight", cancellationToken, elementRef.Match())); + public async Task ClickElementAsync(ElementRef elementRef, CancellationToken cancellationToken = default) => await InvokeAsync(async module => await module.InvokeVoidAsync("clickElement", cancellationToken, elementRef.Match())); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Interop/FilesJsInterop.cs b/src/framework/Elsa.Studio.DomInterop/Interop/FilesJsInterop.cs new file mode 100644 index 0000000..d3fec00 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Interop/FilesJsInterop.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.DomInterop.Contracts; +using Microsoft.JSInterop; + +namespace Elsa.Studio.DomInterop.Interop; + +/// +/// Provides JS interop methods for the files module. +/// +public class FilesJsInterop : JsInteropBase, IFiles +{ + /// + public FilesJsInterop(IJSRuntime jsRuntime) : base(jsRuntime) + { + } + + /// + protected override string ModuleName => "files"; + + /// + public async Task DownloadFileFromStreamAsync(string fileName, Stream stream) + { + var streamRef = new DotNetStreamReference(stream); + await InvokeAsync(async module => await module.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef)); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Interop/JsInteropBase.cs b/src/framework/Elsa.Studio.DomInterop/Interop/JsInteropBase.cs new file mode 100644 index 0000000..3528e72 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Interop/JsInteropBase.cs @@ -0,0 +1,49 @@ +using Microsoft.JSInterop; + +namespace Elsa.Studio.DomInterop.Interop; + +/// +/// Provides access to the designer JavaScript module. +/// +public abstract class JsInteropBase : IAsyncDisposable +{ + private readonly Lazy> _moduleTask; + + protected abstract string ModuleName { get; } + + protected JsInteropBase(IJSRuntime jsRuntime) + { + _moduleTask = new(() => jsRuntime.InvokeAsync( + "import", $"./_content/Elsa.Studio.DomInterop/{ModuleName}.entry.js").AsTask()); + } + + public async ValueTask DisposeAsync() + { + if (_moduleTask.IsValueCreated) + { + var module = await _moduleTask.Value; + + try + { + await module.DisposeAsync(); + } + catch (JSDisconnectedException) + { + // This exception is thrown when the browser window is closed or the page reloads. + // We can safely ignore it. + } + } + } + + protected async Task InvokeAsync(Func func) + { + var module = await _moduleTask.Value; + await func(module); + } + + protected async Task InvokeAsync(Func> func) + { + var module = await _moduleTask.Value; + return await func(module); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Models/DomRect.cs b/src/framework/Elsa.Studio.DomInterop/Models/DomRect.cs new file mode 100644 index 0000000..92cf08d --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Models/DomRect.cs @@ -0,0 +1,13 @@ +namespace Elsa.Studio.DomInterop.Models; + +public struct DomRect +{ + public double X { get; set; } + public double Y { get; set; } + public double Width { get; set; } + public double Height { get; set; } + public double Top { get; set; } + public double Right { get; set; } + public double Bottom { get; set; } + public double Left { get; set; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Models/ElementRef.cs b/src/framework/Elsa.Studio.DomInterop/Models/ElementRef.cs new file mode 100644 index 0000000..1905b46 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Models/ElementRef.cs @@ -0,0 +1,12 @@ +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.DomInterop.Models; + +public class ElementRef : Union +{ + private ElementRef(string value) : base(value) { } + private ElementRef(ElementReference value) : base(value) { } + public static implicit operator ElementRef(string value) => new(value); + public static implicit operator ElementRef(ElementReference value) => new(value); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.DomInterop/Models/Union.cs b/src/framework/Elsa.Studio.DomInterop/Models/Union.cs new file mode 100644 index 0000000..3115751 --- /dev/null +++ b/src/framework/Elsa.Studio.DomInterop/Models/Union.cs @@ -0,0 +1,33 @@ +namespace Elsa.Studio.Models; + +public class Union +{ + private readonly T1? _value1; + private readonly T2? _value2; + private readonly bool _isValue1; + + protected Union(T1 value) + { + _value1 = value; + _isValue1 = true; + } + + protected Union(T2 value) + { + _value2 = value; + _isValue1 = false; + } + + public static implicit operator Union(T1 value) => new(value); + public static implicit operator Union(T2 value) => new(value); + + public T Match(Func case1, Func case2) + { + if (case1 == null) throw new ArgumentNullException(nameof(case1)); + if (case2 == null) throw new ArgumentNullException(nameof(case2)); + + return _isValue1 ? case1(_value1!) : case2(_value2!); + } + + public object Match() => _isValue1 ? _value1! : _value2!; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Branding/DefaultBrandingProvider.cs b/src/framework/Elsa.Studio.Shared/Branding/DefaultBrandingProvider.cs new file mode 100644 index 0000000..0029328 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Branding/DefaultBrandingProvider.cs @@ -0,0 +1,33 @@ +using Elsa.Studio.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Branding; + +/// +/// Provides default branding information for the application, including the application name, logo URL, and reverse logo URL. +/// Implements the interface. +/// +public class DefaultBrandingProvider : IBrandingProvider +{ + /// + public virtual string AppName => $"Elsa {ToolVersion.GetDisplayVersion()}"; + + /// + public virtual string LogoUrl => GetLogoUrl(false); + + /// + public virtual string LogoReverseUrl => GetLogoUrl(true); + + private string GetLogoUrl(bool v) + { + return "_content/Elsa.Studio.Shell/img/icon.png"; + } + + public virtual RenderFragment Branding => + builder => + { + builder.OpenComponent(0, typeof(DefaultBranding)); + builder.AddAttribute(1, "Provider", this); + builder.CloseComponent(); + }; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Branding/IBrandingProvider.cs b/src/framework/Elsa.Studio.Shared/Branding/IBrandingProvider.cs new file mode 100644 index 0000000..9478347 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Branding/IBrandingProvider.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Branding; + +/// +/// Provides branding information for an application, including its name, logo, and reverse logo. +/// +public interface IBrandingProvider +{ + /// + /// The name of the application. + /// + [Obsolete("Use Branding instead to provide a custom component, or configure the DefaultBrandingProvider with an AppName.")] string AppName { get; } + + /// + /// Logo on a white background. + /// + [Obsolete("Use Branding instead to provide a custom component, or configure the DefaultBrandingProvider with a LogoUrl.")] string? LogoUrl { get; } + + /// + /// Logo on a dark background + /// + [Obsolete("Use Branding instead to provide a custom component, or configure the DefaultBrandingProvider with a LogoReverseUrl.")] string? LogoReverseUrl { get; } + + /// + /// The component to render. Use this to completely customize the branding component. + /// + RenderFragment Branding { get; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ClientPackageVersion.razor b/src/framework/Elsa.Studio.Shared/Components/ClientPackageVersion.razor new file mode 100644 index 0000000..e15367b --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ClientPackageVersion.razor @@ -0,0 +1,16 @@ +@using Elsa.Studio.Contracts + +Client version: @PackageVersion + +@code { + [Inject] private IClientInformationProvider ClientInformationProvider { get; set; } = default!; + private string PackageVersion { get; set; } = "Loading..."; + + /// + protected override async Task OnInitializedAsync() + { + var info = await ClientInformationProvider.GetInfoAsync(); + PackageVersion = info.PackageVersion; + } + +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/DataPanel.razor b/src/framework/Elsa.Studio.Shared/Components/DataPanel.razor new file mode 100644 index 0000000..6761c81 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/DataPanel.razor @@ -0,0 +1,88 @@ +@using Elsa.Studio.DomInterop.Contracts +@using Elsa.Studio.Localization.Time.Components +@using Elsa.Studio.Models + + + + @{ + var data = HideEmptyValues + ? Data.Where(x => !string.IsNullOrWhiteSpace(x.Text)).ToList() + : Data; + } + @if (data.Any()) + { + @foreach (var item in data) + { + + @item.Label + + + + + @if (!string.IsNullOrWhiteSpace(item.Link)) + { + @item.Text + } + else if (item.OnClick != null) + { + @item.Text + } + else + { + @if (item.Label == "Created" || item.Label == "Updated" || item.Label == "Finished") + { + + } + else + { + @item.Text + } + } + + + } + } + else + { + if (ShowNoDataAlert) + { + @NoDataMessage + } + } + + + +@code { + + /// + /// The data to display. + /// + [Parameter] + public DataPanelModel Data { get; set; } = new (); + + /// + /// If true, empty values will be hidden. + /// + [Parameter] + public bool HideEmptyValues { get; set; } + + /// + /// If true, a message will be displayed when there is no data. + /// + [Parameter] + public bool ShowNoDataAlert { get; set; } + + /// + /// The message to display when there is no data. + /// + [Parameter] + public string NoDataMessage { get; set; } = "No data available."; + + [Inject] private IClipboard Clipboard { get; set; } = null!; + + private async Task OnCopyClicked(string value) + { + await Clipboard.CopyText(value); + } + +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/DefaultBranding.razor b/src/framework/Elsa.Studio.Shared/Components/DefaultBranding.razor new file mode 100644 index 0000000..4a6b393 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/DefaultBranding.razor @@ -0,0 +1,13 @@ +@using Elsa.Studio.Branding + + +
+ + @Provider.AppName +
+
+ +@code{ + [Parameter] public IBrandingProvider Provider { get; set; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor b/src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor new file mode 100644 index 0000000..d6ac883 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor @@ -0,0 +1,56 @@ +@using Elsa.Api.Client.Resources.Scripting.Extensions; +@using Elsa.Api.Client.Resources.Scripting.Models; +@using Variant = MudBlazor.Variant + +
+
+ + + + + + @if (!DisplayCodeEditor) + { + @ChildContent + } + +
+ @{ + + RenderFragment DisplayDropdownItem(ExpressionDescriptor? item) => @
+ @{ + var isChecked = item?.Type == _selectedExpressionType; + var iconColor = isChecked ? Color.Secondary : Color.Transparent; + var displayName = item?.DisplayName ?? DefaultOption; + + @displayName + } +
; + +
+ + @DisplayDropdownItem(null) + + @foreach (var item in BrowsableExpressionDescriptors.Where(i => !string.IsNullOrEmpty(i.GetMonacoLanguage()))) + { + @DisplayDropdownItem(item) + } + + @foreach (var item in BrowsableExpressionDescriptors.Skip(1).Where(i => string.IsNullOrEmpty(i.GetMonacoLanguage()))) + { + @DisplayDropdownItem(item) + } + +
+ } +
\ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor.cs b/src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor.cs new file mode 100644 index 0000000..1eef000 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ExpressionEditor.razor.cs @@ -0,0 +1,231 @@ +using BlazorMonaco.Editor; +using Elsa.Api.Client.Resources.Scripting.Extensions; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Models; +using Elsa.Studio.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using MudBlazor; +using ThrottleDebounce; + +namespace Elsa.Studio.Components; + +/// +/// A component that renders an input for an expression. +/// +public partial class ExpressionEditor : IDisposable +{ + private readonly string[] _expressionTypeBlacklist = ["Literal", "Object", "Variable"]; + private string? _selectedExpressionType; + private StandaloneCodeEditor? _monacoEditor; + private bool _isInternalContentChange; + private bool _isInitialized; + private string _monacoEditorId = $"monaco-editor-{Guid.NewGuid()}:N"; + private string? _lastMonacoEditorContent; + private RateLimitedFunc _throttledValueChanged; + private ICollection _expressionDescriptors = new List(); + private TaskCompletionSource? _initializationTcs; + + /// + public ExpressionEditor() + { + _throttledValueChanged = Debouncer.Debounce(InvokeValueChangedCallbackAsync, TimeSpan.FromMilliseconds(500)); + } + + /// + /// The content to render inside the editor. + /// + [Parameter] public RenderFragment ChildContent { get; set; } = null!; + + [Parameter] public Expression? Expression { get; set; } = new(string.Empty, string.Empty); + [Parameter] public string DefaultOption { get; set; } = "Default"; + [Parameter] public string DisplayName { get; set; } = string.Empty; + [Parameter] public string Description { get; set; } = string.Empty; + [Parameter] public bool ReadOnly { get; set; } + [Parameter] public IDictionary CustomProperties { get; set; } = new Dictionary(); + [Parameter] public Func? ExpressionChanged { get; set; } + + [Inject] private TypeDefinitionService TypeDefinitionService { get; set; } = null!; + [Inject] private IExpressionService ExpressionService { get; set; } = null!; + [Inject] private IJSRuntime JSRuntime { get; set; } = null!; + [Inject] private IEnumerable MonacoHandlers { get; set; } = null!; + [Inject] private IUIHintService UIHintService { get; set; } = null!; + private IEnumerable BrowsableExpressionDescriptors => _expressionDescriptors.Where(x => x.IsBrowsable); + private ExpressionDescriptor? SelectedExpressionDescriptor => _expressionDescriptors.FirstOrDefault(x => x.Type == _selectedExpressionType); + private string SelectedExpressionTypeDisplayName => SelectedExpressionDescriptor?.DisplayName ?? DefaultOption; + private string MonacoLanguage => SelectedExpressionDescriptor?.GetMonacoLanguage() ?? string.Empty; + private bool DisplayCodeEditor => _selectedExpressionType != null && _selectedExpressionType != DefaultOption; + private bool DisplayModePicker => !DisplayCodeEditor; + private string? ButtonIcon => DisplayModePicker ? Icons.Material.Filled.MoreVert : null; + private string? ButtonLabel => DisplayModePicker ? null : SelectedExpressionTypeDisplayName; + private Variant ButtonVariant => DisplayModePicker ? default : Variant.Filled; + private Color ButtonColor => DisplayModePicker ? default : Color.Primary; + private string? ButtonEndIcon => DisplayModePicker ? null : Icons.Material.Filled.KeyboardArrowDown; + private Color ButtonEndColor => DisplayModePicker ? default : Color.Secondary; + + private string? MonacoSyntax { get; set; } + private bool MonacoSyntaxExist => !string.IsNullOrEmpty(MonacoLanguage); + + /// + /// Updates the internal state of the editor with the provided expression. + /// + /// The expression to update the editor with. Can be null. + public async Task UpdateAsync(Expression? expression) + { + if (!_isInitialized || _monacoEditor == null) + { + _initializationTcs ??= new(); + await _initializationTcs.Task; + } + + await UpdateMonacoEditorAsync(expression); + } + + /// + protected override async Task OnInitializedAsync() + { + var expressionDescriptors = (await ExpressionService.ListDescriptorsAsync()).ExceptBy(_expressionTypeBlacklist, x => x.Type).ToList(); + _selectedExpressionType = expressionDescriptors.First().Type; + _expressionDescriptors = expressionDescriptors.ToList(); + } + + private async Task UpdateMonacoLanguageAsync() + { + if (_monacoEditor == null) + return; + + if (SelectedExpressionDescriptor?.Type == null) + return; + + if (string.IsNullOrWhiteSpace(MonacoLanguage)) + return; + + var model = await _monacoEditor.GetModel(); + await Global.SetModelLanguage(JSRuntime, model, MonacoLanguage); + await RunMonacoHandlersAsync(_monacoEditor); + } + + /// + protected override Task OnParametersSetAsync() + { + _selectedExpressionType = Expression?.Type; + return base.OnParametersSetAsync(); + } + + private StandaloneEditorConstructionOptions ConfigureMonacoEditor(StandaloneCodeEditor editor) + { + return new() + { + Language = MonacoLanguage, + Value = Expression?.Value?.ToString() ?? "", + FontFamily = "Roboto Mono, monospace", + RenderLineHighlight = "none", + FixedOverflowWidgets = true, + Minimap = new() + { + Enabled = false + }, + AutomaticLayout = true, + LineNumbers = "on", + Theme = "vs", + RoundedSelection = true, + ScrollBeyondLastLine = false, + OverviewRulerLanes = 0, + OverviewRulerBorder = false, + LineDecorationsWidth = 0, + HideCursorInOverviewRuler = true, + GlyphMargin = false, + ReadOnly = ReadOnly, + DomReadOnly = ReadOnly + }; + } + + private async Task OnSyntaxSelectedAsync(string? syntax) + { + _selectedExpressionType = syntax; + + var value = Expression?.Value?.ToString() ?? ""; + var expressionType = syntax ?? DefaultOption; + var expression = new Expression(expressionType, value); + await InvokeValueChangedCallbackAsync(expression); + await UpdateMonacoLanguageAsync(); + StateHasChanged(); + } + + private async Task OnMonacoContentChangedAsync(ModelContentChangedEvent e) + { + if (_isInternalContentChange) + return; + + var value = await _monacoEditor!.GetValue(); + + // This event gets fired even when the content hasn't changed, for example, when the containing pane is resized. + // This happens from within the monaco editor itself (or the Blazor wrapper, not sure). + if (value == _lastMonacoEditorContent) + return; + + var expression = new Expression(_selectedExpressionType!, value); + _lastMonacoEditorContent = value; + await ThrottleValueChangedCallbackAsync(expression); + } + + private async Task ThrottleValueChangedCallbackAsync(Expression expression) => await _throttledValueChanged.InvokeAsync(expression); + + private async Task InvokeValueChangedCallbackAsync(Expression? expression) + { + await InvokeAsync(async () => + { + if (ExpressionChanged != null) + await ExpressionChanged.Invoke(expression); + }); + } + + private async Task OnMonacoInitializedAsync() + { + _isInitialized = true; + + if (_initializationTcs != null) + { + _initializationTcs.SetResult(true); + _initializationTcs = null; + return; + } + + await UpdateMonacoEditorAsync(Expression); + } + + private async Task UpdateMonacoEditorAsync(Expression? expression) + { + _isInternalContentChange = true; + var model = await _monacoEditor!.GetModel(); + var expressionText = expression?.Value?.ToString() ?? string.Empty; + + if (expression?.Type != null) + _selectedExpressionType = expression.Type; + + _lastMonacoEditorContent = expressionText; + await model.SetValue(expressionText); + _isInternalContentChange = false; + await Global.SetModelLanguage(JSRuntime, model, MonacoLanguage); + await RunMonacoHandlersAsync(_monacoEditor); + } + + private async Task RunMonacoHandlersAsync(StandaloneCodeEditor editor) + { + if (SelectedExpressionDescriptor == null) + return; + + var context = new MonacoContext(editor, SelectedExpressionDescriptor, CustomProperties); + + foreach (var handler in MonacoHandlers) + await handler.InitializeAsync(context); + } + + /// + public void Dispose() + { + _throttledValueChanged.Dispose(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor b/src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor new file mode 100644 index 0000000..5c83b87 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor @@ -0,0 +1,54 @@ +@using Elsa.Api.Client.Resources.Scripting.Extensions; +@using Elsa.Api.Client.Resources.Scripting.Models; +@using Elsa.Studio.Enums + +
+
+ + @if (ShowMonacoEditor) + { + + + + + + + + } + else + { + + } + +
+ @if (EditorContext.InputDescriptor.IsWrapped) + { + RenderFragment DisplayContent(ExpressionDescriptor item) => @
+ @{ + var isChecked = item.Type == _selectedExpressionType; + var iconColor = isChecked ? Color.Secondary : Color.Transparent; + + @item.DisplayName + }
; +
+ + @DisplayContent(BrowsableExpressionDescriptors.First()) + + @foreach (var item in BrowsableExpressionDescriptors.Where(i=>!string.IsNullOrEmpty(i.GetMonacoLanguage()))) + { + @DisplayContent(item); + } + + @foreach (var item in BrowsableExpressionDescriptors.Skip(1).Where(i=>string.IsNullOrEmpty(i.GetMonacoLanguage()))) + { + @DisplayContent(item); + } + +
+ } +
\ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor.cs b/src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor.cs new file mode 100644 index 0000000..80a6b45 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ExpressionInput.razor.cs @@ -0,0 +1,244 @@ +using BlazorMonaco.Editor; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.Scripting.Extensions; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Models; +using Elsa.Studio.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using MudBlazor; +using ThrottleDebounce; + +namespace Elsa.Studio.Components; + +/// +/// A component that renders an input for an expression. +/// +public partial class ExpressionInput : IDisposable +{ + private const string DefaultSyntax = "Literal"; + private readonly string[] _uiSyntaxes = ["Literal", "Object"]; + private string _selectedExpressionType = DefaultSyntax; + private string _selectedExpressionTypeDisplayName = DefaultSyntax; + private StandaloneCodeEditor? _monacoEditor = null!; + private bool _isInternalContentChange; + private string _monacoEditorId = $"monaco-editor-{Guid.NewGuid()}:N"; + private string? _lastMonacoEditorContent; + private RateLimitedFunc _throttledValueChanged; + private ICollection _expressionDescriptors = new List(); + + /// + public ExpressionInput() + { + _throttledValueChanged = Debouncer.Debounce(InvokeValueChangedCallbackAsync, TimeSpan.FromMilliseconds(500)); + } + + /// + /// The context for the editor. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + /// + /// The content to render inside the editor. + /// + [Parameter] public RenderFragment ChildContent { get; set; } = null!; + + /// + /// A flag indicating whether the editor should only display code. + /// + [Parameter] public bool IsCodeOnly { get; set; } + + [Inject] private TypeDefinitionService TypeDefinitionService { get; set; } = null!; + [Inject] private IExpressionService ExpressionService { get; set; } = null!; + [Inject] private IJSRuntime JSRuntime { get; set; } = null!; + [Inject] private IEnumerable MonacoHandlers { get; set; } = null!; + [Inject] private IUIHintService UIHintService { get; set; } = null!; + private IEnumerable BrowsableExpressionDescriptors => _expressionDescriptors.Where(x => x.IsBrowsable); + private ExpressionDescriptor? SelectedExpressionDescriptor => _expressionDescriptors.FirstOrDefault(x => x.Type == _selectedExpressionType); + private string MonacoLanguage => SelectedExpressionDescriptor?.GetMonacoLanguage() ?? string.Empty; + private string UISyntax => EditorContext.UIHintHandler.UISyntax; + private string ComponentType => EditorContext.InputDescriptor.UIHint; + private bool IsUISyntax => !IsCodeOnly && _selectedExpressionType == UISyntax; + private string? ButtonIcon => IsUISyntax ? Icons.Material.Filled.MoreVert : null; + private string? ButtonLabel => IsUISyntax ? null : _selectedExpressionTypeDisplayName; + private Variant ButtonVariant => IsUISyntax ? default : Variant.Filled; + private Color ButtonColor => IsUISyntax ? default : Color.Primary; + private string? ButtonEndIcon => IsUISyntax ? null : Icons.Material.Filled.KeyboardArrowDown; + private Color ButtonEndColor => IsUISyntax ? default : Color.Secondary; + private bool ShowMonacoEditor => IsCodeOnly || (!IsUISyntax && EditorContext.InputDescriptor.IsWrapped && MonacoSyntaxExist); + private string DisplayName => EditorContext.InputDescriptor.DisplayName ?? EditorContext.InputDescriptor.Name; + private string? Description => EditorContext.InputDescriptor.Description; + private string InputValue => EditorContext.GetExpressionValueOrDefault(); + + private string? MonacoSyntax { get; set; } + private bool MonacoSyntaxExist => !string.IsNullOrEmpty(MonacoLanguage); + + /// + protected override async Task OnInitializedAsync() + { + var defaultDescriptor = new ExpressionDescriptor(UISyntax, "Default"); + var expressionDescriptors = (await ExpressionService.ListDescriptorsAsync()).ExceptBy(_uiSyntaxes, x => x.Type).ToList(); + + if (IsCodeOnly) + _selectedExpressionType = expressionDescriptors.First().Type; + else + expressionDescriptors = expressionDescriptors.Prepend(defaultDescriptor).ToList(); + + _expressionDescriptors = expressionDescriptors.ToList(); + } + + private async Task UpdateMonacoLanguageAsync() + { + if (_monacoEditor == null) + return; + + var expressionDescriptor = SelectedExpressionDescriptor; + + if (expressionDescriptor == null) + return; + + var monacoLanguage = expressionDescriptor.GetMonacoLanguage(); + _selectedExpressionTypeDisplayName = expressionDescriptor.DisplayName; + + if (string.IsNullOrWhiteSpace(monacoLanguage)) + return; + + var model = await _monacoEditor.GetModel(); + await Global.SetModelLanguage(JSRuntime, model, monacoLanguage); + await RunMonacoHandlersAsync(_monacoEditor); + } + + /// + protected override Task OnParametersSetAsync() + { + var selectedExpressionDescriptor = EditorContext.SelectedExpressionDescriptor; + _selectedExpressionType = selectedExpressionDescriptor?.Type ?? UISyntax; + _selectedExpressionTypeDisplayName = selectedExpressionDescriptor?.DisplayName ?? UISyntax; + + UpdateUIHintAsync(EditorContext); + return base.OnParametersSetAsync(); + } + + private StandaloneEditorConstructionOptions ConfigureMonacoEditor(StandaloneCodeEditor editor) + { + return new() + { + Language = MonacoLanguage, + Value = InputValue, + FontFamily = "Roboto Mono, monospace", + RenderLineHighlight = "none", + FixedOverflowWidgets = true, + Minimap = new() + { + Enabled = false + }, + AutomaticLayout = true, + LineNumbers = "on", + Theme = "vs", + RoundedSelection = true, + ScrollBeyondLastLine = false, + OverviewRulerLanes = 0, + OverviewRulerBorder = false, + LineDecorationsWidth = 0, + HideCursorInOverviewRuler = true, + GlyphMargin = false, + ReadOnly = EditorContext.IsReadOnly, + DomReadOnly = EditorContext.IsReadOnly + }; + } + + private async Task OnMonacoInitializedAsync() + { + _isInternalContentChange = true; + var model = await _monacoEditor!.GetModel(); + _lastMonacoEditorContent = InputValue; + await model.SetValue(InputValue); + _isInternalContentChange = false; + await Global.SetModelLanguage(JSRuntime, model, MonacoLanguage); + await RunMonacoHandlersAsync(_monacoEditor); + } + + private async Task OnSyntaxSelectedAsync(string syntax) + { + _selectedExpressionType = syntax; + + var value = InputValue; + var input = (WrappedInput?)EditorContext.Value ?? new WrappedInput(); + + input.Expression = new(_selectedExpressionType, value); + await InvokeValueChangedCallbackAsync(input); + await UpdateMonacoLanguageAsync(); + } + + /// + /// Used to display the UI hint when the user selects any other choice than a language supported by the monaco editor. + /// + private void UpdateUIHintAsync(DisplayInputEditorContext editorContext) + { + if (_selectedExpressionType == "Variable") + { + var uiHintHandler = UIHintService.GetHandler("variable-picker"); + var editor = uiHintHandler.DisplayInputEditor(editorContext); + ChildContent = editor; + return; + } + + if (MonacoSyntax == null + && _selectedExpressionType == editorContext.SelectedExpressionDescriptor?.Type + && editorContext.SelectedExpressionDescriptor.Properties.TryGetValue("UIHint", out var uiHint)) + { + var uiHintHandler = UIHintService.GetHandler(uiHint); + var editor = uiHintHandler.DisplayInputEditor(editorContext); + _selectedExpressionTypeDisplayName = editorContext.SelectedExpressionDescriptor.DisplayName; + + ChildContent = editor; + } + } + + private async Task OnMonacoContentChangedAsync(ModelContentChangedEvent e) + { + if (_isInternalContentChange) + return; + + var value = await _monacoEditor!.GetValue(); + + // This event gets fired even when the content hasn't changed, but for example when the containing pane is resized. + // This happens from within the monaco editor itself (or the Blazor wrapper, not sure). + if (value == _lastMonacoEditorContent) + return; + + var input = (WrappedInput?)EditorContext.Value ?? new WrappedInput(); + input.Expression = new(_selectedExpressionType, value); + _lastMonacoEditorContent = value; + await ThrottleValueChangedCallbackAsync(input); + } + + private async Task ThrottleValueChangedCallbackAsync(WrappedInput input) => await _throttledValueChanged.InvokeAsync(input); + + private async Task InvokeValueChangedCallbackAsync(WrappedInput input) + { + await InvokeAsync(async () => await EditorContext.OnValueChanged(input)); + } + + private async Task RunMonacoHandlersAsync(StandaloneCodeEditor editor) + { + var customProps = new Dictionary + { + { nameof(ActivityDescriptor), EditorContext.ActivityDescriptor }, + { nameof(PropertyDescriptor), EditorContext.InputDescriptor }, + { "WorkflowDefinitionId", EditorContext.WorkflowDefinition.DefinitionId } + }; + + var expressionDescriptor = SelectedExpressionDescriptor?? new ExpressionDescriptor("Literal", "Default"); + var context = new MonacoContext(editor, expressionDescriptor, customProps); + + foreach (var handler in MonacoHandlers) + await handler.InitializeAsync(context); + } + + /// + void IDisposable.Dispose() => _throttledValueChanged.Dispose(); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/FieldExtension.razor b/src/framework/Elsa.Studio.Shared/Components/FieldExtension.razor new file mode 100644 index 0000000..368d084 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/FieldExtension.razor @@ -0,0 +1,79 @@ +@using Elsa.Studio.Contracts +@using Elsa.Studio.Enums +@using Elsa.Studio.Models + + + +@if (hasExtensions) +{ + + @foreach (var extension in TopExtensions ?? Enumerable.Empty()) + { + @extension.DisplayExtension(EditorContext) + } + @ChildContent + @foreach (var extension in BottomExtensions ?? Enumerable.Empty()) + { + @extension.DisplayExtension(EditorContext) + } + +} +else +{ + @ChildContent +} + + +@code +{ + private bool isHovered = false; + private bool hasExtensions => AllExtensions?.Count != 0; + private List? AllExtensions; + private List? TopExtensions; + private List? BottomExtensions; + + /// + /// The UI Hint component type the extensions should be rendered for. + /// + [Parameter] public string UIHintComponent { get; set; } = default!; + + /// + /// The editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = default!; + + /// + /// The content wrap with extensions. + /// + [Parameter] public RenderFragment ChildContent { get; set; } = default!; + + [Inject] private IUIFieldExtensionService FieldExtensionService { get; set; } + + /// + protected override void OnInitialized() + { + AllExtensions = FieldExtensionService.TryGetHandlers(UIHintComponent, EditorContext); + if (AllExtensions is not null) + { + TopExtensions = AllExtensions.Where(p => p.Position == FieldExtensionPosition.Top).ToList(); + BottomExtensions = AllExtensions.Where(p => p.Position == FieldExtensionPosition.Bottom).ToList(); + } + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/NavMenu.razor b/src/framework/Elsa.Studio.Shared/Components/NavMenu.razor new file mode 100644 index 0000000..eac9192 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/NavMenu.razor @@ -0,0 +1,33 @@ +@using Elsa.Studio.Contracts +@using Elsa.Studio.Models +@inject IMenuService MenuService; + + + @foreach (var menuItemGroup in _menuItemsGroups.Values) + { + var menuItems = _menuItems.Where(x => x.GroupName == menuItemGroup.Name).ToList(); + + @if (menuItems.Any()) + { + @menuItemGroup.Text + + foreach (var menuItem in menuItems) + { + + } + } + } + + +@code +{ + private IDictionary _menuItemsGroups = new Dictionary(); + private IEnumerable _menuItems = new List(); + + /// + protected override async Task OnInitializedAsync() + { + _menuItemsGroups = (await MenuService.GetMenuItemGroupsAsync()).ToDictionary(x => x.Name); + _menuItems = await MenuService.GetMenuItemsAsync(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/NavMenuItem.razor b/src/framework/Elsa.Studio.Shared/Components/NavMenuItem.razor new file mode 100644 index 0000000..6715ec7 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/NavMenuItem.razor @@ -0,0 +1,20 @@ +@using Elsa.Studio.Models +@if (!MenuItem.SubMenuItems.Any()) +{ + @MenuItem.Text +} +else +{ + + @foreach (var subItem in MenuItem.SubMenuItems) + { + + } + +} + +@code +{ + [Parameter] + public MenuItem MenuItem { get; set; } = default!; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/PageHeading.razor b/src/framework/Elsa.Studio.Shared/Components/PageHeading.razor new file mode 100644 index 0000000..5b71e59 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/PageHeading.razor @@ -0,0 +1,5 @@ +@Text + +@code { + [Parameter] public string Text { get; set; } = "Untitled"; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ProductInfoDialog.razor b/src/framework/Elsa.Studio.Shared/Components/ProductInfoDialog.razor new file mode 100644 index 0000000..45f4e69 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ProductInfoDialog.razor @@ -0,0 +1,17 @@ + + + + + + + + + Close + + + +@code { + [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; + + void Close() => MudDialog.Close(DialogResult.Ok(true)); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ScrollableWell.razor b/src/framework/Elsa.Studio.Shared/Components/ScrollableWell.razor new file mode 100644 index 0000000..4d8ac15 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ScrollableWell.razor @@ -0,0 +1,20 @@ +
+
+ @ChildContent +
+
+ +@code +{ + /// + /// The maximum height of the component. + /// + [Parameter] + public int MaxHeight { get; set; } = 300; + + /// + /// The content to be rendered inside the component. + /// + [Parameter] + public RenderFragment? ChildContent { get; set; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/ServerPackageVersion.razor b/src/framework/Elsa.Studio.Shared/Components/ServerPackageVersion.razor new file mode 100644 index 0000000..5e2500f --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/ServerPackageVersion.razor @@ -0,0 +1,16 @@ +@using Elsa.Studio.Contracts +@inherits StudioComponentBase +Server version: @PackageVersion + +@code { + [Inject] private IServerInformationProvider ServerInformationProvider { get; set; } = default!; + private string PackageVersion { get; set; } = "Loading..."; + + /// + protected override async Task OnInitializedAsync() + { + var info = await ServerInformationProvider.GetInfoAsync(); + PackageVersion = info.PackageVersion; + } + +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/StudioComponentBase.cs b/src/framework/Elsa.Studio.Shared/Components/StudioComponentBase.cs new file mode 100644 index 0000000..c314b2d --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/StudioComponentBase.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Services; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Components; + +/// Base class for components. This class sets the property to the instance. +/// See https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/dependency-injection?view=aspnetcore-7.0#access-server-side-blazor-services-from-a-different-di-scope +public abstract class StudioComponentBase : ComponentBase; \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/Unauthorized.razor b/src/framework/Elsa.Studio.Shared/Components/Unauthorized.razor new file mode 100644 index 0000000..a5d625c --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/Unauthorized.razor @@ -0,0 +1 @@ +Unauthorized \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/VerticalWell.razor b/src/framework/Elsa.Studio.Shared/Components/VerticalWell.razor new file mode 100644 index 0000000..1cd031f --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/VerticalWell.razor @@ -0,0 +1,16 @@ +
+ @ChildContent +
+ +@code +{ + /// + /// The content to be rendered inside the component. + /// + [Parameter] public RenderFragment? ChildContent { get; set; } + + /// + /// The amount of extra padding to add to the bottom of the component. + /// + [Parameter] public int ExtraPadding { get; set; } +} diff --git a/src/framework/Elsa.Studio.Shared/Components/Well.razor b/src/framework/Elsa.Studio.Shared/Components/Well.razor new file mode 100644 index 0000000..db6161a --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/Well.razor @@ -0,0 +1,11 @@ +
+ @ChildContent +
+ +@code +{ + /// + /// The content to be rendered inside the component. + /// + [Parameter] public RenderFragment? ChildContent { get; set; } +} diff --git a/src/framework/Elsa.Studio.Shared/Components/Zone.razor b/src/framework/Elsa.Studio.Shared/Components/Zone.razor new file mode 100644 index 0000000..321e8af --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/Zone.razor @@ -0,0 +1,4 @@ +@foreach (var widget in Widgets) +{ + @widget.Render(Attributes) +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Components/Zone.razor.cs b/src/framework/Elsa.Studio.Shared/Components/Zone.razor.cs new file mode 100644 index 0000000..cd7ae68 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Components/Zone.razor.cs @@ -0,0 +1,45 @@ +using Elsa.Studio.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Components; + +/// +/// Represents a zone in which widgets can be rendered. +/// +public partial class Zone : IDisposable +{ + /// + /// Gets or sets the zone name. + /// + [Parameter] + public string Name { get; set; } = default!; + + /// + /// Gets or sets the attributes that are passed to the widgets. + /// + [Parameter] + public IDictionary Attributes { get; set; } = new Dictionary(); + + [Inject] private IWidgetRegistry WidgetRegistry { get; set; } = default!; + [Inject] private IFeatureService FeatureService { get; set; } = default!; + private ICollection Widgets { get; set; } = new List(); + + /// + protected override void OnInitialized() + { + FeatureService.Initialized += OnFeatureServiceInitialized; + Widgets = WidgetRegistry.List(Name).ToList(); + } + + private void OnFeatureServiceInitialized() + { + Widgets = WidgetRegistry.List(Name).ToList(); + StateHasChanged(); + } + + /// + public void Dispose() + { + FeatureService.Initialized -= OnFeatureServiceInitialized; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Converters/JsonPrimitiveToStringConverter.cs b/src/framework/Elsa.Studio.Shared/Converters/JsonPrimitiveToStringConverter.cs new file mode 100644 index 0000000..8835e9c --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Converters/JsonPrimitiveToStringConverter.cs @@ -0,0 +1,43 @@ +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Elsa.Studio.Converters; + +/// +/// Converts primitives to and from JSON strings. +/// +public class JsonPrimitiveToStringConverter : JsonConverter +{ + /// + public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case JsonTokenType.True: + return "True"; + case JsonTokenType.False: + return "False"; + case JsonTokenType.Number when reader.TryGetInt64(out var l): + return l.ToString(); + case JsonTokenType.Number: + return reader.GetDouble().ToString(CultureInfo.InvariantCulture); + case JsonTokenType.String when reader.TryGetDateTimeOffset(out var datetime): + return datetime.ToString(); + case JsonTokenType.String: + return reader.GetString()!; + default: + { + // Use JsonElement as fallback. + using var document = JsonDocument.ParseValue(ref reader); + return document.RootElement.Clone().ToString(); + } + } + } + + /// + public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + { + writer.WriteStringValue(value); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Converters/JsonStringToIntConverter.cs b/src/framework/Elsa.Studio.Shared/Converters/JsonStringToIntConverter.cs new file mode 100644 index 0000000..1374ae2 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Converters/JsonStringToIntConverter.cs @@ -0,0 +1,35 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Elsa.Studio.Converters; + +/// +/// Converts strings to and from integers. +/// +public class JsonStringToIntConverter : JsonConverter +{ + /// + public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case JsonTokenType.String: + { + var stringValue = reader.GetString(); + if (int.TryParse(stringValue, out var intValue)) + return intValue; + break; + } + case JsonTokenType.Number: + return reader.GetInt32(); + } + + throw new JsonException($"Unable to convert {reader.TokenType} to {nameof(Int32)}."); + } + + /// + public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj b/src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj new file mode 100644 index 0000000..013ecca --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj @@ -0,0 +1,23 @@ + + + + Elsa Studio shared services and components. + elsa studio framework + Elsa.Studio + + + + + + + + + + + + + + + + + diff --git a/src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj.DotSettings b/src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj.DotSettings new file mode 100644 index 0000000..d38f41f --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Elsa.Studio.Shared.csproj.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Extensions/ClaimsExtensions.cs b/src/framework/Elsa.Studio.Shared/Extensions/ClaimsExtensions.cs new file mode 100644 index 0000000..f8f2e37 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Extensions/ClaimsExtensions.cs @@ -0,0 +1,20 @@ +using System.Security.Claims; + +namespace Elsa.Studio.Extensions; + +/// +/// Contains extension methods for . +/// +public static class ClaimsExtensions +{ + /// + /// Determines whether the "exp" claim is expired. + /// + public static bool IsExpired(this IEnumerable claims) + { + var expString = claims.FirstOrDefault(x => x.Type == "exp")?.Value.Trim(); + var exp = !string.IsNullOrEmpty(expString) ? long.Parse(expString) : 0; + var expiresAt = DateTimeOffset.FromUnixTimeSeconds(exp); + return expiresAt < DateTimeOffset.UtcNow; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Extensions/ServiceCollectionExtensions.cs b/src/framework/Elsa.Studio.Shared/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..390276f --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,33 @@ +using Elsa.Studio.Branding; +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization.Time; +using Elsa.Studio.Localization.Time.Providers; +using Elsa.Studio.Monaco.Handlers; +using Elsa.Studio.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Extensions; + +/// +/// Adds shared services to the service collection. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds shared services to the service collection. + /// + public static IServiceCollection AddSharedServices(this IServiceCollection services) + { + services.AddScoped(); + + // TODO: Move this to a new package; either specific to JS, or perhaps a general Monaco package that supports multiple languages. + // We'll decide once we add support for more languages. + services.AddScoped(); + + // Time services. + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + return services; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/FodyWeavers.xml b/src/framework/Elsa.Studio.Shared/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/FodyWeavers.xsd b/src/framework/Elsa.Studio.Shared/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Layouts/BasicLayout.razor b/src/framework/Elsa.Studio.Shared/Layouts/BasicLayout.razor new file mode 100644 index 0000000..edb3104 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Layouts/BasicLayout.razor @@ -0,0 +1,30 @@ +@using Elsa.Studio.Contracts +@inherits LayoutComponentBase +@implements IDisposable +@inject IThemeService ThemeService + + + + + + + @Body + + +@code { + + private MudTheme CurrentTheme => ThemeService.CurrentTheme; + + protected override void OnInitialized() + { + ThemeService.CurrentThemeChanged += OnThemeChanged; + StateHasChanged(); + } + + public void Dispose() + { + ThemeService.CurrentThemeChanged -= OnThemeChanged; + } + + private void OnThemeChanged() => StateHasChanged(); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor b/src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor new file mode 100644 index 0000000..48d3d06 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor @@ -0,0 +1,61 @@ +@inherits LayoutComponentBase + + + + + + + + + + + @foreach (var appBarItem in AppBarService.AppBarItems) + { + @appBarItem + } + + + + + @if (IsDarkMode) + { + + } + else + { + + } + + + + + + @BrandingProvider.Branding + +
+ +
+
+ + + + @Body + + + @if (context is UnauthorizedAccessException) + { + @UnauthorizedComponent + } + else + { + + + @context.GetType().Name: @context.Message + + + } + + + + +
\ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor.cs b/src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor.cs new file mode 100644 index 0000000..b4bc9e0 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Layouts/MainLayout.razor.cs @@ -0,0 +1,94 @@ +using Blazored.LocalStorage; +using Elsa.Studio.Branding; +using Elsa.Studio.Components; +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Components.Web; +using MudBlazor; + +namespace Elsa.Studio.Layouts; + +/// +/// The main layout for the application. +/// +public partial class MainLayout : IDisposable +{ + private bool _drawerOpen = true; + private ErrorBoundary? _errorBoundary; + + [Inject] private IThemeService ThemeService { get; set; } = null!; + [Inject] private IAppBarService AppBarService { get; set; } = null!; + [Inject] private IUnauthorizedComponentProvider UnauthorizedComponentProvider { get; set; } = null!; + [Inject] private IFeatureService FeatureService { get; set; } = null!; + [Inject] private IDialogService DialogService { get; set; } = null!; + [Inject] private IBrandingProvider BrandingProvider { get; set; } = null!; + [Inject] private IServiceProvider ServiceProvider { get; set; } = null!; + [CascadingParameter] private Task? AuthenticationState { get; set; } + private MudTheme CurrentTheme => ThemeService.CurrentTheme; + private bool IsDarkMode => ThemeService.IsDarkMode; + private RenderFragment UnauthorizedComponent => UnauthorizedComponentProvider.GetUnauthorizedComponent(); + + /// + protected override void OnInitialized() + { + ThemeService.CurrentThemeChanged += OnThemeChanged; + AppBarService.AppBarItemsChanged += OnAppBarItemsChanged; + } + + /// + protected override async Task OnInitializedAsync() + { + if (AuthenticationState != null) + { + var authState = await AuthenticationState; + if (authState.User.Identity?.IsAuthenticated == true && !authState.User.Claims.IsExpired()) + { + await FeatureService.InitializeFeaturesAsync(); + StateHasChanged(); + } + } + else + { + await FeatureService.InitializeFeaturesAsync(); + StateHasChanged(); + } + } + + /// + protected override void OnParametersSet() + { + _errorBoundary?.Recover(); + } + + private void OnThemeChanged() => StateHasChanged(); + private void OnAppBarItemsChanged() => InvokeAsync(StateHasChanged); + + private void DrawerToggle() + { + _drawerOpen = !_drawerOpen; + } + + private void ToggleDarkMode() + { + ThemeService.IsDarkMode = !ThemeService.IsDarkMode; + } + + private async Task ShowProductInfo() + { + await DialogService.ShowAsync($"Elsa Studio {ToolVersion.GetDisplayVersion()}", new DialogOptions + { + FullWidth = true, + MaxWidth = MaxWidth.ExtraSmall, + CloseButton = true, + CloseOnEscapeKey = true + }); + } + + void IDisposable.Dispose() + { + ThemeService.CurrentThemeChanged -= OnThemeChanged; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor b/src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor new file mode 100644 index 0000000..3b88607 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor @@ -0,0 +1 @@ +@GetDisplayString() \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor.cs b/src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor.cs new file mode 100644 index 0000000..dec9eb6 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Localization/Time/Components/Timestamp.razor.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Localization.Time.Components; + +public partial class Timestamp : ComponentBase +{ + /// + /// Gets or sets the timestamp to display. + /// + [Parameter] public DateTimeOffset? Value { get; set; } + + /// + /// Gets or sets the format to use when displaying the timestamp. + /// + [Parameter] public string Format { get; set; } = "G"; + + /// + /// Gets or sets the string to display when is null. + /// + [Parameter] public string EmptyString { get; set; } = string.Empty; + + [Inject] private ITimeFormatter TimeFormatter { get; set; } = default!; + + private string GetDisplayString() + { + return Value == null ? EmptyString : TimeFormatter.Format(Value.Value, Format); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeFormatter.cs b/src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeFormatter.cs new file mode 100644 index 0000000..eeec9c1 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeFormatter.cs @@ -0,0 +1,15 @@ +namespace Elsa.Studio.Localization.Time; + +/// +/// Formats a date and time value based on the preferred time zone provided by . +/// +public interface ITimeFormatter +{ + /// + /// Formats the specified date and time value. + /// + /// The date and time value to format. + /// The format to use. Defaults to "G". + /// The string to return when is null. + string Format(DateTimeOffset? value, string format = "G", string emptyString = ""); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeZoneProvider.cs b/src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeZoneProvider.cs new file mode 100644 index 0000000..2000113 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Localization/Time/Contracts/ITimeZoneProvider.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Localization.Time; + +/// +/// Provides the preferred time zone. +/// +public interface ITimeZoneProvider +{ + /// + /// Gets the preferred time zone. + /// + TimeZoneInfo GetTimeZone(); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Localization/Time/Implementations/DefaultTimeFormatter.cs b/src/framework/Elsa.Studio.Shared/Localization/Time/Implementations/DefaultTimeFormatter.cs new file mode 100644 index 0000000..3b37c57 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Localization/Time/Implementations/DefaultTimeFormatter.cs @@ -0,0 +1,20 @@ +using System.Globalization; + +namespace Elsa.Studio.Localization.Time; + +/// +/// A default implementation that leverages the currently installed . +/// +public class DefaultTimeFormatter(ITimeZoneProvider timeZoneProvider) : ITimeFormatter +{ + /// + public string Format(DateTimeOffset? value, string format, string emptyString) + { + if (value == null) + return emptyString; + + var timeZone = timeZoneProvider.GetTimeZone(); + var localTime = TimeZoneInfo.ConvertTime(value.Value, timeZone); + return localTime.ToString(format, CultureInfo.CurrentCulture); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Localization/Time/Providers/LocalTimeZoneProvider.cs b/src/framework/Elsa.Studio.Shared/Localization/Time/Providers/LocalTimeZoneProvider.cs new file mode 100644 index 0000000..6cee7c7 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Localization/Time/Providers/LocalTimeZoneProvider.cs @@ -0,0 +1,14 @@ +namespace Elsa.Studio.Localization.Time.Providers; + +/// +/// Provides the preferred time zone based on the server's local time zone. +/// +public class LocalTimeZoneProvider : ITimeZoneProvider +{ + /// + public TimeZoneInfo GetTimeZone() + { + var timeZoneId = TimeZoneInfo.Local.Id; + return TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Localization/Time/Providers/UtcTimeZoneProvider.cs b/src/framework/Elsa.Studio.Shared/Localization/Time/Providers/UtcTimeZoneProvider.cs new file mode 100644 index 0000000..15451b8 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Localization/Time/Providers/UtcTimeZoneProvider.cs @@ -0,0 +1,13 @@ +namespace Elsa.Studio.Localization.Time.Providers; + +/// +/// Provides the UTC time zone. +/// +public class UtcTimeZoneProvider : ITimeZoneProvider +{ + /// + public TimeZoneInfo GetTimeZone() + { + return TimeZoneInfo.Utc; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Models/DataPanelItem.cs b/src/framework/Elsa.Studio.Shared/Models/DataPanelItem.cs new file mode 100644 index 0000000..e288505 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Models/DataPanelItem.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Models; + +public record DataPanelItem(string Label, string? Text = null, string? Link = null, Func? OnClick = null); \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Models/DataPanelModel.cs b/src/framework/Elsa.Studio.Shared/Models/DataPanelModel.cs new file mode 100644 index 0000000..6ce0efa --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Models/DataPanelModel.cs @@ -0,0 +1,19 @@ +namespace Elsa.Studio.Models; + +public class DataPanelModel : List +{ + public DataPanelModel() + { + } + + public DataPanelModel(IEnumerable collection) : base(collection) + { + } + + public void Add(string label, string? text = null, string? link = null) => Add(new DataPanelItem(label, text, link)); +} + +public static class DataPanelModelLinqExtensions +{ + public static DataPanelModel ToDataPanelModel(this IEnumerable items) => new(items); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Monaco/Contracts/IMonacoHandler.cs b/src/framework/Elsa.Studio.Shared/Monaco/Contracts/IMonacoHandler.cs new file mode 100644 index 0000000..1267066 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Monaco/Contracts/IMonacoHandler.cs @@ -0,0 +1,14 @@ +using Elsa.Studio.Models; + +namespace Elsa.Studio.Contracts; + +/// +/// Allows extensions to customize Monaco editor behavior, such as configuring intellisense. +/// +public interface IMonacoHandler +{ + /// + /// Invoked when the Monaco editor is initialized. + /// + ValueTask InitializeAsync(MonacoContext context); +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Monaco/Handlers/JavaScriptMonacoHandler.cs b/src/framework/Elsa.Studio.Shared/Monaco/Handlers/JavaScriptMonacoHandler.cs new file mode 100644 index 0000000..376ab78 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Monaco/Handlers/JavaScriptMonacoHandler.cs @@ -0,0 +1,33 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.Services; +using Microsoft.JSInterop; + +namespace Elsa.Studio.Monaco.Handlers; + +/// +/// Handles Monaco editor for JavaScript. +/// +public class JavaScriptMonacoHandler(IJSRuntime jsRuntime, TypeDefinitionService typeDefinitionService) + : IMonacoHandler +{ + /// + public async ValueTask InitializeAsync(MonacoContext context) + { + if (context.ExpressionDescriptor.Type != "JavaScript") + return; + + var activityDescriptor = context.CustomProperties.TryGetValue(nameof(ActivityDescriptor), out var activityDescriptorObj) ? (ActivityDescriptor)activityDescriptorObj : null; + var propertyDescriptor = context.CustomProperties.TryGetValue(nameof(PropertyDescriptor), out var propertyDescriptorObj) ? (PropertyDescriptor)propertyDescriptorObj : null; + var workflowDefinitionId = context.CustomProperties.TryGetValue("WorkflowDefinitionId", out var workflowDefinitionIdObj) ? (string)workflowDefinitionIdObj : null; + var activityTypeName = activityDescriptor?.TypeName; + var propertyName = propertyDescriptor?.Name; + + if (activityTypeName == null || workflowDefinitionId == null) + return; + + var data = await typeDefinitionService.GetTypeDefinition(workflowDefinitionId, activityTypeName, propertyName); + await jsRuntime.InvokeVoidAsync("monaco.languages.typescript.javascriptDefaults.addExtraLib", data, null); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Monaco/Models/MonacoContext.cs b/src/framework/Elsa.Studio.Shared/Monaco/Models/MonacoContext.cs new file mode 100644 index 0000000..ab7335a --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Monaco/Models/MonacoContext.cs @@ -0,0 +1,9 @@ +using BlazorMonaco.Editor; +using Elsa.Api.Client.Resources.Scripting.Models; + +namespace Elsa.Studio.Models; + +/// +/// Represents a context for working with the Monaco editor. +/// +public record MonacoContext(StandaloneCodeEditor Editor, ExpressionDescriptor ExpressionDescriptor, IDictionary CustomProperties); \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/Services/TypeDefinitionService.cs b/src/framework/Elsa.Studio.Shared/Services/TypeDefinitionService.cs new file mode 100644 index 0000000..d6bdd65 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/Services/TypeDefinitionService.cs @@ -0,0 +1,20 @@ +using Elsa.Api.Client.Resources.Scripting.Contracts; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Services; + +/// +/// A service that provides TypeScript type definitions. +/// +public class TypeDefinitionService(IBackendApiClientProvider remoteBackendApiClientProvider) +{ + /// + /// Gets the type definition for the specified activity type. + /// + public async Task GetTypeDefinition(string definitionId, string activityTypeName, string propertyName, CancellationToken cancellationToken = default) + { + var api = await remoteBackendApiClientProvider.GetApiAsync(cancellationToken); + var data = await api.GetTypeDefinitions(definitionId, new(definitionId, activityTypeName, propertyName), cancellationToken); + return await data.Content.ReadAsStringAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/WellKnownSyntaxNames.cs b/src/framework/Elsa.Studio.Shared/WellKnownSyntaxNames.cs new file mode 100644 index 0000000..35ba3f8 --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/WellKnownSyntaxNames.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio; + +public class WellKnownSyntaxNames +{ + public const string Literal = "Literal"; + public const string Object = "Object"; +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shared/_Imports.razor b/src/framework/Elsa.Studio.Shared/_Imports.razor new file mode 100644 index 0000000..be93a1c --- /dev/null +++ b/src/framework/Elsa.Studio.Shared/_Imports.razor @@ -0,0 +1,6 @@ +@using Microsoft.AspNetCore.Components.Web +@using BlazorMonaco +@using BlazorMonaco.Editor +@using MudBlazor +@using Elsa.Studio.Components +@using Elsa.Studio.Services \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/App.razor b/src/framework/Elsa.Studio.Shell/App.razor new file mode 100644 index 0000000..be6d73f --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/App.razor @@ -0,0 +1,32 @@ +@inherits StudioComponentBase + + + @if (!AuthorizationIsDisabled) + { + + + + + Authorizing + + + + @UnauthorizedComponentProvider.GetUnauthorizedComponent() + + + + } + else + { + + + } + + + + Not found + + Sorry, there's nothing at this address. + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/App.razor.cs b/src/framework/Elsa.Studio.Shell/App.razor.cs new file mode 100644 index 0000000..9971cf0 --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/App.razor.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using Elsa.Studio.Contracts; +using Elsa.Studio.Shell.Options; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; + +namespace Elsa.Studio.Shell; + +public partial class App +{ + [Inject] private IEnumerable Modules { get; set; } = null!; + + [Inject] private IUnauthorizedComponentProvider UnauthorizedComponentProvider { get; set; } = null!; + [Inject] private NavigationManager NavigationManager { get; set; } = null!; + + [Inject] private IOptions ShellOptions { get; set; } = null!; + + private IEnumerable AdditionalAssemblies { get; set; } = null!; + + private bool AuthorizationIsDisabled => ShellOptions.Value.DisableAuthorization; + + /// + protected override void OnInitialized() + { + AdditionalAssemblies = Modules.Select(x => x.GetType().Assembly).Distinct().ToList(); + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/ComponentProviders/DefaultUnauthorizedComponentProvider.cs b/src/framework/Elsa.Studio.Shell/ComponentProviders/DefaultUnauthorizedComponentProvider.cs new file mode 100644 index 0000000..77f2626 --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/ComponentProviders/DefaultUnauthorizedComponentProvider.cs @@ -0,0 +1,23 @@ +using Elsa.Studio.Components; +using Elsa.Studio.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Shell.ComponentProviders; + +/// +/// Provides a that displays nothing. This is useful for scenarios where the login page is not required. If you need to display a login page, use LoginPageProvider" from the Login module instead or implement your own . +/// +public class DefaultUnauthorizedComponentProvider : IUnauthorizedComponentProvider +{ + /// + /// Returns a that displays nothing. + /// + public RenderFragment GetUnauthorizedComponent() + { + return builder => + { + builder.OpenComponent(0); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/Elsa.Studio.Shell.csproj b/src/framework/Elsa.Studio.Shell/Elsa.Studio.Shell.csproj new file mode 100644 index 0000000..6b5c468 --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/Elsa.Studio.Shell.csproj @@ -0,0 +1,17 @@ + + + + Elsa Studio application shell. + elsa studio framework + + + + + + + + + + + + diff --git a/src/framework/Elsa.Studio.Shell/Extensions/ServiceCollectionExtensions.cs b/src/framework/Elsa.Studio.Shell/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..022dc78 --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,41 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Shell.ComponentProviders; +using Elsa.Studio.Shell.Options; +using Microsoft.Extensions.DependencyInjection; +using MudBlazor; +using MudBlazor.Services; +using MudExtensions.Services; + +namespace Elsa.Studio.Shell.Extensions; + +/// +/// Provides extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the shell services. + /// + public static IServiceCollection AddShell(this IServiceCollection services, Action? configure = default) + { + configure ??= options => { options.DisableAuthorization = false; }; + services.Configure(configure); + + return services + .AddMudServices(config => + { + config.SnackbarConfiguration.PositionClass = Defaults.Classes.Position.TopCenter; + config.SnackbarConfiguration.PreventDuplicates = false; + config.SnackbarConfiguration.NewestOnTop = false; + config.SnackbarConfiguration.ShowCloseIcon = true; + config.SnackbarConfiguration.VisibleStateDuration = 1000; + config.SnackbarConfiguration.HideTransitionDuration = 100; + config.SnackbarConfiguration.ShowTransitionDuration = 100; + config.SnackbarConfiguration.SnackbarVariant = Variant.Filled; + config.SnackbarConfiguration.MaxDisplayedSnackbars = 3; + }) + .AddMudExtensions() + .AddScoped() + ; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/FodyWeavers.xml b/src/framework/Elsa.Studio.Shell/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/FodyWeavers.xsd b/src/framework/Elsa.Studio.Shell/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/Options/ShellOptions.cs b/src/framework/Elsa.Studio.Shell/Options/ShellOptions.cs new file mode 100644 index 0000000..ca6135b --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/Options/ShellOptions.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Shell.Options; + +/// +/// Contains options for the component. +/// +public class ShellOptions +{ + /// + /// Gets or sets a value indicating whether authorization is disable. false by default. + /// + public bool DisableAuthorization { get; set; } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Shell/_Imports.razor b/src/framework/Elsa.Studio.Shell/_Imports.razor new file mode 100644 index 0000000..9a61f86 --- /dev/null +++ b/src/framework/Elsa.Studio.Shell/_Imports.razor @@ -0,0 +1,9 @@ +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.JSInterop +@using MudBlazor +@using Elsa.Studio.Components +@using Elsa.Studio.Layouts +@using Elsa.Studio.Shell \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Elsa.Studio.Translations.csproj b/src/framework/Elsa.Studio.Translations/Elsa.Studio.Translations.csproj new file mode 100644 index 0000000..67c9e57 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Elsa.Studio.Translations.csproj @@ -0,0 +1,26 @@ + + + + Provides various port providers for activities such as `FlowSwitch` and `SendHttpRequest`. + elsa studio module + + + + + true + true + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/src/framework/Elsa.Studio.Translations/ResxLocalizationProvider.cs b/src/framework/Elsa.Studio.Translations/ResxLocalizationProvider.cs new file mode 100644 index 0000000..0fa7cf7 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/ResxLocalizationProvider.cs @@ -0,0 +1,13 @@ +using System.Globalization; +using Elsa.Studio.Localization; + +namespace Elsa.Studio.Translations +{ + internal class ResxLocalizationProvider : ILocalizationProvider + { + public string? GetTranslation(string key) + { + return Elsa.Studio.Translations.Translations.ResourceManager.GetString(key, CultureInfo.CurrentUICulture); + } + } +} diff --git a/src/framework/Elsa.Studio.Translations/ServiceCollectionExtensions.cs b/src/framework/Elsa.Studio.Translations/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..31fece7 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/ServiceCollectionExtensions.cs @@ -0,0 +1,13 @@ +using Elsa.Studio.Localization; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Translations; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddTranslations(this IServiceCollection services) + { + services.AddSingleton(); + return services; + } +} \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.ar.resx b/src/framework/Elsa.Studio.Translations/Translations.ar.resx new file mode 100644 index 0000000..725ea2d --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.ar.resx @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ١٨٠ يوم + + + ٩٠ يوم + + + ١٤ يوم + + + ٧ أيام + + + ٣٠ يوم + + + وصف مختصر للعامل. + + + وصف مختصر للسر. + + + شرح مختصر لهذا المدخل. + + + شرح مختصر لسير العمل. + + + شرح مختصر لهذا المُخرج. + + + تصنيف خاص يتم تعيينه لسير العمل هذا. + + + تصنيف خاص يتم تحديده لهذا المُخرج. + + + وصف لدور وهدف هذا العامل. + + + تصنيف خاص يتم تحديده لهذا المدخل. + + + قيمة افتراضية. + + + وصف لدور وهدف هذا المتغير. + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.de.resx b/src/framework/Elsa.Studio.Translations/Translations.de.resx new file mode 100644 index 0000000..b6d542e --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.de.resx @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Eine Beschreibung über das Geheimnis. + + + Eine Beschreibung über die Rolle und den Zweck dieser Eingabevariablen. + + + Ein technischer Name für die Funktion, die dieser Agent durchführt. Zum Beispiel: WriteCode + + + Aktivitäten + + + 14 Tage + + + 180 Tage + + + 30 Tage + + + 7 Tage + + + 90 Tage + + + Ein Standard-Wert. + + + Eine kurze Beschreibung des Agenten. + + + Eine kurze Beschreibung des Geheimnisses. + + + Eine kurze Beschreibung der Eingabe. + + + Eine kurze Beschreibung der Ausgabe. + + + Eine benutzerdefinierte Kategorie, um diese Ausgabe zu gruppieren. + + + Eine benutzerdefinierte Kategorie, um diese Eingabe zu gruppieren. + + + Eine Beschreibung über die Rolle und den Zweck dieses Agenten. + + + Eingabe hinzufügen + + + Ausgabe hinzufügen + + + Variable hinzufügen + + + Aktivitäts ID + + + Agent + + + Eine Beschreibung dieser Aktivität, die im Designer angezeigt werden soll. + + + Aktivierungsstrategie + + + API Schlüssel + + + API Schlüssel + + + Anwenden + + + Aggregation + + + Erlaube, dass dieser Workflow von einer Aktivität genutzt wird. + + + Kategorie + + + Unterbrechnung + + + Verzweigen + + + Leeren + + + Schließen + + + Wählen sie diese Option, wenn die Variable ein Array des ausgewählten Typs hält. + + + Klicken um einen neuen Workflow in einem Tab zu öffnen + + + Gemeinsame + + + Datum + + + Datumsfilter + + + Vollständig + + + Abgeschlossen + + + Zusammensetzung + + + Verbindungsdetails + + + Konsole + + + Korrelieren + + + Korrelations-ID + + + Erstellen von Agenten + + + API Schlüssel erstellen + + + Geheimnis erzeugen + + + Dienst erstellen + + + Cron + + + Dashboard + + + Standardeinstellung + + + Dauer + + + Bearbeiten + + + E-Mail + + + Aktivität + + + Hinzufügen + + + Angelegt am + + + Automatisch speichern + + + Abbrechen + + + Workflow schließen + + + Workflow anlegen + + + Entscheidung + + + Angelegt + + + Beschreibung + + + Ende + + + Standardwert + + + Verzögerung + + + Löschen + + + Anzeigenname + + + Ereignisse + + + Anzeigentext + + + Datei herunterladen + + + Ereignis + + + Allgemein + + + Fehlerhaft + + + Beendet + + + Beenden + + + Beendet am + + + Eine kurze Beschreibung des Workflows. + + + Agenten + + + Massenaktionen + + + Container + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.es.resx b/src/framework/Elsa.Studio.Translations/Translations.es.resx new file mode 100644 index 0000000..0f2cb33 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.es.resx @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 días + + + 180 días + + + 30 días + + + 7 días + + + 90 días + + + Una breve descripción del secreto. + + + Una breve descripción del flujo de trabajo. + + + Una breve descripción de esta entrada. + + + La categoría de actividad personalizada asignada a este flujo de trabajo como actividad. + + + Una categoría personalizada para agrupar esta entrada. + + + Un valor predeterminado. + + + Una descripción de la función y el propósito de esta variable de entrada. + + + Una descripción sobre el secreto. + + + El nombre de la función realizada por este agente. Por ejemplo: escribir código (WriteCode) + + + Reconocer eventos de origen de datos + + + Estrategia de activación + + + Actividades + + + Actividad + + + Identificación de la instancia de la actividad + + + Añadir + + + Añadir entrada + + + Añadir salida + + + Añadir variable + + + Agente + + + Agentes + + + Agrupación + + + Permitir que este flujo de trabajo se utilice como una actividad. + + + Clave API + + + Claves API + + + Aplicar + + + Actualización automática de los flujos de trabajo + + + Guardar automáticamente + + + Bifurcación + + + Pausa + + + Acciones masivas + + + Cancelar + + + Categoría + + + Cerrar flujo de trabajo + + + Común + + + Terminado + + + Composición + + + Cadenas de conexión + + + Consola + + + Correlación + + + Crear clave API + + + Cerrar + + + Crear agente + + + Identificación de la correlación + + + Una descripción de la función y el propósito de este agente. + + + Una breve descripción del agente. + + + Una breve descripción de esta salida. + + + Flujos de trabajo de envío masivo + + + Una categoría personalizada para agrupar esta salida. + + + Una descripción de esta actividad que se muestra en el diseñador. + + + Marque esta opción si la variable contiene una matriz del tipo seleccionado. + + + Haga clic para abrir una nueva pestaña de flujo de trabajo + + + Completo + + + Recipiente + + + Limpiar + + + Crear Secreto + + + Crear Servicio + + + Creado + + + Crear flujo de trabajo + + + Cron + + + Escritorio + + + Fecha + + + Filtros de Fecha + + + Decisión + + + Configuración por defecto + + + Valor por defecto + + + ID de Definición + + + ID de Versión de Definición + + + Suspensión + + + Eliminar + + + Descripción + + + Detalles + + + Enviar flujo de trabajo + + + Editar + + + Correo electrónico + + + Fin + + + Ingrese una lista de posibles salidas para este flujo de trabajo. + + + Evento + + + Eventos + + + Procesar Excel + + + Configuración de Ejecución + + + Ejecuciones + + + Expira + + + Exportar + + + Exportar el flujo de trabajo actual como archivo JSON. + + + Fallo + + + Finalizar + + + Finalizado + + + Flujo + + + Penalización de Frecuencia + + + Creación + + + Exportar esta versión como un archivo JSON. + + + Definiciones + + + Descargar Archivo + + + Duración + + + Expira en + + + Texto mostrado + + + Nombre para mostrar + + + Finalizado + + + Versión de Definición + + + Función + + + General + + + HTTP + + + ID + + + Importar + + + Estrategia de incidentes + + + Incidentes + + + Información + + + Info + + + Instancias + + + Última versión + + + Cargando + + + Tokens máximos + + + Metadata + + + Nombre + + + El nombre de la actividad. Otras actividades pueden hacer referencia a las actividades nombradas. + + + Nunca + + + No + + + No se han encontrado agentes + + + No se han encontrado API keys + + + No hay resultados asociados con esta ejecución. + + + No hay salidas asociadas con esta ejecución. + + + Abrir archivo + + + Importar un archivo JSON que contenga datos del flujo de trabajo para anular el contenido del flujo de trabajo actual. + + + Bucles + + + Estrategia de persistencia de logs + + + Ok + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.fa.resx b/src/framework/Elsa.Studio.Translations/Translations.fa.resx new file mode 100644 index 0000000..3a611e6 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.fa.resx @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 روز + + + گروه سفارشی این ورودی. + + + 180 روز + + + توضیح مختصر خروجی. + + + توضیحی از این فعالیت که در ویرایشگر نمایش داده میشود. + + + توضیح مختصر کلید. + + + گروه سفارشی این خروجی. + + + 7 روز + + + 90 روز + + + توضیح مختصر رابط. + + + توضیح مختصر فرآیند. + + + توضیح مختصر ورودی. + + + گروه سفارشی فعالیت جهت اتصال فرآیند به آن. + + + مقدار پیشفرض. + + + توضیح نقش و هدف این متغیر ورودی. + + + توضیحی در مورد کلید. + + + نام فنی تابعی که این رابط انجام میدهد. مانند: WriteCode + + + توضیح نقش و هدف این رابط. + + + 30 روز + + + تایمر + + + افزودن + + + افزودن ورودی + + + افزودن خروجی + + + افزودن متغیر + + + استراتژی فعالسازی + + + اکتیویتی + + + اکتیویتی‌ها + + + زمان + + + این خروجی یک آرایه است + + + این وروددی یک آرایه است + + + نوع + + + مقدار + + + متغیرها + + + بله + + + شناسه اکتیویتی در اجرا + + + عامل + + + عامل‌ها + + + تجمیع + + + استفاده از این فرایند به عنوان اکیویتی. + + + API Key + + + API Keys + + + اعمال + + + به روزرسانی خودکار فرآیندهای مرتبط + + + ذخیره خودکار + + + انشعاب + + + توقف + + + عملیات دسته‌ای + + + اجرای دسته‌ای فرآیندها + + + در صورتی که متغیر شامل آرایه‌ای از نوع انتخاب شده است این گزینه را فعال نمایید. + + + لغو + + + دسته + + + پاکسازی + + + تب فرایند جدید + + + بستن + + + بستن فرآیند + + + عمومی + + + تکمیل + + + تکمیل شده + + + ترکیب + + + Connection Strings + + + کنسول + + + کانتینر + + + ایجاد عامل + + + ایجاد API Key + + + ایجاد رمز + + + ایجاد سرویس + + + ایجاد شده + + + ایجاد شده در + + + ایجاد فرآیند + + + کرون + + + پیشخوان + + + تاریخ + + + فیلترهای تاریخ + + + تصمیم + + + تنظیمات پیفرض + + + مقدار پیش‌فرض + + + تاخیر + + + حذف + + + توضیحات + + + جزییات + + + عنوان + + + نمایش متن + + + دانلود فایل + + + مدت + + + ویرایش + + + ایمیل + + + پایان + + + لیستی از خروجی‌های ممکن برای این فرایند را وارد نمایید. + + + رویداد + + + رویدادها + + + تنظیمات اجرا + + + انقضا + + + اجراها + + + انقضا تا + + + استخراج + + + استخراجی فرآیند جاری در قالی فایل JSON. + + + استخراج نسخه جاری در قالب فایل JSON. + + + خطا + + + خاتمه + + + خاتمه یافته + + + خاتمه یافته در + + + جریان + + + حلقه FOR + + + تابع + + + نام تابع + + + کلی + + + دارای رخداد + + + اچ تی تی پی + + + شناسه + + + شناسه اکتیویتی. + + + ویژگیهای ورودی + + + ورودی/خروجی + + + ورودی‌ها + + + ورودی + + + اجراها + + + عدد صحیح + + + در حال بارگذاری + + + نام + + + جریمه تکرار + + + جدیدترین نسخه + + + لیست کشویی + + + ویرایشگر جیسون + + + لیست چک‌باکس ها + + + لیست رادیو‌باتن ها + + + یک ورودی با این نام از قبل موجود است. + + + انتخابگر خروجی + + + یک ویرایشگر کد + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.fr.resx b/src/framework/Elsa.Studio.Translations/Translations.fr.resx new file mode 100644 index 0000000..c56900f --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.fr.resx @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 jours + + + 180 jours + + + 30 jours + + + 7 jours + + + 90 jours + + + Description courte de l'agent. + + + Description courte du secret. + + + Activité + + + Ajouter + + + Ajouter variable + + + Clé d'API + + + Clés d'API + + + Appliquer + + + Annuler + + + Console + + + Valeur par défaut + + + Durée + + + Modifier + + + Détails + + + Supprimer + + + Description + + + Fin + + + Paramètres d'éxécution + + + Exécutions + + + Expire dans + + + Nom de la Fonction + + + Valeur + + + Variables + + + Version + + + Historique de version + + + Voir + + + Valeur par défaut. + + + Catégorie + + + Tableau de bord + + + Chaînes de connexion + + + Evènement + + + Evènements + + + Email + + + Expiration + + + Fonction + + + Exporter + + + Mis à jour + + + Utiliser cette version + + + Utilisé + + + Activités + + + Agent + + + Agents + + + Sauvegarde automatique + + + Fermer + + + Créer une clé d'API + + + Date + + + Configuration par défaut + + + HTTP + + + ID + + + Information + + + A brève description de la sortie. + + + Une brève description de l'entrée. + + + Une brève description du workflow. + + + Une catégorie d'activité personnalisée à assigner à ce workflow en tant qu'activité. + + + Une activité personnalisée via laquelle grouper cette sortie. + + + Une activité personnalisée via laquelle grouper cette entrée. + + + Une description au sujet du rôle et du but de cet agent. + + + Une description au sujet du rôle et du but de cette variable en entrée. + + + Une description au sujet du secret. + + + Une description de cette activité à afficher dans le concepteur. + + + Un nom technique pour la fonction que cet agent exécute. Par exemple : WriteCode + + + Stratégie d'activation + + + Id d'instance de l'activité + + + Ajouter sortie + + + Ajouter entrée + + + Aggrégation + + + Autoriser ce workflow à être utilisé en tant qu'activité. + + + Branchement + + + Actions en lot + + + Effacer + + + Cliquer pour ouvrir un nouvel onglet de workflow + + + Fermer workflow + + + Terminer + + + Terminé + + + Composition + + + Conteneur + + + Corréler + + + ID de Corrélation + + + Créer agent + + + Créer Secret + + + Créer Service + + + Créé + + + Créé le + + + Créer workflow + + + Cron + + + Filtres de date + + + Décision + + + ID de définition + + + Version de définition + + + ID de version de définition + + + Définitions + + + Nom d'affichage + + + Texte d'affichage + + + Télécharger fichier + + + Saisir une liste de sorties possibles pour ce workflow. + + + Parseur Excel + + + Export le workflow actuel en tant que fichier JSON. + + + Exporter cette version en tant que fichier JSON. + + + Finir + + + Fini + + + Fini à + + + Général + + + A des incidents + + + L'ID de l'activité. + + + Importer + + + Importe a fichier JSON contenant des données de workflow pour écraser les contenus du workflow en cours. + + + Entrée + + + Propriétés en entrée + + + Entrée/sortie + + + Entrées + + + Instances + + + Journal + + + Dernière version + + + Chargement + + + Stratégie de persistence de log + + + Jetons Max + + + Métadonnées + + + Nom + + + Le nom de l'activité. Les activités nommées peuvent être référencées par d'autres activités. + + + Jamais + + + Non + + + Aucun agent trouvé + + + Aucune clé d'API trouvée + + + Aucune entrée + + + Aucune sortie associée avec cette exécution. + + + Aucun résultat de sortie associé avec cette exécution. + + + Aucune sortie + + + Aucun secret trouvé + + + Aucun service trouvé + + + Aucun état associé avec cette exécution. + + + Aucune variable + + + Aucun définition de workflow trouvée + + + Aucune instance de workflow trouvée + + + Ok + + + Ouvrir fichier + + + Sortie + + + Propriétés de sortie + + + Sorties + + + Parseur + + + Persistence de log + + + Propriétés + + + Publier + + + Publier évènement + + + Publié + + + Version publiée + + + Publier le workflow en cours + + + Lignes par page + + + Exécuter + + + Exécuter de manière asynchrone + + + Exécuter JavaScript + + + Exécuter Python + + + Exécuter la tâche + + + Exécuter le workflow + + + Enregister + + + Enregistrer le fichier + + + Rechercher ... + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.nl.resx b/src/framework/Elsa.Studio.Translations/Translations.nl.resx new file mode 100644 index 0000000..a3e0e48 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.nl.resx @@ -0,0 +1,991 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 dagen + + + Een korte omschrijving van deze input. + + + Een korte omschrijving van deze output. + + + 90 dagen + + + Een korte omschrijving van de secret. + + + Een standaardwaarde. + + + Activity Instance ID + + + Agenten + + + Gemaakt op + + + Geen uitkomst gekoppeld aan deze uitvoering. + + + Is op of na + + + De naam van de agent. + + + Temperatuur + + + Gestart + + + De omschrijving van de outputvariabele. + + + Status + + + Taak + + + string + + + Toon incidenten + + + Substatus + + + Alle evenementen + + + Start van de workflow + + + Incidenten + + + + + + De straf voor het herhalen van een token. Een hogere straf vermindert de kans op herhaling en bevordert meer variatie in de gegenereerde tekst. + + + + + + De straf voor het herhalen van een token. Een hogere straf vermindert de kans op herhaling en bevordert meer variatie in de gegenereerde tekst. + + + + + + De naam van de nieuwe agent. + + + + + + De naam van de variabele. + + + De plugin die de agent kan gebruiken. + + + De naam van de nieuwe workfow. + + + De naam van het nieuwe geheim. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lees data uit database + + + Functienaam + + + Gebeurtenissen + + + Lussen + + + De ID van de activiteit. + + + Ingangen + + + Planning + + + Weergave tekst + + + Workflow uitvoeren + + + Bereik + + + Nee + + + Beheer alle dingen + + + Fout + + + Publiceer + + + + + + Algemeen + + + Publiceer de huidige workflow + + + Is een array + + + Voltooien + + + Exporteren + + + Gebeurtenis + + + De naam van de activiteit. Genaamde activiteiten kunnen door andere activiteiten worden gerefereerd. + + + Klik om een nieuw workflowtabblad te openen + + + Agent + + + Samenvoegen + + + HTTP + + + HTTP Request + + + ID + + + Einde + + + Standaardconfiguratie + + + Bezig met laden + + + Geen services gevonden + + + Compositie + + + Maximale tokens + + + Algemeen + + + Is voor + + + Cron + + + Parser + + + HTTP-bestandrespons + + + Uitkomst + + + Bulk Dispatch Workflows + + + Bepaal uitkomst + + + Geen status gekoppeld aan deze uitvoering. + + + 7 dagen + + + Bepaal naam + + + Een beschrijving van de secret. + + + + + + Info + + + int + + + Gepubliceerde versie + + + Taak uitvoeren + + + Verloopt + + + Geen agents gevonden + + + Duur + + + + + + Asynchroon uitvoeren + + + API sleutels + + + + + + Het .NET-type van de inputvariabele. + + + Verwijderen + + + Werkstroom sluiten + + + Substatus + + + Definitie ID + + + JavaScript uitvoeren + + + Workflow verzenden + + + Geen variabelen + + + + + + Bulk acties + + + API sleutel + + + Zoeken... + + + Geen inputs + + + Importeren + + + + + + Invoereigenschappen + + + Geheimen + + + Toepassen + + + Incidentstrategie + + + Bepaal workflow-contextparameter + + + Een korte omschrijving van de agent. + + + De naam van de functie die de agent zal uitvoeren. + + + Functie + + + Nooit + + + Zoek op naam, omschrijving, id, definitie-id + + + Activities + + + + + + HTTP Response + + + Activeringsstrategie + + + Zoek op naam, id, definitie-id, definitieversie-id, correlatie-id + + + Toon relatieve tijd + + + Toon geaccumuleerde tijd + + + Voltooid + + + Is niet + + + Container + + + Toestaan dat deze workflow als activity gebruikt kan worden. + + + Voor + + + HTTP Endpoint + + + + + + Agent aanmaken + + + Open AI-chataanvulling + + + Stroom + + + Naam + + + Rijen per pagina + + + Is na + + + Output toevoegen + + + Dagboek + + + Bewerken + + + + + + Open bestand + + + Verstuur e-mail + + + object + + + Breken + + + Geen API keys gevonden + + + Een beschrijving van deze activity die in de designer moet worden weergegeven. + + + API-sleutel aanmaken + + + Erken Datasource-event + + + Console + + + Is op of voor + + + Gepubliceerd + + + Exporteer de huidige workflow als een JSON-bestand. + + + Correleren + + + Service maken + + + HTTP Request (flow) + + + Executie instellingen + + + Services + + + Incidentaantal + + + Uikomsteigenschappen + + + Informatie + + + Omwisselen (flow) + + + Status + + + Verbindingsreeksen + + + Activity + + + + + + Bestand bewaren + + + Sluiten + + + De levensduur van dit geheim + + + Een technische naam voor de functie die deze agent uitvoert. Bijvoorbeeld: WriteCode + + + Geen workflow-definities gevonden + + + Een aangepaste categorie om deze output te groeperen. + + + Incidenten + + + Geheim aanmaken + + + + + + Omwisselen + + + Terugrollen naar deze versie + + + Executies + + + Sub-workflow uitkomsten + + + Voltooid op + + + Prompt-template + + + Annuleren + + + 180 dagen + + + Invoer + + + Als + + + Start + + + + + + 30 dagen + + + + + + Aggregatie + + + Uitvoeren + + + Een aangepaste categorie waarin deze invoer wordt gegroepeerd. + + + Definities + + + Excel parser + + + Python uitvoeren + + + + + + Toon evenementen binnen het bereik van de huidige container + + + Details + + + + + + Vertakken + + + + + + Opslag + + + Workflow maken + + + Een beschrijving van de rol en het doel van deze invoervariabele. + + + Scripting + + + + + + Variable toevoegen + + + Verloopt over + + + Weergave naam + + + Een korte omschrijving van de workflow. + + + + + + Metadata + + + Automatisch opslaan + + + Lees data uit configuratie / runtime + + + Vork (stroom) + + + Beslissing + + + Voltooien + + + Het .NET-type van de outputvariabele. + + + + + + Instanties + + + Datum filters + + + + + + E-mail + + + OpenAI tekst-naar-afbeelding + + + Eigenschappen + + + Log persistence strategie + + + + + + Sub-workflow inputs + + + + + + Definitie versie + + + Een beschrijving van de rol en het doel van deze agent. + + + Gemaakt + + + Het maximale aantal tokens te genereren. Laat leeg voor maximum. + + + + + + Geen workflow-instances gevonden + + + OK + + + Plugins + + + Voltooid + + + Bestand downloaden + + + Uitkomsten + + + Importeer een JSON-bestand met workflowgegevens om de inhoud van de huidige workflow te overschrijven. + + + + + + Definitie versie ID + + + + + + Instellingen + + + + + + Uitkomsten + + + Correlatie ID + + + Dashboard + + + Bewaren + + + + + + Primitieven + + + Datum + + + Laatste versie + + + Start op + + + Geen uitkomsten + + + Publiceer evenement + + + Omschrijving + + + Een aangepaste activity categorie om aan deze workflow-als-activity toe te wijzen. + + + Geen secrets gevonden + + + Voer een lijst in met mogelijke uitkomsten voor deze workflow. + + + + + + Gebruikende workflows automatisch bijwerken + + + Selecteer deze optie als de variabele een array van het geselecteerde type bevat. + + + Bepaal variabele + + + Sub-workflow + + + Geheim + + + + + + + + + Logpersistentie + + + Frequentiestraf + + + Is + + + Vertraging + + + Input toevoegen + + + Leegmaken + + + Heeft incidenten + + + Categorie + + + Toevoegen + + + Standaardwaarde + + + Geen uitkomsten gekoppeld aan deze uitvoering. + + + Exporteer deze versie als een JSON-bestand. + + + Invoer/uitvoer + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.pt.resx b/src/framework/Elsa.Studio.Translations/Translations.pt.resx new file mode 100644 index 0000000..e602741 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.pt.resx @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 180 dias + + + 90 dias + + + Uma descrição resumida do segredo. + + + Uma descrição resumida do workflow. + + + Uma descrição resumida do input. + + + Uma categoria personalizada de atividade a dar a este workflow-como-atividade. + + + Uma categoria personalizada de como agrupar este output. + + + Um valor padrão. + + + Uma descrição sobre o papel e propósito deste agente. + + + Uma descrição sobre o papel e propósito desta variável de input. + + + Uma descrição sobre o segredo. + + + Uma descrição desta atividade para aparecer no designer. + + + Reconhecer evento de Datasource + + + Estratégia de ativação + + + Atividades + + + Atividade + + + ID de Instância da Atividade + + + Adicionar + + + Adicionar input + + + Adicionar output + + + Agente + + + Permitir que este workflow seja usado como uma atividade. + + + Chave de API + + + Atualizar automaticamente workflows consumidores + + + Guardar automaticamente + + + Ramificar + + + Pausa + + + Ações em massa + + + Cancelar + + + Categoria + + + Seleciona esta opção se a variável contiver um array do tipo selecionado. + + + Limpar + + + Clica para abrir um novo separador de workflow + + + Fechar + + + Fechar workflow + + + Comum + + + Completo + + + Completado + + + Composição + + + Strings de Conexão + + + Consola + + + Container + + + Correlacionar + + + Criar Chave de API + + + Criar Serviço + + + Criado + + + Criado Em + + + Painel + + + Data + + + Filtros de Data + + + Decisão + + + Configuração por Omissão + + + ID de Definição + + + ID de versão de Definição + + + Definições + + + Atraso + + + Apagar + + + Descrição + + + Detalhes + + + Expedir Workflow + + + Nome de Apresentação + + + 14 dias + + + 30 dias + + + Uma descrição resumida do agente. + + + 7 dias + + + Uma descrição resumida do output. + + + Uma categoria personalizada de como agrupar este input. + + + Um nome técnico para a função que este agente performa. Por exemplo: EscreverCodigo + + + Adicionar variável + + + Agentes + + + Agregação + + + Chaves de API + + + Aplicar + + + Expedição em Massa de Workflows + + + Criar Segredo + + + ID de Correlação + + + Valor por omissão + + + Versão de Definição + + + Criar Agente + + + Criar workflow + + + Cron + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.resx b/src/framework/Elsa.Studio.Translations/Translations.resx new file mode 100644 index 0000000..b69e3a6 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.resx @@ -0,0 +1,1632 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 days + + + 180 days + + + 30 days + + + 7 days + + + 90 days + + + A brief description of the agent. + + + A brief description of the secret. + + + A brief description of the workflow. + + + A brief description of this input. + + + A brief description of this output. + + + A custom activity category to assign this workflow-as-an-activity to. + + + A custom category by which to group this input. + + + A custom category by which to group this output. + + + A default value. + + + A description about the role and purpose of this agent. + + + A description about the role and purpose of this input variable. + + + A description about the secret. + + + A description of this activity to be displayed in the designer. + + + A technical name for the function that this agent perform. For example: WriteCode + + + Acknowledge Datasource Event + + + Activation strategy + + + Activities + + + Activity + + + Activity Instance ID + + + Add + + + Add input + + + Add output + + + Add variable + + + Agent + + + Agents + + + Aggregation + + + Allow this workflow to be used as an activity. + + + API Key + + + API Keys + + + Apply + + + Auto-update consuming workflows + + + Auto-save + + + Branching + + + Break + + + Bulk actions + + + Bulk Dispatch Workflows + + + Cancel + + + Category + + + Check this option if the variable holds an array of the selected type. + + + Clear + + + Click to open a new workflow tab + + + Close + + + Close workflow + + + Common + + + Complete + + + Completed + + + Composition + + + Connection Strings + + + Console + + + Container + + + Correlate + + + Correlation ID + + + Create Agent + + + Create API Key + + + Create Secret + + + Create Service + + + Created + + + CreatedAt + + + Create workflow + + + Cron + + + Dashboard + + + Date + + + Date Filters + + + Decision + + + Default configuration + + + Default value + + + Definition ID + + + Definition version + + + Definition version ID + + + Definitions + + + Delay + + + Delete + + + Description + + + Details + + + Dispatch Workflow + + + Display name + + + Display text + + + Download File + + + Duration + + + Edit + + + Email + + + End + + + Enter a list of possible outcomes for this workflow. + + + Event + + + Events + + + Excel Parser + + + Execution Settings + + + Executions + + + Expires + + + Expires In + + + Export + + + Export the current workflow as a JSON file. + + + Export this version as a JSON file. + + + Fault + + + Finish + + + Finished + + + FinishedAt + + + Flow + + + For + + + Fork (flow) + + + Frequency Penalty + + + Function + + + Function Name + + + General + + + Has Incidents + + + HTTP + + + HTTP Endpoint + + + HTTP File Response + + + HTTP Request + + + HTTP Request (flow) + + + HTTP Response + + + ID + + + The ID of the activity. + + + If + + + Import + + + Import a JSON file containing workflow data to override the current workflow's contents. + + + Incident Strategy + + + IncidentCount + + + Incidents + + + Info + + + Information + + + Input + + + Input Properties + + + Input/output + + + Inputs + + + Instances + + + int + + + Is + + + Is After + + + Is array + + + Is Before + + + Is Not + + + Is on or After + + + Is on or Before + + + Join + + + Journal + + + Latest version + + + Loading + + + Log Persistence Strategy + + + Looping + + + Manage all the things + + + Max Tokens + + + Metadata + + + Name + + + The name of the activity. Named activities can be referenced by other activities. + + + Never + + + No + + + No agents found + + + No API keys found + + + No inputs + + + No outcomes associated with this execution. + + + No output associated with this execution. + + + No outputs + + + No secrets found + + + No services found + + + No state associated with this execution. + + + No variables + + + No workflow definitions found + + + No workflow instances found + + + object + + + Ok + + + Open File + + + OpenAIChatCompletion + + + OpenAITextToImage + + + Outcomes + + + Output + + + Output Properties + + + Outputs + + + Parser + + + Log Persistence + + + Plugins + + + Presence Penalty + + + Primitives + + + Prompt Template + + + Properties + + + Publish + + + Publish Event + + + Published + + + Published version + + + Publish the current workflow + + + Read Data from Configuration / Runtime + + + Read Data from Database + + + Rollback to this version + + + Rows Per Page + + + Run + + + Run Asynchronously + + + Run JavaScript + + + Run Python + + + Run Task + + + Run workflow + + + Save + + + Save File + + + Scheduling + + + Scope + + + Scripting + + + Search... + + + Search on name, id, definition id, definition version id, correlation id + + + Search on name, description, id, definition id + + + Secret + + + Secrets + + + Send Email + + + Services + + + Set Name + + + Set Output + + + Set Variable + + + Set Workflow Context Parameter + + + Settings + + + Show accumulated time + + + Show events scoped to current container + + + Show incidents + + + Show relative time + + + Showing all events + + + Showing incidents + + + Start + + + Start at + + + Start of workflow + + + Started + + + State + + + Status + + + Storage + + + string + + + Sub status + + + Sub-Workflow + + + Sub-Workflow Inputs + + + Sub-Workflow Outputs + + + SubStatus + + + Switch + + + Switch (flow) + + + Task + + + Temperature + + + The .NET type of the input variable. + + + The .NET type of the output variable. + + + The description of the output variable. + + + The lifetime of this secret + + + The maximum number of tokens to generate. Leave empty for maximum. + + + The name of the agent. + + + The name of the function that the agent will execute. + + + The name of the new agent. + + + The name of the new secret. + + + The name of the new workflow. + + + The name of the variable. + + + The penalty for repeating any one token. A higher presence penalty will reduce the likelihood of token repetition, fostering more varied text generation. + + + The penalty for repeating any one token. A higher frequency penalty will reduce the likelihood of token repetition, fostering more varied text generation. + + + The plugins that the agent can use. + + + The scope of the secret helps the UI to filter available options from dropdown lists. + + + The secret value. + + + The services that the agent requires. + + + The settings of the service in JSON format. + + + The system prompt template that the agent will use. + + + The technical name of the API key. + + + The technical name of the input variable. When referencing this variable in the prompt template, use this name. + + + The technical name of the input. + + + The technical name of the service. + + + The temperature of the model. Higher values mean the model will take more risks. Try 0.1 for results that are very close to what the model was trained on. Try 0.9 for very creative results. + + + The type of the service. + + + The user-friendly name of this input. + + + The user-friendly name of this output. + + + The value of the API key. + + + There are currently no inputs defined. + + + There are currently no outputs defined. + + + There are currently no variables defined. + + + This activity does not have any common properties. + + + This activity does not have any input properties. + + + This activity does not have any output properties. + + + This input is an array + + + This output is an array + + + This variable is an array + + + Time + + + Timer + + + Top Probability determines the cumulative probability threshold for token selection during text generation. Lower values will result in less diversity, making the model pick from the most probable tokens only. Higher values will allow for more diverse outputs, as the model will consider a wider range of tokens. + + + TopP + + + Trigger workflow + + + Type + + + UI Hint + + + Unable to make changes as the workflow or application is currently in read-only mode + + + Unpublish + + + Unpublish the current workflow. + + + Updated + + + UpdatedAt + + + Usable as activity + + + Use JSON Response + + + Use this version + + + Used + + + Used to define the initial instructions or context that the Semantic Kernel agent will use to generate responses. This template guides the agent's behavior and helps it understand the role it needs to play or the tasks it needs to perform. + + + Value + + + Variables + + + Version + + + Version history + + + View + + + Webhooks + + + When checked, the workflow will be executed asynchronously. + + + When you publish a new version, all of the consuming workflows will be updated to point to the new version of this workflow. + + + Whether to show the description in the designer. + + + Workflow Context + + + Workflow Context Settings + + + Workflow Contexts + + + Workflow definitions Editor + + + Workflow instances + + + The name of the workflow. + + + Workflows + + + Write Line + + + Yes + + + You are running in read-only mode. Workflow operations are disabled + + + You can find documentation and examples here + + + Incident handling strategy + + + A checkbox + + + A code editor + + + A dropdown list + + + A JSON editor + + + A list of checkboxes + + + A list of radio buttons + + + A single line of text input + + + A variable picker + + + A variable with this name already exists in the current scope. + + + A workflow definition picker + + + A workflow output definition picker + + + A workflow with this name already exists. + + + An input for multiple words, like a tagging input + + + An input with this name already exists. + + + An outcome picker + + + Are you sure you want to cancel all running workflow instances of this workflow definition? + + + Are you sure you want to cancel the selected workflow instances? + + + Are you sure you want to cancel this workflow instance? + + + Are you sure you want to delete the selected input? + + + Are you sure you want to delete the selected output? + + + Are you sure you want to delete the selected variable? + + + Are you sure you want to delete the selected versions? + + + Are you sure you want to delete the selected workflow instances? + + + Are you sure you want to delete the selected workflows? + + + Are you sure you want to delete this version? + + + Are you sure you want to delete this workflow instance? + + + Are you sure you want to delete this workflow? + + + Are you sure you want to publish the selected workflows? + + + Are you sure you want to unpublish the selected workflows? + + + Cancel running workflow instances? + + + Cancel selected workflow instances? + + + Cancel workflow instance? + + + Checkbox + + + Checklist + + + Code editor + + + {0} consuming workflow(s) updated + + + Create input + + + Create output + + + Create variable + + + Default + + + Default Strategy + + + Delete selected input? + + + Delete selected output? + + + Delete selected variable? + + + Delete selected versions + + + Delete selected workflow instances? + + + Delete selected workflows? + + + Delete version + + + Delete workflow instance? + + + Delete workflow? + + + Dropdown + + + Edit output + + + Edit variable + + + Edit Workflow Definition + + + Enter the expression that will be used to determine the log persistence strategy for this property. + + + Failed to import {0} workflow definitions. Errors: {1} + + + imported successfully. + + + Inherit + + + JSON editor + + + Message + + + Multi line + + + Multi text + + + Multiple lines of text input + + + New workflow + + + No workflows found to import. + + + No workflows were imported. + + + None + + + Not executed + + + Not usable as activity. + + + One workflow consuming a published workflow has been updated + + + One workflow is already published + + + One workflow is already unpublished + + + One workflow is not found + + + One workflow is published + + + One workflow is unpublished + + + Outcome picker + + + Output picker + + + Please enter a name for the input. + + + Please enter a name for the output. + + + Please enter a name for the variable. + + + Please enter a name for the workflow. + + + Publish selected workflows? + + + Radio list + + + Readonly + + + Show description + + + Single line + + + Successfully imported + + + Successfully imported 1 workflow definition. + + + Successfully imported one instance + + + Successfully started workflow + + + The commit strategy to use that controls when the workflow state should be committed. + + + The ID of the variable. + + + The read-only workflows will not be affected. + + + The text to display in the designer. + + + The workflow cannot be started + + + Timestamp + + + Unpublish selected workflows? + + + Upload JSON and/or ZIP files containing workflow data to import. + + + Variable picker + + + When checked, this activity can trigger this workflow. + + + When checked, this activity is the start of this workflow. + + + Workflow definition picker + + + workflow definitions. + + + Workflow published + + + Workflow published with Not Found activities + + + Workflow retracted + + + Workflow saved + + + Workflow unpublished + + + Workflow was already published + + + workflows are already published + + + workflows are already unpublished + + + workflows are not found + + + workflows are published + + + workflows are unpublished + + + workflows consuming published workflows have been updated + + + Delete version {0} + + + Successfully imported {0} instances + + + Successfully imported {0} workflow definitions. + + + {0} workflows are already published + + + {0} workflows are already unpublished + + + {0} workflows are not found + + + {0} workflows are published + + + {0} workflows are unpublished + + + {0} workflows consuming published workflows have been updated + + + {0} {1} imported successfully. + + + Failed to import {0} {1}. + + + Auto layout + + + Center + + + Zoom to fit the screen + + + A function to compute the correlation ID to associate a dispatched workflow with. + + + A list of expected outcomes to handle. + + + A list of expected status codes to handle. + + + A value that allows to add the Authorization header without validation. + + + Always allow the creation + + + Branches + + + Break out of a loop. + + + Cancelled + + + Condition + + + Content Type + + + Correlation ID Function + + + Default Item Input Key + + + Disable Authorization Header Validation + + + Executes javaScript code + + + Executing + + + Expected Status Codes + + + Method + + + Mode + + + Request Content. + + + Result + + + Running + + + Supported Methods + + + The Authorization header value to send with the request. For example: Bearer {some-access-token} + + + The content to send with the request. Can be a string, an object, a byte array or a stream. + + + The content type to use when sending the request. + + + The data source to use for dispatching the workflows. + + + The default key to use for the input name when sending the current item to the dispatched workflow. Will not be used if the Items field contain a list of dictionaries + + + The definition ID of the workflows to dispatch. + + + The HTTP method to use when sending the request. + + + The HTTP methods to accept. + + + The join mode determines whether this activity should continue as soon as one inbound path comes in (Wait Any), or once all inbound paths have executed (Wait All). + + + The outcome or set of outcomes to complete this activity with. + + + The path to associate with the workflow. + + + The switch mode determines whether the first match should be scheduled, or all matches. + + + The URL to download the file from. + + + Time Duration + + + Trigger execution at a specific time in the future. + + + URL + + + Validation Result + + + Workflow Definition + + + Add case + + + Data + + + Label + + + Result + + + Zoom to fit + + + Always allow the creation of a new workflow instance. + + + Assign the current value to the specified variable. + + + Code + + + Controls whether the end step is upper/lowerbound inclusive or exclusive. True (inclusive) by default. + + + Current Value + + + Interval + + + Outer Bound Inclusive + + + Payload + + + Step + + + The end step. + + + The items to iterate through. + + + The set of values to iterate. + + + The start step. + + + The step size. To count down, enter a negative number. + + + Variable + + + Provider Type + + + Configuration + + + Exclude + + + Include + + + Load + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.ru.resx b/src/framework/Elsa.Studio.Translations/Translations.ru.resx new file mode 100644 index 0000000..857c94b --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.ru.resx @@ -0,0 +1,991 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 дней + + + 180 дней + + + 7 дней + + + 90 дней + + + Краткое описание этого вывода. + + + Пользовательская категория, по которой можно сгруппировать эти выходные данные. + + + 30 дней + + + Краткое описание агента. + + + Краткое описание секрета. + + + Краткое описание рабочего процесса. + + + Краткое описание этого ввода. + + + Значение по-умолчанию. + + + Описание роли и назначения этой входной переменной. + + + Описание секрета. + + + Пользовательская категория действий, которой можно присвоить этот рабочий процесс как действие. + + + Пользовательская категория, по которой можно сгруппировать эти входные данные. + + + Описание этого действия будет отображено в конструкторе. + + + Описание роли и назначения этого агента. + + + Стратегия активации + + + Подтверждение события источника данных + + + Действия + + + Техническое название функции, которую выполняет этот агент. Например: WriteCode + + + Действие + + + ID экземпляра действия + + + Добавить + + + Добавить вход + + + Добавить выход + + + Добавить переменную + + + Агент + + + Агенты + + + Агрегация + + + Ключ API + + + Ключи API + + + Применить + + + Использовать рабочий процесс в качестве действия. + + + Автообновление трудоемких рабочих процессов + + + Автосохранение + + + Ветвление + + + Прерывание + + + Массовые действия + + + Массовые вызовы рабочих процессов + + + Отмена + + + Категория + + + Установите этот флажок, если переменная содержит массив выбранного типа. + + + Очистить + + + Нажмите, чтобы открыть новую вкладку рабочего процесса + + + Закрыть + + + Закрыть рабочий процесс + + + Общий + + + Завершить + + + Завершенный + + + Композиция + + + Строки подключения + + + Консоль + + + Контейнер + + + Соотнести + + + ID соотношения (корреляции) + + + Создать агента + + + Создать ключ API + + + Создать секрет + + + Создать службу + + + Создан + + + Создан в + + + Создать рабочий процесс + + + Крон + + + Дэшборд + + + Дата + + + Фильтры по дате + + + Решение + + + Стандартная конфигурация + + + Значение по-умолчанию + + + ID определения + + + Версия определения + + + ID версии определения + + + Определения + + + Задержка + + + Удалить + + + Описание + + + Детали + + + Отправка рабочего процесса + + + Отображаемое название + + + Отображаемый текст + + + Скачать файл + + + Длительность + + + Редактировать + + + Email + + + Конец + + + Введите список возможных результатов для этого рабочего процесса. + + + Событие + + + События + + + Обработчик Excel + + + Запуски + + + Истекает + + + Истекает в + + + Экспорт + + + Экспорт текущего рабочего процесса как файл JSON. + + + Ошибка + + + Завершить + + + Завершен + + + Завершен в + + + Поток + + + Цикл For + + + Разделить (поток) + + + Ограничение по частоте + + + Функция + + + Название функции + + + Основной + + + Есть инциденты + + + HTTP + + + Точка доступа HTTP + + + Файловый ответ HTTP + + + Запрос HTTP + + + Запрос HTTP (поток) + + + Ответ HTTP + + + ID + + + ID действия. + + + Если (условие) + + + Импорт + + + Импортировать файл JSON, содержащий данные рабочего процесса для перезаписи текущего контента рабочих процессов. + + + Стратегия инцидентов + + + Количество инцидентов + + + Инциденты + + + Краткая информация + + + Информация + + + Ввод + + + Свойства ввода + + + Ввод/вывод + + + Вводы + + + Экземпляры + + + int + + + Есть + + + Это после + + + Это массив + + + Это до + + + Это не + + + Это на или после + + + Это на или до + + + Объединить + + + Журнал + + + Последняя версия + + + Загрузка + + + Стратегия сохранения журнала + + + Название действия. На именованные действия могут ссылаться другие действия. + + + Никогда + + + Нет + + + Агенты не найдены + + + API ключи не найдены + + + Нет вводов + + + Никаких результатов, связанных с этим выполнением, нет. + + + Никаких выходных данных, связанных с этим выполнением, нет. + + + Нет состояния, связанного с этим выполнением. + + + Нет переменных + + + Не найдено определений рабочих процессов + + + Не найдено экземпляров рабочих процессов + + + object + + + Ок + + + Открыть файл + + + Плагины + + + Примитивы + + + Свойства + + + Опубликовать + + + Опубликовать события + + + Опубликовано + + + Откатить до этой версии + + + Строк на страницу + + + Выполнить JavaScript + + + Выполнить рабочий процесс + + + Сохранить + + + Сохранить файл + + + Планирование + + + Поиск по названию, описанию, идентификатору, идентификатору определения + + + Отправить Email + + + Службы + + + Установить название + + + Установить вывод + + + Установить переменную + + + Показать события в области текущего контейнера + + + Показать инциденты + + + Показывать все события + + + Показывать инциденты + + + Начать + + + Начать в + + + Начало рабочего процесса + + + Начат + + + Состояние + + + Статус + + + string + + + Дополнительный статус + + + Подпроцесс + + + Переключатель + + + Переключатель (поток) + + + Задача + + + Температура + + + .Net тип переменной ввода. + + + .Net тип перменной вывода. + + + Описание переменной вывода. + + + Время жизни этого секрета + + + Название агента. + + + Экспорт этой версии рабочего процесса как файл JSON. + + + Параметры запуска + + + Циклы + + + Матаданные + + + Сценарии + + + Результаты + + + Штраф за присутствие + + + Показать накопленное время + + + Область + + + Максимальное кол-во токенов + + + Настройки + + + Управлять всеми делами + + + Название + + + Прочитать данные из БД + + + Секреты + + + Показать относительное время + + + Установить параметр контекста рабочего процесса + + + Секреты не найдены + + + Изображение на основе описания OpenAI + + + Вывод + + + Свойства вывода + + + Парсер + + + Нет выводов + + + Выводы + + + Секрет + + + Службы не найдены + + + Выполнить задачу + + + Выполнить асинхронно + + + Выполнить Python + + + Опубликовать текущий рабочий процесс + + + Выполнение OpenAIChat + + + Поиск... + + + Устойчивость журнала + + + Шаблон подсказки + + + Опубликованная версия + + + Прочитать данные из конфигурации / На лету (Runtime) + + + Выполнить + + + Поиск по имени, идентификатору, идентификатору определения, идентификатору версии определения, идентификатору корреляции + + + Хранилище + + + Выводы подпроцесс + + + Вводы продпроцесса + + + Подстатус + + + Максимальное количество токенов для генерации. Оставьте поле пустым для максимального количества. + + + Код + + + Редактор кода + + + Редактировать переменную + + + {0} {1} успешно импортировано. + + + Условие + + + Выполнить javaScript код + + + Исполнение + + + Добавить сценарий + + + Название переменной. + + + Имя нового рабочего процесса. + + + Сервисы, необходимые агенту. + + + Плагины, которые может использовать агент. + + + Область действия секрета помогает интерфейсу фильтровать доступные варианты в выпадающих списках. + + + Значение секрета. + + + Настройки сервиса в формате JSON. + + + Шаблон системного запроса, который будет использовать агент. + + + Техническое имя API ключа. + + + Техническое имя входной переменной. При обращении к этой переменной в шаблоне запроса используйте это имя. + + + Использовать JSON ответ + + + Использовать эту версию + + + Значение + + + Переменные + + + Версия + + + История версий + + + Просмотр + + + Вебхуки + + + Стратегия обработки инцидентов + + + Входной параметр с таким именем уже существует. + + + Выпадающий список + + + Не выполнено + + + Нельзя использовать как активность. + + + Показать описание + + + Успешно импортировано + + + Рабочий процесс успешно запущен + + + ID переменной. + + + Текст, отображаемый в дизайнере. + + + Невозможно запустить рабочий процесс + + + Загрузите файлы JSON и/или ZIP, содержащие данные рабочих процессов, для импорта. + + + Не удалось импортировать {0} {1}. + + + По центру + + + Масштабировать по размеру экрана + + + Список ожидаемых кодов состояния для обработки. + + + Всегда разрешать создание + + + Тип содержимого + + + Метод + + + Содержимое запроса. + + + Результат + + + Поддерживаемые методы + + + Значение заголовка Authorization, отправляемое с запросом. Например: Bearer {some-access-token} + + + Содержимое для отправки с запросом. Может быть строкой, объектом, байтовым массивом или потоком. + + + Тип содержимого, используемый при отправке запроса. + + + HTTP-метод, используемый при отправке запроса. + + + HTTP-методы, которые принимаются. + + + Путь, который следует ассоциировать с рабочим процессом. + + + Продолжительность времени + + + Результат проверки + + + Переменная + + + Масштабировать по размеру + + + Вы действительно хотите отменить выбранные экземпляры рабочих процессов? + + + Всегда разрешать создание нового экземпляра рабочего процесса. + + + Источник данных, используемый для запуска рабочих процессов. + + + Выбор переменной + + + {0} рабочих процессов опубликованы + + + Автоматическая компоновка + + + Прекращает выполнение цикла. + + + Отключить проверку заголовка авторизации + + + URL, откуда будет скачан файл. + + + URL + + + Присвоить текущее значение указанной переменной. + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.uk.resx b/src/framework/Elsa.Studio.Translations/Translations.uk.resx new file mode 100644 index 0000000..1e48892 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.uk.resx @@ -0,0 +1,1573 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 180 днів + + + 30 днів + + + Короткий опис секрету. + + + Короткий опис робочого процесу. + + + Короткий опис цього вводу. + + + Значення за замовчуванням. + + + 14 днів + + + Короткий опис агента. + + + Опис про роль та призначення даного агента. + + + 7 днів + + + Короткий опис цього виходу. + + + 90 днів + + + Спеціальна категорія, за якою групувати цей вихід. + + + Опис про секрет. + + + Опис цієї діяльності буде відображено в дизайнері. + + + Технічна назва функції, яку виконує цей агент. Наприклад: WriteCode + + + Підтвердити подію джерела даних + + + Стратегія активації + + + Діяльність + + + Діяльність + + + Ідентифікатор діяльності + + + Додати + + + Додайте вхідні дані + + + Додати вихід + + + Додайте змінну + + + Агент + + + Агенти + + + Агрегація + + + Дозволити використовувати цей робочий процес як дію. + + + Ключ API + + + Ключі API + + + Застосувати + + + Автоматичне оновлення споживаючих робочих процесів + + + Автозбереження + + + Розгалуження + + + Перерва + + + Масові дії + + + Робочі процеси масової розсилки + + + Скасувати + + + Категорія + + + Перевірте цей параметр, якщо змінна має масив вибраного типу. + + + Очистити + + + Натисніть, щоб відкрити нову вкладку робочого процесу + + + Закрити + + + Закритий робочий процес + + + Загальні + + + Повний + + + Виконаний + + + Композиція + + + Рядки підключення + + + Консоль + + + Контейнер + + + Співвіднести + + + ID кореляції + + + Створити агента + + + Створити ключ API + + + Створити секрет + + + Створено + + + Створити послугу + + + CreatedAt + + + Створити робочий процес + + + Cron + + + Приладова панель + + + Дата + + + Фільтри дат + + + Рішення + + + Конфігурація за замовчуванням + + + Значення за замовчуванням + + + ID визначення + + + Версія визначення + + + Ідентифікатор версії визначення + + + Визначення + + + Затримка + + + Видалити + + + Опис + + + Подробиці + + + Диспетчерський робочий процес + + + Відображуване ім'я + + + Відображення тексту + + + Завантажити файл + + + Тривалість + + + Редагувати + + + Електронна пошта + + + Кінець + + + Введіть список можливих результатів для цього робочого процесу. + + + Подія + + + Події + + + Парсер Excel + + + Параметри виконання + + + Страти + + + Термін дії закінчується + + + Експорт + + + Експортуйте поточний робочий процес як файл JSON. + + + Експортуйте цю версію як файл JSON. + + + Несправність + + + Закінчити + + + Готово + + + FinishedAt + + + Потік + + + Для + + + Штраф за частоту + + + Вилка (потік) + + + Функція + + + Назва функції + + + Загальний + + + Має інциденти + + + HTTP + + + Кінцева точка HTTP + + + Відповідь файлу HTTP + + + HTTP-запит + + + HTTP-запит (потік) + + + Відповідь HTTP + + + ID + + + Ідентифікатор діяльності. + + + Якщо + + + Імпорт + + + Імпортуйте файл JSON, що містить дані робочого циклу, щоб замінити вміст поточного робочого циклу. + + + Стратегія інциденту + + + IncidentCount + + + Інциденти + + + Інформація + + + Інформація + + + Введення + + + Властивості введення + + + Введення/виведення + + + Вхідні дані + + + Примірники + + + внутр + + + Є + + + Є після + + + Раніше + + + Не є + + + Чи є на або після + + + Чи до + + + Приєднуйтесь + + + Журнал + + + Остання версія + + + Завантаження + + + Стратегія збереження журналу + + + Зациклення + + + Керуйте всіма справами + + + Макс жетонів + + + Ім'я + + + Ніколи + + + Немає входів + + + Немає результатів, пов’язаних із цією стратою. + + + Немає виходів + + + Секретів не знайдено + + + Послуг не знайдено + + + Жодних змінних + + + Не знайдено екземплярів робочого процесу + + + об'єкт + + + Гаразд + + + Відкрити файл + + + OpenAIChatCompletion + + + OpenAITextToImage + + + Результати + + + Вихід + + + Вихідні властивості + + + Виходи + + + Парсер + + + Постійність журналу + + + Плагіни + + + Штраф за присутність + + + Примітиви + + + Шаблон запиту + + + Властивості + + + Опублікувати + + + Опублікувати подію + + + Опубліковано + + + Опублікована версія + + + Рядків на сторінці + + + Запуск + + + Запуск асинхронно + + + Запустіть JavaScript + + + Запустіть Python + + + Виконати завдання + + + Запустіть робочий процес + + + Планування + + + Область застосування + + + Сценарії + + + Пошук... + + + Пошук за назвою, описом, ідентифікатором, ідентифікатором визначення + + + Секрет + + + Секрети + + + Надіслати електронний лист + + + Послуги + + + Встановити назву + + + Встановити вихід + + + Встановити змінну + + + Встановити параметр контексту робочого процесу + + + Показати накопичений час + + + Показати події + + + Показати відносний час + + + Показ усіх подій + + + Показ інцидентів + + + Розпочато + + + Держава + + + Статус + + + Під статусом + + + Вхідні дані підпроцесу + + + Підробочі результати + + + Перемикач (потік) + + + Завдання + + + Тип .NET вхідної змінної. + + + Тип .NET вихідної змінної. + + + Максимальна кількість токенів для генерації. Залиште порожнім для максимуму. + + + Ім'я агента. + + + Назва нового секрету. + + + Назва нового робочого циклу. + + + Ім'я змінної. + + + Плагіни, які може використовувати агент. + + + Обсяг секрету допомагає інтерфейсу користувача фільтрувати доступні параметри зі спадних списків. + + + Секретна цінність. + + + Послуги, які вимагає агент. + + + Налаштування сервісу в форматі JSON. + + + Шаблон системної підказки, який використовуватиме агент. + + + Технічна назва ключа API. + + + Технічна назва вхідної змінної. Посилаючись на цю змінну в шаблоні підказки, використовуйте це ім’я. + + + Технічна назва послуги. + + + Тип послуги. + + + Зручна назва цього введення. + + + Зручна назва цього результату. + + + Значення ключа API. + + + Наразі не визначено жодного входу. + + + Наразі не визначено вихідних даних. + + + Наразі не визначено жодної змінної. + + + Ця діяльність не має вхідних властивостей. + + + Цей вхід є масивом + + + Ця змінна є масивом + + + Час + + + Таймер + + + TopP + + + Робочий процес тригера + + + Тип + + + Підказка інтерфейсу користувача + + + Неможливо внести зміни, оскільки робочий процес або програма зараз у режимі лише для читання + + + Скасувати публікацію + + + Скасувати публікацію поточного робочого процесу. + + + Оновлено + + + Оновлено в + + + Можна використовувати як діяльність + + + Значення + + + Змінні + + + Версія + + + Історія версій + + + Переглянути + + + Вебхуки + + + Коли ви публікуєте нову версію, усі споживчі робочі цикли буде оновлено, щоб вказувати на нову версію цього робочого циклу. + + + Контекст робочого процесу + + + Параметри контексту робочого процесу + + + Контексти робочого процесу + + + Екземпляри робочого процесу + + + Робочі процеси + + + Написати рядок + + + Так + + + Ви можете знайти документацію та приклади тут + + + Стратегія поводження з інцидентами + + + Старт + + + Температура + + + Опис вихідної змінної. + + + Тривалість життя цієї таємниці + + + Ця діяльність не має вихідних властивостей. + + + Технічна назва входу. + + + Ця діяльність не має спільних властивостей. + + + Цей вихід є масивом + + + Верхня ймовірність визначає кумулятивний поріг імовірності для вибору маркера під час генерації тексту. Менші значення призведуть до меншої різноманітності, що змусить модель вибирати лише найімовірніші маркери. Вищі значення дозволять отримати більш різноманітні результати, оскільки модель розглядатиме ширший діапазон токенів. + + + Використовуйте відповідь JSON + + + Використовуйте цю версію + + + Якщо позначено, робочий процес виконуватиметься асинхронно. + + + Редактор визначень робочого процесу + + + Ви працюєте в режимі лише для читання. Операції робочого циклу вимкнено + + + Початок робочого процесу + + + Спеціальна категорія діяльності, до якої можна призначити цей робочий процес як дію. + + + Початок о + + + Ні + + + Температура моделі. Вищі значення означають, що модель більше ризикуватиме. Спробуйте 0,1 для результатів, які дуже близькі до того, на якому навчалася модель. Спробуйте 0,9 для дуже творчих результатів. + + + Використовується для визначення початкових інструкцій або контексту, які агент семантичного ядра використовуватиме для створення відповідей. Цей шаблон спрямовує поведінку агента та допомагає йому зрозуміти роль, яку він має відігравати, або завдання, які він має виконувати. + + + Налаштування + + + Метадані + + + Показати події, пов’язані з поточним контейнером + + + Зберігання + + + Чи показувати опис у конструкторі. + + + Назва діяльності. На названі дії можуть посилатися інші дії. + + + Агентів не знайдено + + + Ім'я нового агента. + + + б/в + + + Опис ролі та призначення цієї вхідної змінної. + + + Ключі API не знайдено + + + Читання даних із бази даних + + + Пошук за назвою, ідентифікатором, ідентифікатором визначення, ідентифікатором версії визначення, ідентифікатором кореляції + + + Спеціальна категорія, за якою групувати цей вхід. + + + Немає вихідних даних, пов’язаних із цим виконанням. + + + Жодного стану, пов’язаного з цією стратою. + + + рядок + + + Підробочий процес + + + Назва функції, яку виконуватиме агент. + + + Штраф за повторення будь-якої однієї фішки. Вищий штраф за присутність зменшить ймовірність повторення маркера, сприяючи створенню більш різноманітного тексту. + + + Штраф за повторення будь-якої однієї фішки. Вищий штраф частоти зменшить ймовірність повторення маркера, сприяючи генерації більш різноманітного тексту. + + + Є масив + + + Визначення робочого процесу не знайдено + + + Зберегти + + + Підстатус + + + Назва робочого циклу. + + + Перемикач + + + Термін дії закінчується + + + Опублікувати поточний робочий процес + + + Читання даних із конфігурації / середовища виконання + + + Відкат до цієї версії + + + Зберегти файл + + + А Вибір змінних + + + А Вибір результатів + + + Ви впевнені, що бажаєте видалити вибраний вихід? + + + Ви впевнені, що бажаєте видалити цей робочий процес? + + + Контрольний список + + + Редактор коду + + + Оновлено споживаючих робочих процесів: {0} + + + Створіть змінну + + + За замовчуванням + + + Видалити вибрані версії + + + Видалити екземпляр робочого процесу? + + + Видалити робочий процес? + + + Редагувати вихід + + + Редагувати визначення робочого процесу + + + Редактор JSON + + + Жодного + + + Один робочий процес уже опубліковано + + + Вибір вихідних даних + + + Будь ласка, введіть назву для введення. + + + Якщо позначено, ця дія може ініціювати цей робочий процес. + + + Вибір визначення робочого процесу + + + {0} робочих процесів не знайдено + + + {0} {1} успішно імпортовано. + + + Опубліковано один робочий процес + + + Список радіокнопок + + + Багаторядкове введення тексту + + + Ви впевнені, що бажаєте видалити вибрані екземпляри робочого процесу? + + + Неможливо запустити робочий процес + + + Випадаючий список + + + Успішно імпортовано {0} визначень робочого процесу. + + + {0} робочих процесів уже опубліковано + + + Опубліковано {0} робочих процесів + + + Змінна з такою назвою вже існує в поточній області. + + + {0} робочих процесів скасовано + + + Засіб вибору визначення вихідних даних робочого процесу + + + Ви впевнені, що бажаєте опублікувати вибрані робочі процеси? + + + успішно імпортовано. + + + Вхід із такою назвою вже існує. + + + Видалити вибрані екземпляри робочого процесу? + + + А Редактор JSON + + + Ви впевнені, що бажаєте скасувати цей екземпляр робочого процесу? + + + Ви впевнені, що бажаєте видалити вибрані версії? + + + Ви впевнені, що бажаєте видалити вибрану змінну? + + + Робочі процеси не імпортовано. + + + Один робочий процес не знайдено + + + Один робочий процес не опублікований + + + Будь ласка, введіть назву для результату. + + + Введіть назву робочого циклу. + + + Ви впевнені, що хочете видалити цю версію? + + + Ви впевнені, що бажаєте видалити цей екземпляр робочого процесу? + + + Редагувати змінну + + + Тільки для читання + + + Один робочий процес уже не опубліковано + + + Робочий процес опубліковано + + + Успішно імпортовано 1 визначення робочого процесу. + + + Робочий процес збережено + + + Робочий цикл опубліковано з діями Not Found + + + Мітка часу + + + робочі процеси вже опубліковано + + + робочі процеси вже неопубліковані + + + Успішно імпортовано {0} примірників + + + Скасувати запущені екземпляри робочого процесу? + + + Створити вхід + + + Створити вихід + + + Видалити версію + + + Якщо позначено, ця дія є початком робочого процесу. + + + Введіть вираз, який використовуватиметься для визначення стратегії збереження журналу для цієї властивості. + + + Багаторядковий + + + Вибір результатів + + + Список прапорців + + + Введення тексту в один рядок + + + Засіб вибору визначення робочого процесу + + + Ідентифікатор змінної. + + + Робочий цикл із такою назвою вже існує. + + + Вхід для кількох слів, наприклад введення тегів + + + Ви впевнені, що бажаєте скасувати всі запущені екземпляри цього робочого циклу? + + + Скасувати вибрані екземпляри робочого процесу? + + + Видалити вибраний вихід? + + + Не вдалося імпортувати {0} визначень робочого процесу. Помилки: {1} + + + Не виконано + + + Опублікувати вибрані робочі процеси? + + + Ви впевнені, що бажаєте скасувати вибрані екземпляри робочого процесу? + + + Ви впевнені, що бажаєте видалити вибрані робочі процеси? + + + Ви впевнені, що бажаєте видалити вибраний вхід? + + + Текст для відображення в дизайнері. + + + А Прапорець + + + Ви впевнені, що бажаєте скасувати публікацію вибраних робочих процесів? + + + Скасувати екземпляр робочого процесу? + + + Прапорець + + + Мультитекст + + + Стратегія за замовчуванням + + + Видалити вибраний вхід? + + + Видалити вибрану змінну? + + + Спадний список + + + Видалити вибрані робочі процеси? + + + Список радіо + + + Успадкувати + + + Показати опис + + + Повідомлення + + + Оновлено один робочий цикл, який використовує опублікований робочий цикл + + + Новий робочий процес + + + Не знайдено робочих процесів для імпорту. + + + Не можна використовувати як діяльність. + + + Будь ласка, введіть назву для змінної. + + + Одна лінія + + + Успішно імпортовано + + + Успішно імпортовано один екземпляр + + + Робочий процес успішно розпочато + + + Вибір змінних + + + Стратегія фіксації для використання контролює, коли стан робочого циклу має бути фіксовано. + + + Це не вплине на робочі процеси лише для читання. + + + Скасувати публікацію вибраних робочих процесів? + + + публікуються робочі процеси + + + Завантажте JSON та/або ZIP-файли з даними робочого процесу для імпорту. + + + визначення робочого процесу. + + + Робочий процес відкликано + + + Робочий процес уже опубліковано + + + Робочий процес не опубліковано + + + Видалити версію {0} + + + робочі процеси не знайдено + + + робочі процеси неопубліковані + + + робочі процеси, які використовують опубліковані робочі процеси, оновлено + + + {0} робочих процесів уже скасовано + + + Оновлено {0} робочих процесів, які використовують опубліковані робочі процеси + + + Не вдалося імпортувати {0} {1}. + + + А Редактор коду + + + Ідентифікатор визначення робочих процесів, які потрібно відправити. + + + Список очікуваних кодів стану для обробки. + + + Шлях для зв’язування з робочим процесом. + + + Режим перемикання визначає, чи слід запланувати перший матч чи всі матчі. + + + Контролює, чи буде кінцевий крок включно чи виключно з верхньої/нижньої межі. Істина (включно) за замовчуванням. + + + Елементи для повторення. + + + Початковий крок. + + + Масштаб під розмір екрана + + + Режим + + + Результат + + + Автоматичний макет + + + Ідентифікаційна функція кореляції + + + Джерело даних для диспетчеризації робочих процесів. + + + Завжди дозволяйте створення нового екземпляра робочого процесу. + + + Центр + + + Функція для обчислення ідентифікатора кореляції, з яким пов’язується надісланий робочий процес. + + + Клавіша введення елемента за замовчуванням + + + Метод + + + Тип вмісту для використання під час надсилання запиту. + + + Запит вмісту. + + + Збільшити до розміру + + + Набір значень для повторення. + + + Метод HTTP для надсилання запиту. + + + Значення заголовка авторизації для надсилання із запитом. Наприклад: носій {some-access-token} + + + Результат або набір результатів для завершення цієї діяльності. + + + URL-адреса для завантаження файлу. + + + Мітка + + + Поточне значення + + + Розмір кроку. Для зворотного відліку введіть від’ємне число. + + + Вміст, який потрібно надіслати разом із запитом. Може бути рядком, об’єктом, масивом байтів або потоком. + + + Час Тривалість + + + Присвоїти поточне значення вказаній змінній. + + + Ключ за замовчуванням, який використовується як ім’я введення під час надсилання поточного елемента до робочого циклу відправлення. Не використовуватиметься, якщо поле Items містить список словників + + + Методи HTTP, які потрібно прийняти. + + + Режим об’єднання визначає, чи має продовжуватися ця діяльність, щойно надходить один вхідний шлях (Wait Any), чи після виконання всіх вхідних шляхів (Wait All). + + + Список очікуваних результатів для обробки. + + + Значення, яке дозволяє додати заголовок авторизації без перевірки. + + + Завжди дозволяти створення + + + Відділення + + + Вирватися з петлі. + + + Скасовано + + + Хвороба + + + Тип вмісту + + + Вимкнути перевірку заголовка авторизації + + + Виконує код javascript + + + Виконання + + + Очікувані коди стану + + + Запуск + + + Підтримувані методи + + + Запустити виконання в певний час у майбутньому. + + + URL + + + Результат перевірки + + + Визначення робочого процесу + + + Додати регістр + + + Дані + + + Результат + + + Код + + + Інтервал + + + Зовнішня межа включно + + + Корисне навантаження + + + Крок + + + Кінцевий крок. + + + змінна + + + Навантаження + + + Конфігурація + + + Тип постачальника + + + Виключити + + + Включати + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.zh-Hans.resx b/src/framework/Elsa.Studio.Translations/Translations.zh-Hans.resx new file mode 100644 index 0000000..b003614 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.zh-Hans.resx @@ -0,0 +1,1558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 180 天 + + + 30 天 + + + 7 天 + + + 90 天 + + + 工作流的简要描述。 + + + 代理的简要描述。 + + + 默认值。 + + + 活动 + + + 活动实例ID + + + 添加输入 + + + 添加变量 + + + 聚合 + + + 允许该工作流作为一个活动。 + + + 批量操作 + + + 批量调度工作流 + + + 取消 + + + 清空 + + + 点击打开一个新的工作流标签页 + + + 关闭 + + + 关闭工作流 + + + 公共 + + + 跳出 + + + 混合 + + + 控制台 + + + 容器 + + + 关联 + + + 关联ID + + + 创建 API Key + + + 创建 Service + + + 创建于 + + + Cron表达式 + + + 仪表盘 + + + 日期 + + + 日期筛选器 + + + 决策 + + + 默认配置 + + + 默认值 + + + 工作流定义版本ID + + + 工作流定义列表 + + + 删除 + + + 描述 + + + 调度工作流 + + + 显示名称 + + + 显示文本 + + + 编辑 + + + 结束 + + + 事件 + + + Excel 解析器 + + + Execution 列表 + + + 导出 + + + 导出该版本到JSON文件 + + + 错误 + + + 完成 + + + 已完成 + + + Flow + + + 14 天 + + + 输出的简要描述。 + + + 添加 + + + 输入的简要描述。 + + + secret的简要描述。 + + + 活动列表 + + + 添加输出 + + + 应用 + + + 自动保存 + + + 分类 + + + 完成 + + + 已完成 + + + 工作流定义ID + + + For + + + 工作流定义版本 + + + 延迟 + + + 创建 Secret + + + 已创建 + + + 创建工作流 + + + 详情 + + + 下载文件 + + + 分支 + + + Execution 设置 + + + 间隔 + + + 邮件 + + + 事件列表 + + + 导出当前工作流到JSON文件 + + + ID + + + 导入 + + + If + + + 完成于 + + + 激活策略 + + + 代理 + + + 代理列表 + + + API Key + + + 自动更新使用中的工作流 + + + API Keys + + + 连接字符串 + + + 创建代理 + + + 键入此工作流可能的结果列表。 + + + HTTP文件响应 + + + 此活动的ID。 + + + 信息 + + + 信息 + + + 输入属性列表 + + + 输入/输出 + + + 在此之后 + + + 不包含 + + + 连接 + + + 最新版本 + + + 加载中 + + + 日志持久化策略 + + + 否 + + + 输入列表为空 + + + 此执行过程没有任何结果。 + + + 没有变量列表 + + + 对象(Object) + + + 确认 + + + 打开文件 + + + 结果列表 + + + 输出 + + + 输出属性 + + + 输出列表 + + + 日志持久化 + + + 元数据 + + + 名称 + + + 属性列表 + + + 发布事件 + + + 已发布 + + + 发布当前工作流 + + + 从配置/运行时读取数据 + + + 从数据库读取数据 + + + 回退到此版本 + + + Secret + + + 发送电子邮件 + + + 服务 + + + 每页行数 + + + 运行 + + + 运行(异步) + + + 运行JavaScript + + + 运行Python + + + 运行工作流 + + + 保存文件 + + + 范围 + + + 设置列表 + + + 开始 + + + 已开始 + + + 状态 + + + 存储库 + + + 字符串 + + + 子工作流输入列表 + + + 新代理的名称。 + + + 子工作流输出列表 + + + 子状态 + + + 选择器 + + + 选择器(流模式) + + + 任务 + + + 输出变量的描述。 + + + 这个输出是一个数组 + + + 这个输入是一个数组 + + + 这个活动没有任何输出属性。 + + + 目前没有定义任何变量。 + + + 目前没有定义任何输入。 + + + 目前没有定义任何输出。 + + + 服务的类型。 + + + 变量列表 + + + 历史版本 + + + 视图 + + + 当您发布一个新版本时,所有的被使用工作流将被更新,以指向该工作流的新版本。 + + + 工作流上下文 + + + 工作流上下文列表 + + + 工作流定义编辑器 + + + 工作流实例 + + + 工作流的名称。 + + + 您正在以只读模式运行。工作流操作被禁止 + + + 你可以在这里找到文档和示例 + + + 版本 + + + Webhooks + + + 选中时,工作流将异步执行。 + + + 是否在设计器中显示描述。 + + + 工作流上下文设置 + + + 计时器 + + + 时间 + + + 这个变量是一个数组 + + + 这个活动没有任何输入属性。 + + + API密钥的值。 + + + 代理的名称。 + + + 代理将执行的函数的名称。 + + + 搜索… + + + 值 + + + 写行 + + + 是 + + + 搜索 名称,id,定义id,定义版本id,相关id + + + 搜索 名称,描述,id,定义id + + + 设置工作流上下文参数 + + + 设置输出 + + + 设置变量 + + + 显示所有事件 + + + 开始于 + + + 状态 + + + 子状态 + + + 子工作流 + + + 温度 + + + 活动的名称。命名活动后可以被其他活动引用。 + + + 此执行过程没有任何输出。 + + + 输出列表为空 + + + 插件列表 + + + 发布 + + + 已发布版本 + + + 保存 + + + HTTP 终节点 + + + HTTP请求 + + + HTTP请求(流模式) + + + HTTP响应 + + + 输入 + + + 导入一个包含工作流数据的JSON文件,以覆盖当前工作流的内容。 + + + 输入列表 + + + 实例列表 + + + 整型(Int) + + + 是数组 + + + 在此之前 + + + 关于此输入变量的角色和目的的描述。 + + + 分配给此工作流作为活动的自定义活动类别。 + + + 用于对此输入进行分组的自定义类别。 + + + 用于对此输出进行分组的自定义类别。 + + + 关于此密钥的描述。 + + + 此代理执行的功能名称。例如:编写代码(WriteCode) + + + 确认数据源事件 + + + 如果变量持有选定类型的数组,请勾选此选项。 + + + 过期 + + + 过期于 + + + 分支(流) + + + 频率惩罚 + + + 函数 + + + 函数名称 + + + 常规 + + + HTTP + + + 存在异常事件 + + + 异常事件数量 + + + 异常事件策略 + + + 异常事件列表 + + + 是 + + + 等于或在此之后 + + + 等于或在此之前 + + + 未找到任何代理 + + + 未找到任何 API keys + + + 未找到任何 secrets + + + 未找到任何服务 + + + 此执行过程没有任何状态。 + + + 未找到任何工作流实例 + + + 未找到任何工作流定义 + + + OpenAI对话模型(OpenAIChatCompletion) + + + OpenAI文本转图像模型(OpenAITextToImage) + + + 解析器 + + + 正循环中 + + + 管理所有事项 + + + 最大 Tokens 数量 + + + 从不 + + + 提示词模版 + + + 重复惩罚(Presence Penalty) + + + 运行Task + + + 设置名称 + + + 正计划中 + + + Secrets列表 + + + 显示累计时长 + + + 显示异常事件列表 + + + 正显示异常事件列表中 + + + 启动工作流 + + + 此 secret 的生命周期 + + + 此输入变量的.NET类型 + + + 此输出变量的.NET类型 + + + 可生成的最大tokens数量。留空时为可用的最大值。 + + + 新 secret 的名称。 + + + 新工作流的名称。 + + + 此变量的名称。 + + + 当Token重复时的惩罚。重复惩罚值越高,生成重复Token的可能性就越低,从而促进生成更多样化的文本。 + + + 此代理可用的插件列表 + + + 此服务的专业名称。 + + + 此输入的专业名称。 + + + 此 API key 的专业名称。 + + + 此输入变量的专业名称。在提示模板中引用此变量时,请使用此名称。 + + + 无法更改,因为当前工作流或应用处于只读模式。 + + + 用户界面提示 + + + 类型 + + + 触发工作流 + + + TopP + + + TopP 决定了文本生成过程中 Token 选择的累积概率阈值。较低的值会导致多样性减少,使模型仅从最可能的 Token 中选择。较高的值将允许输出更加多样化,因为模型会考虑更广泛的 Token 范围。 + + + 此活动没有任何公共属性。 + + + 此输出的显示文本。 + + + 此输入出的显示文本。 + + + 已使用 + + + 使用此版本 + + + 启用 JSON Response + + + 可用作活动 + + + 更新于 + + + 已更新 + + + 取消发布当前工作流。 + + + 取消发布 + + + 工作流列表 + + + 异常事件处理策略 + + + 在设计器中显示的此活动的描述。 + + + 关于此代理的角色和目的的描述。 + + + 此代理所需的服务列表 + + + 此 secret 的值 + + + 初始指令或上下文,用于定义Semantic Kernel代理如何生成内容。此模板指导代理的行为,并帮助它理解需要扮演的角色或执行的任务。 + + + 模型的温度。值越高,意味着模型将承担更大的风险。尝试0.1以获得与模型训练内容非常接近的结果。尝试0.9以获得极具创意的结果。 + + + 日志 + + + 基本元素 + + + 脚本语言 + + + 显示当前容器范围内的事件 + + + 显示相对时间 + + + 服务的设置以JSON格式表示。 + + + 系统提示模板,代理将使用该模板。 + + + 重复任何一个token的惩罚。更高的频率惩罚将减少token重复的可能性,促进更多样化的文本生成。 + + + secret的范围可以从下拉列表中筛选可用选项。 + + + 代码编辑器 + + + 下拉列表 + + + JSON编辑器 + + + 复选框列表 + + + 单选按钮列表 + + + 单行文本输入 + + + 复选框 + + + 当前作用域中已经存在这个名称的变量。 + + + 工作流定义选择器 + + + 工作流输出定义选择器 + + + 这个名称的输入已经存在。 + + + 您确定要删除选定的输入吗? + + + 您确定要删除选定的工作流吗? + + + 您确定要删除此版本吗? + + + 您确定要删除此工作流实例吗? + + + 确定取消正在运行的工作流实例? + + + 确定取消选定的工作流实例? + + + 复选框 + + + 创建变量 + + + 默认 + + + 确定删除选定的输入? + + + 确认删除选定的工作流实例? + + + 确定删除选定的工作流? + + + 编辑变量 + + + 输入将用于确定此属性的日志持久性策略的表达式。 + + + 导入 {0} 个工作流定义失败。错误:{1} + + + 导入成功。 + + + 继承 + + + 多行 + + + 多文本 + + + 未执行 + + + 无 + + + 不能作为活动使用。 + + + 一个使用已发布工作流的工作流已被更新 + + + 已经发布了一个工作流 + + + 输出选择器 + + + 请输入这个变量的名称。 + + + 请输入这个工作流的名称。 + + + 单行 + + + 导入成功 + + + 要在设计器中显示的文本。 + + + 时间戳 + + + 当选中时,此活动是此工作流的开始。 + + + 工作流定义选择器 + + + 工作流已发布 + + + 发布的工作流没有找到活动 + + + 工作流已撤销发布 + + + 已更新使用当前已发布工作流的其他工作流 + + + 删除版本 {0} + + + {0} 个工作流已发布 + + + 已更新 {0} 个使用已发布工作流的工作流 + + + {0} {1} 导入成功。 + + + 您确定要取消此工作流实例吗? + + + 没有找到要导入的工作流。 + + + 确定删除工作流? + + + 没有导入任何工作流。 + + + 多行文本输入 + + + 成功导入 1 个工作流定义。 + + + 删除版本 + + + 复选框列表 + + + 具有此名称的工作流已经存在。 + + + 您确定要删除选定的输出吗? + + + 无法启动工作流 + + + 创建输入 + + + 发布一个工作流 + + + 删除选定版本 + + + 发布选定的工作流? + + + 启动工作流成功 + + + 编辑输出 + + + 您确定要取消选定的工作流实例吗? + + + 您确定要删除此工作流吗? + + + 变量选择器 + + + 默认策略 + + + 代码编辑器 + + + 确定要取消此工作流定义的所有正在运行的工作流实例吗? + + + 您确定要发布选定的工作流吗? + + + 您确定要删除选定的变量吗? + + + 创建输出 + + + 确定删除工作流实例? + + + 结果选择器 + + + 您确定要删除选定的版本吗? + + + 多个单词的输入,如标记输入 + + + 您确定要删除选定的工作流实例吗? + + + 您确定要取消选定的工作流吗? + + + 确认删除选定的变量? + + + 请输入这个输出的名称。 + + + 取消工作流实例? + + + 编辑工作流定义 + + + 新工作流 + + + 没有找到一个工作流 + + + 确定删除选定的输出? + + + {0} 个使用中的工作流已更新 + + + 下拉 + + + 单选列表 + + + 消息 + + + 撤销发布一个工作流 + + + JSON 编辑器 + + + 请输入这个输入的名称。 + + + 工作流已经发布 + + + 结果选择器 + + + 一个工作流已经撤销发布 + + + 只读 + + + 成功导入一个实例 + + + 工作流定义。 + + + 显示描述 + + + 已撤销工作流 + + + 要使用的提交策略控制应何时该提交工作流状态。 + + + 变量的ID。 + + + 只读工作流不会受到影响。 + + + 上传包含工作流数据的JSON文件或包含工作流数据的JSON文件的压缩包(ZIP)导入。 + + + 变量选择器 + + + 确定取消发布选定的工作流? + + + 当被选中时,此活动可以触发此工作流。 + + + 已保存工作流 + + + 未找到工作流 + + + 工作流已经发布 + + + 成功导入 {0} 个实例 + + + 已取消发布工作流 + + + 工作流已撤销发布 + + + 工作流已发布 + + + {0} 个工作流已发布 + + + {0} {1} 导入失败。 + + + 成功导入 {0} 个工作流定义。 + + + {0} 个工作流已取消发布 + + + {0} 个工作流未找到 + + + {0} 个工作流已取消发布 + + + 连接模式决定这个活动是否应该在一个入站路径进入时就继续(等待任意一个),还是在所有入站路径都执行完毕后才继续(等待全部)。 + + + 用于分派工作流的数据源。 + + + 在将当前项发送到被分派的工作流时用于输入名称的默认键。如果Items字段包含字典列表,则不会使用该键 + + + 自动布局 + + + 中心 + + + 缩放适应屏幕 + + + 一个用来计算关联分发的工作流的相关性ID的函数。 + + + 一个预期结果列表进行处理。 + + + 一个要处理的预期状态码列表。 + + + 一个允许在不进行验证的情况下添加授权头的值。 + + + 始终允许创建 + + + 分支 + + + 跳出循环。 + + + 已取消 + + + 状态 + + + 内容形式 + + + 相关 ID 函数 + + + 默认项目输入键 + + + 禁用授权头验证 + + + 执行JavaScript代码 + + + 执行中 + + + 预期的状态码 + + + 方法 + + + 模式 + + + 请求内容。 + + + 结果 + + + 运行中 + + + 建议方法 + + + 和请求一起发送的授权头值。例如:Bearer {some - access - token} + + + 随请求发送的内容。可以是字符串、对象、字节数组或者流。 + + + 发送请求时使用的内容类型。 + + + 要分派的工作流的定义ID。 + + + 发送请求时使用的HTTP方法。 + + + 要接受的HTTP方法。 + + + 完成此活动的结果或结果集。 + + + 与工作流关联的路径。 + + + 切换模式决定是应该安排第一个匹配项,还是安排所有匹配项。 + + + 用于下载文件的URL。 + + + 持续时间 + + + 在未来特定的时间触发执行。 + + + URL + + + 验证结果 + + + 工作流定义 + + + 添加示例 + + + 数据 + + + 标签 + + + 结果 + + + 缩放匹配 + + + 总是允许创建新的工作流实例。 + + + 将当前值赋给指定的变量。 + + + 代码 + + + 控制结束步骤是包含还是排除上界/下界。默认为True(包含)。 + + + 现有赋值 + + + 间隔 + + + 包含外部边界 + + + 负载 + + + 步 + + + 终止步骤。 + + + 要迭代的项目。 + + + 要迭代的值集合。 + + + 初始化。 + + + 步长。要倒计时,请输入一个负数。 + + + 变量 + + \ No newline at end of file diff --git a/src/framework/Elsa.Studio.Translations/Translations.zh-Hant.resx b/src/framework/Elsa.Studio.Translations/Translations.zh-Hant.resx new file mode 100644 index 0000000..e6a3f64 --- /dev/null +++ b/src/framework/Elsa.Studio.Translations/Translations.zh-Hant.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 此代理的簡短描述。 + + + 90 天 + + + 14 天 + + + 180 天 + + + 30 天 + + + 7 天 + + + 此密鑰的簡短描述。 + + + 分配此流程為活動到自定義類別。 + + + 預設值。 + + + 此流程的簡短描述。 + + + 此輸出的簡短描述。 + + + 此輸入的簡短描述。 + + + 依輸出群組客製化分類。 + + + 角色描述及此代理的目的。 + + + 角色描述及此輸入變數的目的。 + + + 秘密描述 + + + 新增輸出 + + + 代理 + + + 新增變數 + + + 自動儲存 + + + 取消 + + + 類別 + + \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendComponentBase.cs b/src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendComponentBase.cs new file mode 100644 index 0000000..92e39c3 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendComponentBase.cs @@ -0,0 +1,34 @@ +using Elsa.Studio.Components; +using Elsa.Studio.Host.CustomElements.Services; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Host.CustomElements.Components; + +public abstract class BackendComponentBase : StudioComponentBase +{ + [Parameter] public string? RemoteEndpoint { get; set; } + [Parameter] public string? ApiKey { get; set; } + [Parameter] public string? AccessToken { get; set; } + [Parameter] public string? TenantId { get; set; } + [Parameter] public string? TenantIdHeaderName { get; set; } + [Inject] private BackendService BackendService { get; set; } = null!; + + /// + protected override void OnInitialized() + { + if (!string.IsNullOrWhiteSpace(RemoteEndpoint)) + BackendService.RemoteEndpoint = RemoteEndpoint; + + if (!string.IsNullOrWhiteSpace(ApiKey)) + BackendService.ApiKey = ApiKey; + + if (!string.IsNullOrWhiteSpace(AccessToken)) + BackendService.AccessToken = AccessToken; + + if(!string.IsNullOrWhiteSpace(TenantId)) + BackendService.TenantId = TenantId; + + if(!string.IsNullOrWhiteSpace(TenantIdHeaderName)) + BackendService.TenantIdHeaderName = TenantIdHeaderName; + } +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendProvider.razor b/src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendProvider.razor new file mode 100644 index 0000000..3626fa6 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Components/BackendProvider.razor @@ -0,0 +1 @@ +@inherits BackendComponentBase \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Components/ThemedComponentWrapper.razor b/src/hosts/Elsa.Studio.Host.CustomElements/Components/ThemedComponentWrapper.razor new file mode 100644 index 0000000..39d3d75 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Components/ThemedComponentWrapper.razor @@ -0,0 +1,18 @@ +@using Elsa.Studio.Contracts +@inherits BackendComponentBase +@inject IThemeService ThemeService + + + + + +@ChildContent + +@code +{ + /// + /// The component to render. + /// + [Parameter] + public RenderFragment ChildContent { get; set; } = default!; +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionEditorWrapper.razor b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionEditorWrapper.razor new file mode 100644 index 0000000..2f2a359 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionEditorWrapper.razor @@ -0,0 +1,54 @@ +@using System.Text.Json.Nodes +@using Elsa.Api.Client.Resources.WorkflowDefinitions.Models +@inherits BackendComponentBase + + + + + +@code +{ + private bool _shouldRender; + private string _definitionId = default!; + + /// The ID of the workflow definition to edit. + [Parameter] public string DefinitionId + { + get => _definitionId; + set + { + if (_definitionId == value) return; + _definitionId = value; + _shouldRender = true; + } + } + + /// An event that is invoked when a workflow definition has been executed. + /// The ID of the workflow instance is provided as the value to the event callback. + [Parameter] public Func? WorkflowDefinitionExecuted { get; set; } + + /// Gets or sets the event that occurs when the workflow definition version is updated. + [Parameter] public Func? WorkflowDefinitionVersionSelected { get; set; } + + /// Gets or sets the event triggered when an activity is selected. + [Parameter] public Func? ActivitySelected { get; set; } + + /// Gets the currently selected activity ID. + public string? SelectedActivityId => WorkflowDefinitionEditor.SelectedActivityId; + + private WorkflowDefinitionEditor WorkflowDefinitionEditor { get; set; } = default!; + + /// Gets the currently selected workflow definition version. + public WorkflowDefinition? GetSelectedWorkflowDefinitionVersion() => WorkflowDefinitionEditor.GetSelectedWorkflowDefinitionVersion(); + + /// + protected override bool ShouldRender() + { + if (!_shouldRender) return false; + _shouldRender = false; + return true; + } +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionListWrapper.razor b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionListWrapper.razor new file mode 100644 index 0000000..784acd6 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowDefinitionListWrapper.razor @@ -0,0 +1,13 @@ +@inherits BackendComponentBase + + + + + +@code +{ + /// + /// An event that is invoked when a workflow definition is edited. + /// + [Parameter] public EventCallback EditWorkflowDefinition { get; set; } +} diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceListWrapper.razor b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceListWrapper.razor new file mode 100644 index 0000000..c8c6e32 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceListWrapper.razor @@ -0,0 +1,14 @@ +@inherits BackendComponentBase + + + + + +@code{ + + /// + /// An event that is invoked when a workflow instance is viewed. + /// + [Parameter] public EventCallback ViewWorkflowInstance { get; set; } + +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceViewerWrapper.razor b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceViewerWrapper.razor new file mode 100644 index 0000000..b1d9db1 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Components/WorkflowInstanceViewerWrapper.razor @@ -0,0 +1,20 @@ +@inherits BackendComponentBase + + + + + +@code +{ + /// + /// The ID of the workflow definition to edit. + /// + [Parameter] + public string InstanceId { get; set; } = default!; + + /// + /// An event that is invoked when a workflow definition is edited. + /// + [Parameter] + public EventCallback EditWorkflowDefinition { get; set; } +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Elsa.Studio.Host.CustomElements.csproj b/src/hosts/Elsa.Studio.Host.CustomElements/Elsa.Studio.Host.CustomElements.csproj new file mode 100644 index 0000000..0918f0a --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Elsa.Studio.Host.CustomElements.csproj @@ -0,0 +1,32 @@ + + + + Linux + true + + + + + + + + + + + Always + + + + + + + + + + + + + + + + diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/HttpMessageHandlers/ApiKeyHttpMessageHandler.cs b/src/hosts/Elsa.Studio.Host.CustomElements/HttpMessageHandlers/ApiKeyHttpMessageHandler.cs new file mode 100644 index 0000000..74895b0 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/HttpMessageHandlers/ApiKeyHttpMessageHandler.cs @@ -0,0 +1,38 @@ +using Elsa.Studio.Host.CustomElements.Services; + +namespace Elsa.Studio.Host.CustomElements.HttpMessageHandlers; + +/// +/// An that configures the outgoing HTTP request to use the configured API key or bearer token. +/// +public class AuthHttpMessageHandler : DelegatingHandler +{ + private readonly BackendService _backendService; + + /// + /// Initializes a new instance of the class. + /// + public AuthHttpMessageHandler(BackendService backendService) + { + _backendService = backendService; + } + + /// + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var apiKey = _backendService.ApiKey; + var accessToken = _backendService.AccessToken; + var tenantId = _backendService.TenantId; + var tenantIdHeaderName = _backendService.TenantIdHeaderName; + + if(!string.IsNullOrEmpty(apiKey)) + request.Headers.Authorization = new("ApiKey", apiKey); + else if(!string.IsNullOrEmpty(accessToken)) + request.Headers.Authorization = new("Bearer", accessToken); + + if(!string.IsNullOrEmpty(tenantId)) + request.Headers.Add(tenantIdHeaderName, tenantId); + + return await base.SendAsync(request, cancellationToken); + } +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Program.cs b/src/hosts/Elsa.Studio.Host.CustomElements/Program.cs new file mode 100644 index 0000000..9cd2093 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Program.cs @@ -0,0 +1,69 @@ +using Elsa.Studio.Shell.Extensions; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Contracts; +using Elsa.Studio.Core.BlazorWasm.Extensions; +using Elsa.Studio.Extensions; +using Elsa.Studio.Host.CustomElements.Components; +using Elsa.Studio.Host.CustomElements.HttpMessageHandlers; +using Elsa.Studio.Host.CustomElements.Services; +using Elsa.Studio.Localization.Time; +using Elsa.Studio.Localization.Time.Providers; +using Elsa.Studio.Localization.Models; +using Elsa.Studio.Localization.BlazorWasm.Extensions; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Designer.Extensions; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.Extensions.DependencyInjection.Extensions; + +// Build the host. +var builder = WebAssemblyHostBuilder.CreateDefault(args); +var configuration = builder.Configuration; + +// Register the custom elements. +builder.RootComponents.RegisterCustomElsaStudioElements(); +builder.RootComponents.RegisterCustomElement("elsa-backend-provider"); +builder.RootComponents.RegisterCustomElement("elsa-workflow-definition-editor"); +builder.RootComponents.RegisterCustomElement("elsa-workflow-instance-viewer"); +builder.RootComponents.RegisterCustomElement("elsa-workflow-instance-list"); +builder.RootComponents.RegisterCustomElement("elsa-workflow-definition-list"); + +// Register local services. +builder.Services.AddSingleton(); + +// Register the modules. +var backendApiConfig = new BackendApiConfig +{ + ConfigureBackendOptions = options => configuration.GetSection("Backend").Bind(options), + ConfigureHttpClientBuilder = options => + { + options.ApiKey = configuration["Backend:ApiKey"]; + options.AuthenticationHandler = typeof(AuthHttpMessageHandler); + }, +}; + +var localizationConfig = new LocalizationConfig +{ + ConfigureLocalizationOptions = options => configuration.GetSection("Localization").Bind(options), +}; + +builder.Services.AddCore(); +builder.Services.AddShell(); +builder.Services.AddRemoteBackend(backendApiConfig); +builder.Services.Replace(ServiceDescriptor.Scoped()); +builder.Services.AddWorkflowsModule(); +builder.Services.AddLocalizationModule(localizationConfig); +builder.Services.AddScoped(); + +// Build the application. +var app = builder.Build(); + +await app.UseElsaLocalization(); + +// Run each startup task. +var startupTask = app.Services.GetServices(); +foreach (var task in startupTask) await task.ExecuteAsync(); + +// Run the application. +await app.RunAsync(); + diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Properties/launchSettings.json b/src/hosts/Elsa.Studio.Host.CustomElements/Properties/launchSettings.json new file mode 100644 index 0000000..5f30317 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Properties/launchSettings.json @@ -0,0 +1,37 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:15721", + "sslPort": 44319 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5122", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7251;http://localhost:5122", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Services/BackendService.cs b/src/hosts/Elsa.Studio.Host.CustomElements/Services/BackendService.cs new file mode 100644 index 0000000..23f4481 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Services/BackendService.cs @@ -0,0 +1,65 @@ +namespace Elsa.Studio.Host.CustomElements.Services; + +/// +/// Represents a service for backend configuration and information management. +/// +/// +/// The class provides properties to manage backend connectivity, +/// including endpoint configuration, API key management, access token, and tenant identification. +/// It acts as a centralized configuration point for backend communication settings. +/// +public class BackendService +{ + /// + /// Gets or sets the remote endpoint URL for backend communication. + /// + /// + /// The RemoteEndpoint property specifies the base URL of the backend service that the application interacts with. + /// It is used as a key configuration for defining the remote backend's address and is essential for facilitating communication with the service. + /// This property is typically configured during application initialization or dynamically at runtime. + /// + public string RemoteEndpoint { get; set; } = null!; + + /// + /// Gets or sets the API key used for authenticating requests to the backend service. + /// + /// + /// The ApiKey property is used to supply authentication credentials in the form of an API key + /// when communicating with the backend service. It is typically included in the request headers to identify + /// and authorize the client. This property should hold a secure, non-empty value if API key-based authentication + /// is enabled for the backend. Configuring this property correctly is critical for ensuring authorized access + /// to backend resources. + /// + public string? ApiKey { get; set; } + + /// + /// Gets or sets the access token used for authentication in backend communication. + /// + /// + /// The AccessToken property specifies a bearer token used for authorizing requests to protected backend resources. + /// This property is typically set during initialization or dynamically updated to ensure proper authorization headers are sent with HTTP requests. + /// It is utilized when API key-based authentication is not provided, ensuring secure access through bearer token mechanisms. + /// + public string? AccessToken { get; set; } + + /// + /// Gets or sets the tenant identifier for backend communication. + /// + /// + /// The TenantId property specifies the unique identifier associated with the tenant context in the backend service. + /// It is used to distinguish resources and operations specific to a particular tenant, enabling multi-tenancy support. + /// This property can be set during initialization or dynamically altered at runtime to switch between tenants. + /// Setting this property is not necessary if the carries a claim that can be used on the back-end to determine the current tenant. + /// + public string? TenantId { get; set; } + + /// + /// Gets or sets the name of the HTTP header used for tenant identification during backend communication. + /// + /// + /// The TenantIdHeaderName property defines the header key that carries the tenant identifier in HTTP requests. + /// It is essential for multi-tenant applications to distinguish between different tenants while interacting with the backend service. + /// This property can be customized to align with specific header naming conventions required by the backend. + /// + public string TenantIdHeaderName { get; set; } = "X-Tenant-Id"; +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/Services/ComponentRemoteBackendAccessor.cs b/src/hosts/Elsa.Studio.Host.CustomElements/Services/ComponentRemoteBackendAccessor.cs new file mode 100644 index 0000000..161f8a2 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/Services/ComponentRemoteBackendAccessor.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.Options; +using Elsa.Studio.Services; + +namespace Elsa.Studio.Host.CustomElements.Services; + +/// +/// A default implementation of that uses the to determine the URL of the remote backend. +/// +public class ComponentRemoteBackendAccessor : IRemoteBackendAccessor +{ + private readonly BackendService _backendService; + + /// + /// Initializes a new instance of the class. + /// + public ComponentRemoteBackendAccessor(BackendService backendService) + { + _backendService = backendService; + } + + /// + public RemoteBackend RemoteBackend => new(new(_backendService.RemoteEndpoint)); +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/_Imports.razor b/src/hosts/Elsa.Studio.Host.CustomElements/_Imports.razor new file mode 100644 index 0000000..2d56cb6 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/_Imports.razor @@ -0,0 +1,9 @@ +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.JSInterop +@using MudBlazor +@using Elsa.Studio.Components +@using Elsa.Studio.Shell +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor +@using Elsa.Studio.Workflows.Components.WorkflowInstanceViewer +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionList +@using Elsa.Studio.Workflows.Components.WorkflowInstanceList \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/appsettings.Development.json b/src/hosts/Elsa.Studio.Host.CustomElements/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/appsettings.json b/src/hosts/Elsa.Studio.Host.CustomElements/appsettings.json new file mode 100644 index 0000000..7b8a827 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/appsettings.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Shell": { + "DisableAuthorization": false + } +} diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/npm/package.json b/src/hosts/Elsa.Studio.Host.CustomElements/npm/package.json new file mode 100644 index 0000000..22cf8be --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/npm/package.json @@ -0,0 +1,22 @@ +{ + "name": "@elsa-workflows/elsa-studio-wasm", + "version": "3.0.0-preview.1", + "description": "Provides Elsa Studio Blazor components wrapped as custom elements.", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "elsa workflows", + "blazor" + ], + "author": "Sipke Schoorstra", + "license": "MIT", + "files": [ + "_framework/*", + "_content/*", + "index.html", + "appsettings.json", + "Elsa.Studio.Host.CustomElements.styles.css" + ] + +} diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/appsettings.json b/src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/appsettings.json new file mode 100644 index 0000000..c0c96b6 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/appsettings.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "Backend": { + "Url": "https://localhost:5001/elsa/api" + } +} diff --git a/src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/index.html b/src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/index.html new file mode 100644 index 0000000..b38778e --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.CustomElements/wwwroot/index.html @@ -0,0 +1,43 @@ + + + + + + + MyApplication + + + + + + + + + + + + + + + + + + + + + +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + + + + + + \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.HostedWasm/Elsa.Studio.Host.HostedWasm.csproj b/src/hosts/Elsa.Studio.Host.HostedWasm/Elsa.Studio.Host.HostedWasm.csproj new file mode 100644 index 0000000..53a53e3 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.HostedWasm/Elsa.Studio.Host.HostedWasm.csproj @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/hosts/Elsa.Studio.Host.HostedWasm/Middleware/WasmAssetsRewritingMiddleware.cs b/src/hosts/Elsa.Studio.Host.HostedWasm/Middleware/WasmAssetsRewritingMiddleware.cs new file mode 100644 index 0000000..d6ede90 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.HostedWasm/Middleware/WasmAssetsRewritingMiddleware.cs @@ -0,0 +1,63 @@ +namespace Elsa.Studio.Host.HostedWasm.Middleware; + +/// +/// Middleware that intercepts HTTP requests and rewrites specific asset-related paths +/// for Web Assembly applications to ensure proper routing and handling of static files. +/// +public class WasmAssetsRewritingMiddleware(RequestDelegate next, ILogger logger) +{ + private static readonly string[] TargetSegments = { "_content", "_framework" }; + + public async Task InvokeAsync(HttpContext context) + { + if (context.Request.Path.HasValue && NeedsRewriting(context.Request.Path.Value!)) + { + var path = context.Request.Path.Value!; + + // Call the private method to get the index of the target segment using spans + var segmentIndex = GetTargetSegmentIndex(path.AsSpan()); + + if (segmentIndex > 0) + { + // Use slices instead of Substring to avoid allocations + var newPath = path.AsSpan(segmentIndex).ToString(); // Convert back to a string only when required + context.Request.Path = newPath.StartsWith('/') ? newPath : $"/{newPath}"; + + if (logger.IsEnabled(LogLevel.Debug)) logger.LogDebug("Rewritten: {Path} -> {NewPath}", path, context.Request.Path.Value); + } + } + + // Call the next middleware in the pipeline + await next(context); + } + + private static bool NeedsRewriting(string path) + { + // Fast path: Return if the path does not include potential target segments + foreach (var segment in TargetSegments) + { + if (path.Contains(segment, StringComparison.OrdinalIgnoreCase)) + return true; + } + + return false; + } + + private static int GetTargetSegmentIndex(ReadOnlySpan path) + { + foreach (var segment in TargetSegments) + { + // Use Span instead of string concatenation and index search + var segmentAsSpan = $"{segment}/".AsSpan(); + var index = path.IndexOf(segmentAsSpan, StringComparison.OrdinalIgnoreCase); + + if (index >= 0) + { + return index; + } + } + + return -1; // No valid index found + } + +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.HostedWasm/Pages/_Host.cshtml b/src/hosts/Elsa.Studio.Host.HostedWasm/Pages/_Host.cshtml new file mode 100644 index 0000000..dd70def --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.HostedWasm/Pages/_Host.cshtml @@ -0,0 +1,79 @@ +@page "/" +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@inject IConfiguration Configuration; +@{ + var apiUrl = Configuration["Hosting:ApiUrl"]; + + // Get the first segment of the request path, which represents the tenant ID. + var segments = Request.Path.Value!.Split('/', StringSplitOptions.RemoveEmptyEntries); + var tenantId = segments.Length is 1 or > 2 ? segments[0] : null; + var baseRef = tenantId != null ? $"/{tenantId}/" : "/"; +} + + + + + + + + Elsa Studio 3 + + + + + + + + + + + + + + + + + + +
+
+
Loading...
+
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.HostedWasm/Program.cs b/src/hosts/Elsa.Studio.Host.HostedWasm/Program.cs new file mode 100644 index 0000000..15336e0 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.HostedWasm/Program.cs @@ -0,0 +1,43 @@ +using Elsa.Studio.Host.HostedWasm.Middleware; +using Microsoft.AspNetCore.StaticFiles; + +var builder = WebApplication.CreateBuilder(args); +builder.WebHost.UseStaticWebAssets(); + +// Add services to the container. +builder.Services.AddRazorPages(); +builder.Services.AddCors(cors => cors.AddDefaultPolicy(policy => policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error", createScopeForErrors: true); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); +app.UseBlazorFrameworkFiles(); +app.UseRouting(); +app.UseCors(); + +// Insert this BEFORE UseStaticFiles middleware. +app.UseMiddleware(); + +// Use Static Files instead of MapStaticAssets. +app.UseStaticFiles(new StaticFileOptions +{ + ContentTypeProvider = new FileExtensionContentTypeProvider + { + Mappings = + { + // Add custom MIME type mappings for WASM + [".dat"] = "application/octet-stream" + } + } +}); +app.MapFallbackToPage("/_Host"); + +app.Run(); \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.HostedWasm/Properties/launchSettings.json b/src/hosts/Elsa.Studio.Host.HostedWasm/Properties/launchSettings.json new file mode 100644 index 0000000..e6da1c2 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.HostedWasm/Properties/launchSettings.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7267", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.Development.json b/src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.json b/src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.json new file mode 100644 index 0000000..d6c905b --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.HostedWasm/appsettings.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Hosting": { + "ApiUrl": "https://localhost:5001/elsa/api" + } +} diff --git a/src/hosts/Elsa.Studio.Host.Server/Dockerfile b/src/hosts/Elsa.Studio.Host.Server/Dockerfile new file mode 100644 index 0000000..c6b2265 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/Dockerfile @@ -0,0 +1,20 @@ +FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base +WORKDIR /app +EXPOSE 80 +EXPOSE 443 + +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +WORKDIR /src +COPY ["Elsa.Studio.ServerApp/Elsa.Studio.ServerApp.csproj", "Elsa.Studio.ServerApp/"] +RUN dotnet restore "Elsa.Studio.ServerApp/Elsa.Studio.ServerApp.csproj" +COPY . . +WORKDIR "/src/Elsa.Studio.ServerApp" +RUN dotnet build "Elsa.Studio.ServerApp.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "Elsa.Studio.ServerApp.csproj" -c Release -o /app/publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Elsa.Studio.ServerApp.dll"] diff --git a/src/hosts/Elsa.Studio.Host.Server/Elsa.Studio.Host.Server.csproj b/src/hosts/Elsa.Studio.Host.Server/Elsa.Studio.Host.Server.csproj new file mode 100644 index 0000000..0fb7355 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/Elsa.Studio.Host.Server.csproj @@ -0,0 +1,27 @@ + + + + Linux + + + + + .dockerignore + + + + + + + + + + + + + + + + + + diff --git a/src/hosts/Elsa.Studio.Host.Server/Pages/_Host.cshtml b/src/hosts/Elsa.Studio.Host.Server/Pages/_Host.cshtml new file mode 100644 index 0000000..00f8253 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/Pages/_Host.cshtml @@ -0,0 +1,56 @@ +@page "/" +@using Elsa.Studio.Shell +@using Microsoft.AspNetCore.Components.Web +@namespace Elsa.Studio.Host.Server.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + + + + + + + + + + + + + + + + + @* Use designer.v1.css for the old designer (and comment out the previous designer.css style reference).*@ + @* *@ + + + + + + + +
+ + An error has occurred. This application may no longer respond until reloaded. + + + An unhandled exception has occurred. See browser dev tools for details. + + Reload + 🗙 +
+ + + + + + + + + \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.Server/Program.cs b/src/hosts/Elsa.Studio.Host.Server/Program.cs new file mode 100644 index 0000000..181fcb0 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/Program.cs @@ -0,0 +1,122 @@ +using Elsa.Studio.Core.BlazorServer.Extensions; +using Elsa.Studio.Dashboard.Extensions; +using Elsa.Studio.Extensions; +using Elsa.Studio.Localization.Time; +using Elsa.Studio.Localization.Time.Providers; +using Elsa.Studio.Login.BlazorServer.Extensions; +using Elsa.Studio.Login.HttpMessageHandlers; +using Elsa.Studio.Models; +using Elsa.Studio.Secrets; +using Elsa.Studio.Shell.Extensions; +using Elsa.Studio.Webhooks.Extensions; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Workflows.Designer.Extensions; +using Elsa.Studio.Localization.BlazorServer.Extensions; +using Elsa.Studio.Localization.Models; +using Elsa.Studio.Localization.Options; +using Elsa.Studio.Translations; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Elsa.Studio.Branding; +using Elsa.Studio.Host.Server; +using Elsa.Studio.Login.Extensions; + +// Build the host. +var builder = WebApplication.CreateBuilder(args); +var configuration = builder.Configuration; + +// Register Razor services. +builder.Services.AddRazorPages(); +builder.Services.AddServerSideBlazor(options => +{ + // Register the root components. + // V2 activity wrapper by default. + options.RootComponents.RegisterCustomElsaStudioElements(); + + // To use V1 activity wrapper layout, specify the V1 component instead: + //options.RootComponents.RegisterCustomElsaStudioElements(typeof(Elsa.Studio.Workflows.Designer.Components.ActivityWrappers.V1.EmbeddedActivityWrapper)); + + options.RootComponents.MaxJSRootComponents = 1000; +}); + +// Register shell services and modules. +var backendApiConfig = new BackendApiConfig +{ + ConfigureBackendOptions = options => configuration.GetSection("Backend").Bind(options), + ConfigureHttpClientBuilder = options => + { + options.AuthenticationHandler = typeof(AuthenticatingApiHttpMessageHandler); + options.ConfigureHttpClient = (_, client) => + { + // Set a long time out to simplify debugging both Elsa Studio and the Elsa Server backend. + client.Timeout = TimeSpan.FromHours(1); + }; + }, +}; + +var localizationConfig = new LocalizationConfig +{ + ConfigureLocalizationOptions = options => + { + configuration.GetSection(LocalizationOptions.LocalizationSection).Bind(options); + options.SupportedCultures = new[] { options?.DefaultCulture ?? new LocalizationOptions().DefaultCulture } + .Concat(options?.SupportedCultures.Where(culture => culture != options?.DefaultCulture) ?? []) .ToArray(); + } +}; + +builder.Services.AddScoped(); +builder.Services.AddCore().Replace(new(typeof(IBrandingProvider), typeof(StudioBrandingProvider), ServiceLifetime.Scoped)); +builder.Services.AddShell(options => configuration.GetSection("Shell").Bind(options)); +builder.Services.AddRemoteBackend(backendApiConfig); +builder.Services.AddLoginModule(); +builder.Services.UseElsaIdentity(); +// builder.Services.UseOAuth2(options => +// { +// options.ClientId = "ElsaStudio"; +// options.TokenEndpoint = "https://localhost:44366/connect/token"; +// options.Scope = "YourSite offline_access"; +// }); +builder.Services.AddDashboardModule(); +builder.Services.AddWorkflowsModule(); +builder.Services.AddWebhooksModule(); +builder.Services.AddSecretsModule(backendApiConfig); +builder.Services.AddLocalizationModule(localizationConfig); +builder.Services.AddTranslations(); + +// Replace some services with other implementations. +builder.Services.AddScoped(); + +// Uncomment for V1 designer theme (default is V2). +// builder.Services.Configure(options => +// { +// options.DesignerCssClass = "elsa-flowchart-diagram-designer-v1"; +// options.GraphSettings.Grid.Type = "mesh"; +// }); + +// Configure SignalR. +builder.Services.AddSignalR(options => +{ + // Set MaximumReceiveMessageSize: + options.MaximumReceiveMessageSize = 5 * 1024 * 1000; // 5MB +}); + +// Build the application. +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseResponseCompression(); + + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseElsaLocalization(); +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.UseRouting(); +app.UseAuthorization(); +app.MapControllers(); +app.MapBlazorHub(); +app.MapFallbackToPage("/_Host"); +app.Run(); \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.Server/Properties/launchSettings.json b/src/hosts/Elsa.Studio.Host.Server/Properties/launchSettings.json new file mode 100644 index 0000000..65b29fc --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/Properties/launchSettings.json @@ -0,0 +1,35 @@ +{ + "iisSettings": { + "iisExpress": { + "applicationUrl": "http://localhost:50413", + "sslPort": 44382 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5010", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7113;http://localhost:5010", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/hosts/Elsa.Studio.Host.Server/StudioBrandingProvider.cs b/src/hosts/Elsa.Studio.Host.Server/StudioBrandingProvider.cs new file mode 100644 index 0000000..abfd026 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/StudioBrandingProvider.cs @@ -0,0 +1,10 @@ +using Elsa.Studio.Branding; + +namespace Elsa.Studio.Host.Server +{ + /// + public class StudioBrandingProvider : DefaultBrandingProvider + { + public override string AppName => "Elsa Studio 3.5"; + } +} \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.Server/_Imports.razor b/src/hosts/Elsa.Studio.Host.Server/_Imports.razor new file mode 100644 index 0000000..2ae3b36 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/_Imports.razor @@ -0,0 +1,5 @@ +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Mvc.TagHelpers +@using Microsoft.JSInterop \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.Server/appsettings.Development.json b/src/hosts/Elsa.Studio.Host.Server/appsettings.Development.json new file mode 100644 index 0000000..770d3e9 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/hosts/Elsa.Studio.Host.Server/appsettings.json b/src/hosts/Elsa.Studio.Host.Server/appsettings.json new file mode 100644 index 0000000..b61e9c9 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Server/appsettings.json @@ -0,0 +1,22 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Shell": { + "DisableAuthorization": false + }, + "Backend": { + "Url": "https://localhost:5001/elsa/api" + }, + "Localization": { + "DefaultCulture": "fa-IR", + "SupportedCultures": [ + "fa-IR", + "en-US" + ] + } +} diff --git a/src/hosts/Elsa.Studio.Host.Wasm/Dockerfile b/src/hosts/Elsa.Studio.Host.Wasm/Dockerfile new file mode 100644 index 0000000..d0565b4 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Wasm/Dockerfile @@ -0,0 +1,20 @@ +FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base +WORKDIR /app +EXPOSE 80 +EXPOSE 443 + +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +WORKDIR /src +COPY ["src/Elsa.Studio.WebAssemblyApp/Elsa.Studio.WebAssemblyApp.csproj", "src/Elsa.Studio.WebAssemblyApp/"] +RUN dotnet restore "src/Elsa.Studio.WebAssemblyApp/Elsa.Studio.WebAssemblyApp.csproj" +COPY . . +WORKDIR "/src/src/Elsa.Studio.WebAssemblyApp" +RUN dotnet build "Elsa.Studio.WebAssemblyApp.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "Elsa.Studio.WebAssemblyApp.csproj" -c Release -o /app/publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . +ENTRYPOINT ["dotnet", "Elsa.Studio.WebAssemblyApp.dll"] diff --git a/src/hosts/Elsa.Studio.Host.Wasm/Elsa.Studio.Host.Wasm.csproj b/src/hosts/Elsa.Studio.Host.Wasm/Elsa.Studio.Host.Wasm.csproj new file mode 100644 index 0000000..dc46208 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Wasm/Elsa.Studio.Host.Wasm.csproj @@ -0,0 +1,30 @@ + + + + Linux + true + + + + + + + + + + + Always + + + + + + + + + + + + + + diff --git a/src/hosts/Elsa.Studio.Host.Wasm/Program.cs b/src/hosts/Elsa.Studio.Host.Wasm/Program.cs new file mode 100644 index 0000000..0a5d08c --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Wasm/Program.cs @@ -0,0 +1,63 @@ +using Elsa.Studio.Dashboard.Extensions; +using Elsa.Studio.Shell; +using Elsa.Studio.Shell.Extensions; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Contracts; +using Elsa.Studio.Core.BlazorWasm.Extensions; +using Elsa.Studio.Extensions; +using Elsa.Studio.Localization.Time; +using Elsa.Studio.Localization.Time.Providers; +using Elsa.Studio.Login.BlazorWasm.Extensions; +using Elsa.Studio.Login.HttpMessageHandlers; +using Elsa.Studio.Models; +using Elsa.Studio.WorkflowContexts.Extensions; +using Elsa.Studio.Workflows.Designer.Extensions; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Elsa.Studio.Localization.Models; +using Elsa.Studio.Localization.BlazorWasm.Extensions; + +// Build the host. +var builder = WebAssemblyHostBuilder.CreateDefault(args); +var configuration = builder.Configuration; + +// Register root components. +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); +builder.RootComponents.RegisterCustomElsaStudioElements(); + +// Register shell services and modules. +var backendApiConfig = new BackendApiConfig +{ + ConfigureBackendOptions = options => configuration.GetSection("Backend").Bind(options), + ConfigureHttpClientBuilder = options => options.AuthenticationHandler = typeof(AuthenticatingApiHttpMessageHandler), +}; + +var localizationConfig = new LocalizationConfig +{ + ConfigureLocalizationOptions = options => configuration.GetSection("Localization").Bind(options), +}; + +builder.Services.AddCore(); +builder.Services.AddShell(); +builder.Services.AddRemoteBackend(backendApiConfig); +builder.Services.AddLoginModule(); +builder.Services.AddDashboardModule(); +builder.Services.AddWorkflowsModule(); +builder.Services.AddWorkflowContextsModule(); +builder.Services.AddLocalizationModule(localizationConfig); + +// Replace some services with other implementations. +builder.Services.AddScoped(); + +// Build the application. +var app = builder.Build(); + +await app.UseElsaLocalization(); + +// Run each startup task. +var startupTaskRunner = app.Services.GetRequiredService(); +await startupTaskRunner.RunStartupTasksAsync(); + +// Run the application. +await app.RunAsync(); \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.Wasm/Properties/launchSettings.json b/src/hosts/Elsa.Studio.Host.Wasm/Properties/launchSettings.json new file mode 100644 index 0000000..c86a17a --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Wasm/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "iisSettings": { + "iisExpress": { + "applicationUrl": "http://localhost:10111", + "sslPort": 44341 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5275", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7052;http://localhost:5275", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/hosts/Elsa.Studio.Host.Wasm/_Imports.razor b/src/hosts/Elsa.Studio.Host.Wasm/_Imports.razor new file mode 100644 index 0000000..a2fe699 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Wasm/_Imports.razor @@ -0,0 +1,6 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop \ No newline at end of file diff --git a/src/hosts/Elsa.Studio.Host.Wasm/wwwroot/appsettings.json b/src/hosts/Elsa.Studio.Host.Wasm/wwwroot/appsettings.json new file mode 100644 index 0000000..c0c96b6 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Wasm/wwwroot/appsettings.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "Backend": { + "Url": "https://localhost:5001/elsa/api" + } +} diff --git a/src/hosts/Elsa.Studio.Host.Wasm/wwwroot/index.html b/src/hosts/Elsa.Studio.Host.Wasm/wwwroot/index.html new file mode 100644 index 0000000..b9f2c44 --- /dev/null +++ b/src/hosts/Elsa.Studio.Host.Wasm/wwwroot/index.html @@ -0,0 +1,47 @@ + + + + + + + Elsa Studio 3.5 + + + + + + + + + + + + + + + + + + + +
+
+
Loading...
+
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Elsa.Studio.ActivityPortProviders.csproj b/src/modules/Elsa.Studio.ActivityPortProviders/Elsa.Studio.ActivityPortProviders.csproj new file mode 100644 index 0000000..6a098aa --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Elsa.Studio.ActivityPortProviders.csproj @@ -0,0 +1,13 @@ + + + + Provides various port providers for activities such as `FlowSwitch` and `SendHttpRequest`. + elsa studio module + + + + + + + + diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.ActivityPortProviders/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..92e7c53 --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,26 @@ +using Elsa.Studio.ActivityPortProviders.Providers; +using Elsa.Studio.Workflows.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.ActivityPortProviders.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds default activity port providers. + /// + public static IServiceCollection AddDefaultActivityPortProviders(this IServiceCollection services) + { + services.AddActivityPortProvider(); + services.AddActivityPortProvider(); + services.AddActivityPortProvider(); + services.AddActivityPortProvider(); + services.AddActivityPortProvider(); + services.AddActivityPortProvider(); + + return services; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xml b/src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xsd b/src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Providers/DynamicOutcomesPortProvider.cs b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/DynamicOutcomesPortProvider.cs new file mode 100644 index 0000000..3af1eb7 --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/DynamicOutcomesPortProvider.cs @@ -0,0 +1,96 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Providers; +using Humanizer; + +namespace Elsa.Studio.ActivityPortProviders.Providers; + +/// +/// Provides ports for the FlowSendHttpRequest activity based on its supported status codes. +/// +public class DynamicOutcomesPortProvider : ActivityPortProviderBase +{ + /// + public override bool GetSupportsActivityType(PortProviderContext context) => GetDynamicOutcomesInput(context) != null; + + /// + public override IEnumerable GetPorts(PortProviderContext context) + { + var dynamicOutcomesInputDescriptor = GetDynamicOutcomesInput(context)!; + var dynamicOutcomes = GetDynamicOutcomes(context.Activity, dynamicOutcomesInputDescriptor).ToList(); + + foreach (var dynamicOutcome in dynamicOutcomes) + { + yield return new Port + { + Name = dynamicOutcome, + Type = PortType.Flow, + DisplayName = dynamicOutcome + }; + } + + var dynamicOutcomesOptions = GetDynamicOutcomeOptions(dynamicOutcomesInputDescriptor); + var fixedOutcomes = dynamicOutcomesOptions?.FixedOutcomes; + + if (fixedOutcomes == null) + yield break; + + foreach (var outcome in fixedOutcomes) + { + yield return new Port + { + Name = outcome, + Type = PortType.Flow, + DisplayName = outcome + }; + } + } + + private static DynamicOutcomesOptions? GetDynamicOutcomeOptions(InputDescriptor dynamicOutcomesInputDescriptor) + { + if (dynamicOutcomesInputDescriptor.UISpecifications?.TryGetValue(nameof(DynamicOutcomesOptions), out var dynamicOutcomesOptions) != true) + return default; + + var serializerOptions = CreateSerializerOptions(); + var options = ((JsonElement)dynamicOutcomesOptions!).Deserialize(serializerOptions); + + return options; + + } + + private static InputDescriptor? GetDynamicOutcomesInput(PortProviderContext context) + { + return context.ActivityDescriptor.Inputs.FirstOrDefault(x => x.UIHint == "dynamic-outcomes"); + } + + private static IEnumerable GetDynamicOutcomes(JsonObject activity, PropertyDescriptor dynamicOutcomesInputDescriptor) + { + var options = CreateSerializerOptions(); + var dynamicOutcomesInputPropertyName = dynamicOutcomesInputDescriptor.Name.Camelize(); + + var wrappedInput = activity.GetProperty(options, dynamicOutcomesInputPropertyName) ?? new WrappedInput + { + TypeName = dynamicOutcomesInputDescriptor.TypeName, + Expression = Expression.CreateObject("[]") + }; + + var objectExpression = wrappedInput.Expression; + return JsonSerializer.Deserialize>(objectExpression.Value!.ToString()!, options)!; + } + + private static JsonSerializerOptions CreateSerializerOptions() + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + return options; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowHttpRequestPortProvider.cs b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowHttpRequestPortProvider.cs new file mode 100644 index 0000000..a25066b --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowHttpRequestPortProvider.cs @@ -0,0 +1,97 @@ +using System.Net; +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Converters; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Providers; +using JetBrains.Annotations; + +namespace Elsa.Studio.ActivityPortProviders.Providers; + +/// +/// Provides ports for the FlowSendHttpRequest & DownloadHttpFile activities based on its supported status codes. +/// +[UsedImplicitly] +public class FlowHttpRequestPortProvider : ActivityPortProviderBase +{ + /// + public override bool GetSupportsActivityType(PortProviderContext context) + { + return context.ActivityDescriptor.TypeName is "Elsa.FlowSendHttpRequest" or "Elsa.DownloadHttpFile"; + } + + /// + public override IEnumerable GetPorts(PortProviderContext context) + { + var expectedStatusCodes = GetExpectedStatusCodes(context.Activity); + + foreach (var statusCode in expectedStatusCodes) + { + yield return new Port + { + Name = statusCode.ToString(), + Type = PortType.Flow, + DisplayName = statusCode.ToString() + }; + } + + yield return new Port + { + Name = "Unmatched status code", + Type = PortType.Flow, + DisplayName = "Unmatched status code" + }; + + yield return new Port + { + Name = "Failed to connect", + Type = PortType.Flow, + DisplayName = "Failed to connect" + }; + + yield return new Port + { + Name = "Timeout", + Type = PortType.Flow, + DisplayName = "Timeout" + }; + + yield return new Port + { + Name = "Done", + Type = PortType.Flow, + DisplayName = "Done" + }; + } + + private static IEnumerable GetExpectedStatusCodes(JsonObject activity) + { + var options = CreateSerializerOptions(); + + var wrappedInput = activity.GetProperty(options, "expectedStatusCodes") ?? new WrappedInput + { + TypeName = typeof(int[]).Name, + Expression = Expression.CreateObject(JsonSerializer.Serialize(new[] { (int)HttpStatusCode.OK }, options)) + }; + + var objectExpression = wrappedInput.Expression; + return JsonSerializer.Deserialize>(objectExpression.Value!.ToString()!, options)!; + } + + private static JsonSerializerOptions CreateSerializerOptions() + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + options.Converters.Add(new JsonStringToIntConverter()); + + return options; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowSwitchPortProvider.cs b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowSwitchPortProvider.cs new file mode 100644 index 0000000..2f96625 --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/FlowSwitchPortProvider.cs @@ -0,0 +1,51 @@ +using System.Text.Json; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Providers; +using JetBrains.Annotations; + +namespace Elsa.Studio.ActivityPortProviders.Providers; + +/// +/// Provides ports for the FlowSwitch activity based on its cases. +/// +[UsedImplicitly] +public class FlowSwitchPortProvider : ActivityPortProviderBase +{ + /// + public override bool GetSupportsActivityType(PortProviderContext context) => context.ActivityDescriptor.TypeName is "Elsa.FlowSwitch"; + + /// + public override IEnumerable GetPorts(PortProviderContext context) + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + var cases = context.Activity.GetProperty>(options, "cases") ?? new List(); + + foreach (var @case in cases) + { + yield return new Port + { + Name = @case.Label, + DisplayName = @case.Label, + Type = PortType.Flow, + }; + } + + if (cases.Any(x => x.Label == "Default")) + yield break; + + yield return new Port + { + Name = "Default", + DisplayName = "Default", + Type = PortType.Flow + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Providers/HttpEndpointPortProvider.cs b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/HttpEndpointPortProvider.cs new file mode 100644 index 0000000..059f71e --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/HttpEndpointPortProvider.cs @@ -0,0 +1,52 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Providers; + +namespace Elsa.Studio.ActivityPortProviders.Providers; + +/// +/// Provides ports for the HttpEndpoint activity based on its configuration. +/// +public class HttpEndpointPortProvider : ActivityPortProviderBase +{ + private const string Done = "Done"; + private const string FileTooLarge = "File too large"; + private const string RequestTooLarge = "Request too large"; + private const string InvalidFileExtension = "Invalid file extension"; + private const string InvalidMimeType = "Invalid file MIME type"; + + /// + public override bool GetSupportsActivityType(PortProviderContext context) => context.ActivityDescriptor.TypeName is "Elsa.HttpEndpoint"; + + /// + public override IEnumerable GetPorts(PortProviderContext context) + { + if (ExposeFileTooLargeOutcome(context.Activity)) yield return CreatePort(FileTooLarge); + if (ExposeRequestTooLargeOutcome(context.Activity)) yield return CreatePort(RequestTooLarge); + if (ExposeInvalidFileExtensionOutcome(context.Activity)) yield return CreatePort(InvalidFileExtension); + if (ExposeInvalidFileMimeTypeOutcome(context.Activity)) yield return CreatePort(InvalidMimeType); + yield return CreatePort(Done); + } + + private bool ExposeFileTooLargeOutcome(JsonObject @case) => TryGetValue(@case, "exposeFileTooLargeOutcome", () => false); + private bool ExposeRequestTooLargeOutcome(JsonObject @case) => TryGetValue(@case, "exposeRequestTooLargeOutcome", () => false); + private bool ExposeInvalidFileExtensionOutcome(JsonObject @case) => TryGetValue(@case, "exposeInvalidFileExtensionOutcome", () => false); + private bool ExposeInvalidFileMimeTypeOutcome(JsonObject @case) => TryGetValue(@case, "exposeInvalidFileMimeTypeOutcome", () => false); + + private Port CreatePort(string name) + { + return new Port + { + Name = name, + DisplayName = name, + Type = PortType.Flow, + }; + } + + private static T TryGetValue(JsonObject model, string propName, Func defaultValue) + { + return model.TryGetPropertyValue(propName, out var node) ? node != null ? node.GetValue() : defaultValue() : defaultValue(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Providers/SendHttpRequestPortProvider.cs b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/SendHttpRequestPortProvider.cs new file mode 100644 index 0000000..2c3cfd2 --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/SendHttpRequestPortProvider.cs @@ -0,0 +1,110 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Providers; + +namespace Elsa.Studio.ActivityPortProviders.Providers; + +/// +/// Provides ports for the FlowSendHttpRequest activity based on its supported status codes. +/// +public class SendHttpRequestPortProvider : ActivityPortProviderBase +{ + private const string UnmatchedStatusCodePortName = "Unmatched status code"; + + /// + public override bool GetSupportsActivityType(PortProviderContext context) => context.ActivityDescriptor.TypeName is "Elsa.SendHttpRequest"; + + /// + public override IEnumerable GetPorts(PortProviderContext context) + { + var cases = GetExpectedStatusCodes(context.Activity); + + foreach (var @case in cases) + { + var statusCode = GetStatusCode(@case); + + yield return new Port + { + Name = statusCode.ToString(), + DisplayName = statusCode.ToString(), + Type = PortType.Embedded, + }; + } + + yield return new Port + { + Name = UnmatchedStatusCodePortName, + DisplayName = "Unmatched status code", + Type = PortType.Embedded, + }; + } + + /// + public override JsonObject? ResolvePort(string portName, PortProviderContext context) + { + if (portName == UnmatchedStatusCodePortName) + return GetUnmatchedStatusCodeActivity(context.Activity); + + var cases = GetExpectedStatusCodes(context.Activity); + var @case = cases.FirstOrDefault(x => GetStatusCode(x).ToString() == portName); + + return GetActivity(@case); + } + + /// + public override void AssignPort(string portName, JsonObject activity, PortProviderContext context) + { + var switchActivity = context.Activity; + + if (portName == UnmatchedStatusCodePortName) + { + SetUnmatchedStatusCodeActivity(switchActivity, activity); + return; + } + + var cases = GetExpectedStatusCodes(switchActivity).ToList(); + var @case = cases.FirstOrDefault(x => GetStatusCode(x).ToString() == portName); + + if (@case == null) + return; + + SetActivity(@case, activity); + } + + /// + public override void ClearPort(string portName, PortProviderContext context) + { + if (portName == UnmatchedStatusCodePortName) + { + SetUnmatchedStatusCodeActivity(context.Activity, null); + return; + } + + var cases = GetExpectedStatusCodes(context.Activity).ToList(); + var @case = cases.FirstOrDefault(x => GetStatusCode(x).ToString() == portName); + + if (@case == null) + return; + + SetActivity(@case, null); + } + + private static IEnumerable GetExpectedStatusCodes(JsonObject switchActivity) + { + return switchActivity.GetProperty("expectedStatusCodes")?.AsArray().AsEnumerable().Cast() ?? new List(); + } + + private static void SetExpectedStatusCodes(JsonObject switchActivity, ICollection cases) + { + switchActivity.SetProperty(cases, "expectedStatusCodes"); + } + + private int GetStatusCode(JsonObject @case) => @case.GetProperty("statusCode")!.GetValue(); + private JsonObject? GetActivity(JsonObject? @case) => @case?.GetProperty("activity")?.AsObject(); + private void SetActivity(JsonObject @case, JsonObject? activity) => @case.SetProperty(activity, "activity"); + private JsonObject? GetUnmatchedStatusCodeActivity(JsonObject httpRequestActivity) => httpRequestActivity.GetProperty("unmatchedStatusCode")?.AsObject(); + private void SetUnmatchedStatusCodeActivity(JsonObject httpRequestActivity, JsonObject? activity) => httpRequestActivity.SetProperty(activity, "unmatchedStatusCode"); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.ActivityPortProviders/Providers/SwitchPortProvider.cs b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/SwitchPortProvider.cs new file mode 100644 index 0000000..e0dd624 --- /dev/null +++ b/src/modules/Elsa.Studio.ActivityPortProviders/Providers/SwitchPortProvider.cs @@ -0,0 +1,103 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Providers; + +namespace Elsa.Studio.ActivityPortProviders.Providers; + +/// +/// Provides ports for the Switch activity based on its cases. +/// +public class SwitchPortProvider : ActivityPortProviderBase +{ + /// + public override bool GetSupportsActivityType(PortProviderContext context) => context.ActivityDescriptor.TypeName == "Elsa.Switch"; + + /// + public override IEnumerable GetPorts(PortProviderContext context) + { + var cases = GetCases(context.Activity).ToList(); + + foreach (var @case in cases) + { + var label = GetLabel(@case); + yield return new Port + { + Name = label, + DisplayName = label, + Type = PortType.Embedded, + }; + } + + if (cases.Any(x => GetLabel(x) == "Default")) + yield break; + + yield return new Port + { + Name = "Default", + DisplayName = "Default", + Type = PortType.Embedded + }; + } + + /// + public override JsonObject? ResolvePort(string portName, PortProviderContext context) + { + if (portName == "Default") + { + return context.Activity.GetProperty("default"); + } + + var cases = GetCases(context.Activity); + var @case = cases.FirstOrDefault(x => GetLabel(x) == portName); + + return @case != null ? GetActivity(@case) : null; + } + + /// + public override void AssignPort(string portName, JsonObject activity, PortProviderContext context) + { + if(portName == "Default") + { + context.Activity.SetProperty(activity, "default"); + return; + } + + var cases = GetCases(context.Activity).ToList(); + var @case = cases.FirstOrDefault(x => GetLabel(x) == portName); + + if (@case == null) + return; + + SetActivity(@case, activity); + } + + /// + public override void ClearPort(string portName, PortProviderContext context) + { + if(portName == "Default") + { + context.Activity.SetProperty(null, "default"); + return; + } + + var cases = GetCases(context.Activity).ToList(); + var @case = cases.FirstOrDefault(x => GetLabel(x) == portName); + + if (@case == null) + return; + + SetActivity(@case, null); + } + + private string GetLabel(JsonObject @case) => @case.GetProperty("label")?.GetValue()!; + private JsonObject? GetActivity(JsonObject @case) => @case.GetProperty("activity")?.AsObject(); + private void SetActivity(JsonObject @case, JsonObject? activity) => @case.SetProperty(activity, "activity"); + + private static IEnumerable GetCases(JsonObject switchActivity) + { + return switchActivity.GetProperty("cases")?.AsArray().AsEnumerable().Cast() ?? new List(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Counter/Elsa.Studio.Counter.csproj b/src/modules/Elsa.Studio.Counter/Elsa.Studio.Counter.csproj new file mode 100644 index 0000000..769ba34 --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/Elsa.Studio.Counter.csproj @@ -0,0 +1,16 @@ + + + + Adds the classical Counter screen from the default Blazor template to the studio. + elsa studio module + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Counter/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Counter/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..560ff21 --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,17 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Counter.Menu; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Counter.Extensions; + +/// Extension methods to add the Counter module to the service collection. +public static class ServiceCollectionExtensions +{ + /// Adds the Counter module to the service collection. + public static IServiceCollection AddCounterModule(this IServiceCollection services) + { + return services + .AddScoped() + .AddScoped(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Counter/FodyWeavers.xml b/src/modules/Elsa.Studio.Counter/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Counter/FodyWeavers.xsd b/src/modules/Elsa.Studio.Counter/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Counter/Menu/CounterMenu.cs b/src/modules/Elsa.Studio.Counter/Menu/CounterMenu.cs new file mode 100644 index 0000000..55f8143 --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/Menu/CounterMenu.cs @@ -0,0 +1,37 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using MudBlazor; + +namespace Elsa.Studio.Counter.Menu; + +public class CounterMenu : IMenuProvider +{ + public ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default) + { + var menuItems = new List + { + new() + { + Icon = Icons.Material.Filled.Add, + Href = "counter", + Text = "Counter", + GroupName = MenuItemGroups.General.Name, + SubMenuItems = new List + { + new() + { + Href = "counter", + Text = "Sub menu item 1", + }, + new() + { + Href = "counter2", + Text = "Sub menu item 2", + }, + } + } + }; + + return new ValueTask>(menuItems); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Counter/Module.cs b/src/modules/Elsa.Studio.Counter/Module.cs new file mode 100644 index 0000000..bc6c437 --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/Module.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Abstractions; + +namespace Elsa.Studio.Counter; + +public class Feature : FeatureBase +{ + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Counter/Pages/Counter.razor b/src/modules/Elsa.Studio.Counter/Pages/Counter.razor new file mode 100644 index 0000000..a32f008 --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/Pages/Counter.razor @@ -0,0 +1,19 @@ +@page "/counter" + +Counter + + + + Current count: @_currentCount + Click me + + + +@code { + private int _currentCount = 0; + + private void IncrementCount() + { + _currentCount++; + } +} diff --git a/src/modules/Elsa.Studio.Counter/_Imports.razor b/src/modules/Elsa.Studio.Counter/_Imports.razor new file mode 100644 index 0000000..418389e --- /dev/null +++ b/src/modules/Elsa.Studio.Counter/_Imports.razor @@ -0,0 +1,7 @@ +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.JSInterop +@using Elsa.Studio.Components +@using MudBlazor +@attribute [Authorize] \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Dashboard/Elsa.Studio.Dashboard.csproj b/src/modules/Elsa.Studio.Dashboard/Elsa.Studio.Dashboard.csproj new file mode 100644 index 0000000..725cd50 --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/Elsa.Studio.Dashboard.csproj @@ -0,0 +1,17 @@ + + + + Adds a dashboard page to the studio. + elsa studio module + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Dashboard/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Dashboard/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..5d3c765 --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,15 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Dashboard.Menu; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Dashboard.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddDashboardModule(this IServiceCollection services) + { + return services + .AddScoped() + .AddScoped(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Dashboard/Feature.cs b/src/modules/Elsa.Studio.Dashboard/Feature.cs new file mode 100644 index 0000000..3adcb13 --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/Feature.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Abstractions; + +namespace Elsa.Studio.Dashboard; + +public class Feature : FeatureBase +{ + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Dashboard/FodyWeavers.xml b/src/modules/Elsa.Studio.Dashboard/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Dashboard/FodyWeavers.xsd b/src/modules/Elsa.Studio.Dashboard/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Dashboard/Menu/DashboardMenu.cs b/src/modules/Elsa.Studio.Dashboard/Menu/DashboardMenu.cs new file mode 100644 index 0000000..258cc98 --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/Menu/DashboardMenu.cs @@ -0,0 +1,32 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Services; +using Microsoft.AspNetCore.Components.Routing; +using MudBlazor; + +namespace Elsa.Studio.Dashboard.Menu; + +/// +/// Provides the menu items for the Dashboard module. +/// +public class DashboardMenu(ILocalizer localizer) : IMenuProvider +{ + /// + public ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default) + { + var menuItems = new List + { + new() + { + Icon = Icons.Material.Outlined.SpaceDashboard, + Href = "", + Text = localizer["Dashboard"], + GroupName = MenuItemGroups.General.Name, + Match = NavLinkMatch.All + } + }; + + return new ValueTask>(menuItems); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Dashboard/Pages/Index.razor b/src/modules/Elsa.Studio.Dashboard/Pages/Index.razor new file mode 100644 index 0000000..027422e --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/Pages/Index.razor @@ -0,0 +1,13 @@ +@page "/" +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +Index + + + + @Localizer["Manage all the things"] + @Localizer["You can find documentation and examples here"]: v3.elsaworkflows.io + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Dashboard/_Imports.razor b/src/modules/Elsa.Studio.Dashboard/_Imports.razor new file mode 100644 index 0000000..854cf75 --- /dev/null +++ b/src/modules/Elsa.Studio.Dashboard/_Imports.razor @@ -0,0 +1,6 @@ +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Elsa.Studio.Components +@using Elsa.Studio.Localization +@using MudBlazor +@attribute [Authorize] \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Components/EnvironmentPicker.razor b/src/modules/Elsa.Studio.Environments/Components/EnvironmentPicker.razor new file mode 100644 index 0000000..f1f62eb --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Components/EnvironmentPicker.razor @@ -0,0 +1,49 @@ +@using MudBlazor +@using Elsa.Studio.Environments.Contracts +@using Elsa.Studio.Environments.Models +@inherits StudioComponentBase +@implements IDisposable +@inject IEnvironmentService EnvironmentService; + + + @foreach (var environment in EnvironmentService.Environments) + { + @environment.Name + } + + +@code +{ + private void ChangeEnvironment(ServerEnvironment environment) + { + EnvironmentService.SetCurrentEnvironment(environment.Name); + StateHasChanged(); + } + + protected override void OnInitialized() + { + EnvironmentService.EnvironmentsChanged += OnEnvironmentsChanged; + EnvironmentService.CurrentEnvironmentChanged += OnCurrentEnvironmentChanged; + } + + public void Dispose() + { + EnvironmentService.EnvironmentsChanged -= OnEnvironmentsChanged; + EnvironmentService.CurrentEnvironmentChanged -= OnCurrentEnvironmentChanged; + } + + private void OnEnvironmentsChanged() + { + StateHasChanged(); + } + + private void OnCurrentEnvironmentChanged() => StateHasChanged(); +} diff --git a/src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentService.cs b/src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentService.cs new file mode 100644 index 0000000..d6cdd5e --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentService.cs @@ -0,0 +1,42 @@ +using Elsa.Studio.Environments.Models; + +namespace Elsa.Studio.Environments.Contracts; + +/// +/// Manages the environment in which the dashboard is running. +/// +public interface IEnvironmentService +{ + /// + /// Raised when the list of environments changed. + /// + event Action? EnvironmentsChanged; + + /// + /// Raised when the current environment changed. + /// + event Action CurrentEnvironmentChanged; + + /// + /// The current environment. + /// + ServerEnvironment? CurrentEnvironment { get; } + + /// + /// Gets or sets a list of environments. + /// + IEnumerable Environments { get; } + + /// + /// Sets the list of environments. + /// + /// The environments to set. + /// The name of the default environment. + void SetEnvironments(IEnumerable environments, string? defaultEnvironmentName = null); + + /// + /// Sets the current environment. + /// + /// The name of the current environment to set. + void SetCurrentEnvironment(string name); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentsClient.cs b/src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentsClient.cs new file mode 100644 index 0000000..a668cb4 --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Contracts/IEnvironmentsClient.cs @@ -0,0 +1,20 @@ +using Elsa.Studio.Environments.Models; +using Refit; + +namespace Elsa.Studio.Environments.Contracts; + +/// +/// An HTTP client for the Environments API. +/// +public interface IEnvironmentsClient +{ + /// + /// Returns a list of environments from the API. + /// + /// The cancellation token. + /// A list of environments. + [Get("/environments")] + Task ListEnvironmentsAsync(CancellationToken cancellationToken = default); +} + +public record ListEnvironmentsResponse(ICollection Environments, string? DefaultEnvironmentName); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Elsa.Studio.Environments.csproj b/src/modules/Elsa.Studio.Environments/Elsa.Studio.Environments.csproj new file mode 100644 index 0000000..f7860bc --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Elsa.Studio.Environments.csproj @@ -0,0 +1,22 @@ + + + + Adds support for connecting to different Elsa Workflows environments. + elsa studio module + + + + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Environments/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Environments/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..5fac01d --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Environments.Contracts; +using Elsa.Studio.Environments.Services; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Elsa.Studio.Environments.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the environments module. + /// + public static IServiceCollection AddEnvironmentsModule(this IServiceCollection services) + { + services.AddScoped(); + services.Replace(ServiceDescriptor.Scoped()); + //services.AddSingleton(); + services.AddScoped(); + return services; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/FodyWeavers.xml b/src/modules/Elsa.Studio.Environments/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/FodyWeavers.xsd b/src/modules/Elsa.Studio.Environments/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Models/ServerEnvironment.cs b/src/modules/Elsa.Studio.Environments/Models/ServerEnvironment.cs new file mode 100644 index 0000000..aecc5b5 --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Models/ServerEnvironment.cs @@ -0,0 +1,22 @@ +namespace Elsa.Studio.Environments.Models; + +/// +/// Represents the environment in which the workflow engine is running. +/// +public class ServerEnvironment +{ + /// + /// The name of the environment. + /// + public string Name { get; set; } = default!; + + /// + /// The URL of the server hosting the workflow engine. + /// + public Uri Url { get; set; } = default!; + + /// + /// A dictionary of custom properties. + /// + public IDictionary CustomProperties { get; set; } = new Dictionary(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Module.cs b/src/modules/Elsa.Studio.Environments/Module.cs new file mode 100644 index 0000000..43094fe --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Module.cs @@ -0,0 +1,15 @@ +using Elsa.Studio.Abstractions; +using Elsa.Studio.Contracts; +using Elsa.Studio.Environments.Components; + +namespace Elsa.Studio.Environments; + +public class Feature(IAppBarService appBarService) : FeatureBase +{ + public override ValueTask InitializeAsync(CancellationToken cancellationToken = default) + { + appBarService.AddAppBarItem(); + + return ValueTask.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Services/DefaultEnvironmentService.cs b/src/modules/Elsa.Studio.Environments/Services/DefaultEnvironmentService.cs new file mode 100644 index 0000000..5b2ce2a --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Services/DefaultEnvironmentService.cs @@ -0,0 +1,38 @@ +using Elsa.Studio.Environments.Contracts; +using Elsa.Studio.Environments.Models; + +namespace Elsa.Studio.Environments.Services; + +public class DefaultEnvironmentService : IEnvironmentService +{ + public event Action? EnvironmentsChanged; + public event Action? CurrentEnvironmentChanged; + + public ServerEnvironment? CurrentEnvironment { get; private set; } + public IEnumerable Environments { get; private set; } = new List(); + + public void SetEnvironments(IEnumerable environments, string? defaultEnvironmentName = null) + { + var environmentList = environments.ToList(); + Environments = environmentList; + + if (defaultEnvironmentName != null) + SetCurrentEnvironment(defaultEnvironmentName); + else if (CurrentEnvironment == null) + SetCurrentEnvironment(environmentList.FirstOrDefault()?.Name ?? string.Empty); + + EnvironmentsChanged?.Invoke(); + } + + public void SetCurrentEnvironment(string name) + { + var environments = Environments.ToList(); + var environment = environments.FirstOrDefault(x => x.Name == name); + + if (environment == null || CurrentEnvironment == environment) + return; + + CurrentEnvironment = environment; + CurrentEnvironmentChanged?.Invoke(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Services/EnvironmentBackendApiClientProvider.cs b/src/modules/Elsa.Studio.Environments/Services/EnvironmentBackendApiClientProvider.cs new file mode 100644 index 0000000..7986eec --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Services/EnvironmentBackendApiClientProvider.cs @@ -0,0 +1,38 @@ +using Elsa.Api.Client.Extensions; +using Elsa.Studio.Contracts; +using Elsa.Studio.Environments.Contracts; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Environments.Services; + +/// +/// An environment-aware backend connection provider that returns the URL to the currently selected environment, if any. +/// +public class EnvironmentBackendApiClientProvider : IBackendApiClientProvider +{ + private readonly IEnvironmentService _environmentService; + private readonly IRemoteBackendAccessor _remoteBackendAccessor; + + /// + /// Initializes a new instance of the class. + /// + public EnvironmentBackendApiClientProvider(IEnvironmentService environmentService, IRemoteBackendAccessor remoteBackendAccessor) + { + _environmentService = environmentService; + _remoteBackendAccessor = remoteBackendAccessor; + } + + /// + public Uri Url => _environmentService.CurrentEnvironment?.Url ?? _remoteBackendAccessor.RemoteBackend.Url; + + /// + public async ValueTask GetApiAsync(CancellationToken cancellationToken = default) where T : class + { + var services = new ServiceCollection().AddDefaultApiClients(x => + { + x.BaseAddress = Url; + //x.ConfigureHttpClient = httpClient => httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + }).BuildServiceProvider(); + return services.GetRequiredService(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/Tasks/LoadEnvironmentsStartupTask.cs b/src/modules/Elsa.Studio.Environments/Tasks/LoadEnvironmentsStartupTask.cs new file mode 100644 index 0000000..31a6472 --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/Tasks/LoadEnvironmentsStartupTask.cs @@ -0,0 +1,13 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Environments.Contracts; + +namespace Elsa.Studio.Environments.Tasks; + +public class LoadEnvironmentsStartupTask(IEnvironmentsClient environmentsClient, IEnvironmentService environmentService) : IStartupTask +{ + public async ValueTask ExecuteAsync(CancellationToken cancellationToken = default) + { + var response = await environmentsClient.ListEnvironmentsAsync(cancellationToken); + environmentService.SetEnvironments(response.Environments, response.DefaultEnvironmentName); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Environments/_Imports.razor b/src/modules/Elsa.Studio.Environments/_Imports.razor new file mode 100644 index 0000000..33be4d4 --- /dev/null +++ b/src/modules/Elsa.Studio.Environments/_Imports.razor @@ -0,0 +1,4 @@ +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Elsa.Studio.Components +@attribute [Authorize] \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization.BlazorServer/Controllers/CultureController.cs b/src/modules/Elsa.Studio.Localization.BlazorServer/Controllers/CultureController.cs new file mode 100644 index 0000000..ea331d8 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorServer/Controllers/CultureController.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Localization; +using Microsoft.AspNetCore.Mvc; + +namespace Elsa.Studio.Localization.BlazorServer.Controllers; + +/// +/// Controller for setting the culture. +/// +[Route("[controller]/[action]")] +public class CultureController : Controller +{ + /// + /// Sets the culture and redirects to the specified URI. + /// + public IActionResult Set(string? culture, string redirectUri) + { + if (culture != null) + { + HttpContext.Response.Cookies.Append( + CookieRequestCultureProvider.DefaultCookieName, + CookieRequestCultureProvider.MakeCookieValue( + new RequestCulture(culture, culture))); + } + + return LocalRedirect(redirectUri); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization.BlazorServer/Elsa.Studio.Localization.BlazorServer.csproj b/src/modules/Elsa.Studio.Localization.BlazorServer/Elsa.Studio.Localization.BlazorServer.csproj new file mode 100644 index 0000000..dfe9ba1 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorServer/Elsa.Studio.Localization.BlazorServer.csproj @@ -0,0 +1,15 @@ + + + + Adds support for localization to Elsa Studio Blazor Server Apps. + elsa studio module + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..8aed2dc --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,19 @@ +using Elsa.Studio.Localization.BlazorServer.Services; +using Elsa.Studio.Localization.Extensions; +using Elsa.Studio.Localization.Models; +using Elsa.Studio.Localization.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Localization.BlazorServer.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddLocalizationModule(this IServiceCollection services, LocalizationConfig localizationConfig) + { + services.AddControllers(); + services.AddLocalizationModuleCore(localizationConfig); + services.AddScoped(); + + return services; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/WebApplicationExtensions.cs b/src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/WebApplicationExtensions.cs new file mode 100644 index 0000000..7664991 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorServer/Extensions/WebApplicationExtensions.cs @@ -0,0 +1,28 @@ +using Elsa.Studio.Localization.Options; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; + +namespace Elsa.Studio.Localization.BlazorServer.Extensions; + +public static class WebApplicationExtensions +{ + public static WebApplication UseElsaLocalization(this WebApplication app) + { + var localisationOptions = app.Services.GetService>()?.Value; + var defaultCulture = localisationOptions?.DefaultCulture; + var supportedCultures = localisationOptions?.SupportedCultures; + + if (supportedCultures != null) + { + var localizationOptions = new RequestLocalizationOptions() + .SetDefaultCulture(defaultCulture ?? new LocalizationOptions().DefaultCulture) + .AddSupportedCultures(supportedCultures) + .AddSupportedUICultures(supportedCultures); + + app.UseRequestLocalization(localizationOptions); + } + + return app; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization.BlazorServer/Services/BlazorServerCultureService.cs b/src/modules/Elsa.Studio.Localization.BlazorServer/Services/BlazorServerCultureService.cs new file mode 100644 index 0000000..4bc5a0e --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorServer/Services/BlazorServerCultureService.cs @@ -0,0 +1,31 @@ +using Elsa.Studio.Localization.Services; +using Microsoft.AspNetCore.Components; +using System.Globalization; + +namespace Elsa.Studio.Localization.BlazorServer.Services; + +/// +public class BlazorServerCultureService(NavigationManager navigationManager) : ICultureService +{ + /// + public Task ChangeCultureAsync(CultureInfo culture) + { + if (CultureInfo.CurrentUICulture.Name != culture.Name) + { + var cultureString = culture.Name; + var uri = new Uri(navigationManager.Uri).GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped); + + // Set culture of the current thread. + CultureInfo.CurrentCulture = culture; + CultureInfo.CurrentUICulture = culture; + var cultureEscaped = Uri.EscapeDataString(cultureString); + var uriEscaped = Uri.EscapeDataString(uri); + + navigationManager.NavigateTo( + $"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}", + forceLoad: true); + } + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization.BlazorWasm/Elsa.Studio.Localization.BlazorWasm.csproj b/src/modules/Elsa.Studio.Localization.BlazorWasm/Elsa.Studio.Localization.BlazorWasm.csproj new file mode 100644 index 0000000..14ccf19 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorWasm/Elsa.Studio.Localization.BlazorWasm.csproj @@ -0,0 +1,19 @@ + + + + Adds support for localization to Elsa Studio Blazor Wasm Apps. + elsa studio module + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..0208530 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,20 @@ +using Elsa.Studio.Localization.BlazorWasm.Services; +using Elsa.Studio.Localization.Extensions; +using Elsa.Studio.Localization.Models; +using Elsa.Studio.Localization.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Localization.BlazorWasm.Extensions +{ + public static class ServiceCollectionExtensions + { + public static IServiceCollection AddLocalizationModule(this IServiceCollection services, LocalizationConfig localizationConfig) + { + services.AddLocalizationModuleCore(localizationConfig); + + services.AddScoped(); + + return services; + } + } +} diff --git a/src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/WebAssemblyHostExtensions.cs b/src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/WebAssemblyHostExtensions.cs new file mode 100644 index 0000000..bc66681 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorWasm/Extensions/WebAssemblyHostExtensions.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.JSInterop; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Studio.Localization.BlazorWasm.Extensions +{ + public static class WebAssemblyHostExtensions + { + public static async Task UseElsaLocalization(this WebAssemblyHost host) { + + const string defaultCulture = "en-US"; + var js = host.Services.GetRequiredService(); + var module = await js.InvokeAsync("import", "./_content/Elsa.Studio.Localization.BlazorWasm/blazorCulture.js"); + var result = await js.InvokeAsync("blazorCulture.get"); + + var culture = CultureInfo.GetCultureInfo(result ?? defaultCulture); + + if (result == null) + { + await js.InvokeVoidAsync("blazorCulture.set", defaultCulture); + } + + CultureInfo.DefaultThreadCurrentCulture = culture; + CultureInfo.DefaultThreadCurrentUICulture = culture; + + return host; + } + } +} diff --git a/src/modules/Elsa.Studio.Localization.BlazorWasm/Services/BlazorWasmCultureService.cs b/src/modules/Elsa.Studio.Localization.BlazorWasm/Services/BlazorWasmCultureService.cs new file mode 100644 index 0000000..7a24a1d --- /dev/null +++ b/src/modules/Elsa.Studio.Localization.BlazorWasm/Services/BlazorWasmCultureService.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Localization.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using System.Globalization; + +namespace Elsa.Studio.Localization.BlazorWasm.Services +{ + /// + public class BlazorWasmCultureService(NavigationManager navigationManager, IJSRuntime jSRuntime) : ICultureService + { + private IJSObjectReference? _module; + + /// + public async Task ChangeCultureAsync(CultureInfo culture) + { + if (CultureInfo.CurrentUICulture.Name != culture.Name) + { + _module = await jSRuntime.InvokeAsync("import", "./_content/Elsa.Studio.Localization.BlazorWasm/blazorCulture.js"); + await jSRuntime.InvokeVoidAsync("blazorCulture.set", culture.Name); + + navigationManager.NavigateTo(navigationManager.Uri, forceLoad: true); + } + } + } +} diff --git a/src/modules/Elsa.Studio.Localization/Components/LanguagePicker.razor b/src/modules/Elsa.Studio.Localization/Components/LanguagePicker.razor new file mode 100644 index 0000000..ae92bb8 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/Components/LanguagePicker.razor @@ -0,0 +1,32 @@ +@inject IOptions LocalizationOptions +@inject ICultureService CultureService + + + @foreach (var culture in _cultures) + { + @LocalizationOptions.Value.CulturePickerFormatter(culture) + } + + +@code { + private List _cultures = []; + + /// + protected override void OnInitialized() + { + _cultures = LocalizationOptions.Value?.SupportedCultures.Select(s => new CultureInfo(s)).ToList() ?? []; + } + + private async void ChangeCulture(CultureInfo culture) + { + await CultureService.ChangeCultureAsync(culture); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization/Elsa.Studio.Localization.csproj b/src/modules/Elsa.Studio.Localization/Elsa.Studio.Localization.csproj new file mode 100644 index 0000000..e228dc3 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/Elsa.Studio.Localization.csproj @@ -0,0 +1,21 @@ + + + + Adds support for localization to Elsa Studio. + elsa studio module + + + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Localization/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Localization/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..5780224 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,19 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization.Models; +using Microsoft.Extensions.DependencyInjection; +using MudBlazor.Translations; + +namespace Elsa.Studio.Localization.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddLocalizationModuleCore(this IServiceCollection services,LocalizationConfig localizationConfig) + { + services.AddLocalization(); + services.AddMudTranslations(); + services.Configure(localizationConfig.ConfigureLocalizationOptions); + services.AddScoped(); + + return services; + } +} diff --git a/src/modules/Elsa.Studio.Localization/FodyWeavers.xml b/src/modules/Elsa.Studio.Localization/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization/FodyWeavers.xsd b/src/modules/Elsa.Studio.Localization/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization/LocalizationFeature.cs b/src/modules/Elsa.Studio.Localization/LocalizationFeature.cs new file mode 100644 index 0000000..07bd6e0 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/LocalizationFeature.cs @@ -0,0 +1,14 @@ +using Elsa.Studio.Abstractions; +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization.Components; + +namespace Elsa.Studio.Localization; +public class LocalizationFeature(IAppBarService appBarService) : FeatureBase +{ + public override ValueTask InitializeAsync(CancellationToken cancellationToken = default) + { + appBarService.AddAppBarItem(); + + return ValueTask.CompletedTask; + } +} diff --git a/src/modules/Elsa.Studio.Localization/Models/LocalizationConfig.cs b/src/modules/Elsa.Studio.Localization/Models/LocalizationConfig.cs new file mode 100644 index 0000000..5b84158 --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/Models/LocalizationConfig.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Localization.Options; + +namespace Elsa.Studio.Localization.Models; + +public class LocalizationConfig +{ + public Action ConfigureLocalizationOptions { get; set; } = _ => { }; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization/Options/LocalizationOptions.cs b/src/modules/Elsa.Studio.Localization/Options/LocalizationOptions.cs new file mode 100644 index 0000000..6c4801b --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/Options/LocalizationOptions.cs @@ -0,0 +1,26 @@ +using System.Globalization; + +namespace Elsa.Studio.Localization.Options; + +/// +/// Options for localization settings. +/// +public class LocalizationOptions +{ + public static string LocalizationSection = "Localization"; + + /// + /// Gets or sets the supported cultures. + /// + public string[] SupportedCultures { get; set; } = []; + + /// + /// Gets or sets the default culture. + /// + public string DefaultCulture { get; set; } = "en-US"; + + /// + /// Gets or sets the culture picker formatter + /// + public Func CulturePickerFormatter { get; set; } = info => info.Name; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization/README.md b/src/modules/Elsa.Studio.Localization/README.md new file mode 100644 index 0000000..9db203a --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/README.md @@ -0,0 +1,71 @@ +# Elsa Studio Localization +Elsa Studio Localization Allows localizing the Studio UI to different languages. + +`ILocalizationProvider` is the interface that needs to be implemented to provide the localized strings for the Studio UI. + +Create your own localization file (Using the resource file or any alternative method' and implement the `ILocalizationProvider` interface. + +Afterwards, register your implementation in the DI container. + +```cssharp +builder.Services.AddSingleton(); +``` + +## Steps to Enable Localization + +### For Blazor Server +1. Add Reference to `Elsa.Studio.Localization.BlazorServer` package. +1. Define the Localization Configuration + ```csharp + var localizationConfig = new LocalizationConfig + { + ConfigureLocalizationOptions = options => configuration.GetSection("Localization").Bind(options), + }; + ``` +1. Register the Localization Module `builder.Services.AddLocalizationModule();` +1. Register your locallization provider + ```csharp + builder.Services.AddSingleton(); + ``` +1. Add The localization Middleware. Making Sure that Controllers are also mapped. + ```csharp + app.UseElsaLocalization(); + app.MapControllers(); + ``` +1. Add below configuration in the `appsettings.json` file, specifying the supported cultures. + ```json + "Localization": { + "SupportedCultures": [ + "ja-JP", + "fr-FR" + ] + } + ``` + +### For Blazor WebAssembly +1. Add Reference to `Elsa.Studio.Localization.BlazorWasm` package. +1. Define the Localization Configuration + ```csharp + var localizationConfig = new LocalizationConfig + { + ConfigureLocalizationOptions = options => configuration.GetSection("Localization").Bind(options), + }; + ``` +1. Register the Localization Module `builder.Services.AddLocalizationModule();` +1. Register your locallization provider + ```csharp + builder.Services.AddSingleton(); + ``` +1. Use the localization Middleware + ```csharp + await app.UseElsaLocalization(); + ``` +1. Add below configuration in the `appsettings.json` file, specifying the supported cultures. + ```json + "Localization": { + "SupportedCultures": [ + "ja-JP", + "fr-FR" + ] + } + ``` \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization/Services/ICultureService.cs b/src/modules/Elsa.Studio.Localization/Services/ICultureService.cs new file mode 100644 index 0000000..4be127c --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/Services/ICultureService.cs @@ -0,0 +1,14 @@ +using System.Globalization; + +namespace Elsa.Studio.Localization.Services; + +/// +/// Service to change the culture of the application. +/// +public interface ICultureService +{ + /// + /// Change the culture of the application. + /// + Task ChangeCultureAsync(CultureInfo culture); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Localization/_Imports.razor b/src/modules/Elsa.Studio.Localization/_Imports.razor new file mode 100644 index 0000000..d3a381c --- /dev/null +++ b/src/modules/Elsa.Studio.Localization/_Imports.razor @@ -0,0 +1,9 @@ +@using Elsa.Studio.Components +@using Elsa.Studio.Localization.Options +@using Elsa.Studio.Localization.Services +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.Extensions.Options +@using Microsoft.JSInterop +@using MudBlazor +@using System.Globalization \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorServer/Elsa.Studio.Login.BlazorServer.csproj b/src/modules/Elsa.Studio.Login.BlazorServer/Elsa.Studio.Login.BlazorServer.csproj new file mode 100644 index 0000000..3a4a707 --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorServer/Elsa.Studio.Login.BlazorServer.csproj @@ -0,0 +1,17 @@ + + + + Elsa Studio Login module for Blazor Server apps. + elsa studio module login blazor server + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Login.BlazorServer/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Login.BlazorServer/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..de90e61 --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorServer/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,34 @@ +using Blazored.LocalStorage; +using Elsa.Studio.Login.BlazorServer.Services; +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Login.BlazorServer.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds login services with Blazor Server implementations. + /// + public static IServiceCollection AddLoginModule(this IServiceCollection services) + { + // Add the login module. + services.AddLoginModuleCore(); + + // Register HttpContextAccessor. + services.AddHttpContextAccessor(); + + // Register Blazored LocalStorage. + services.AddBlazoredLocalStorage(); + + // Register JWT services. + services.AddSingleton(); + services.AddScoped(); + + return services; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xml b/src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xsd b/src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorServer/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtAccessor.cs b/src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtAccessor.cs new file mode 100644 index 0000000..8fa7bef --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtAccessor.cs @@ -0,0 +1,40 @@ +using Blazored.LocalStorage; +using Elsa.Studio.Login.Contracts; +using Microsoft.AspNetCore.Http; + +namespace Elsa.Studio.Login.BlazorServer.Services; + +/// +/// Implements the interface for server-side Blazor. +/// +public class BlazorServerJwtAccessor : IJwtAccessor +{ + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly ILocalStorageService _localStorageService; + + /// + /// Initializes a new instance of the class. + /// + public BlazorServerJwtAccessor(IHttpContextAccessor httpContextAccessor, ILocalStorageService localStorageService) + { + _httpContextAccessor = httpContextAccessor; + _localStorageService = localStorageService; + } + + /// + public async ValueTask ReadTokenAsync(string name) + { + if (IsPrerendering()) + return null; + + return await _localStorageService.GetItemAsync(name); + } + + /// + public async ValueTask WriteTokenAsync(string name, string token) + { + await _localStorageService.SetItemAsStringAsync(name, token); + } + + private bool IsPrerendering() => _httpContextAccessor.HttpContext?.Response.HasStarted == false; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtParser.cs b/src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtParser.cs new file mode 100644 index 0000000..32162e0 --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorServer/Services/BlazorServerJwtParser.cs @@ -0,0 +1,17 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using Elsa.Studio.Login.Contracts; + +namespace Elsa.Studio.Login.BlazorServer.Services; + +/// +public class BlazorServerJwtParser : IJwtParser +{ + /// + public IEnumerable Parse(string jwt) + { + var handler = new JwtSecurityTokenHandler(); + var jwtSecurityToken = handler.ReadJwtToken(jwt); + return jwtSecurityToken.Claims; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorWasm/Elsa.Studio.Login.BlazorWasm.csproj b/src/modules/Elsa.Studio.Login.BlazorWasm/Elsa.Studio.Login.BlazorWasm.csproj new file mode 100644 index 0000000..b0d890e --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorWasm/Elsa.Studio.Login.BlazorWasm.csproj @@ -0,0 +1,12 @@ + + + + Elsa Studio Login module for Blazor Web Assembly apps. + elsa studio module login blazor wasm + + + + + + + diff --git a/src/modules/Elsa.Studio.Login.BlazorWasm/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Login.BlazorWasm/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..a080cb9 --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorWasm/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,31 @@ +using Blazored.LocalStorage; +using Elsa.Studio.Login.BlazorWasm.Services; +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Login.BlazorWasm.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds login services with Blazor Server implementations. + /// + public static IServiceCollection AddLoginModule(this IServiceCollection services) + { + // Add the login module. + services.AddLoginModuleCore(); + + // Register Blazored LocalStorage. + services.AddBlazoredLocalStorage(); + + // Register JWT services. + services.AddSingleton(); + services.AddScoped(); + + return services; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xml b/src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xsd b/src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorWasm/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtAccessor.cs b/src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtAccessor.cs new file mode 100644 index 0000000..f63855e --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtAccessor.cs @@ -0,0 +1,31 @@ +using Blazored.LocalStorage; +using Elsa.Studio.Login.Contracts; + +namespace Elsa.Studio.Login.BlazorWasm.Services; + +/// +public class BlazorWasmJwtAccessor : IJwtAccessor +{ + private readonly ILocalStorageService _localStorageService; + + /// + /// + /// + /// + public BlazorWasmJwtAccessor(ILocalStorageService localStorageService) + { + _localStorageService = localStorageService; + } + + /// + public async ValueTask ReadTokenAsync(string name) + { + return await _localStorageService.GetItemAsync(name); + } + + /// + public async ValueTask WriteTokenAsync(string name, string token) + { + await _localStorageService.SetItemAsStringAsync(name, token); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtParser.cs b/src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtParser.cs new file mode 100644 index 0000000..d7589f1 --- /dev/null +++ b/src/modules/Elsa.Studio.Login.BlazorWasm/Services/BlazorWasmJwtParser.cs @@ -0,0 +1,43 @@ +using Elsa.Studio.Login.Contracts; +using Microsoft.AspNetCore.WebUtilities; +using System.Security.Claims; +using System.Text.Json; +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Login.BlazorWasm.Services; + +/// +public class BlazorWasmJwtParser : IJwtParser +{ + // Taken and adapted from: https://trystanwilcock.com/2022/09/28/net-6-0-blazor-webassembly-jwt-token-authentication-from-scratch-c-sharp-wasm-tutorial/ + /// + public IEnumerable Parse(string jwt) + { + var payload = jwt.Split('.')[1]; + var jsonBytes = WebEncoders.Base64UrlDecode(payload); + var keyValuePairs = JsonSerializer.Deserialize>(jsonBytes)!; + foreach (var (key, value) in keyValuePairs) + { + // Having an ClaimsIdentity with the following claims + // new Claim("A", "val1"); + // new Claim("A", "val2"); + // is serialized as + // { "A": ["val1", "val2"] } + // so handle that here + if (value is JsonArray array) + { + foreach (var arrayValue in array) + { + if (arrayValue != null) + { + yield return new Claim(key, arrayValue.ToString()); + } + } + } + else + { + yield return new Claim(key, value.ToString()); + } + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/ComponentProviders/RedirectToLoginUnauthorizedComponentProvider.cs b/src/modules/Elsa.Studio.Login/ComponentProviders/RedirectToLoginUnauthorizedComponentProvider.cs new file mode 100644 index 0000000..40608d0 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/ComponentProviders/RedirectToLoginUnauthorizedComponentProvider.cs @@ -0,0 +1,16 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Login.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Login.ComponentProviders; + +/// +public class RedirectToLoginUnauthorizedComponentProvider : IUnauthorizedComponentProvider +{ + /// + public RenderFragment GetUnauthorizedComponent() + { + return builder => builder.CreateComponent(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Components/LoginState.razor b/src/modules/Elsa.Studio.Login/Components/LoginState.razor new file mode 100644 index 0000000..2a673d8 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Components/LoginState.razor @@ -0,0 +1,42 @@ +@using Elsa.Studio.Login.Contracts +@using Microsoft.AspNetCore.Components.Authorization +@inherits StudioComponentBase +@implements IDisposable +@inject AuthenticationStateProvider AuthenticationStateProvider +@inject IEndSessionService EndSessionService + +@if (@CurrentState?.User.Identity?.IsAuthenticated is true) +{ + + Logout + +} + +@code +{ + private AuthenticationState? CurrentState; + + protected override async Task OnInitializedAsync() + { + CurrentState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); + AuthenticationStateProvider.AuthenticationStateChanged += OnCurrentEnvironmentChanged; + } + + public void Dispose() + { + AuthenticationStateProvider.AuthenticationStateChanged -= OnCurrentEnvironmentChanged; + } + + private async void OnCurrentEnvironmentChanged(Task state) + { + CurrentState = await state; + StateHasChanged(); + } +} diff --git a/src/modules/Elsa.Studio.Login/Components/ReceiveAuthorizationCode.cs b/src/modules/Elsa.Studio.Login/Components/ReceiveAuthorizationCode.cs new file mode 100644 index 0000000..4bc64c5 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Components/ReceiveAuthorizationCode.cs @@ -0,0 +1,30 @@ +using Elsa.Studio.Components; +using Elsa.Studio.Login.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Login.Components; + +/// +/// Receives the OIDC authorization code and trades it for access_token +/// +[Route("/signin-oidc")] +public sealed class ReceiveAuthorizationCode : StudioComponentBase +{ + /// + /// Gets or sets the . + /// + [Inject] private IAuthorizationService AuthorizationService { get; set; } = default!; + + [SupplyParameterFromQuery(Name = "code")] private string? AuthorizationCode { get; set; } + + [SupplyParameterFromQuery(Name = "state")] private string? State { get; set; } + + /// + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (AuthorizationCode != null) + { + await AuthorizationService.ReceiveAuthorizationCode(AuthorizationCode, State, default); + } + } +} diff --git a/src/modules/Elsa.Studio.Login/Components/RedirectToLogin.cs b/src/modules/Elsa.Studio.Login/Components/RedirectToLogin.cs new file mode 100644 index 0000000..2722818 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Components/RedirectToLogin.cs @@ -0,0 +1,21 @@ +using Elsa.Studio.Login.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Login.Components; + +/// +/// Redirects to the login page. +/// +public class RedirectToLogin : ComponentBase +{ + /// + /// Gets or sets the . + /// + [Inject] protected IAuthorizationService AuthorizationService { get; set; } = default!; + + /// + protected override Task OnAfterRenderAsync(bool firstRender) + { + return AuthorizationService.RedirectToAuthorizationServer(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Contracts/IAuthorizationService.cs b/src/modules/Elsa.Studio.Login/Contracts/IAuthorizationService.cs new file mode 100644 index 0000000..aa06458 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Contracts/IAuthorizationService.cs @@ -0,0 +1,17 @@ +namespace Elsa.Studio.Login.Contracts; + +/// +/// Provides a service to acquire an access_token from an authorization server +/// +public interface IAuthorizationService +{ + /// + /// Redirects the user agent to the authorization server for authentication + /// + Task RedirectToAuthorizationServer(); + + /// + /// Trades a authorization code received from the authorization server for an access_token + /// + Task ReceiveAuthorizationCode(string code, string? state, CancellationToken cancellationToken); +} diff --git a/src/modules/Elsa.Studio.Login/Contracts/ICredentialsValidator.cs b/src/modules/Elsa.Studio.Login/Contracts/ICredentialsValidator.cs new file mode 100644 index 0000000..ed7b220 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Contracts/ICredentialsValidator.cs @@ -0,0 +1,18 @@ +using Elsa.Studio.Login.Models; + +namespace Elsa.Studio.Login.Contracts; + +/// +/// A validator for credentials. +/// +public interface ICredentialsValidator +{ + /// + /// Validates the credentials. + /// + /// The username. + /// The password. + /// An optional cancellation token. + /// A instance. + ValueTask ValidateCredentialsAsync(string username, string password, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Contracts/IEndSessionService.cs b/src/modules/Elsa.Studio.Login/Contracts/IEndSessionService.cs new file mode 100644 index 0000000..7d72aed --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Contracts/IEndSessionService.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Login.Contracts; + +/// +/// Provides a service to end the session with an authorization server +/// +public interface IEndSessionService +{ + /// + /// Remove authentication state and end the session with the authorization server + /// + Task LogoutAsync(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Contracts/IJwtAccessor.cs b/src/modules/Elsa.Studio.Login/Contracts/IJwtAccessor.cs new file mode 100644 index 0000000..388d43a --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Contracts/IJwtAccessor.cs @@ -0,0 +1,17 @@ +namespace Elsa.Studio.Login.Contracts; + +/// +/// Reads the token from storage (e.g. cookie, local storage, etc.). +/// +public interface IJwtAccessor +{ + /// + /// Reads the token from storage (e.g. cookie, local storage, etc.). + /// + ValueTask ReadTokenAsync(string name); + + /// + /// Writes the token to storage (e.g. cookie, local storage, etc.). + /// + ValueTask WriteTokenAsync(string name, string token); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Contracts/IJwtParser.cs b/src/modules/Elsa.Studio.Login/Contracts/IJwtParser.cs new file mode 100644 index 0000000..752894f --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Contracts/IJwtParser.cs @@ -0,0 +1,14 @@ +using System.Security.Claims; + +namespace Elsa.Studio.Login.Contracts; + +/// +/// Parses a JWT token and returns the claims. +/// +public interface IJwtParser +{ + /// + /// Parses a JWT token and returns the claims. + /// + IEnumerable Parse(string jwt); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Contracts/IRefreshTokenService.cs b/src/modules/Elsa.Studio.Login/Contracts/IRefreshTokenService.cs new file mode 100644 index 0000000..8b44d0c --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Contracts/IRefreshTokenService.cs @@ -0,0 +1,14 @@ +using Elsa.Api.Client.Resources.Identity.Responses; + +namespace Elsa.Studio.Login.Contracts; + +/// +/// Provides a service to refresh an access_token from an authorization server +/// +public interface IRefreshTokenService +{ + /// + /// Refreshes the access_token + /// + Task RefreshTokenAsync(CancellationToken cancellationToken); +} diff --git a/src/modules/Elsa.Studio.Login/Elsa.Studio.Login.csproj b/src/modules/Elsa.Studio.Login/Elsa.Studio.Login.csproj new file mode 100644 index 0000000..a21f422 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Elsa.Studio.Login.csproj @@ -0,0 +1,26 @@ + + + + Adds a user login screen that integrates with the `Elsa.Identity` backend module. + elsa studio module + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Login/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Login/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..8fd7fe5 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,80 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Login.ComponentProviders; +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.HttpMessageHandlers; +using Elsa.Studio.Login.Models; +using Elsa.Studio.Login.Services; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; + +namespace Elsa.Studio.Login.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the login module to the service collection. + /// + public static IServiceCollection AddLoginModuleCore(this IServiceCollection services) + { + return services + .AddScoped() + .AddOptions() + .AddAuthorizationCore() + .AddScoped() + .AddScoped() + .AddScoped() + ; + } + + /// + /// Configures the login module to use elsa identity + /// + public static IServiceCollection UseElsaIdentity(this IServiceCollection services) + { + return services + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + ; + } + + /// + /// Configures the service collection to use OAuth2 for credential validation and related services. + /// + public static IServiceCollection UseOAuth2(this IServiceCollection services, Action configure) + { + services.Configure(configure); + + services.AddHttpClient(httpClient => + { + var options = services.BuildServiceProvider().GetRequiredService>().Value; + httpClient.BaseAddress = new(options.TokenEndpoint); + }); + + return services + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + ; + } + + /// + /// Configures the login module to use OpenIdConnect (OIDC) + /// + public static IServiceCollection UseOpenIdConnect(this IServiceCollection services, Action configure) + { + services.Configure(configure); + + return services + .AddScoped() + .AddScoped() + .AddScoped() + ; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/FodyWeavers.xml b/src/modules/Elsa.Studio.Login/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Login/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/FodyWeavers.xsd b/src/modules/Elsa.Studio.Login/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Login/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/HttpMessageHandlers/AuthenticatingApiHttpMessageHandler.cs b/src/modules/Elsa.Studio.Login/HttpMessageHandlers/AuthenticatingApiHttpMessageHandler.cs new file mode 100644 index 0000000..5e39eaa --- /dev/null +++ b/src/modules/Elsa.Studio.Login/HttpMessageHandlers/AuthenticatingApiHttpMessageHandler.cs @@ -0,0 +1,36 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Login.Contracts; +using Microsoft.Extensions.DependencyInjection; +using System.Net; + +namespace Elsa.Studio.Login.HttpMessageHandlers; + +/// +/// An that configures the outgoing HTTP request to use the access token as bearer token. +/// +public class AuthenticatingApiHttpMessageHandler(IRefreshTokenService refreshTokenService, IBlazorServiceAccessor blazorServiceAccessor) + : DelegatingHandler +{ + /// + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + var sp = blazorServiceAccessor.Services; + var jwtAccessor = sp.GetRequiredService(); + var accessToken = await jwtAccessor.ReadTokenAsync(TokenNames.AccessToken); + request.Headers.Authorization = new("Bearer", accessToken); + + var response = await base.SendAsync(request, cancellationToken); + + if (response.StatusCode == HttpStatusCode.Unauthorized) + { + // Refresh token and retry once. + var tokens = await refreshTokenService.RefreshTokenAsync(cancellationToken); + request.Headers.Authorization = new("Bearer", tokens.AccessToken); + + // Retry. + response = await base.SendAsync(request, cancellationToken); + } + + return response; + } +} diff --git a/src/modules/Elsa.Studio.Login/LoginFeature.cs b/src/modules/Elsa.Studio.Login/LoginFeature.cs new file mode 100644 index 0000000..4b30fd8 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/LoginFeature.cs @@ -0,0 +1,16 @@ +using Elsa.Studio.Abstractions; +using Elsa.Studio.Contracts; +using Elsa.Studio.Login.Components; + +namespace Elsa.Studio.Login; + +/// +public class LoginFeature(IAppBarService appBarService) : FeatureBase +{ + /// + public override ValueTask InitializeAsync(CancellationToken cancellationToken = default) + { + appBarService.AddAppBarItem(); + return base.InitializeAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Models/IdentityTokenOptions.cs b/src/modules/Elsa.Studio.Login/Models/IdentityTokenOptions.cs new file mode 100644 index 0000000..cf23026 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Models/IdentityTokenOptions.cs @@ -0,0 +1,20 @@ +using Elsa.Studio.Login.Services; +using System.Security.Claims; + +namespace Elsa.Studio.Login.Models; + +/// +/// Provides options to configure how a ClaimsIdentity is created by +/// +public class IdentityTokenOptions +{ + /// + /// The claim type that is being used to identify the name of the created ClaimsIdentity + /// + public string NameClaimType { get; set; } = ClaimsIdentity.DefaultNameClaimType; + + /// + /// The claim type that is being used to identify the role of the created ClaimsIdentity + /// + public string RoleClaimType { get; set; } = ClaimsIdentity.DefaultRoleClaimType; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Models/OAuth2CredentialsValidatorOptions.cs b/src/modules/Elsa.Studio.Login/Models/OAuth2CredentialsValidatorOptions.cs new file mode 100644 index 0000000..d898541 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Models/OAuth2CredentialsValidatorOptions.cs @@ -0,0 +1,29 @@ +namespace Elsa.Studio.Login.Models; + +/// +/// Represents configuration options for the OAuth2 credentials validation process. +/// +public class OAuth2CredentialsValidatorOptions +{ + /// + /// The URL of the OAuth2 token endpoint. + /// + public string TokenEndpoint { get; set; } = string.Empty; + + /// + /// The client ID to use for the OAuth2 client. + /// + public string ClientId { get; set; } = string.Empty; + + /// + /// The client secret to use for the OAuth2 client (if confidential). + /// + public string? ClientSecret { get; set; } + + /// + /// The scope of access being requested during the OAuth2 authentication process. + /// Typically, this defines the permissions or resources the client is requesting + /// authorization for. + /// + public string? Scope { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Models/OpenIdConnectConfiguration.cs b/src/modules/Elsa.Studio.Login/Models/OpenIdConnectConfiguration.cs new file mode 100644 index 0000000..dfd9436 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Models/OpenIdConnectConfiguration.cs @@ -0,0 +1,32 @@ +namespace Elsa.Studio.Login.Models; + +/// +/// Provides configuration necessary for correct OpenIdConnect operation +/// +public class OpenIdConnectConfiguration +{ + /// + /// The authorization_endpoint as given by the openid-configuration + /// + public required string AuthEndpoint { get; set; } + + /// + /// The token_endpoint as given by the openid-configuration + /// + public required string TokenEndpoint { get; set; } + + /// + /// The end_session_endpoint as given by the openid-configuration + /// + public required string EndSessionEndpoint { get; set; } + + /// + /// The client_id as which this application is registered with the authorization server + /// + public required string ClientId { get; set; } + + /// + /// The scopes to request, defaulting to: openid profile offline_access + /// + public string[] Scopes { get; set; } = ["openid", "profile", "offline_access"]; +} diff --git a/src/modules/Elsa.Studio.Login/Models/TokenResponse.cs b/src/modules/Elsa.Studio.Login/Models/TokenResponse.cs new file mode 100644 index 0000000..7673cec --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Models/TokenResponse.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Serialization; + +namespace Elsa.Studio.Login.Models; + +public sealed class TokenResponse +{ + [JsonPropertyName("access_token")] public string? AccessToken { get; set; } + [JsonPropertyName("id_token")] public string? IdToken { get; set; } + [JsonPropertyName("refresh_token")] public string? RefreshToken { get; set; } + [JsonPropertyName("expires_in")] public int ExpiresIn { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Models/ValidateCredentialsResult.cs b/src/modules/Elsa.Studio.Login/Models/ValidateCredentialsResult.cs new file mode 100644 index 0000000..cd3440c --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Models/ValidateCredentialsResult.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Login.Models; + +public record ValidateCredentialsResult(bool IsAuthenticated, string? AccessToken, string? RefreshToken); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor b/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor new file mode 100644 index 0000000..def8671 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor @@ -0,0 +1,35 @@ +@page "/login" +@inherits StudioComponentBase +@layout BasicLayout + +@* *@ \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.cs b/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.cs new file mode 100644 index 0000000..989725f --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.cs @@ -0,0 +1,77 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Pages.Login.Models; +using Elsa.Studio.Login.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.WebUtilities; +using MudBlazor; + +namespace Elsa.Studio.Login.Pages.Login; + +/// +/// The login page. +/// +[AllowAnonymous] +public partial class Login +{ + private readonly LoginModel _model = new(); + + [Inject] private IJwtAccessor JwtAccessor { get; set; } = default!; + [Inject] private ICredentialsValidator CredentialsValidator { get; set; } = default!; + [Inject] private NavigationManager NavigationManager { get; set; } = default!; + [Inject] private ISnackbar Snackbar { get; set; } = default!; + [Inject] private AuthenticationStateProvider AuthenticationStateProvider { get; set; } = default!; + [Inject] private IClientInformationProvider ClientInformationProvider { get; set; } = default!; + [Inject] private IServerInformationProvider ServerInformationProvider { get; set; } = default!; + + private string ClientVersion { get; set; } = "3.0.0"; + private string ServerVersion { get; set; } = "3.0.0"; + + /// + protected override async Task OnInitializedAsync() + { + var clientInformation = await ClientInformationProvider.GetInfoAsync(); + var serverInformation = await ServerInformationProvider.GetInfoAsync(); + ClientVersion = clientInformation.PackageVersion; + ServerVersion = string.Join('.', serverInformation.PackageVersion.Split('.').Take(2)); + } + + private async Task TryLogin() + { + var isValid = await ValidateCredentials(_model.Username, _model.Password); + if (!isValid) + { + Snackbar.Add("Invalid credentials. Please try again", Severity.Error); + return; + } + + ((AccessTokenAuthenticationStateProvider)AuthenticationStateProvider).NotifyAuthenticationStateChanged(); + + var uri = new Uri(NavigationManager.Uri); + if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("returnUrl", out var returnUrl)) + { + NavigationManager.NavigateTo(returnUrl.FirstOrDefault() ?? "", true); + } + else + { + NavigationManager.NavigateTo("", true); + } + } + + private async Task ValidateCredentials(string username, string password) + { + if (string.IsNullOrEmpty(username) && string.IsNullOrEmpty(password)) + return false; + + var result = await CredentialsValidator.ValidateCredentialsAsync(username, password); + + if (!result.IsAuthenticated) + return false; + + await JwtAccessor.WriteTokenAsync(TokenNames.AccessToken, result.AccessToken!); + await JwtAccessor.WriteTokenAsync(TokenNames.RefreshToken, result.RefreshToken!); + return true; + } +} diff --git a/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.css b/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.css new file mode 100644 index 0000000..29bb79a --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Pages/Login/Login.razor.css @@ -0,0 +1,8 @@ +h2.LoginTitle { + text-align: center; + text-transform: uppercase; + font-family: 'Grandstander', cursive; + font-size: 60px; + color: #ffffff; + opacity: 0.8; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Pages/Login/Models/LoginModel.cs b/src/modules/Elsa.Studio.Login/Pages/Login/Models/LoginModel.cs new file mode 100644 index 0000000..aa852b0 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Pages/Login/Models/LoginModel.cs @@ -0,0 +1,8 @@ +namespace Elsa.Studio.Login.Pages.Login.Models; + +internal class LoginModel +{ + public string Username { get; set; } = default!; + public string Password { get; set; } = default!; + public bool RememberMe { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Services/AccessTokenAuthenticationStateProvider.cs b/src/modules/Elsa.Studio.Login/Services/AccessTokenAuthenticationStateProvider.cs new file mode 100644 index 0000000..b82df40 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/AccessTokenAuthenticationStateProvider.cs @@ -0,0 +1,45 @@ +using Elsa.Studio.Extensions; +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Models; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.Extensions.Options; +using System.Security.Claims; + +namespace Elsa.Studio.Login.Services; + +/// +/// Provides the authentication state for the current user based on an access token. +/// +public class AccessTokenAuthenticationStateProvider(IJwtAccessor jwtAccessor, IJwtParser jwtParser, IOptions options) : AuthenticationStateProvider +{ + /// + public override async Task GetAuthenticationStateAsync() + { + var authToken = await jwtAccessor.ReadTokenAsync(TokenNames.IdToken) + ?? await jwtAccessor.ReadTokenAsync(TokenNames.AccessToken); + + if (string.IsNullOrEmpty(authToken)) + return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); + + var claims = jwtParser.Parse(authToken).ToList(); + var isExpired = claims.IsExpired(); + + // If the token has expired, return an empty authentication state. + if (isExpired) + return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); + + // Otherwise, return the authentication state. + var identity = new ClaimsIdentity(claims, "jwt", options.Value.NameClaimType, options.Value.RoleClaimType); + var user = new ClaimsPrincipal(identity); + + return new AuthenticationState(user); + } + + /// + /// Notifies the authentication state has changed. + /// + public void NotifyAuthenticationStateChanged() + { + NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Services/ElsaIdentityAuthorizationService.cs b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityAuthorizationService.cs new file mode 100644 index 0000000..f988890 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityAuthorizationService.cs @@ -0,0 +1,30 @@ +using Elsa.Studio.Login.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Login.Services; + +/// +internal class ElsaIdentityAuthorizationService(NavigationManager NavigationManager) : IAuthorizationService +{ + /// + public Task RedirectToAuthorizationServer() + { + var returnUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri); + if (string.IsNullOrWhiteSpace(returnUrl)) + { + NavigationManager.NavigateTo("login", true); + } + else + { + NavigationManager.NavigateTo($"login?returnUrl={returnUrl}", true); + } + + return Task.CompletedTask; + } + + /// + public Task ReceiveAuthorizationCode(string code, string? state, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } +} diff --git a/src/modules/Elsa.Studio.Login/Services/ElsaIdentityCredentialsValidator.cs b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityCredentialsValidator.cs new file mode 100644 index 0000000..3024508 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityCredentialsValidator.cs @@ -0,0 +1,33 @@ +using Elsa.Api.Client.Resources.Identity.Contracts; +using Elsa.Api.Client.Resources.Identity.Requests; +using Elsa.Studio.Contracts; +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Models; + +namespace Elsa.Studio.Login.Services; + +/// +/// A implementation of that consumes the endpoints from Elsa.Identity. +/// +public class ElsaIdentityCredentialsValidator : ICredentialsValidator +{ + private readonly IBackendApiClientProvider _backendApiClientProvider; + /// + /// Initializes a new instance of the class. + /// + public ElsaIdentityCredentialsValidator(IBackendApiClientProvider backendApiClientProvider) + { + _backendApiClientProvider = backendApiClientProvider; + } + + /// + public async ValueTask ValidateCredentialsAsync(string username, string password, CancellationToken cancellationToken = default) + { + var api = await _backendApiClientProvider.GetApiAsync(cancellationToken); + + var request = new LoginRequest(username, password); + var response = await api.LoginAsync(request, cancellationToken); + + return new ValidateCredentialsResult(response.IsAuthenticated, response.AccessToken, response.RefreshToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Services/ElsaIdentityEndSessionService.cs b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityEndSessionService.cs new file mode 100644 index 0000000..fddd19c --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityEndSessionService.cs @@ -0,0 +1,16 @@ +using Elsa.Studio.Login.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Login.Services; + +/// +public class ElsaIdentityEndSessionService(IJwtAccessor jwtAccessor, NavigationManager navigationManager) : IEndSessionService +{ + /// + public async Task LogoutAsync() + { + await jwtAccessor.WriteTokenAsync(TokenNames.AccessToken, ""); + await jwtAccessor.WriteTokenAsync(TokenNames.RefreshToken, ""); + navigationManager.NavigateTo("/", true); + } +} diff --git a/src/modules/Elsa.Studio.Login/Services/ElsaIdentityRefreshTokenService.cs b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityRefreshTokenService.cs new file mode 100644 index 0000000..8b08049 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/ElsaIdentityRefreshTokenService.cs @@ -0,0 +1,40 @@ +using Elsa.Api.Client.Resources.Identity.Responses; +using Elsa.Studio.Contracts; +using Elsa.Studio.Login.Contracts; +using System.Net; +using System.Net.Http.Json; + +namespace Elsa.Studio.Login.Services; + +/// +public class ElsaIdentityRefreshTokenService(IRemoteBackendAccessor remoteBackendAccessor, IJwtAccessor jwtAccessor, HttpClient httpClient) : IRefreshTokenService +{ + /// + public async Task RefreshTokenAsync(CancellationToken cancellationToken) + { + // Get refresh token. + var refreshToken = await jwtAccessor.ReadTokenAsync(TokenNames.RefreshToken); + + // Setup request to get new tokens. + var url = remoteBackendAccessor.RemoteBackend.Url + "/identity/refresh-token"; + var refreshRequestMessage = new HttpRequestMessage(HttpMethod.Post, url); + refreshRequestMessage.Headers.Authorization = new("Bearer", refreshToken); + + // Send request. + var response = await httpClient.SendAsync(refreshRequestMessage, cancellationToken); + + // If the refresh token is invalid, we can't do anything. + if (response.StatusCode == HttpStatusCode.Unauthorized) + return new(false, null, null); + + // Parse response into tokens. + var tokens = (await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken))!; + + // Store tokens. + await jwtAccessor.WriteTokenAsync(TokenNames.RefreshToken, tokens.RefreshToken!); + await jwtAccessor.WriteTokenAsync(TokenNames.AccessToken, tokens.AccessToken!); + + // Return tokens. + return tokens; + } +} diff --git a/src/modules/Elsa.Studio.Login/Services/OAuth2CredentialsValidator.cs b/src/modules/Elsa.Studio.Login/Services/OAuth2CredentialsValidator.cs new file mode 100644 index 0000000..742fcc1 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/OAuth2CredentialsValidator.cs @@ -0,0 +1,24 @@ +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Models; +using Microsoft.Extensions.Options; + +namespace Elsa.Studio.Login.Services; + +/// +/// Validates OAuth2 credentials using a token endpoint, client ID, and optional client secret. +/// +public class OAuth2CredentialsValidator(IOptions options, OAuth2HttpClient httpClient) : ICredentialsValidator +{ + /// + public async ValueTask ValidateCredentialsAsync(string username, string password, CancellationToken cancellationToken = default) + { + var tokenResponse = await httpClient.RequestTokenAsync(username, password, cancellationToken); + + // If the access token is null or empty, the validation failed. + if (string.IsNullOrEmpty(tokenResponse.AccessToken)) + return new(false, null, null); + + // Return the result with the access token and refresh token. + return new(true, tokenResponse.AccessToken, tokenResponse.RefreshToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Services/OAuth2HttpClient.cs b/src/modules/Elsa.Studio.Login/Services/OAuth2HttpClient.cs new file mode 100644 index 0000000..2e85731 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/OAuth2HttpClient.cs @@ -0,0 +1,45 @@ +using System.Net.Http.Json; +using Elsa.Studio.Login.Models; +using Microsoft.Extensions.Options; + +namespace Elsa.Studio.Login.Services; + +/// +/// Provides functionality for interacting with an OAuth2 token endpoint to request tokens. +/// +public class OAuth2HttpClient(HttpClient httpClient, IOptions options) +{ + private readonly OAuth2CredentialsValidatorOptions _options = options.Value; + + /// + /// Sends a token request to the OAuth2 token endpoint using the specified credentials. + /// + /// The username to authenticate with. + /// The password to authenticate with. + /// A cancellation token used to cancel the operation. + /// A containing the access token, refresh token, and other token details. + /// Thrown when the response cannot be read or contains no valid data. + public async Task RequestTokenAsync(string username, string password, CancellationToken cancellationToken = default) + { + var request = new HttpRequestMessage(HttpMethod.Post, _options.TokenEndpoint); + var content = new Dictionary + { + { "grant_type", "password" }, + { "username", username }, + { "password", password }, + { "client_id", _options.ClientId }, + }; + + if (!string.IsNullOrEmpty(_options.ClientSecret)) content["client_secret"] = _options.ClientSecret; + if (!string.IsNullOrEmpty(_options.Scope)) content["scope"] = _options.Scope; + + request.Content = new FormUrlEncodedContent(content); + + var response = await httpClient.SendAsync(request, cancellationToken); + + if (!response.IsSuccessStatusCode) + return new(); + + return await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken) ?? throw new InvalidOperationException("Failed to read token response."); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs b/src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs new file mode 100644 index 0000000..c2857cd --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/OpenIdConnectAuthorizationService.cs @@ -0,0 +1,61 @@ +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.WebUtilities; +using Microsoft.Extensions.Options; +using System.Net; +using System.Net.Http.Json; +using System.Text; + +namespace Elsa.Studio.Login.Services; + +/// +public class OpenIdConnectAuthorizationService(IJwtAccessor jwtAccessor, IOptions configuration, NavigationManager navigationManager, HttpClient httpClient) : IAuthorizationService +{ + /// + public Task RedirectToAuthorizationServer() + { + var config = configuration.Value; + var redirectUri = new Uri(navigationManager.Uri).GetLeftPart(UriPartial.Authority) + "/signin-oidc"; + string url = config.AuthEndpoint + $"?client_id={WebUtility.UrlEncode(config.ClientId)}&redirect_uri={WebUtility.UrlEncode(redirectUri)}&response_type=code&scope={WebUtility.UrlEncode(String.Join(' ', config.Scopes))}"; + if (navigationManager.ToBaseRelativePath(navigationManager.Uri) is { } returnUrl and not "/") + { + url += "&state=" + WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(returnUrl)); + } + + navigationManager.NavigateTo(url, true); + return Task.CompletedTask; + } + + /// + public async Task ReceiveAuthorizationCode(string code, string? state, CancellationToken cancellationToken) + { + var config = configuration.Value; + var redirectUri = new Uri(navigationManager.Uri).GetLeftPart(UriPartial.Authority) + "/signin-oidc"; + + var refreshRequestMessage = new HttpRequestMessage(HttpMethod.Post, config.TokenEndpoint); + refreshRequestMessage.Content = new FormUrlEncodedContent( + [ + new KeyValuePair("client_id", config.ClientId), + new KeyValuePair("code", code), + new KeyValuePair("grant_type", "authorization_code"), + new KeyValuePair("redirect_uri", redirectUri), + ]); + + // Send request. + var response = await httpClient.SendAsync(refreshRequestMessage, cancellationToken); + + var tokens = (await response.Content.ReadFromJsonAsync(cancellationToken))!; + + await jwtAccessor.WriteTokenAsync(TokenNames.RefreshToken, tokens.RefreshToken ?? ""); + await jwtAccessor.WriteTokenAsync(TokenNames.AccessToken, tokens.AccessToken ?? ""); + await jwtAccessor.WriteTokenAsync(TokenNames.IdToken, tokens.IdToken ?? ""); + + string returnUrl = "/"; + if (!String.IsNullOrWhiteSpace(state)) + { + returnUrl = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(state)); + } + navigationManager.NavigateTo(returnUrl, true); + } +} diff --git a/src/modules/Elsa.Studio.Login/Services/OpenIdConnectEndSessionService.cs b/src/modules/Elsa.Studio.Login/Services/OpenIdConnectEndSessionService.cs new file mode 100644 index 0000000..fe09bfd --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/OpenIdConnectEndSessionService.cs @@ -0,0 +1,31 @@ +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Options; +using System.Net; + +namespace Elsa.Studio.Login.Services; + +/// +public class OpenIdConnectEndSessionService(IOptions options, IJwtAccessor jwtAccessor, NavigationManager navigationManager) : IEndSessionService +{ + /// + public async Task LogoutAsync() + { + await jwtAccessor.WriteTokenAsync(TokenNames.AccessToken, ""); + await jwtAccessor.WriteTokenAsync(TokenNames.RefreshToken, ""); + + string logoutUrl = "/"; + if (options.Value.EndSessionEndpoint is { } endSessionEndpoint) + { + logoutUrl = endSessionEndpoint + $"?post_logout_redirect_uri={WebUtility.UrlEncode(new Uri(navigationManager.Uri).GetLeftPart(UriPartial.Authority))}"; + if (await jwtAccessor.ReadTokenAsync(TokenNames.IdToken) is { } idToken && !String.IsNullOrWhiteSpace(idToken)) + { + logoutUrl += $"&id_token_hint={WebUtility.UrlEncode(idToken)}"; + } + } + + await jwtAccessor.WriteTokenAsync(TokenNames.IdToken, ""); + navigationManager.NavigateTo(logoutUrl, true); + } +} diff --git a/src/modules/Elsa.Studio.Login/Services/OpenIdConnectRefreshTokenService.cs b/src/modules/Elsa.Studio.Login/Services/OpenIdConnectRefreshTokenService.cs new file mode 100644 index 0000000..9b6c558 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/Services/OpenIdConnectRefreshTokenService.cs @@ -0,0 +1,47 @@ +using Elsa.Api.Client.Resources.Identity.Responses; +using Elsa.Studio.Login.Contracts; +using Elsa.Studio.Login.Models; +using Microsoft.Extensions.Options; +using System.Net.Http.Json; + +namespace Elsa.Studio.Login.Services; + +/// +public class OpenIdConnectRefreshTokenService(IOptions options, IJwtAccessor jwtAccessor, HttpClient httpClient) : IRefreshTokenService +{ + /// + public async Task RefreshTokenAsync(CancellationToken cancellationToken) + { + // Get refresh token. + var refreshToken = await jwtAccessor.ReadTokenAsync(TokenNames.RefreshToken); + if (refreshToken == null) + return new(false, null, null); + + // Setup request to get new tokens. + var refreshRequestMessage = new HttpRequestMessage(HttpMethod.Post, options.Value.TokenEndpoint); + refreshRequestMessage.Content = new FormUrlEncodedContent( + [ + new KeyValuePair("client_id", options.Value.ClientId), + new KeyValuePair("grant_type", "refresh_token"), + new KeyValuePair("refresh_token", refreshToken), + ]); + + // Send request. + var response = await httpClient.SendAsync(refreshRequestMessage, cancellationToken); + + // If the refresh token is invalid, we can't do anything. + if (!response.IsSuccessStatusCode) + return new(false, null, null); + + // Parse response into tokens. + var tokens = (await response.Content.ReadFromJsonAsync(cancellationToken: cancellationToken))!; + + // Store tokens. + await jwtAccessor.WriteTokenAsync(TokenNames.RefreshToken, tokens.RefreshToken ?? ""); + await jwtAccessor.WriteTokenAsync(TokenNames.AccessToken, tokens.AccessToken ?? ""); + await jwtAccessor.WriteTokenAsync(TokenNames.IdToken, tokens.IdToken ?? ""); + + // Return tokens. + return new(tokens.AccessToken != null, tokens.AccessToken, tokens.RefreshToken); + } +} diff --git a/src/modules/Elsa.Studio.Login/_Imports.razor b/src/modules/Elsa.Studio.Login/_Imports.razor new file mode 100644 index 0000000..9946f63 --- /dev/null +++ b/src/modules/Elsa.Studio.Login/_Imports.razor @@ -0,0 +1,7 @@ +@using System.ComponentModel.DataAnnotations +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Forms +@using MudBlazor +@using Elsa.Studio.Components +@using Elsa.Studio.Layouts \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/Client/ISecretsApi.cs b/src/modules/Elsa.Studio.Secrets/Client/ISecretsApi.cs new file mode 100644 index 0000000..b3594b5 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/Client/ISecretsApi.cs @@ -0,0 +1,47 @@ +using Elsa.Api.Client.Shared.Models; +using Elsa.Secrets; +using Elsa.Secrets.BulkActions; +using Elsa.Secrets.UniqueName; +using Refit; + +namespace Elsa.Studio.Secrets.Client; + +/// Represents a client API for managing secrets. +public interface ISecretsApi +{ + /// Lists all secrets. + [Get("/secrets")] + Task> ListAsync(CancellationToken cancellationToken = default); + + /// Gets a secret by ID. + [Get("/secrets/{id}")] + Task GetAsync(string id, CancellationToken cancellationToken = default); + + /// Gets a secret input model by ID. + [Get("/secrets/{id}/input")] + Task GetInputAsync(string id, CancellationToken cancellationToken = default); + + /// Generates a unique name for a secret. + [Post("/actions/secrets/generate-unique-name")] + Task GenerateUniqueNameAsync(CancellationToken cancellationToken = default); + + /// Checks if a name is unique for a secret. + [Post("/queries/secrets/is-unique-name")] + Task GetIsNameUniqueAsync(IsUniqueNameRequest request, CancellationToken cancellationToken); + + /// Creates a new secret. + [Post("/secrets")] + Task CreateAsync(SecretInputModel request, CancellationToken cancellationToken = default); + + /// Updates a secret. + [Post("/secrets/{id}")] + Task UpdateAsync(string id, SecretInputModel request, CancellationToken cancellationToken = default); + + /// Deletes a secret. + [Delete("/secrets/{id}")] + Task DeleteAsync(string id, CancellationToken cancellationToken = default); + + /// Deletes multiple secrets. + [Post("/bulk-actions/secrets/delete")] + Task BulkDeleteAsync(BulkDeleteRequest request, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj b/src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj new file mode 100644 index 0000000..72ddd77 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj @@ -0,0 +1,21 @@ + + + + Adds secrets management to the studio. + elsa studio module + + + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj.DotSettings b/src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj.DotSettings new file mode 100644 index 0000000..17962b1 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/Elsa.Studio.Secrets.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Secrets/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..f5b8ecf --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Models; +using Elsa.Studio.Secrets.Client; +using Elsa.Studio.Secrets.Menu; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Secrets; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the Secrets module. + /// + public static IServiceCollection AddSecretsModule(this IServiceCollection services, BackendApiConfig backendApiConfig) + { + return services + .AddScoped() + .AddScoped() + .AddRemoteApi(backendApiConfig); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/Extensions/TimeSpanExtensions.cs b/src/modules/Elsa.Studio.Secrets/Extensions/TimeSpanExtensions.cs new file mode 100644 index 0000000..a465b2e --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/Extensions/TimeSpanExtensions.cs @@ -0,0 +1,30 @@ +namespace Elsa.Studio.Secrets; + +/// +/// Provides extension methods for objects. +/// +public static class TimeSpanExtensions +{ + /// + /// Converts objects to a simple human-readable string. Examples: 3.1 seconds, 2 minutes, 4.23 hours, etc. + /// + /// The timespan. + /// Significant digits to use for output. + /// + public static string ToHumanTimeString(this TimeSpan span, int significantDigits = 3) + { + if(span <= TimeSpan.Zero) + return "0"; + + var format = "G" + significantDigits; + return span.TotalMilliseconds < 1000 + ? span.TotalMilliseconds.ToString(format) + " milliseconds" + : span.TotalSeconds < 60 + ? (int)span.TotalSeconds + " seconds" + : span.TotalMinutes < 60 + ? (int)span.TotalMinutes + " minutes" + : span.TotalHours < 24 + ? (int)span.TotalHours + " hours" + : (int)span.TotalDays + " days"; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/FodyWeavers.xml b/src/modules/Elsa.Studio.Secrets/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/FodyWeavers.xsd b/src/modules/Elsa.Studio.Secrets/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/Menu/SecretsMenu.cs b/src/modules/Elsa.Studio.Secrets/Menu/SecretsMenu.cs new file mode 100644 index 0000000..d0a4348 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/Menu/SecretsMenu.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using MudBlazor; + +namespace Elsa.Studio.Secrets.Menu; + +/// +/// Provides the menu items for the Secrets module. +/// +public class SecretsMenu(ILocalizer localizer) : IMenuProvider +{ + /// + public ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default) + { + var menuItems = new List + { + new() + { + Icon = Icons.Material.Filled.Key, + Href = "secrets", + Text = localizer["Secrets"], + GroupName = MenuItemGroups.Settings.Name + } + }; + + return new ValueTask>(menuItems); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/Module.cs b/src/modules/Elsa.Studio.Secrets/Module.cs new file mode 100644 index 0000000..112ea3c --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/Module.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Abstractions; + +namespace Elsa.Studio.Secrets; + +public class Feature : FeatureBase +{ + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor b/src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor new file mode 100644 index 0000000..0d37f4a --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor @@ -0,0 +1,34 @@ +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + + + + + + + + + + @Localizer["General"] + @Localizer["API Keys"] + @Localizer["Connection Strings"] + + + @Localizer["7 days"] + @Localizer["14 days"] + @Localizer["30 days"] + @Localizer["90 days"] + @Localizer["180 days"] + @Localizer["Never"] + + + + + + + @Localizer["Cancel"] + @Localizer["Ok"] + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor.cs b/src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor.cs new file mode 100644 index 0000000..ae01ef9 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/UI/Components/CreateSecretDialog.razor.cs @@ -0,0 +1,54 @@ +using Blazored.FluentValidation; +using Elsa.Secrets; +using Elsa.Studio.Contracts; +using Elsa.Studio.Secrets.Client; +using Elsa.Studio.Secrets.UI.Validators; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace Elsa.Studio.Secrets.UI.Components; + +/// A dialog that creates a new secret. +public partial class CreateSecretDialog +{ + private readonly SecretInputModel _inputModel = new(); + private EditContext _editContext = null!; + private FluentValidationValidator _fluentValidationValidator = null!; + private SecretInputModelValidator _validator = null!; + + /// The default name of the agent to create. + [Parameter] public string SecretName { get; set; } = ""; + [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; + [Inject] private IBackendApiClientProvider ApiClientProvider { get; set; } = null!; + + /// + protected override async Task OnInitializedAsync() + { + _inputModel.Name = SecretName; + _inputModel.Description = ""; + _editContext = new(_inputModel); + var api = await ApiClientProvider.GetApiAsync(); + _validator = new(api); + } + + private Task OnCancelClicked() + { + MudDialog.Cancel(); + return Task.CompletedTask; + } + + private async Task OnSubmitClicked() + { + if(!await _fluentValidationValidator.ValidateAsync()) + return; + + await OnValidSubmit(); + } + + private Task OnValidSubmit() + { + MudDialog.Close(_inputModel); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor new file mode 100644 index 0000000..a5e75b2 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor @@ -0,0 +1,68 @@ +@page "/secrets/{SecretId}" +@using Elsa.Secrets +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +@Localizer["Secret"] + + + + + + + + + + + + + + + + @Localizer["7 days"] + @Localizer["14 days"] + @Localizer["30 days"] + @Localizer["90 days"] + @Localizer["180 days"] + @Localizer["Never"] + + + + @Localizer["General"] + @Localizer["API Keys"] + @Localizer["Connection Strings"] + + + + + + + + + @Localizer["Save"] + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor.cs b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor.cs new file mode 100644 index 0000000..39f8800 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secret.razor.cs @@ -0,0 +1,51 @@ +using Elsa.Secrets; +using Elsa.Studio.Components; +using Elsa.Studio.Contracts; +using Elsa.Studio.Secrets.Client; +using Elsa.Studio.Secrets.UI.Validators; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Secrets.UI.Pages; + +public partial class Secret : StudioComponentBase +{ + /// The ID of the secret to edit. + [Parameter] public string SecretId { get; set; } = default!; + + [Inject] private IBackendApiClientProvider ApiClientProvider { get; set; } = default!; + [Inject] private ISnackbar Snackbar { get; set; } = default!; + [Inject] private NavigationManager NavigationManager { get; set; } = default!; + + private MudForm _form = default!; + private SecretInputModelValidator _validator = default!; + private SecretInputModel _model = new(); + + /// + protected override async Task OnInitializedAsync() + { + var apiClient = await ApiClientProvider.GetApiAsync(); + _validator = new SecretInputModelValidator(apiClient); + } + + /// + protected override async Task OnParametersSetAsync() + { + var apiClient = await ApiClientProvider.GetApiAsync(); + _model = await apiClient.GetInputAsync(SecretId); + } + + private async Task OnSaveClicked() + { + await _form.Validate(); + + if (!_form.IsValid) + return; + + var apiClient = await ApiClientProvider.GetApiAsync(); + await apiClient.UpdateAsync(SecretId, _model); + Snackbar.Add("Secret successfully updated.", Severity.Success); + StateHasChanged(); + NavigationManager.NavigateTo("secrets"); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor new file mode 100644 index 0000000..a20062d --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor @@ -0,0 +1,90 @@ +@page "/secrets" +@using Elsa.Secrets +@using Elsa.Studio.Secrets +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@code +{ + private DateTime _now = DateTime.UtcNow; +} + +@Localizer["Secrets"] + + + + + + + + @Localizer["Delete"] + + + + + @Localizer["Create Secret"] + + + + + + + + + + + + + @Localizer["Name"] + + + @Localizer["Scope"] + + + @Localizer["Version"] + + + @Localizer["Status"] + + + @Localizer["Expires"] + + + + + @context.Name + @(context.Scope ?? "-") + @context.Version + @context.Status + @(context.ExpiresAt == null ? "Never" : (context.ExpiresAt!.Value - _now).ToHumanTimeString(3)) + + + @Localizer["Edit"] + @Localizer["Delete"] + + + + + @Localizer["No secrets found"] + + + @Localizer["Loading"]... + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor.cs b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor.cs new file mode 100644 index 0000000..b58e990 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/UI/Pages/Secrets.razor.cs @@ -0,0 +1,126 @@ +using Elsa.Secrets; +using Elsa.Secrets.BulkActions; +using Elsa.Studio.Contracts; +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.Secrets.Client; +using Elsa.Studio.Secrets.UI.Components; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Secrets.UI.Pages; + +[UsedImplicitly] +public partial class Secrets +{ + private MudTable _table = null!; + private HashSet _selectedRows = new(); + + [Inject] private IDialogService DialogService { get; set; } = default!; + [Inject] private ISnackbar Snackbar { get; set; } = default!; + [Inject] NavigationManager NavigationManager { get; set; } = default!; + [Inject] private IBackendApiClientProvider ApiClientProvider { get; set; } = default!; + + private async Task GetApiAsync() + { + return await ApiClientProvider.GetApiAsync(); + } + + private async Task> ServerReload(TableState state, CancellationToken cancellationToken) + { + var apiClient = await GetApiAsync(); + var secrets = await apiClient.ListAsync(cancellationToken); + + return new TableData + { + TotalItems = (int)secrets.Count, + Items = secrets.Items + }; + } + + private async Task OnCreateClicked() + { + var apiClient = await GetApiAsync(); + var uniqueNameResponse = await apiClient.GenerateUniqueNameAsync(); + var name = uniqueNameResponse.Name; + + var parameters = new DialogParameters + { + { x => x.SecretName, name } + }; + + var options = new DialogOptions + { + CloseOnEscapeKey = true, + Position = DialogPosition.Center, + CloseButton = true, + FullWidth = true, + MaxWidth = MaxWidth.Small + }; + + var dialogInstance = await DialogService.ShowAsync("New Secret", parameters, options); + var dialogResult = await dialogInstance.Result; + + if (!dialogResult!.Canceled) + { + var inputModel = (SecretInputModel)dialogResult.Data; + try + { + var model = await apiClient.CreateAsync(inputModel); + //await EditAsync(model.Id); + Reload(); + } + catch (Exception e) + { + Snackbar.Add(e.Message, Severity.Error); + } + } + } + + private async Task EditAsync(string id) + { + await InvokeAsync(() => NavigationManager.NavigateTo($"secrets/{id}")); + } + + private void Reload() + { + _table.ReloadServerData(); + } + + private async Task OnEditClicked(string definitionId) + { + await EditAsync(definitionId); + } + + private async Task OnRowClick(TableRowClickEventArgs e) + { + await EditAsync(e.Item!.Id); + } + + private async Task OnDeleteClicked(SecretModel model) + { + var result = await DialogService.ShowMessageBox("Delete Secret?", "Are you sure you want to delete this secret?", yesText: "Delete", cancelText: "Cancel"); + + if (result != true) + return; + + var id = model.Id; + var apiClient = await GetApiAsync(); + await apiClient.DeleteAsync(id); + Reload(); + } + + private async Task OnBulkDeleteClicked() + { + var result = await DialogService.ShowMessageBox("Delete Selected Secrets?", "Are you sure you want to delete the selected secrets?", yesText: "Delete", cancelText: "Cancel"); + + if (result != true) + return; + + var ids = _selectedRows.Select(x => x.Id).ToList(); + var request = new BulkDeleteRequest { Ids = ids }; + var apiClient = await GetApiAsync(); + await apiClient.BulkDeleteAsync(request); + Reload(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/UI/Validators/SecretInputModelValidator.cs b/src/modules/Elsa.Studio.Secrets/UI/Validators/SecretInputModelValidator.cs new file mode 100644 index 0000000..975d023 --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/UI/Validators/SecretInputModelValidator.cs @@ -0,0 +1,32 @@ +using Elsa.Secrets; +using Elsa.Secrets.UniqueName; +using Elsa.Studio.Contracts; +using Elsa.Studio.Secrets.Client; +using FluentValidation; + +namespace Elsa.Studio.Secrets.UI.Validators; + +/// +/// A validator for instances. +/// +public class SecretInputModelValidator : AbstractValidator +{ + /// + public SecretInputModelValidator(ISecretsApi api) + { + RuleFor(x => x.Name).NotEmpty().WithMessage("Please enter a name for the secret."); + RuleFor(x => x.Value).NotEmpty().WithMessage("Please enter the secret value."); + + RuleFor(x => x.Name) + .MustAsync(async (context, name, cancellationToken) => + { + var request = new IsUniqueNameRequest + { + Name = name!, + }; + var response = await api.GetIsNameUniqueAsync(request, cancellationToken); + return response.IsUnique; + }) + .WithMessage("A secret with this name already exists."); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Secrets/_Imports.razor b/src/modules/Elsa.Studio.Secrets/_Imports.razor new file mode 100644 index 0000000..cdf191f --- /dev/null +++ b/src/modules/Elsa.Studio.Secrets/_Imports.razor @@ -0,0 +1,12 @@ +@using Elsa.Studio.Components +@using Elsa.Studio.Localization +@using Elsa.Studio.Secrets +@using Blazored.FluentValidation +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.JSInterop +@using MudBlazor +@using MudExtensions +@attribute [Authorize] \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Security/Elsa.Studio.Security.csproj b/src/modules/Elsa.Studio.Security/Elsa.Studio.Security.csproj new file mode 100644 index 0000000..395546b --- /dev/null +++ b/src/modules/Elsa.Studio.Security/Elsa.Studio.Security.csproj @@ -0,0 +1,16 @@ + + + + Adds user and role management to the studio. + elsa studio module + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Security/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Security/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..e58885a --- /dev/null +++ b/src/modules/Elsa.Studio.Security/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,15 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Security.Menu; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Security.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddSecurityModule(this IServiceCollection services) + { + return services + .AddScoped() + .AddScoped(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Security/FodyWeavers.xml b/src/modules/Elsa.Studio.Security/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Security/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Security/FodyWeavers.xsd b/src/modules/Elsa.Studio.Security/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Security/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Security/Menu/SecurityMenu.cs b/src/modules/Elsa.Studio.Security/Menu/SecurityMenu.cs new file mode 100644 index 0000000..3ee72e4 --- /dev/null +++ b/src/modules/Elsa.Studio.Security/Menu/SecurityMenu.cs @@ -0,0 +1,39 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using MudBlazor; + +namespace Elsa.Studio.Security.Menu; + +public class SecurityMenu : IMenuProvider +{ + public ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default) + { + var menuItems = new List + { + new() + { + Icon = Icons.Material.Filled.Security, + Href = "security/users", + Text = "Security", + GroupName = MenuItemGroups.Settings.Name, + SubMenuItems = + { + new MenuItem + { + Text = "Users", + Href = "security/users", + Icon = Icons.Material.Filled.Person + }, + new MenuItem + { + Text = "Roles", + Href = "security/roles", + Icon = Icons.Material.Filled.PeopleOutline + } + } + } + }; + + return new ValueTask>(menuItems); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Security/Module.cs b/src/modules/Elsa.Studio.Security/Module.cs new file mode 100644 index 0000000..431c176 --- /dev/null +++ b/src/modules/Elsa.Studio.Security/Module.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Abstractions; + +namespace Elsa.Studio.Security; + +public class Feature : FeatureBase +{ + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Security/Pages/Roles.razor b/src/modules/Elsa.Studio.Security/Pages/Roles.razor new file mode 100644 index 0000000..753996f --- /dev/null +++ b/src/modules/Elsa.Studio.Security/Pages/Roles.razor @@ -0,0 +1,8 @@ +@page "/security/roles" +@inherits StudioComponentBase + +Roles + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Security/Pages/Users.razor b/src/modules/Elsa.Studio.Security/Pages/Users.razor new file mode 100644 index 0000000..06be0c4 --- /dev/null +++ b/src/modules/Elsa.Studio.Security/Pages/Users.razor @@ -0,0 +1,8 @@ +@page "/security/users" +@inherits StudioComponentBase + +Users + + + + diff --git a/src/modules/Elsa.Studio.Security/_Imports.razor b/src/modules/Elsa.Studio.Security/_Imports.razor new file mode 100644 index 0000000..93919a4 --- /dev/null +++ b/src/modules/Elsa.Studio.Security/_Imports.razor @@ -0,0 +1,7 @@ +@using Elsa.Studio.Components +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.JSInterop +@using MudBlazor +@attribute [Authorize] \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Cases.razor b/src/modules/Elsa.Studio.UIHints/Components/Cases.razor new file mode 100644 index 0000000..2934619 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Cases.razor @@ -0,0 +1,62 @@ +@inherits StudioComponentBase +@inject ILocalizer Localizer + + + + @Localizer["Label"] + @Localizer["Condition"] + @Localizer["Type"] + + + + @context.Label + @context.Condition + @GetExpressionTypeDisplayName(@context.ExpressionType) + + + + + + + + + + + + + + @foreach (var expressionDescriptor in GetSupportedExpressions()) + { + @expressionDescriptor.DisplayName + } + + + + + + @Localizer["Add case"] + + + + @if (Items.Any()) + { + + @Localizer["Add case"] + + } + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Cases.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/Cases.razor.cs new file mode 100644 index 0000000..c313ab6 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Cases.razor.cs @@ -0,0 +1,210 @@ +using System.Diagnostics; +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Helpers; +using Elsa.Studio.Workflows.Domain.Models; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// Renders an editor for a collection of objects. +/// +public partial class Cases +{ + private readonly string[] _uiSyntaxes = { "Literal", "Object" }; + + private SwitchCaseRecord? _caseBeingEdited; + private SwitchCaseRecord? _caseBeingAdded; + private MudTable _table = default!; + + /// + /// The context for the editor. + /// + [Parameter] + public DisplayInputEditorContext EditorContext { get; set; } = default!; + + [CascadingParameter] private ExpressionDescriptorProvider ExpressionDescriptorProvider { get; set; } = default!; + + private ICollection Items { get; set; } = new List(); + private bool DisableAddButton => _caseBeingEdited != null || _caseBeingAdded != null; + + /// + protected override void OnParametersSet() + { + Items = GetItems(); + } + + private ICollection GetItems() + { + var input = EditorContext.GetObjectValueOrDefault(); + var cases = ParseJson(input); + var caseRecords = cases.Select(Map).ToList(); + return caseRecords; + } + + private IEnumerable ParseJson(string? json) + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + return JsonParser.ParseJson(json, () => new List(), options); + } + + private IEnumerable GetSupportedExpressions() + { + return ExpressionDescriptorProvider.ListDescriptors().Where(x => !_uiSyntaxes.Contains(x.Type) && x.IsBrowsable).ToList(); + } + + private string GetDefaultExpressionType() + { + var defaultExpressionType = GetSupportedExpressions().FirstOrDefault()?.Type ?? "Literal"; + return defaultExpressionType; + } + + private SwitchCaseRecord Map(SwitchCase @case) + { + var defaultExpressionType = GetDefaultExpressionType(); + + return new() + { + Label = @case.Label, + Condition = @case.Condition.ToString(), + ExpressionType = string.IsNullOrWhiteSpace(@case.Condition.Type) ? defaultExpressionType : @case.Condition.Type, + Activity = @case.Activity + }; + } + + private SwitchCase Map(SwitchCaseRecord switchCase) + { + var expression = new Expression(switchCase.ExpressionType, switchCase.Condition); + + return new() + { + Label = switchCase.Label, + Condition = expression, + Activity = switchCase.Activity + }; + } + + private Task SaveChangesAsync() + { + var cases = Items.Select(Map).ToList(); + + return EditorContext.UpdateValueAsync(cases); + } + + private async void OnRowEditCommitted(object data) + { + _caseBeingAdded = null; + _caseBeingEdited = null; + await SaveChangesAsync(); + StateHasChanged(); + } + + private void OnRowEditPreview(object obj) + { + var @case = (SwitchCaseRecord)obj; + _caseBeingEdited = new() + { + Label = @case.Label, + Condition = @case.Condition, + ExpressionType = @case.ExpressionType + }; + + StateHasChanged(); + } + + private async void OnRowEditCancel(object obj) + { + if (_caseBeingAdded != null) + { + Items.Remove(_caseBeingAdded); + await SaveChangesAsync(); + _caseBeingAdded = null; + StateHasChanged(); + return; + } + + var @case = (SwitchCaseRecord)obj; + @case.Condition = _caseBeingEdited?.Condition ?? ""; + @case.Label = _caseBeingEdited?.Label ?? ""; + @case.ExpressionType = _caseBeingEdited?.ExpressionType ?? ""; + _caseBeingEdited = null; + StateHasChanged(); + } + + private async Task OnDeleteClicked(SwitchCaseRecord switchCase) + { + Items.Remove(switchCase); + await SaveChangesAsync(); + } + + private void OnAddClicked() + { + var @case = new SwitchCaseRecord + { + Label = $"Case {Items.Count + 1}", + Condition = "", + ExpressionType = GetDefaultExpressionType() + }; + + Items.Add(@case); + _caseBeingAdded = @case; + + // Need to do it this way, otherwise MudTable doesn't show the item in edit mode. + _ = Task.Delay(1).ContinueWith(_ => + { + InvokeAsync(() => + { + _table.SetEditingItem(@case); + StateHasChanged(); + }); + }); + } + + private string GetExpressionTypeDisplayName(string expressionType) + { + var expressionDescriptor = ExpressionDescriptorProvider.GetByType(expressionType) ?? throw new($"Could not find expression descriptor for expression type '{expressionType}'."); + return expressionDescriptor.DisplayName; + } +} + +/// +/// Represents a single case in a activity. +/// +public class SwitchCaseRecord +{ + /// + /// The label of the case. + /// + public string Label { get; set; } = string.Empty; + + /// + /// The condition of the case. + /// + public string Condition { get; set; } = string.Empty; + + [Obsolete("Use ExpressionType instead.")] + public string Syntax + { + get => ExpressionType; + set => ExpressionType = value; + } + + /// + /// The expression type of the case. + /// + public string ExpressionType { get; set; } = "Literal"; + + /// + /// When used in a activity, specifies the activity to schedule when the condition evaluates to true. + /// + public JsonObject? Activity { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/CheckList.razor b/src/modules/Elsa.Studio.UIHints/Components/CheckList.razor new file mode 100644 index 0000000..c0bf394 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/CheckList.razor @@ -0,0 +1,19 @@ +@inherits StudioComponentBase +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; +} + + + + + @foreach (var item in _checkListItems) + { + + } + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/CheckList.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/CheckList.razor.cs new file mode 100644 index 0000000..be0efb8 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/CheckList.razor.cs @@ -0,0 +1,70 @@ +using Elsa.Api.Client.Shared.UIHints.CheckList; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Extensions; +using Elsa.Studio.UIHints.Helpers; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// A component that renders a check list. +/// +public partial class CheckList +{ + private ICollection _checkListItems = []; + + /// + /// The editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + /// + protected override void OnInitialized() + { + var checkList = EditorContext.InputDescriptor.GetCheckList(); + var selectedValues = GetSelectedValues(checkList.IsFlagsEnum); + + _checkListItems = checkList.Items + .Select(i => new CheckListItem { Value = i.Value, Text = i.Text, IsChecked = selectedValues.Contains(i.Value) }) + .ToList(); + } + + private ICollection GetSelectedValues(bool isFlagsEnum) + { + var inputDescriptor = EditorContext.InputDescriptor; + var input = EditorContext.GetObjectValueOrDefault(); + var defaultValue = inputDescriptor.DefaultValue; + var json = !string.IsNullOrWhiteSpace(input) ? input : defaultValue as string; + + if (isFlagsEnum) + { + return !string.IsNullOrWhiteSpace(json) + ? int.TryParse(json, out var n) ? [n.ToString()] : Array.Empty() + : [defaultValue?.ToString() ?? string.Empty]; + } + + var selectListItems = ParseJson(json); + + if (!selectListItems.Any()) + selectListItems = ParseJson(defaultValue as string); + + return selectListItems; + } + + private ICollection ParseJson(string? json) + { + return JsonParser.ParseJson>(json, () => new List()); + } + + private async Task OnCheckedChanged(CheckListItem item, bool? state) + { + // Toggle state. + item.IsChecked = state == true; + + // Get selected values. + var selectedValues = _checkListItems.Where(x => x.IsChecked).Select(x => x.Value).ToList(); + + // Update state. + await EditorContext.UpdateValueOrObjectExpressionAsync(selectedValues); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Checkbox.razor b/src/modules/Elsa.Studio.UIHints/Components/Checkbox.razor new file mode 100644 index 0000000..3f95b92 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Checkbox.razor @@ -0,0 +1,50 @@ +@using Elsa.Studio.Models +@using Elsa.Api.Client.Resources.Scripting.Models +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var inputValue = EditorContext.GetLiteralValueOrDefault(); + var isChecked = !string.IsNullOrWhiteSpace(inputValue) && bool.TryParse(inputValue, out var b) && b; +} + + + + + + + + + +@code { + + /// + /// The editor context. + /// + [Parameter] + public DisplayInputEditorContext EditorContext { get; set; } = null!; + + private async Task OnCheckChanged(bool? isChecked) + { + if (EditorContext.InputDescriptor.IsWrapped) + { + var newValue = isChecked == true ? "True" : "False"; + var expression = Expression.CreateLiteral(newValue); + + await EditorContext.UpdateExpressionAsync(expression); + } + else + { + await EditorContext.UpdateValueAsync(isChecked); + } + } + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Code.razor b/src/modules/Elsa.Studio.UIHints/Components/Code.razor new file mode 100644 index 0000000..f9a9cf0 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Code.razor @@ -0,0 +1,21 @@ +@using BlazorMonaco.Editor +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; +} + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Code.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/Code.razor.cs new file mode 100644 index 0000000..27b395f --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Code.razor.cs @@ -0,0 +1,130 @@ +using BlazorMonaco.Editor; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Shared.UIHints.CodeEditor; +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Extensions; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using ThrottleDebounce; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// A component that renders a code editor. +/// +public partial class Code : IDisposable +{ + private readonly string _monacoEditorId = $"monaco-editor-{Guid.NewGuid()}:N"; + private StandaloneCodeEditor? _monacoEditor; + private string _monacoLanguage = ""; + private string? _lastMonacoEditorContent; + private readonly RateLimitedFunc _throttledValueChanged; + private CodeEditorOptions _codeEditorOptions = new(); + private bool _isInternalContentChange; + + [Inject] private IJSRuntime JSRuntime { get; set; } = default!; + [Inject] private IEnumerable MonacoHandlers { get; set; } = default!; + + /// + public Code() + { + _throttledValueChanged = Debouncer.Debounce(InvokeValueChangedCallback, TimeSpan.FromMilliseconds(500)); + } + + /// + /// The context for the editor. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = default!; + + private string InputValue => EditorContext.GetLiteralValueOrDefault(); + + /// + protected override void OnInitialized() + { + _codeEditorOptions = EditorContext.InputDescriptor.GetCodeEditorOptions(); + _monacoLanguage = _codeEditorOptions.Language ?? "javascript"; + ; + } + + private StandaloneEditorConstructionOptions ConfigureMonacoEditor(StandaloneCodeEditor editor) + { + return new StandaloneEditorConstructionOptions + { + Language = _monacoLanguage, + Value = InputValue, + FontFamily = "Roboto Mono, monospace", + RenderLineHighlight = "none", + Minimap = new EditorMinimapOptions + { + Enabled = false + }, + AutomaticLayout = true, + LineNumbers = "on", + Theme = "vs", + RoundedSelection = true, + ScrollBeyondLastLine = false, + OverviewRulerLanes = 0, + OverviewRulerBorder = false, + LineDecorationsWidth = 0, + HideCursorInOverviewRuler = true, + GlyphMargin = false, + ReadOnly = EditorContext.IsReadOnly, + DomReadOnly = EditorContext.IsReadOnly + }; + } + + private async Task OnMonacoInitializedAsync() + { + _isInternalContentChange = true; + var model = await _monacoEditor!.GetModel(); + _lastMonacoEditorContent = InputValue; + await model.SetValue(InputValue); + _isInternalContentChange = false; + await Global.SetModelLanguage(JSRuntime, model, _monacoLanguage); + await RunMonacoHandlersAsync(_monacoEditor); + } + + private async Task OnMonacoContentChanged(ModelContentChangedEvent e) + { + if (_isInternalContentChange) + return; + + await _throttledValueChanged.InvokeAsync(); + } + + private async Task InvokeValueChangedCallback() + { + var value = await _monacoEditor!.GetValue(); + + // This event gets fired even when the content hasn't changed, but for example when the containing pane is resized. + // This happens from within the monaco editor itself (or the Blazor wrapper, not sure). + if (value == _lastMonacoEditorContent) + return; + + _lastMonacoEditorContent = value; + var expression = Expression.CreateLiteral(value); + + await InvokeAsync(async () => await EditorContext.UpdateExpressionAsync(expression)); + } + + private async Task RunMonacoHandlersAsync(StandaloneCodeEditor editor) + { + var customProps = new Dictionary + { + { nameof(ActivityDescriptor), EditorContext.ActivityDescriptor }, + { nameof(InputDescriptor), EditorContext.InputDescriptor }, + { "WorkflowDefinitionId", EditorContext.WorkflowDefinition.DefinitionId } + }; + + var expressionDescriptor = EditorContext.SelectedExpressionDescriptor ?? new ExpressionDescriptor("Default", "Default"); + var context = new MonacoContext(editor, expressionDescriptor, customProps); + + foreach (var handler in MonacoHandlers) + await handler.InitializeAsync(context); + } + + void IDisposable.Dispose() => _throttledValueChanged.Dispose(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/DateTimePicker.razor b/src/modules/Elsa.Studio.UIHints/Components/DateTimePicker.razor new file mode 100644 index 0000000..b18af61 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/DateTimePicker.razor @@ -0,0 +1,111 @@ +@using Elsa.Studio.Models +@using Elsa.Api.Client.Shared.UIHints.SingleLine +@using Elsa.Studio.DomInterop.Contracts +@using Elsa.Studio.UIHints.Extensions +@using System.Globalization + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = $"{inputDescriptor.DisplayName} (Date)"; + var displayTimeName = $"{inputDescriptor.DisplayName} (Time)"; +} + + + + + + + @if (showTimePicker) + { + + } + + @if (InputDateValue is not null) + { + + } + + + + +@code { + private bool showTimePicker; + private DateTime? inputDateValue; + private TimeSpan? inputTimeValue; + + public bool ShowTimePicker + { + get => showTimePicker; + set + { + showTimePicker = value; + if (showTimePicker == false) InputTimeValue = null; + } + } + public DateTime? InputDateValue + { + get => inputDateValue; + set + { + inputDateValue = value; + if (inputDateValue is null) + { + inputTimeValue = null; + showTimePicker = false; + } + OnValueChanged(); + } + } + public TimeSpan? InputTimeValue + { + get => inputTimeValue; + set + { + inputTimeValue = value; + OnValueChanged(); + } + } + + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + protected override void OnInitialized() + { + if (DateTime.TryParse(EditorContext.GetExpressionValueOrDefault(), out var parsedDate)) + { + inputDateValue = parsedDate; + inputTimeValue = parsedDate.TimeOfDay; + showTimePicker = parsedDate.TimeOfDay.Ticks != 0; + } + } + + private async Task OnValueChanged() + { + var combinedDateTime = InputDateValue?.Date.Add(InputTimeValue ?? TimeSpan.Zero); + await EditorContext.UpdateValueOrLiteralExpressionAsync(combinedDateTime?.ToString()); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor b/src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor new file mode 100644 index 0000000..8b32267 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor @@ -0,0 +1,30 @@ +@using Elsa.Api.Client.Shared.UIHints.DropDown +@inject ILocalizer Localizer + +@inherits StudioComponentBase +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var selectedValue = GetSelectedValue(); + var searchBox = _items.Count > 10; +} + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor.cs new file mode 100644 index 0000000..3d79cb5 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Dropdown.razor.cs @@ -0,0 +1,37 @@ +using Elsa.Api.Client.Shared.UIHints.DropDown; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Extensions; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// A component that renders a dropdown. +/// +public partial class Dropdown +{ + private ICollection _items = []; + + /// + /// The editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + /// + protected override void OnInitialized() + { + var selectList = EditorContext.InputDescriptor.GetSelectList(); + _items = selectList.Items.OrderBy(x => x.Text).ToList(); + } + + private SelectListItem? GetSelectedValue() + { + var value = EditorContext.GetLiteralValueOrDefault(); + return _items.FirstOrDefault(x => x.Value == value); + } + + private async Task OnValueChanged(SelectListItem? value) + { + await EditorContext.UpdateValueOrLiteralExpressionAsync(value?.Value ?? ""); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor b/src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor new file mode 100644 index 0000000..abc1cd8 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor @@ -0,0 +1,30 @@ +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; +} + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor.cs new file mode 100644 index 0000000..cfa7a4e --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/DynamicOutcomes.razor.cs @@ -0,0 +1,63 @@ +using System.Reflection; +using System.Text.Json; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Studio.Converters; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Helpers; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using MudExtensions; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// Implements a component for the "dynamic-outcomes" UI hint. +/// +public partial class DynamicOutcomes +{ + private List _items = new(); + private MudChipField _chipField = default!; + + /// + /// Gets or sets the editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = default!; + + /// + protected override void OnInitialized() + { + _items = GetCurrentItems(); + } + + private List GetCurrentItems() + { + var input = EditorContext.GetObjectValueOrDefault(); + return ParseJson(input); + } + + private List ParseJson(string? json) + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + options.Converters.Add(new JsonPrimitiveToStringConverter()); + return JsonParser.ParseJson(json, () => new List(), options); + } + + private async Task OnValuesChanges(List arg) + { + await EditorContext.UpdateValueOrObjectExpressionAsync(_items); + } + + private void OnKeyDown(KeyboardEventArgs arg) + { + // TODO: This is a hack to get the chips to update when the user presses enter. + // Ideally, we can configure this on MudChipField, but this is not currently supported. + if (arg.Key is not ("Enter" or "Tab")) return; + + var setChipsMethod = _chipField.GetType().GetMethod("SetChips", BindingFlags.Instance | BindingFlags.NonPublic); + setChipsMethod!.Invoke(_chipField, null); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/ExpressionEditor.razor b/src/modules/Elsa.Studio.UIHints/Components/ExpressionEditor.razor new file mode 100644 index 0000000..5f7540c --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/ExpressionEditor.razor @@ -0,0 +1,10 @@ +@using Elsa.Studio.Models + + + +@code { + + /// Gets or sets the editor context. + [Parameter] + public DisplayInputEditorContext EditorContext { get; set; } = null!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor b/src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor new file mode 100644 index 0000000..88d5594 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor @@ -0,0 +1,33 @@ +@inject ILocalizer Localizer +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; +} + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor.cs new file mode 100644 index 0000000..9cb1f12 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/HttpStatusCodes.razor.cs @@ -0,0 +1,54 @@ +using System.Reflection; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using MudExtensions; + +namespace Elsa.Studio.UIHints.Components; + +public partial class HttpStatusCodes +{ + private List _items = new(); + private MudChipField _chipField = null!; + + /// + /// The editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + /// + protected override void OnParametersSet() + { + _items = GetCurrentItems(); + } + + private List GetCurrentItems() + { + var expectedStatusCodes = EditorContext.GetValueOrDefault>()?.ToList() ?? new List(); + return expectedStatusCodes; + } + + private async Task OnValuesChanges(List? values) + { + // Remove any item from _items that is not in values. + _items.RemoveAll(x => values?.Contains(x.StatusCode.ToString()) != true); + + // Add any item from values that is not in _items. + _items.AddRange(values? + .Where(x => _items.All(y => y.StatusCode.ToString() != x)) + .Select(x => new HttpStatusCodeCase { StatusCode = int.Parse(x) }) ?? new List()); + + await EditorContext.UpdateValueAsync(_items); + } + + private void OnKeyDown(KeyboardEventArgs arg) + { + // TODO: This is a hack to get the chips to update when the user presses enter. + // Ideally, we can configure this on MudChipField, but this is not currently supported. + if (arg.Key is not ("Enter" or "Tab")) return; + + var setChipsMethod = _chipField.GetType().GetMethod("SetChips", BindingFlags.Instance | BindingFlags.NonPublic); + setChipsMethod!.Invoke(_chipField, null); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Json.razor b/src/modules/Elsa.Studio.UIHints/Components/Json.razor new file mode 100644 index 0000000..89d5ddd --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Json.razor @@ -0,0 +1,21 @@ +@using BlazorMonaco.Editor +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; +} + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/Json.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/Json.razor.cs new file mode 100644 index 0000000..e4fa391 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/Json.razor.cs @@ -0,0 +1,92 @@ +using BlazorMonaco.Editor; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Shared.UIHints.CodeEditor; +using Elsa.Studio.Extensions; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Extensions; +using Microsoft.AspNetCore.Components; +using ThrottleDebounce; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// A component that renders a code editor. +/// +public partial class Json : IDisposable +{ + private readonly string _monacoEditorId = $"monaco-editor-{Guid.NewGuid()}:N"; + private StandaloneCodeEditor? _monacoEditor; + private string? _lastMonacoEditorContent; + private readonly RateLimitedFunc _throttledValueChanged; + private CodeEditorOptions _codeEditorOptions = new(); + + /// + public Json() + { + _throttledValueChanged = Debouncer.Debounce(InvokeValueChangedCallback, TimeSpan.FromMilliseconds(500)); + } + + /// + /// The context for the editor. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + private string InputValue => EditorContext.GetLiteralValueOrDefault(); + + /// + protected override void OnInitialized() + { + _codeEditorOptions = EditorContext.InputDescriptor.GetCodeEditorOptions(); + } + + private StandaloneEditorConstructionOptions ConfigureMonacoEditor(StandaloneCodeEditor editor) + { + var language = _codeEditorOptions.Language ?? "javascript"; + + return new() + { + Language = language, + Value = InputValue, + FontFamily = "Roboto Mono, monospace", + RenderLineHighlight = "none", + Minimap = new() + { + Enabled = false + }, + AutomaticLayout = true, + LineNumbers = "on", + Theme = "vs", + RoundedSelection = true, + ScrollBeyondLastLine = false, + OverviewRulerLanes = 0, + OverviewRulerBorder = false, + LineDecorationsWidth = 0, + HideCursorInOverviewRuler = true, + GlyphMargin = false, + ReadOnly = EditorContext.IsReadOnly, + DomReadOnly = EditorContext.IsReadOnly + }; + } + + private async Task OnMonacoContentChanged(ModelContentChangedEvent e) + { + await _throttledValueChanged.InvokeAsync(); + } + + private async Task InvokeValueChangedCallback() + { + var value = await _monacoEditor!.GetValue(); + + // This event gets fired even when the content hasn't changed, but for example when the containing pane is resized. + // This happens from within the monaco editor itself (or the Blazor wrapper, not sure). + if (value == _lastMonacoEditorContent) + return; + + _lastMonacoEditorContent = value; + var expression = Expression.CreateLiteral(value); + + await InvokeAsync(async () => await EditorContext.UpdateExpressionAsync(expression)); + } + + void IDisposable.Dispose() => _throttledValueChanged.Dispose(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/MultiLine.razor b/src/modules/Elsa.Studio.UIHints/Components/MultiLine.razor new file mode 100644 index 0000000..18dd3f0 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/MultiLine.razor @@ -0,0 +1,40 @@ +@using Elsa.Studio.Models +@using Elsa.Studio.UIHints.Extensions +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var inputValue = EditorContext.GetLiteralValueOrDefault(); +} + + + + + + + +@code { + + /// + /// The EditorContext provided by the input UI framework. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + private async Task OnValueChanged(string newValue) + { + await EditorContext.UpdateValueOrLiteralExpressionAsync(newValue.TrimNull()); + } + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/MultiText.razor b/src/modules/Elsa.Studio.UIHints/Components/MultiText.razor new file mode 100644 index 0000000..ae876bf --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/MultiText.razor @@ -0,0 +1,32 @@ +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; +} + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/MultiText.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/MultiText.razor.cs new file mode 100644 index 0000000..be6848d --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/MultiText.razor.cs @@ -0,0 +1,63 @@ +using System.Reflection; +using System.Text.Json; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Studio.Converters; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Helpers; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using MudExtensions; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// Implements a component for the "multi-text" UI hint. +/// +public partial class MultiText +{ + private List _items = new(); + private MudChipField _chipField = null!; + + /// + /// Gets or sets the editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + /// + protected override void OnInitialized() + { + _items = GetCurrentItems(); + } + + private List GetCurrentItems() + { + var input = EditorContext.GetObjectValueOrDefault(); + return ParseJson(input); + } + + private static List ParseJson(string? json) + { + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + options.Converters.Add(new JsonPrimitiveToStringConverter()); + return JsonParser.ParseJson(json, () => new List(), options); + } + + private async Task OnValuesChanges(List arg) + { + await EditorContext.UpdateValueOrObjectExpressionAsync(_items); + } + + private void OnKeyDown(KeyboardEventArgs arg) + { + // TODO: This is a hack to get the chips to update when the user presses enter. + // Ideally, we can configure this on MudChipField, but this is not currently supported. + if (arg.Key is not ("Enter" or "Tab")) return; + + var setChipsMethod = _chipField.GetType().GetMethod("SetChips", BindingFlags.Instance | BindingFlags.NonPublic); + setChipsMethod!.Invoke(_chipField, null); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor b/src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor new file mode 100644 index 0000000..6d06996 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor @@ -0,0 +1,29 @@ +@using Elsa.Api.Client.Shared.UIHints.DropDown +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var selectedValue = GetSelectedValue(); + var searchBox = _items.Count > 10; +} + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor.cs new file mode 100644 index 0000000..8c24a2f --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/OutcomePicker.razor.cs @@ -0,0 +1,38 @@ +using Elsa.Api.Client.Shared.UIHints.DropDown; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// A component that renders a dropdown for outcomes. +/// +public partial class OutcomePicker +{ + private ICollection _items = Array.Empty(); + + /// + /// The editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + private ICollection Outcomes => EditorContext.WorkflowDefinition.Outcomes; + + /// + protected override void OnParametersSet() + { + _items = Outcomes.Select(x => new SelectListItem(x, x)).OrderBy(x => x.Text).ToList(); + } + + private SelectListItem? GetSelectedValue() + { + var value = EditorContext.GetLiteralValueOrDefault(); + return _items.FirstOrDefault(x => x.Value == value); + } + + private async Task OnValueChanged(SelectListItem? value) + { + var outcome = value?.Value ?? ""; + await EditorContext.UpdateValueOrLiteralExpressionAsync(outcome); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor b/src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor new file mode 100644 index 0000000..e2955b1 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor @@ -0,0 +1,28 @@ +@using Elsa.Api.Client.Shared.UIHints.DropDown +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var selectedValue = GetSelectedValue(); + var searchBox = _items.Count > 10; +} + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor.cs new file mode 100644 index 0000000..4f74ace --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/OutputPicker.razor.cs @@ -0,0 +1,41 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.UIHints.DropDown; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// A component that renders a dropdown for outputs. +/// +public partial class OutputPicker +{ + private ICollection _items = Array.Empty(); + + /// + /// The editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + private ICollection Outputs => EditorContext.WorkflowDefinition.Outputs; + + /// + protected override void OnParametersSet() + { + var items = Outputs.Select(x => new SelectListItem(x.DisplayName, x.Name)).OrderBy(x => x.Text).ToList(); + items.Insert(0, new("(None)", "")); + _items = items; + } + + private SelectListItem? GetSelectedValue() + { + var outputName = EditorContext.GetExpressionValueOrDefault(); + return _items.FirstOrDefault(x => x.Value == outputName); + } + + private async Task OnValueChanged(SelectListItem? value) + { + var outputName = value?.Value ?? ""; + await EditorContext.UpdateValueOrLiteralExpressionAsync(outputName); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/RadioList.razor b/src/modules/Elsa.Studio.UIHints/Components/RadioList.razor new file mode 100644 index 0000000..87440d1 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/RadioList.razor @@ -0,0 +1,21 @@ +@inherits StudioComponentBase +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; +} + + + + + + @foreach (var item in _radioListItems) + { + @item?.Text + } + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/RadioList.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/RadioList.razor.cs new file mode 100644 index 0000000..6048242 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/RadioList.razor.cs @@ -0,0 +1,46 @@ +using Elsa.Api.Client.Shared.UIHints.RadioList; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Extensions; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// A component that renders a radio list. +/// +public partial class RadioList +{ + private ICollection _radioListItems = Array.Empty(); + private string? radioItem = string.Empty; + + public string _radioItem + { + get { return radioItem; } + set + { + radioItem = value; + OnValueChanged(value); + } + } + + /// + /// The editor context. + /// + [Parameter] + public DisplayInputEditorContext EditorContext { get; set; } = default!; + + /// + protected override void OnInitialized() + { + var radioList = EditorContext.InputDescriptor.GetRadioList(); + _radioListItems = radioList.Items.ToList(); + + var value = EditorContext.GetLiteralValueOrDefault(); + radioItem = _radioListItems.FirstOrDefault(x => x.Value == value)?.Value ?? ""; + } + + private async Task OnValueChanged(string? value) + { + await EditorContext.UpdateValueOrLiteralExpressionAsync(value ?? ""); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/SingleLine.razor b/src/modules/Elsa.Studio.UIHints/Components/SingleLine.razor new file mode 100644 index 0000000..7e5d76b --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/SingleLine.razor @@ -0,0 +1,72 @@ +@using Elsa.Studio.Models +@using Elsa.Api.Client.Shared.UIHints.SingleLine +@using Elsa.Studio.DomInterop.Contracts +@using Elsa.Studio.UIHints.Extensions +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var inputValue = EditorContext.GetLiteralValueOrDefault(); + var adornment = !string.IsNullOrWhiteSpace(_singleLineProps.AdornmentText) ? Adornment.Start : Adornment.None; +} + + + + + + @if (!string.IsNullOrWhiteSpace(_singleLineProps.AdornmentText)) + { + @_singleLineProps.AdornmentText + } + + + @if (_singleLineProps.EnableCopyAdornment) + { + + } + + + + + +@code { + + private SingleLineProps _singleLineProps = new(); + + /// Gets or sets the editor context. + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + [Inject] private IClipboard Clipboard { get; set; } = null!; + + /// + protected override void OnInitialized() + { + _singleLineProps = EditorContext.InputDescriptor.GetSingleLineProps(); + } + + private async Task OnValueChanged(string newValue) + { + await EditorContext.UpdateValueOrLiteralExpressionAsync(newValue.TrimWhitespace()); + } + + private async Task OnCopyClicked() + { + var value = (_singleLineProps.AdornmentText ?? string.Empty) + EditorContext.GetLiteralValueOrDefault(); + await Clipboard.CopyText(value); + } + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor b/src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor new file mode 100644 index 0000000..e9f4f0d --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor @@ -0,0 +1,37 @@ +@using Elsa.Api.Client.Resources.VariableTypes.Models +@inject ILocalizer Localizer +@inherits StudioComponentBase + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var selectedValue = GetSelectedValue(); + var searchBox = _variableTypes.Count > 10; +} + + + + + @foreach (var grouping in _groupedVariableTypes) + { + + @foreach (var variableType in grouping) + { + @variableType.DisplayName + } + + } + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor.cs new file mode 100644 index 0000000..35cd23a --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/TypePicker.razor.cs @@ -0,0 +1,40 @@ +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// Provides a component for picking a type. +/// +public partial class TypePicker +{ + private ICollection _variableTypes = new List(); + private ICollection> _groupedVariableTypes = new List>(); + + /// + /// Gets or sets the editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + [Inject] private IVariableTypeService VariableTypeService { get; set; } = null!; + + /// + protected override async Task OnParametersSetAsync() + { + _variableTypes = (await VariableTypeService.GetVariableTypesAsync()).ToList(); + _groupedVariableTypes = _variableTypes.GroupBy(x => x.Category).ToList(); + } + + private VariableTypeDescriptor? GetSelectedValue() + { + var value = EditorContext.GetLiteralValueOrDefault(); + return _variableTypes.FirstOrDefault(x => x.TypeName == value); + } + + private async Task OnValueChanged(VariableTypeDescriptor? value) + { + await EditorContext.UpdateValueOrLiteralExpressionAsync(value?.TypeName ?? ""); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor b/src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor new file mode 100644 index 0000000..c47c4f9 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor @@ -0,0 +1,29 @@ +@using Elsa.Api.Client.Shared.UIHints.DropDown +@inject ILocalizer Localizer +@inherits StudioComponentBase + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var selectedValue = GetSelectedValue(); + var searchBox = _items.Count > 10; +} + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor.cs new file mode 100644 index 0000000..fc18393 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/VariablePicker.razor.cs @@ -0,0 +1,70 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.UIHints.DropDown; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; +using System.Text.Json; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// Provides a component for picking a variable. +/// +public partial class VariablePicker +{ + private ICollection _items = Array.Empty(); + + /// + /// Gets or sets the editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = default!; + + private ICollection Variables => EditorContext.WorkflowDefinition.Variables; + + private JsonSerializerOptions JsonSerializerOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + /// + protected override void OnParametersSet() + { + _items = Variables.Select(x => new SelectListItem(x.Name, x.Id)).OrderBy(x => x.Text).ToList(); + } + + private SelectListItem? GetSelectedValue() + { + Variable? value; + if (EditorContext.InputDescriptor.IsWrapped) + { + var expressionValue = EditorContext.GetExpressionValueOrDefault(); + if (string.IsNullOrEmpty(expressionValue)) + value = null; + else + { + try + { + value = JsonSerializer.Deserialize(expressionValue, JsonSerializerOptions); + } + catch (Exception) + { + value = null; + } + } + } + else + value = EditorContext.GetValueOrDefault(); + + return _items.FirstOrDefault(x => x.Value == value?.Id); + } + + private async Task OnValueChanged(SelectListItem? value) + { + var variableId = value?.Value; + var variable = Variables.FirstOrDefault(x => x.Id == variableId); + + if(EditorContext.InputDescriptor.IsWrapped) + await EditorContext.UpdateExpressionAsync(new("Variable", JsonSerializer.Serialize(variable, JsonSerializerOptions))); + else + await EditorContext.UpdateValueAsync(variable); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor b/src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor new file mode 100644 index 0000000..fb7012d --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor @@ -0,0 +1,31 @@ +@using Elsa.Api.Client.Shared.UIHints.DropDown + +@inherits StudioComponentBase +@inject ILocalizer Localizer + +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var selectedValue = GetSelectedValue(); + var searchBox = _items.Count > 10; +} + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor.cs b/src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor.cs new file mode 100644 index 0000000..bcb7eeb --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Components/WorkflowDefinitionPicker.razor.cs @@ -0,0 +1,49 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Api.Client.Shared.UIHints.DropDown; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Components; + +/// +/// Provides a component for picking a workflow definition. +/// +public partial class WorkflowDefinitionPicker +{ + private ICollection _items = Array.Empty(); + + /// + /// Gets or sets the editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = null!; + + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = null!; + + + /// + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + var request = new ListWorkflowDefinitionsRequest(); + var availableWorkflowDefinitions = await WorkflowDefinitionService.ListAsync(request, VersionOptions.Published); + var workflowDefinitions = availableWorkflowDefinitions.Items; + _items = workflowDefinitions.Select(x => new SelectListItem(x.Name, x.DefinitionId)).OrderBy(x => x.Text).ToList(); + + StateHasChanged(); + } + } + + private SelectListItem? GetSelectedValue() + { + var value = EditorContext.GetLiteralValueOrDefault(); + return _items.FirstOrDefault(x => x.Value == value); + } + + private async Task OnValueChanged(SelectListItem? value) + { + await EditorContext.UpdateValueOrLiteralExpressionAsync(value?.Value ?? ""); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Elsa.Studio.UIHints.csproj b/src/modules/Elsa.Studio.UIHints/Elsa.Studio.UIHints.csproj new file mode 100644 index 0000000..6d68262 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Elsa.Studio.UIHints.csproj @@ -0,0 +1,17 @@ + + + + Adds various UI hint handlers for activity input. + elsa studio module + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCheckListExtensions.cs b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCheckListExtensions.cs new file mode 100644 index 0000000..302bcc5 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCheckListExtensions.cs @@ -0,0 +1,31 @@ +using System.Text.Json; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Shared.UIHints.CheckList; + +namespace Elsa.Studio.UIHints.Extensions; + +/// +/// Provides extension methods for . +/// +public static class InputDescriptorCheckListExtensions +{ + /// + /// Gets a list of s for the specified . + /// + public static CheckList GetCheckList(this InputDescriptor descriptor) + { + var specifications = descriptor.UISpecifications; + var props = specifications != null ? specifications.TryGetValue(InputUIHints.CheckList, out var propsValue) ? propsValue is JsonElement value ? value : default : default : default; + + if (props.ValueKind == JsonValueKind.Undefined) + return new([]); + + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + + var checkListProps = props.Deserialize(serializerOptions); + return checkListProps?.CheckList ?? new CheckList([]); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCodeEditorExtensions.cs b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCodeEditorExtensions.cs new file mode 100644 index 0000000..f8e232b --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorCodeEditorExtensions.cs @@ -0,0 +1,30 @@ +using System.Text.Json; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Shared.UIHints.CodeEditor; + +namespace Elsa.Studio.UIHints.Extensions; + +/// +/// Provides extension methods for . +/// +public static class InputDescriptorCodeEditorExtensions +{ + /// + /// Gets the for the specified . + /// + public static CodeEditorOptions GetCodeEditorOptions(this InputDescriptor descriptor) + { + var specifications = descriptor.UISpecifications; + var props = specifications != null ? specifications.TryGetValue(InputUIHints.CodeEditor, out var propsValue) ? propsValue is JsonElement value ? value : default : default : default; + + if (props.ValueKind == JsonValueKind.Undefined) + return new CodeEditorOptions(); + + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + + return props.Deserialize(serializerOptions)!; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorRadioListExtensions.cs b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorRadioListExtensions.cs new file mode 100644 index 0000000..21d553f --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorRadioListExtensions.cs @@ -0,0 +1,31 @@ +using System.Text.Json; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Shared.UIHints.RadioList; + +namespace Elsa.Studio.UIHints.Extensions; + +/// +/// Provides extension methods for . +/// +public static class InputDescriptorRadioListExtensions +{ + /// + /// Gets a list of s for the specified . + /// + public static RadioList GetRadioList(this InputDescriptor descriptor) + { + var specifications = descriptor.UISpecifications; + var props = specifications != null ? specifications.TryGetValue(InputUIHints.RadioList, out var propsValue) ? propsValue is JsonElement value ? value : default : default : default; + + if (props.ValueKind == JsonValueKind.Undefined) + return new RadioList(Array.Empty()); + + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + + var radioListProps = props.Deserialize(serializerOptions); + return radioListProps?.RadioList ?? new RadioList(Array.Empty()); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSelectListExtensions.cs b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSelectListExtensions.cs new file mode 100644 index 0000000..2117221 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSelectListExtensions.cs @@ -0,0 +1,31 @@ +using System.Text.Json; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Shared.UIHints.DropDown; + +namespace Elsa.Studio.UIHints.Extensions; + +/// +/// Provides extension methods for . +/// +public static class InputDescriptorSelectListExtensions +{ + /// + /// Gets the for the specified . + /// + public static SelectList GetSelectList(this InputDescriptor descriptor) + { + var specifications = descriptor.UISpecifications; + var props = specifications != null ? specifications.TryGetValue(InputUIHints.DropDown, out var propsValue) ? propsValue is JsonElement value ? value : default : default : default; + + if (props.ValueKind == JsonValueKind.Undefined) + return new([]); + + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + + var dropDownProps = props.Deserialize(serializerOptions); + return dropDownProps?.SelectList ?? new SelectList([]); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSingleLineExtensions.cs b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSingleLineExtensions.cs new file mode 100644 index 0000000..747ddd1 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Extensions/InputDescriptorSingleLineExtensions.cs @@ -0,0 +1,30 @@ +using System.Text.Json; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Shared.UIHints.SingleLine; + +namespace Elsa.Studio.UIHints.Extensions; + +/// +/// Provides extension methods for . +/// +public static class InputDescriptorSingleLineExtensions +{ + /// + /// Gets the for the specified . + /// + public static SingleLineProps GetSingleLineProps(this InputDescriptor descriptor) + { + var specifications = descriptor.UISpecifications; + var props = specifications != null ? specifications.TryGetValue(InputUIHints.SingleLine, out var propsValue) ? propsValue is JsonElement value ? value : default : default : default; + + if (props.ValueKind == JsonValueKind.Undefined) + return new SingleLineProps(); + + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + + return props.Deserialize(serializerOptions)!; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.UIHints/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..52aeeaa --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,39 @@ +using Elsa.Studio.Extensions; +using Elsa.Studio.UIHints.Handlers; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.UIHints.Extensions; + +/// +/// Provides a set of extension methods for . +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the default UI hint handlers. + /// + public static IServiceCollection AddDefaultUIHintHandlers(this IServiceCollection services) + { + return services + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + .AddUIHintHandler() + ; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Extensions/StringExtensions.cs b/src/modules/Elsa.Studio.UIHints/Extensions/StringExtensions.cs new file mode 100644 index 0000000..9b57c8a --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Extensions/StringExtensions.cs @@ -0,0 +1,23 @@ +namespace Elsa.Studio.UIHints.Extensions; + +/// +/// Provides a set of extension methods for . +/// +public static class StringExtensions +{ + /// + /// Trims the whitespace from the string, including null characters and new lines. + /// + public static string TrimWhitespace(this string value) + { + return value.Trim(' ', '\0', '\n', '\r'); + } + + /// + /// Trims the null characters from the string. + /// + public static string TrimNull(this string value) + { + return value.Trim('\0'); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/FodyWeavers.xml b/src/modules/Elsa.Studio.UIHints/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/FodyWeavers.xsd b/src/modules/Elsa.Studio.UIHints/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/CheckListHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/CheckListHandler.cs new file mode 100644 index 0000000..c0f2087 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/CheckListHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class CheckListHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.CheckList; + + /// + public string UISyntax => WellKnownSyntaxNames.Object; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(CheckList)); + builder.AddAttribute(1, nameof(CheckList.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/CheckboxHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/CheckboxHandler.cs new file mode 100644 index 0000000..7b76257 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/CheckboxHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class CheckboxHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.Checkbox; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(Checkbox)); + builder.AddAttribute(1, nameof(Checkbox.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/CodeEditorHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/CodeEditorHandler.cs new file mode 100644 index 0000000..51d6d01 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/CodeEditorHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class CodeEditorHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.CodeEditor; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(Code)); + builder.AddAttribute(1, nameof(Code.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/DateTimePickerHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/DateTimePickerHandler.cs new file mode 100644 index 0000000..c6be3d5 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/DateTimePickerHandler.cs @@ -0,0 +1,23 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +public class DateTimePickerHandler : IUIHintHandler +{ + public bool GetSupportsUIHint(string uiHint) => uiHint == InputUIHints.DateTimePicker; + + public string UISyntax => WellKnownSyntaxNames.Literal; + + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(DateTimePicker)); + builder.AddAttribute(1, nameof(DateTimePicker.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/DropDownHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/DropDownHandler.cs new file mode 100644 index 0000000..442fa41 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/DropDownHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class DropDownHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.DropDown; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(Dropdown)); + builder.AddAttribute(1, nameof(Dropdown.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/DynamicOutcomesHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/DynamicOutcomesHandler.cs new file mode 100644 index 0000000..c32b2b1 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/DynamicOutcomesHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class DynamicOutcomesHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.DynamicOutcomes; + + /// + public string UISyntax => WellKnownSyntaxNames.Object; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(DynamicOutcomes)); + builder.AddAttribute(1, nameof(DynamicOutcomes.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/ExpressionEditorHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/ExpressionEditorHandler.cs new file mode 100644 index 0000000..e3fb8fb --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/ExpressionEditorHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class ExpressionEditorHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.ExpressionEditor; + + /// + public string UISyntax => "JavaScript"; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(ExpressionEditor)); + builder.AddAttribute(1, nameof(ExpressionEditor.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/HttpStatusCodesHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/HttpStatusCodesHandler.cs new file mode 100644 index 0000000..471b829 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/HttpStatusCodesHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class HttpStatusCodesHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.HttpStatusCodes; + + /// + public string UISyntax => WellKnownSyntaxNames.Object; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(HttpStatusCodes)); + builder.AddAttribute(1, nameof(HttpStatusCodes.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/JsonEditorHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/JsonEditorHandler.cs new file mode 100644 index 0000000..cf1e42b --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/JsonEditorHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class JsonEditorHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.JsonEditor; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(Json)); + builder.AddAttribute(1, nameof(Json.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/MultiLineHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/MultiLineHandler.cs new file mode 100644 index 0000000..6e1f68c --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/MultiLineHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class MultiLineHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.MultiLine; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(MultiLine)); + builder.AddAttribute(1, nameof(MultiLine.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/MultiTextHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/MultiTextHandler.cs new file mode 100644 index 0000000..4cb0a9d --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/MultiTextHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class MultiTextHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.MultiText; + + /// + public string UISyntax => WellKnownSyntaxNames.Object; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(MultiText)); + builder.AddAttribute(1, nameof(MultiText.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/OutcomePickerHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/OutcomePickerHandler.cs new file mode 100644 index 0000000..d35aee8 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/OutcomePickerHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class OutcomePickerHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.OutcomePicker; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(OutcomePicker)); + builder.AddAttribute(1, nameof(OutcomePicker.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/OutputPickerHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/OutputPickerHandler.cs new file mode 100644 index 0000000..03697b0 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/OutputPickerHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class OutputPickerHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.OutputPicker; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(OutputPicker)); + builder.AddAttribute(1, nameof(OutputPicker.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/RadioListHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/RadioListHandler.cs new file mode 100644 index 0000000..872c597 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/RadioListHandler.cs @@ -0,0 +1,23 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +public class RadioListHandler : IUIHintHandler +{ + public bool GetSupportsUIHint(string uiHint) => uiHint == InputUIHints.RadioList; + + public string UISyntax => WellKnownSyntaxNames.Literal; + + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(RadioList)); + builder.AddAttribute(1, nameof(RadioList.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/SingleLineHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/SingleLineHandler.cs new file mode 100644 index 0000000..8d39542 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/SingleLineHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class SingleLineHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint == InputUIHints.SingleLine; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(SingleLine)); + builder.AddAttribute(1, nameof(SingleLine.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/SwitchEditorHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/SwitchEditorHandler.cs new file mode 100644 index 0000000..92a4ab4 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/SwitchEditorHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the and UI hints. +/// +public class SwitchEditorHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.FlowSwitchEditor or InputUIHints.SwitchEditor; + + /// + public string UISyntax => WellKnownSyntaxNames.Object; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(Cases)); + builder.AddAttribute(1, nameof(Cases.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/TypePickerHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/TypePickerHandler.cs new file mode 100644 index 0000000..f40b3ed --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/TypePickerHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class TypePickerHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.TypePicker; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(TypePicker)); + builder.AddAttribute(1, nameof(TypePicker.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/VariablePickerHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/VariablePickerHandler.cs new file mode 100644 index 0000000..4140c09 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/VariablePickerHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class VariablePickerHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.VariablePicker; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(VariablePicker)); + builder.AddAttribute(1, nameof(VariablePicker.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Handlers/WorkflowDefinitionPickerHandler.cs b/src/modules/Elsa.Studio.UIHints/Handlers/WorkflowDefinitionPickerHandler.cs new file mode 100644 index 0000000..6094224 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Handlers/WorkflowDefinitionPickerHandler.cs @@ -0,0 +1,29 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.UIHints.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.UIHints.Handlers; + +/// +/// Provides a handler for the UI hint. +/// +public class WorkflowDefinitionPickerHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint is InputUIHints.WorkflowDefinitionPicker; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(WorkflowDefinitionPicker)); + builder.AddAttribute(1, nameof(WorkflowDefinitionPicker.EditorContext), context); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/Helpers/JsonParser.cs b/src/modules/Elsa.Studio.UIHints/Helpers/JsonParser.cs new file mode 100644 index 0000000..7f87753 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/Helpers/JsonParser.cs @@ -0,0 +1,34 @@ +using System.Text.Json; + +namespace Elsa.Studio.UIHints.Helpers; + +public static class JsonParser +{ + /// + /// Parses the specified JSON string into an object of type . + /// + /// The JSON string to parse. + /// A factory function that returns a default value of type . + /// The to use when parsing the JSON string. + /// The type of the object to parse the JSON string into. + /// An object of type . + public static T ParseJson(string? json, Func defaultValueFactory, JsonSerializerOptions? options = default) + { + if (string.IsNullOrWhiteSpace(json)) + return defaultValueFactory(); + + try + { + options ??= new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + return JsonSerializer.Deserialize(json, options) ?? defaultValueFactory(); + } + catch (JsonException) + { + return defaultValueFactory(); + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/InputUIHints.cs b/src/modules/Elsa.Studio.UIHints/InputUIHints.cs new file mode 100644 index 0000000..c2c6e93 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/InputUIHints.cs @@ -0,0 +1,28 @@ +namespace Elsa.Studio.UIHints; + +/// +/// Provides a set of well-known UI hints. +/// +public static class InputUIHints +{ + public const string Checkbox = "checkbox"; + public const string CheckList = "checklist"; + public const string CodeEditor = "code-editor"; + public const string DateTimePicker = "datetime-picker"; + public const string DropDown = "dropdown"; + public const string DynamicOutcomes = "dynamic-outcomes"; + public const string ExpressionEditor = "expression-editor"; + public const string HttpStatusCodes = "http-status-codes"; + public const string JsonEditor = "json-editor"; + public const string MultiLine = "multiline"; + public const string MultiText = "multitext"; + public const string OutcomePicker = "outcome-picker"; + public const string OutputPicker = "output-picker"; + public const string RadioList = "radiolist"; + public const string SingleLine = "singleline"; + public const string FlowSwitchEditor = "flow-switch-editor"; + public const string SwitchEditor = "switch-editor"; + public const string TypePicker = "type-picker"; + public const string VariablePicker = "variable-picker"; + public const string WorkflowDefinitionPicker = "workflow-definition-picker"; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.UIHints/_Imports.razor b/src/modules/Elsa.Studio.UIHints/_Imports.razor new file mode 100644 index 0000000..1f6d130 --- /dev/null +++ b/src/modules/Elsa.Studio.UIHints/_Imports.razor @@ -0,0 +1,5 @@ +@using Microsoft.AspNetCore.Components.Web +@using Elsa.Studio.Components +@using Elsa.Studio.Localization +@using MudBlazor +@using MudExtensions \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Webhooks/Elsa.Studio.Webhooks.csproj b/src/modules/Elsa.Studio.Webhooks/Elsa.Studio.Webhooks.csproj new file mode 100644 index 0000000..946d033 --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/Elsa.Studio.Webhooks.csproj @@ -0,0 +1,17 @@ + + + + Adds webhook management to the studio. + elsa studio module + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Webhooks/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Webhooks/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..eb3d509 --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,15 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Webhooks.Menu; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Webhooks.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddWebhooksModule(this IServiceCollection services) + { + return services + .AddScoped() + .AddScoped(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Webhooks/FodyWeavers.xml b/src/modules/Elsa.Studio.Webhooks/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Webhooks/FodyWeavers.xsd b/src/modules/Elsa.Studio.Webhooks/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Webhooks/Menu/WebhooksMenu.cs b/src/modules/Elsa.Studio.Webhooks/Menu/WebhooksMenu.cs new file mode 100644 index 0000000..2b4ec9d --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/Menu/WebhooksMenu.cs @@ -0,0 +1,26 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Services; +using MudBlazor; + +namespace Elsa.Studio.Webhooks.Menu; + +public class WebhooksMenu(ILocalizer localizer) : IMenuProvider +{ + public ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default) + { + var menuItems = new List + { + new() + { + Icon = Icons.Material.Filled.Http, + Href = "webhooks", + Text = localizer["Webhooks"], + GroupName = MenuItemGroups.Settings.Name + } + }; + + return new ValueTask>(menuItems); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Webhooks/Module.cs b/src/modules/Elsa.Studio.Webhooks/Module.cs new file mode 100644 index 0000000..875310f --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/Module.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Abstractions; + +namespace Elsa.Studio.Webhooks; + +public class Feature : FeatureBase +{ + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Webhooks/Pages/Index.razor b/src/modules/Elsa.Studio.Webhooks/Pages/Index.razor new file mode 100644 index 0000000..777fdf1 --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/Pages/Index.razor @@ -0,0 +1,8 @@ +@page "/webhooks" +@inherits StudioComponentBase + +Webhooks + + + + diff --git a/src/modules/Elsa.Studio.Webhooks/_Imports.razor b/src/modules/Elsa.Studio.Webhooks/_Imports.razor new file mode 100644 index 0000000..93919a4 --- /dev/null +++ b/src/modules/Elsa.Studio.Webhooks/_Imports.razor @@ -0,0 +1,7 @@ +@using Elsa.Studio.Components +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.JSInterop +@using MudBlazor +@attribute [Authorize] \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/ActivityTabs/WorkflowContextActivityTab.cs b/src/modules/Elsa.Studio.WorkflowContexts/ActivityTabs/WorkflowContextActivityTab.cs new file mode 100644 index 0000000..0314352 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/ActivityTabs/WorkflowContextActivityTab.cs @@ -0,0 +1,28 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.WorkflowContexts.Components; +using Microsoft.AspNetCore.Components; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Studio.WorkflowContexts.ActivityTabs +{ + public class WorkflowContextActivityTab(ILocalizer localizer) : IActivityTab + { + public string Title => localizer["Workflow Context"]; + + public Func, RenderFragment> Render => attributes => builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(WorkflowContextActivityTabPanel.WorkflowDefinition), attributes["WorkflowDefinition"]); + builder.AddAttribute(2, nameof(WorkflowContextActivityTabPanel.Activity), attributes["Activity"]); + builder.AddAttribute(2, nameof(WorkflowContextActivityTabPanel.ActivityDescriptor), attributes["ActivityDescriptor"]); + builder.AddAttribute(2, nameof(WorkflowContextActivityTabPanel.OnActivityUpdated), attributes["OnActivityUpdated"]); + builder.CloseComponent(); + }; + + } +} diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor new file mode 100644 index 0000000..6cc8c0e --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor @@ -0,0 +1,35 @@ +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +
+ + + @Localizer["Workflow Context Settings"] + @if (_items.Count > 0) + { + + + @foreach (var item in _items) + { + + + @Localizer[@item.Text] + + + + + + + + + } + + + + } + + + +
+ diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor.cs b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor.cs new file mode 100644 index 0000000..4d4311b --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextActivityTabPanel.razor.cs @@ -0,0 +1,125 @@ +namespace Elsa.Studio.WorkflowContexts.Components; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; + +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Models; +using Elsa.Api.Client.Shared.UIHints.DropDown; +using Elsa.Extensions; +using Elsa.Studio.WorkflowContexts.Contracts; +using Elsa.Studio.WorkflowContexts.Extensions; +using Elsa.Studio.WorkflowContexts.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using System.Diagnostics; +using System.Text.Json.Nodes; + +public partial class WorkflowContextActivityTabPanel +{ + /// + /// Gets or sets the workflow definition. + /// + [Parameter] + public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// + /// Gets or sets the activity. + /// + [Parameter] + public JsonObject? Activity { get; set; } + + /// + /// Gets or sets the activity descriptor. + /// + [Parameter] + public ActivityDescriptor? ActivityDescriptor { get; set; } + + /// + /// Gets or sets a callback that is invoked when the activity is updated. + /// + [Parameter] + public Func? OnActivityUpdated { get; set; } + + [Inject] private IWorkflowContextsProvider WorkflowContextsProvider { get; set; } = default!; + + [CascadingParameter] private IWorkspace? Workspace { get; set; } + + private bool IsReadOnly => Workspace?.IsReadOnly == true; + + private ICollection _items = Array.Empty(); + + private Dictionary _contextSettings = new Dictionary(); + + private ICollection WorkflowContextDescriptors { get; set; } = new List(); + + /// + protected override async Task OnInitializedAsync() + { + WorkflowContextDescriptors = (await WorkflowContextsProvider.ListAsync()).ToList(); + } + + protected override void OnParametersSet() + { + var selectedContextProviders = WorkflowDefinition!.GetWorkflowContextProviderTypes(); + _items = WorkflowContextDescriptors.Where(descriptior => selectedContextProviders.Contains(descriptior.Type)) + .Select(descriptior => new SelectListItem(descriptior.Name, descriptior.Type)).ToList(); + + + if (Activity != null) + { + _contextSettings = Activity.GetWorkflowContextSettings() ?? new Dictionary(); + } + } + + + private bool IsChecked(string type, string function) + { + try + { + if (_contextSettings.ContainsKey(type)) + { + return function switch + { + "Load" => _contextSettings[type].Load, + "Save" => _contextSettings[type].Save, + _ => false + }; + + } + } + catch + { + + } + return false; + } + + private async Task OnValueChanged(string type, string function, bool? value) + { + if (Activity != null) + { + if (value.HasValue) + { + if (!_contextSettings.ContainsKey(type)) + { + _contextSettings[type] = new ActivityWorkflowContextSettings(); + } + + if (String.Equals(function, "Load", StringComparison.OrdinalIgnoreCase)) + { + _contextSettings[type].Load = value.Value; + } + if (String.Equals(function, "Save", StringComparison.OrdinalIgnoreCase)) + { + _contextSettings[type].Save = value.Value; + } + } + + Activity.SetWorkflowContextSettings(_contextSettings); + + + if (OnActivityUpdated != null) + await OnActivityUpdated(Activity); + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor new file mode 100644 index 0000000..cec107e --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor @@ -0,0 +1,24 @@ +@using Elsa.Api.Client.Shared.UIHints.DropDown +@inherits StudioComponentBase +@{ + var inputDescriptor = EditorContext.InputDescriptor; + var displayName = inputDescriptor.DisplayName; + var description = inputDescriptor.Description; + var selectedValue = GetSelectedValue(); + var searchBox = _items.Count > 10; +} + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor.cs b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor.cs new file mode 100644 index 0000000..ec7654d --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextProviderPicker.razor.cs @@ -0,0 +1,52 @@ +using Elsa.Api.Client.Shared.UIHints.DropDown; +using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Models; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; +using Elsa.Extensions; +using Elsa.Studio.WorkflowContexts.Contracts; +using Elsa.Api.Client.Resources.Scripting.Models; + +namespace Elsa.Studio.WorkflowContexts.Components; + +/// +/// A component that renders the workflow context drop down. +/// +public partial class WorkflowContextProviderPicker +{ + private ICollection _items = Array.Empty(); + + /// + /// Gets or sets the editor context. + /// + [Parameter] public DisplayInputEditorContext EditorContext { get; set; } = default!; + + [Inject] private IWorkflowContextsProvider WorkflowContextsProvider { get; set; } = default!; + + private ICollection WorkflowContextDescriptors { get; set; } = new List(); + + /// + protected override async Task OnInitializedAsync() + { + WorkflowContextDescriptors = (await WorkflowContextsProvider.ListAsync()).ToList(); + } + + /// + protected override void OnParametersSet() + { + var selectedContextProviders = EditorContext.WorkflowDefinition.GetWorkflowContextProviderTypes(); + _items = WorkflowContextDescriptors.Where(descriptior => selectedContextProviders.Contains(descriptior.Type)) + .Select(descriptior => new SelectListItem(descriptior.Name, descriptior.Type)).ToList(); + } + + private SelectListItem? GetSelectedValue() + { + var value = EditorContext.GetLiteralValueOrDefault(); + return _items.FirstOrDefault(x => x.Value == value); + } + + private async Task OnValueChanged(SelectListItem? value) + { + var expression = Expression.CreateLiteral(value?.Value ?? ""); + await EditorContext.UpdateExpressionAsync(expression); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor new file mode 100644 index 0000000..7633ac7 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor @@ -0,0 +1,13 @@ +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +@Localizer["Workflow Context"] + + + @foreach (var descriptor in WorkflowContextDescriptors) + { + + } + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor.cs b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor.cs new file mode 100644 index 0000000..12aab79 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Components/WorkflowContextsEditor.razor.cs @@ -0,0 +1,55 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Models; +using Elsa.Extensions; +using Elsa.Studio.WorkflowContexts.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.WorkflowContexts.Components; + +/// +/// A component that renders the workflow context editor. +/// +public partial class WorkflowContextsEditor +{ + /// + /// Gets or sets the workflow definition. + /// + [Parameter] + public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + + /// + /// Gets or sets the callback that is invoked when the workflow definition is updated. + /// + [Parameter] + public EventCallback WorkflowDefinitionUpdated { get; set; } + + [Inject] private IWorkflowContextsProvider WorkflowContextsProvider { get; set; } = default!; + + private ICollection WorkflowContextDescriptors { get; set; } = new List(); + private ISet SelectedWorkflowContextTypes { get; set; } = new HashSet(); + + /// + protected override async Task OnInitializedAsync() + { + WorkflowContextDescriptors = (await WorkflowContextsProvider.ListAsync()).ToList(); + } + + /// + protected override void OnParametersSet() + { + SelectedWorkflowContextTypes = WorkflowDefinition.GetWorkflowContextProviderTypes().ToHashSet(); + } + + private async Task OnCheckChanged(WorkflowContextProviderDescriptor descriptor, bool isChecked) + { + if (isChecked) + SelectedWorkflowContextTypes.Add(descriptor.Type); + else + SelectedWorkflowContextTypes.Remove(descriptor.Type); + + WorkflowDefinition.SetWorkflowContextProviderTypes(SelectedWorkflowContextTypes); + + if (WorkflowDefinitionUpdated.HasDelegate) + await WorkflowDefinitionUpdated.InvokeAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Contracts/IWorkflowContextsProvider.cs b/src/modules/Elsa.Studio.WorkflowContexts/Contracts/IWorkflowContextsProvider.cs new file mode 100644 index 0000000..2d3789d --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Contracts/IWorkflowContextsProvider.cs @@ -0,0 +1,14 @@ +using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Models; + +namespace Elsa.Studio.WorkflowContexts.Contracts; + +/// +/// Provides workflow contexts. +/// +public interface IWorkflowContextsProvider +{ + /// + /// Returns a list of workflow context provider descriptors. + /// + Task> ListAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Elsa.Studio.WorkflowContexts.csproj b/src/modules/Elsa.Studio.WorkflowContexts/Elsa.Studio.WorkflowContexts.csproj new file mode 100644 index 0000000..2a17ad9 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Elsa.Studio.WorkflowContexts.csproj @@ -0,0 +1,14 @@ + + + + Enables Workflow Context management + elsa studio module + + + + + + + + + diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Extensions/ActivityExtensions.cs b/src/modules/Elsa.Studio.WorkflowContexts/Extensions/ActivityExtensions.cs new file mode 100644 index 0000000..9ff0307 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Extensions/ActivityExtensions.cs @@ -0,0 +1,20 @@ +using Elsa.Api.Client.Extensions; +using Elsa.Studio.WorkflowContexts.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Nodes; +using System.Threading.Tasks; + +namespace Elsa.Studio.WorkflowContexts.Extensions +{ + public static class ActivityExtensions + { + public static void SetWorkflowContextSettings(this JsonObject activity, Dictionary value) => + activity.SetProperty(JsonValue.Create(value), "customProperties", "ActivityWorkflowContextSettingsKey"); + + public static Dictionary GetWorkflowContextSettings(this JsonObject activity) => + activity.GetProperty>("customProperties", "ActivityWorkflowContextSettingsKey"); + } +} diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.WorkflowContexts/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..db0d73a --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,28 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.WorkflowContexts.Contracts; +using Elsa.Studio.WorkflowContexts.Handlers; +using Elsa.Studio.WorkflowContexts.Services; +using Elsa.Studio.Extensions; +using Microsoft.Extensions.DependencyInjection; +using Elsa.Studio.WorkflowContexts.ActivityTabs; + +namespace Elsa.Studio.WorkflowContexts.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the workflow vcontexts module to the service collection. + /// + public static IServiceCollection AddWorkflowContextsModule(this IServiceCollection services) + { + return services + .AddScoped() + .AddScoped() + .AddUIHintHandler() + .AddScoped() + ; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Extensions/WorkflowDefinitionExtensions.cs b/src/modules/Elsa.Studio.WorkflowContexts/Extensions/WorkflowDefinitionExtensions.cs new file mode 100644 index 0000000..cae509d --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Extensions/WorkflowDefinitionExtensions.cs @@ -0,0 +1,39 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; + +// ReSharper disable once CheckNamespace +namespace Elsa.Extensions; + +/// +/// Adds extension methods to . +/// +public static class WorkflowDefinitionExtensions +{ + /// + /// Gets the workflow context provider types that are installed on the workflow definition. + /// + /// The workflow definition to get the provider types from. + /// The workflow context provider types. + public static IEnumerable GetWorkflowContextProviderTypes(this WorkflowDefinition workflowDefinition) + { + if (!workflowDefinition.CustomProperties.TryGetValue("Elsa:WorkflowContextProviderTypes", out var providerTypesValue)) + return []; + + var jsonElement = (JsonElement)providerTypesValue; + return jsonElement.Deserialize(JsonSerializerOptions.Default); + } + + /// + /// Gets the workflow context provider types that are installed on the workflow definition. + /// + /// The workflow definition to get the provider types from. + /// The workflow context provider types. + /// The workflow context provider types. + public static void SetWorkflowContextProviderTypes(this WorkflowDefinition workflowDefinition, IEnumerable value) + { + var jsonElement = JsonSerializer.SerializeToElement(value.ToArray()); + workflowDefinition.CustomProperties["Elsa:WorkflowContextProviderTypes"] = jsonElement; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Feature.cs b/src/modules/Elsa.Studio.WorkflowContexts/Feature.cs new file mode 100644 index 0000000..257f64b --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Feature.cs @@ -0,0 +1,28 @@ +using Elsa.Studio.Abstractions; +using Elsa.Studio.Attributes; +using Elsa.Studio.Contracts; +using Elsa.Studio.WorkflowContexts.Widgets; + +namespace Elsa.Studio.WorkflowContexts; + +/// +/// Registers the workflow contexts feature. +/// +[RemoteFeature("Elsa.WorkflowContexts")] +public class Feature : FeatureBase +{ + private readonly IWidgetRegistry _widgetRegistry; + + /// + public Feature(IWidgetRegistry widgetRegistry) + { + _widgetRegistry = widgetRegistry; + } + + /// + public override ValueTask InitializeAsync(CancellationToken cancellationToken = default) + { + _widgetRegistry.Add(new WorkflowContextsEditorWidget()); + return default; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xml b/src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xsd b/src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Handlers/WorkflowContextProviderPickerHandler.cs b/src/modules/Elsa.Studio.WorkflowContexts/Handlers/WorkflowContextProviderPickerHandler.cs new file mode 100644 index 0000000..41d73f8 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Handlers/WorkflowContextProviderPickerHandler.cs @@ -0,0 +1,26 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; +using Elsa.Studio.WorkflowContexts.Components; + +namespace Elsa.Studio.WorkflowContexts.Handlers; + +public class WorkflowContextProviderPickerHandler : IUIHintHandler +{ + /// + public bool GetSupportsUIHint(string uiHint) => uiHint == "workflow-context-provider-picker"; + + /// + public string UISyntax => WellKnownSyntaxNames.Literal; + + /// + public RenderFragment DisplayInputEditor(DisplayInputEditorContext context) + { + return builder => + { + builder.OpenComponent(0, typeof(WorkflowContextProviderPicker)); + builder.AddAttribute(1, nameof(WorkflowContextProviderPicker.EditorContext), context); + builder.CloseComponent(); + }; + } +} diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Models/ActivityWorkflowContextSettings.cs b/src/modules/Elsa.Studio.WorkflowContexts/Models/ActivityWorkflowContextSettings.cs new file mode 100644 index 0000000..29f24e0 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Models/ActivityWorkflowContextSettings.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Studio.WorkflowContexts.Models; + +public class ActivityWorkflowContextSettings +{ + /// + /// Whether to load the context before executing the activity. + /// + public bool Load { get; set; } + + /// + /// Whether to save the context after executing the activity. + /// + public bool Save { get; set; } +} diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Services/RemoteWorkflowContextsProvider.cs b/src/modules/Elsa.Studio.WorkflowContexts/Services/RemoteWorkflowContextsProvider.cs new file mode 100644 index 0000000..72fe3b9 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Services/RemoteWorkflowContextsProvider.cs @@ -0,0 +1,30 @@ +using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Contracts; +using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.WorkflowContexts.Contracts; + +namespace Elsa.Studio.WorkflowContexts.Services; + +/// +/// Provides workflow contexts from a remote API. +/// +public class RemoteWorkflowContextsProvider : IWorkflowContextsProvider +{ + private readonly IBackendApiClientProvider _backendApiClientProvider; + + /// + /// Initializes a new instance of the class. + /// + public RemoteWorkflowContextsProvider(IBackendApiClientProvider backendApiClientProvider) + { + _backendApiClientProvider = backendApiClientProvider; + } + + /// + public async Task> ListAsync(CancellationToken cancellationToken = default) + { + var api = await _backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + return response.Items; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/Widgets/WorkflowContextsEditorWidget.cs b/src/modules/Elsa.Studio.WorkflowContexts/Widgets/WorkflowContextsEditorWidget.cs new file mode 100644 index 0000000..c6e7c56 --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/Widgets/WorkflowContextsEditorWidget.cs @@ -0,0 +1,27 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.WorkflowContexts.Components; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.WorkflowContexts.Widgets; + +/// +/// A widget that renders the workflow context editor. +/// +public class WorkflowContextsEditorWidget : IWidget +{ + /// + public string Zone => "workflow-definition-properties"; + + /// + public double Order => 25; + + /// + public Func, RenderFragment> Render => attributes => builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(WorkflowContextsEditor.WorkflowDefinition), attributes["WorkflowDefinition"]); + builder.AddAttribute(2, nameof(WorkflowContextsEditor.WorkflowDefinitionUpdated), attributes["WorkflowDefinitionUpdated"]); + builder.CloseComponent(); + + }; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.WorkflowContexts/_Imports.razor b/src/modules/Elsa.Studio.WorkflowContexts/_Imports.razor new file mode 100644 index 0000000..5c4672b --- /dev/null +++ b/src/modules/Elsa.Studio.WorkflowContexts/_Imports.razor @@ -0,0 +1,15 @@ +@using System.ComponentModel.DataAnnotations +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.Forms +@using Blazored.FluentValidation +@using Elsa.Studio.Components +@using Elsa.Studio.Localization +@using Humanizer +@using MudBlazor +@using MudExtensions +@using Radzen +@using Radzen.Blazor + +@attribute [Authorize] \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contexts/PortProviderContext.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contexts/PortProviderContext.cs new file mode 100644 index 0000000..89218c6 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contexts/PortProviderContext.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; + +namespace Elsa.Studio.Workflows.Domain.Contexts; + +/// +/// Represents the context for a port provider. +/// +/// The descriptor of te activity for which ports are being provided. +/// The activity for which ports are being provided. +public record PortProviderContext(ActivityDescriptor ActivityDescriptor, JsonObject Activity); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/CompatWorkflowJsonDetector.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/CompatWorkflowJsonDetector.cs new file mode 100644 index 0000000..d868335 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/CompatWorkflowJsonDetector.cs @@ -0,0 +1,22 @@ +using Elsa.Studio.Workflows.Domain.Services; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A service that detects whether a JSON string is a workflow definition, +/// first using a schema, then using a simple heuristic. +/// +public class CompatWorkflowJsonDetector : IWorkflowJsonDetector +{ + /// + public bool IsWorkflowSchema(string json) + { + var schemaDetector = new SchemaWorkflowJsonDetector(); + + if (schemaDetector.IsWorkflowSchema(json)) + return true; + + var simpleDetector = new SimpleWorkflowJsonDetector(); + return simpleDetector.IsWorkflowSchema(json); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityExecutionService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityExecutionService.cs new file mode 100644 index 0000000..032acdf --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityExecutionService.cs @@ -0,0 +1,37 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.ActivityExecutions.Models; +using Elsa.Api.Client.Resources.Resilience.Models; +using Elsa.Api.Client.Shared.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A service that provides information about the execution of activities. +/// +public interface IActivityExecutionService +{ + /// + /// Gets a report of the execution of activities. + /// + Task GetReportAsync(string workflowInstanceId, JsonObject containerActivity, CancellationToken cancellationToken = default); + + /// + /// Gets a list of activity execution records. + /// + Task> ListAsync(string workflowInstanceId, string activityNodeId, CancellationToken cancellationToken = default); + + /// + /// Gets a list of activity execution record summaries. + /// + Task> ListSummariesAsync(string workflowInstanceId, string activityNodeId, CancellationToken cancellationToken = default); + + /// + /// Gets an individual activity execution record. + /// + Task GetAsync(string id, CancellationToken cancellationToken = default); + + /// + /// Retrieves a paginated list of retry attempt records for a specific activity instance. + /// + Task> GetRetriesAsync(string activityInstanceId, int? skip = null, int? take = null, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityIdGenerator.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityIdGenerator.cs new file mode 100644 index 0000000..b396844 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityIdGenerator.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Generates unique activity IDs. +/// +public interface IIdentityGenerator +{ + /// + /// Generates a unique activity ID. + /// + string GenerateId(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityNameGenerator.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityNameGenerator.cs new file mode 100644 index 0000000..1ddab48 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityNameGenerator.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Generates unique activity names. +/// +public interface IActivityNameGenerator +{ + /// + /// Returns true if the specified name already exists in the container. + /// + bool GetNameExists(IEnumerable activities, string name); + + /// + /// Generates a unique name for the specified activity descriptor. + /// + string GenerateNextName(IEnumerable activities, ActivityDescriptor activityDescriptor); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortProvider.cs new file mode 100644 index 0000000..f6cab98 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortProvider.cs @@ -0,0 +1,49 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Provides ports for activities. +/// +public interface IActivityPortProvider +{ + /// + /// Gets the priority of the provider. + /// + double Priority { get; } + + /// + /// Returns true if the provider supports the specified activity type. + /// + bool GetSupportsActivityType(PortProviderContext context); + + /// + /// Returns the ports for the specified activity. + /// + /// The context. + IEnumerable GetPorts(PortProviderContext context); + + /// + /// Returns the activity for the specified port. + /// + /// The name of the port. + /// The context. + JsonObject? ResolvePort(string portName, PortProviderContext context); + + /// + /// Assigns the specified activity to the specified port. + /// + /// The name of the port. + /// The activity to assign. + /// The context. + void AssignPort(string portName, JsonObject activity, PortProviderContext context); + + /// + /// Clears the specified port. + /// + /// The name of the port. + /// The context. + void ClearPort(string portName, PortProviderContext context); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortService.cs new file mode 100644 index 0000000..06da803 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityPortService.cs @@ -0,0 +1,10 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +public interface IActivityPortService +{ + IActivityPortProvider GetProvider(PortProviderContext context); + IEnumerable GetPorts(PortProviderContext context); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistry.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistry.cs new file mode 100644 index 0000000..7496e09 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistry.cs @@ -0,0 +1,45 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Represents a registry of activity descriptors. +/// +public interface IActivityRegistry +{ + /// + /// Refreshes the list of activity descriptors. + /// + Task RefreshAsync(CancellationToken cancellationToken = default); + + /// + /// Ensures that the list of activity descriptors is loaded. + /// + Task EnsureLoadedAsync(CancellationToken cancellationToken = default); + + /// + /// Returns a list of the latest versions of activity descriptors. + /// + /// A list of activity descriptors. + IEnumerable List(); + + /// + /// Finds an activity descriptor by its type. + /// + /// The activity type. + /// The activity version. + /// The activity descriptor. + ActivityDescriptor? Find(string activityType, int? version = default); + + /// + /// Finds all activity descriptor versions by type. + /// + /// + /// + IEnumerable FindAll(string activityType); + + /// + /// Marks the activity registry as stale. + /// + void MarkStale(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistryProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistryProvider.cs new file mode 100644 index 0000000..143bec4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityRegistryProvider.cs @@ -0,0 +1,14 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Provides a list of activity descriptors to the activity registry. This is a way to abstract the source of activity descriptors. +/// +public interface IActivityRegistryProvider +{ + /// + /// Returns a list of activity descriptors. + /// + Task> ListAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityResolver.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityResolver.cs new file mode 100644 index 0000000..2a490e1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityResolver.cs @@ -0,0 +1,29 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// An activity resolver inspects a given activity and returns its contained activities. +/// Node resolvers are used to inspect a workflow structure and build a graph of nodes from it for easy node traversal. +/// +public interface IActivityResolver +{ + /// + /// The priority of this resolver. Resolvers with higher priority are executed first. + /// + int Priority { get; } + + /// + /// Returns true if this resolver supports the specified activity. + /// + bool GetSupportsActivity(JsonObject activity); + + /// + /// Returns a list of contained activities for the specified activity. + /// + /// + /// + /// + ValueTask> GetActivitiesAsync(JsonObject activity, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityVisitor.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityVisitor.cs new file mode 100644 index 0000000..f9172b0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IActivityVisitor.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Shared.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Represents a visitor that can visit an activity. +/// +public interface IActivityVisitor +{ + /// + /// Visits the specified activity and returns a graph of activities. + /// + /// + /// + /// + Task VisitAsync(JsonObject activity, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ICommitStrategiesProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ICommitStrategiesProvider.cs new file mode 100644 index 0000000..5cd0bbf --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ICommitStrategiesProvider.cs @@ -0,0 +1,19 @@ +using Elsa.Api.Client.Resources.CommitStrategies.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Provides commit strategies for workflows and activities. +/// +public interface ICommitStrategiesProvider +{ + /// + /// Gets workflow commit strategies. + /// + ValueTask> GetWorkflowCommitStrategiesAsync(CancellationToken cancellationToken = default); + + /// + /// Gets activity commit strategies. + /// + ValueTask> GetActivityCommitStrategiesAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IIncidentStrategiesProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IIncidentStrategiesProvider.cs new file mode 100644 index 0000000..4a6dfad --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IIncidentStrategiesProvider.cs @@ -0,0 +1,14 @@ +using Elsa.Api.Client.Resources.IncidentStrategies.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Provides incident strategies. +/// +public interface IIncidentStrategiesProvider +{ + /// + /// Gets incident strategies. + /// + ValueTask> GetIncidentStrategiesAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ILogPersistenceStrategyService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ILogPersistenceStrategyService.cs new file mode 100644 index 0000000..cbb7eb7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/ILogPersistenceStrategyService.cs @@ -0,0 +1,15 @@ +using Elsa.Api.Client.Resources.LogPersistenceStrategies; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A services that provides log persistence strategies. +/// +public interface ILogPersistenceStrategyService +{ + /// + /// Gets the log persistence strategies. + /// + /// The cancellation token. + Task> GetLogPersistenceStrategiesAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IResilienceStrategyCatalog.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IResilienceStrategyCatalog.cs new file mode 100644 index 0000000..a314c59 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IResilienceStrategyCatalog.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// Provides resilience strategies. +/// +public interface IResilienceStrategyCatalog +{ + /// + /// Gets resilience strategies for the specified category. + /// + ValueTask> ListAsync(string category, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IStorageDriverService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IStorageDriverService.cs new file mode 100644 index 0000000..eb95c31 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IStorageDriverService.cs @@ -0,0 +1,16 @@ +using Elsa.Api.Client.Resources.StorageDrivers.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A services that provides storage drivers. +/// +public interface IStorageDriverService +{ + /// + /// Gets the storage drivers. + /// + /// + /// + Task> GetStorageDriversAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IVariableTypeService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IVariableTypeService.cs new file mode 100644 index 0000000..99624bd --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IVariableTypeService.cs @@ -0,0 +1,15 @@ +using Elsa.Api.Client.Resources.VariableTypes.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A services that provides variable types. +/// +public interface IVariableTypeService +{ + /// + /// Gets the variable types. + /// + /// The cancellation token. + Task> GetVariableTypesAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowActivationStrategyService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowActivationStrategyService.cs new file mode 100644 index 0000000..8cec784 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowActivationStrategyService.cs @@ -0,0 +1,15 @@ +using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A services that provides workflow activation strategies. +/// +public interface IWorkflowActivationStrategyService +{ + /// + /// Gets the workflow activation strategies. + /// + /// The cancellation token. + Task> GetWorkflowActivationStrategiesAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionEditorService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionEditorService.cs new file mode 100644 index 0000000..db0421d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionEditorService.cs @@ -0,0 +1,34 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Responses; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A service that can be used to manage workflow definitions. +/// +public interface IWorkflowDefinitionEditorService +{ + /// + /// Saves a workflow definition. + /// + Task> SaveAsync(WorkflowDefinition workflowDefinition, bool publish, Func? workflowSavedCallback = null, CancellationToken cancellationToken = default); + + /// + /// Publishes a workflow definition. + /// + Task PublishAsync(WorkflowDefinition workflowDefinition, Func? workflowPublishedCallback = null, CancellationToken cancellationToken = default); + + + /// + /// Retracts a workflow definition. + /// + Task> RetractAsync(WorkflowDefinition workflowDefinition, Func? workflowRetractedCallback = null, CancellationToken cancellationToken = default); + + /// + /// Exports a workflow definition. + /// + Task ExportAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionHistoryService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionHistoryService.cs new file mode 100644 index 0000000..997edf4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionHistoryService.cs @@ -0,0 +1,21 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A service that can be used to manage the history of workflow definitions. +/// +public interface IWorkflowDefinitionHistoryService +{ + /// + /// Retracts a workflow definition. + /// + Task> RetractAsync(WorkflowDefinition workflowDefinition, Func? workflowRetractedCallback = null, CancellationToken cancellationToken = default); + + /// + /// Reverts the specified workflow definition to the specified version. + /// + Task RevertAsync(WorkflowDefinitionVersion workflowDefinitionVersion, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionImporter.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionImporter.cs new file mode 100644 index 0000000..c20f25a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionImporter.cs @@ -0,0 +1,15 @@ +using Elsa.Studio.Workflows.Domain.Models; +using Microsoft.AspNetCore.Components.Forms; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A service that imports workflow definitions. +/// +public interface IWorkflowDefinitionImporter +{ + /// + /// Imports a set of files containing workflow definitions. + /// + Task> ImportFilesAsync(IReadOnlyList files, ImportOptions? options = null); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionService.cs new file mode 100644 index 0000000..45f3f91 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowDefinitionService.cs @@ -0,0 +1,120 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Responses; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Models; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A service that can be used to manage workflow definitions. +/// +public interface IWorkflowDefinitionService +{ + /// + /// Lists all workflow definitions. + /// + Task> ListAsync(ListWorkflowDefinitionsRequest request, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default); + + /// + /// Finds a workflow definition by its ID. + /// + Task FindByDefinitionIdAsync(string definitionId, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default); + + /// + /// Finds a workflow definition by its ID. + /// + Task FindByIdAsync(string id, CancellationToken cancellationToken = default); + + /// + /// Finds all workflow definitions by their IDs. + /// + Task> FindManyByIdAsync(IEnumerable ids, CancellationToken cancellationToken = default); + + /// + /// Finds a workflow subgraph by workflow definition ID. + /// + Task FindSubgraphAsync(string id, string? parentNodeId = null, CancellationToken cancellationToken = default); + + /// + /// Returns all ancestor nodes for the specified child node. + /// + Task GetPathSegmentsAsync(string id, string? childNodeId = null, CancellationToken cancellationToken = default); + + /// + /// Deletes a workflow definition. + /// + Task DeleteAsync(string definitionId, CancellationToken cancellationToken = default); + + /// + /// Deletes a workflow definition version. + /// + Task DeleteVersionAsync(WorkflowDefinitionVersion workflowDefinitionVersion, CancellationToken cancellationToken = default); + + /// + /// Publishes a workflow definition. + /// + Task PublishAsync(string definitionId, CancellationToken cancellationToken = default); + + /// + /// Retracts a workflow definition. + /// + Task> RetractAsync(string definitionId, CancellationToken cancellationToken = default); + + /// + /// Deletes multiple workflow definitions. + /// + Task BulkDeleteAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default); + + /// + /// Deletes multiple workflow definition versions. + /// + Task BulkDeleteVersionsAsync(IEnumerable workflowDefinitionVersions, CancellationToken cancellationToken = default); + + /// + /// Publishes multiple workflow definitions. + /// + Task BulkPublishAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default); + + /// + /// Retracts multiple workflow definitions. + /// + Task BulkRetractAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default); + + /// + /// Returns true if a workflow definition with the specified name exists. + /// + Task GetIsNameUniqueAsync(string name, string? definitionId = default, CancellationToken cancellationToken = default); + + /// + /// Generates a unique name for a workflow definition. + /// + Task GenerateUniqueNameAsync(CancellationToken cancellationToken = default); + + /// + /// Creates a new workflow definition. + /// + Task> CreateNewDefinitionAsync(string name, string? description = default, CancellationToken cancellationToken = default); + + /// + /// Exports a workflow definition. + /// + Task ExportDefinitionAsync(string definitionId, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default); + + /// + /// Exports a set of workflow definitions. + /// + Task BulkExportDefinitionsAsync(IEnumerable ids, CancellationToken cancellationToken = default); + + /// + /// Updates the references of a workflow definition. + /// + Task UpdateReferencesAsync(string definitionId, CancellationToken cancellationToken = default); + + /// + /// Executes a workflow definition. + /// + Task ExecuteAsync(string definitionId, ExecuteWorkflowDefinitionRequest? request, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowInstanceService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowInstanceService.cs new file mode 100644 index 0000000..a9915fd --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowInstanceService.cs @@ -0,0 +1,22 @@ +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Models; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Contracts; + +public interface IWorkflowInstanceService +{ + Task> ListAsync(ListWorkflowInstancesRequest request, CancellationToken cancellationToken = default); + Task DeleteAsync(string instanceId, CancellationToken cancellationToken = default); + Task BulkDeleteAsync(IEnumerable instanceIds, CancellationToken cancellationToken = default); + Task CancelAsync(string instanceId, CancellationToken cancellationToken = default); + Task BulkCancelAsync(BulkCancelWorkflowInstancesRequest request, CancellationToken cancellationToken = default); + Task GetAsync(string id, CancellationToken cancellationToken = default); + Task> GetJournalAsync(string instanceId, JournalFilter? filter = default, int? skip = default, int? take = default, CancellationToken cancellationToken = default); + Task ExportAsync(string id, CancellationToken cancellationToken = default); + Task BulkExportAsync(IEnumerable ids, CancellationToken cancellationToken = default); + Task BulkImportAsync(IEnumerable streamParts, CancellationToken cancellationToken = default); + Task> GetVariablesAsync(string instanceId, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowJsonDetector.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowJsonDetector.cs new file mode 100644 index 0000000..b163a53 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Contracts/IWorkflowJsonDetector.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Workflows.Domain.Contracts; + +/// +/// A service that detects whether a JSON string is a workflow definition. +/// +public interface IWorkflowJsonDetector +{ + /// + /// Checks whether the provided JSON is a workflow schema. + /// + bool IsWorkflowSchema(string json); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityNodeExtensions.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityNodeExtensions.cs new file mode 100644 index 0000000..57bb563 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityNodeExtensions.cs @@ -0,0 +1,25 @@ +using Elsa.Api.Client.Shared.Models; + +namespace Elsa.Studio.Workflows.Domain.Extensions; + +/// +/// Provides extension methods for . +/// +public static class ActivityNodeExtensions +{ + /// + /// Returns a flattened list of the specified node and all its descendants. + /// + public static IEnumerable Flatten(this ActivityNode root) + { + yield return root; + + foreach (var node in root.Children) + { + var children = node.Flatten(); + + foreach (var child in children) + yield return child; + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityRegistryExtensions.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityRegistryExtensions.cs new file mode 100644 index 0000000..2b1003a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ActivityRegistryExtensions.cs @@ -0,0 +1,16 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ActivityRegistryExtensions +{ + /// + /// Returns a list of activity descriptors that are browsable. + /// + public static IEnumerable ListBrowsable(this IActivityRegistry activityRegistry) => + activityRegistry.List().Where(x => x.IsBrowsable).ToList(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ProblemDetailsExtensions.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ProblemDetailsExtensions.cs new file mode 100644 index 0000000..86e0554 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ProblemDetailsExtensions.cs @@ -0,0 +1,22 @@ +using Elsa.Studio.Workflows.Domain.Models; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Extensions; + +/// +/// Provides extension methods for . +/// +public static class ProblemDetailsExtensions +{ + /// + /// Converts a object to a object. + /// + public static ValidationErrors ToValidationErrors(this ProblemDetails problemDetails) + { + var validationErrors = + from pair in problemDetails.Errors + from message in pair.Value + select new ValidationError(message); + return new(validationErrors.ToList()); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ValidationApiExceptionExtensions.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ValidationApiExceptionExtensions.cs new file mode 100644 index 0000000..3d0c975 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Extensions/ValidationApiExceptionExtensions.cs @@ -0,0 +1,23 @@ +using Elsa.Studio.Workflows.Domain.Models; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Extensions; + +/// +/// Provides extension methods for . +/// +public static class ValidationApiExceptionExtensions +{ + /// + /// Gets the validation errors from a . + /// + public static ValidationErrors GetValidationErrors(this ValidationApiException e) + { + var problemDetails = e.Content; + + if (problemDetails != null) + return problemDetails.ToValidationErrors(); + + return problemDetails?.ToValidationErrors() ?? new ValidationErrors(new List { new(e.ReasonPhrase ?? "The server responded with a Bad Request status code. That's all I know.") }); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityGraph.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityGraph.cs new file mode 100644 index 0000000..bdfbf72 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityGraph.cs @@ -0,0 +1,31 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Extensions; + +namespace Elsa.Studio.Workflows.Domain.Models; + +/// An activity and a lookup of its descendants. +public class ActivityGraph(JsonObject activity, IActivityVisitor activityVisitor) +{ + private IDictionary _activityNodeLookup = new Dictionary(); + + /// + /// The root activity. + /// + public JsonObject Activity { get; } = activity; + + /// + /// A lookup of activity nodes by ID. + /// + public IReadOnlyDictionary ActivityNodeLookup => _activityNodeLookup.AsReadOnly(); + + /// + /// Updates the activity node lookup. + /// + public async Task IndexAsync() + { + _activityNodeLookup = await activityVisitor.VisitAndMapAsync(Activity); + return this; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityStats.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityStats.cs new file mode 100644 index 0000000..a79c3cb --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ActivityStats.cs @@ -0,0 +1,37 @@ +namespace Elsa.Studio.Workflows.Domain.Models; + +/// +/// Represents a report of activity executions. +/// +public class ActivityStats +{ + /// + /// The number of times the activity has been started. + /// + public long Started { get; set; } + + /// + /// The number of times the activity has been completed. + /// + public long Completed { get; set; } + + /// + /// The number of times the activity has been uncompleted. + /// + public long Uncompleted { get; set; } + + /// + /// Whether the activity is blocked. + /// + public bool Blocked { get; set; } + + /// + /// Whether the activity has faulted. + /// + public bool Faulted { get; set; } + + /// + /// A collection of metadata associated with the activity statistics. + /// + public IDictionary? Metadata { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/EmbeddedActivity.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/EmbeddedActivity.cs new file mode 100644 index 0000000..9e7d1ef --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/EmbeddedActivity.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.Domain.Models; + +/// +/// Represents an embedded activity. +/// +/// The embedded activity. +/// The name of the property that contains the embedded activity. +public record EmbeddedActivity(JsonObject Activity, string PropertyName); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExecuteWorkflowResult.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExecuteWorkflowResult.cs new file mode 100644 index 0000000..a212751 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExecuteWorkflowResult.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Workflows.Domain.Models; + +public record ExecuteWorkflowResult(string? WorkflowInstanceId, bool CannotStart); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExpressionDescriptorProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExpressionDescriptorProvider.cs new file mode 100644 index 0000000..fa43ac3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ExpressionDescriptorProvider.cs @@ -0,0 +1,35 @@ +using Elsa.Api.Client.Resources.Scripting.Models; + +namespace Elsa.Studio.Workflows.Domain.Models; + +/// +/// Provides expression descriptors that can be used as a cascading parameter. +/// +public class ExpressionDescriptorProvider +{ + private readonly IDictionary _expressionDescriptors = new Dictionary(); + + /// + /// Lists all expression descriptors. + /// + public IEnumerable ListDescriptors() => _expressionDescriptors.Values; + + /// + /// Adds an expression descriptor. + /// + public void Add(ExpressionDescriptor descriptor) => _expressionDescriptors[descriptor.Type] = descriptor; + + /// + /// Gets an expression descriptor by type. + /// + public ExpressionDescriptor? GetByType(string type) => _expressionDescriptors.TryGetValue(type, out var descriptor) ? descriptor : default; + + /// + /// Adds a range of expression descriptors. + /// + public void AddRange(IEnumerable descriptors) + { + foreach (var descriptor in descriptors) + Add(descriptor); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/FileDownload.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/FileDownload.cs new file mode 100644 index 0000000..58beffb --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/FileDownload.cs @@ -0,0 +1,6 @@ +namespace Elsa.Studio.Workflows.Domain.Models; + +/// +/// Represents a file download. +/// +public record FileDownload(string FileName, Stream Content); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ImportOptions.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ImportOptions.cs new file mode 100644 index 0000000..16d2c62 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ImportOptions.cs @@ -0,0 +1,11 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; + +namespace Elsa.Studio.Workflows.Domain.Models; + +public class ImportOptions +{ + public int MaxAllowedSize { get; set; } = 1024 * 1024 * 10; // 10 MB + public string? DefinitionId { get; set; } + public Func? ImportedCallback { get; set; } + public Func ErrorCallback { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationError.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationError.cs new file mode 100644 index 0000000..722ee90 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationError.cs @@ -0,0 +1,13 @@ +namespace Elsa.Studio.Workflows.Domain.Models; + +/// +/// Represents a validation error. +/// +/// +public record ValidationError(string ErrorMessage) +{ + /// + /// Returns the error message. + /// + public override string ToString() => ErrorMessage; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationErrors.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationErrors.cs new file mode 100644 index 0000000..9350419 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/ValidationErrors.cs @@ -0,0 +1,6 @@ +namespace Elsa.Studio.Workflows.Domain.Models; + +/// +/// Represents a collection of validation errors. +/// +public record ValidationErrors(IReadOnlyCollection Errors); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowDefinitionVersion.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowDefinitionVersion.cs new file mode 100644 index 0000000..59639be --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowDefinitionVersion.cs @@ -0,0 +1,21 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; + +namespace Elsa.Studio.Workflows.Domain.Models; + +public record WorkflowDefinitionVersion(string WorkflowDefinitionId, string WorkflowDefinitionVersionId, int Version) +{ + public static WorkflowDefinitionVersion FromDefinition(WorkflowDefinition workflowDefinition) + { + return new(workflowDefinition.DefinitionId, workflowDefinition.Id, workflowDefinition.Version); + } + + public static WorkflowDefinitionVersion FromDefinitionSummary(WorkflowDefinitionSummary workflowDefinitionSummary) + { + return new(workflowDefinitionSummary.DefinitionId, workflowDefinitionSummary.Id, workflowDefinitionSummary.Version); + } + + public static WorkflowDefinitionVersion FromDefinitionModel(WorkflowDefinitionModel model) + { + return new(model.DefinitionId, model.Id, model.Version); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailure.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailure.cs new file mode 100644 index 0000000..64efeb4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailure.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Workflows.Domain.Models; + +public record WorkflowImportFailure(string ErrorMessage, WorkflowImportFailureType FailureType); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailureType.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailureType.cs new file mode 100644 index 0000000..2d7d1da --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportFailureType.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Workflows.Domain.Models; + +public enum WorkflowImportFailureType +{ + Exception, + InvalidSchema +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportResult.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportResult.cs new file mode 100644 index 0000000..6abaad0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Models/WorkflowImportResult.cs @@ -0,0 +1,11 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; + +namespace Elsa.Studio.Workflows.Domain.Models; + +public class WorkflowImportResult +{ + public string FileName { get; set; } + public WorkflowDefinition? WorkflowDefinition { get; set; } + public WorkflowImportFailure? Failure { get; set; } + public bool IsSuccess => Failure == null; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ActivityRegistryRefreshed.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ActivityRegistryRefreshed.cs new file mode 100644 index 0000000..115344d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ActivityRegistryRefreshed.cs @@ -0,0 +1,10 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// +/// Represents a notification published when the activity registry is refreshed. +/// +public class ActivityRegistryRefreshed : INotification +{ +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverted.cs new file mode 100644 index 0000000..507a3a7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverted.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionReverted(ICollection WorkflowDefinitionVersions); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverting.cs new file mode 100644 index 0000000..9fc7780 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionReverting.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionReverting(ICollection WorkflowDefinitionVersions); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleted.cs new file mode 100644 index 0000000..1b49713 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleted.cs @@ -0,0 +1,6 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionVersionsDeleted(ICollection Versions) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleting.cs new file mode 100644 index 0000000..fea11d6 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionVersionsDeleting.cs @@ -0,0 +1,6 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionVersionsDeleting(ICollection Versions) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleted.cs new file mode 100644 index 0000000..454246f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleted.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionsDeleted(ICollection WorkflowDefinitionIds) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleting.cs new file mode 100644 index 0000000..5b5ab6e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsDeleting.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionsDeleting(ICollection WorkflowDefinitionIds) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublished.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublished.cs new file mode 100644 index 0000000..138aead --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublished.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionsPublished(ICollection WorkflowDefinitionIds) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublishing.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublishing.cs new file mode 100644 index 0000000..42dc9c7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsPublishing.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionsPublishing(ICollection WorkflowDefinitionIds) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracted.cs new file mode 100644 index 0000000..73f22e1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracted.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionsRetracted(ICollection WorkflowDefinitionIds) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracting.cs new file mode 100644 index 0000000..dd93aa9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/BulkWorkflowDefinitionsRetracting.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record BulkWorkflowDefinitionsRetracting(ICollection WorkflowDefinitionIds) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedFile.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedFile.cs new file mode 100644 index 0000000..47e24fa --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedFile.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Contracts; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Components.Forms; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +[UsedImplicitly] +public record ImportedFile(IBrowserFile File) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedJson.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedJson.cs new file mode 100644 index 0000000..08d3973 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedJson.cs @@ -0,0 +1,7 @@ +using Elsa.Studio.Contracts; +using JetBrains.Annotations; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +[UsedImplicitly] +public record ImportedJson(string Json) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedWorkflowDefinition.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedWorkflowDefinition.cs new file mode 100644 index 0000000..513b593 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportedWorkflowDefinition.cs @@ -0,0 +1,6 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record ImportedWorkflowDefinition(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingFile.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingFile.cs new file mode 100644 index 0000000..18b1336 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingFile.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Contracts; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Components.Forms; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +[UsedImplicitly] +public record ImportingFile(IBrowserFile File) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingJson.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingJson.cs new file mode 100644 index 0000000..4e09e8c --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingJson.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Contracts; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Components.Forms; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +[UsedImplicitly] +public record ImportingJson(string Json) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingWorkflowDefinition.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingWorkflowDefinition.cs new file mode 100644 index 0000000..505494b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/ImportingWorkflowDefinition.cs @@ -0,0 +1,6 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record ImportingWorkflowDefinition(WorkflowDefinitionModel WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleted.cs new file mode 100644 index 0000000..26bdbd2 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleted.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionDeleted(string WorkflowDefinitionId) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleting.cs new file mode 100644 index 0000000..711b4c6 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionDeleting.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionDeleting(string WorkflowDefinitionId) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExported.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExported.cs new file mode 100644 index 0000000..837f648 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExported.cs @@ -0,0 +1,7 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionExported(WorkflowDefinition WorkflowDefinition, FileDownload FileDownload) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExporting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExporting.cs new file mode 100644 index 0000000..b4c40c5 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionExporting.cs @@ -0,0 +1,6 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionExporting(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExported.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExported.cs new file mode 100644 index 0000000..d97944a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExported.cs @@ -0,0 +1,7 @@ +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionIdExported(string WorkflowDefinitionId, VersionOptions? VersionOptions, FileDownload FileDownload) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExporting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExporting.cs new file mode 100644 index 0000000..3855693 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdExporting.cs @@ -0,0 +1,6 @@ +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionIdExporting(string WorkflowDefinitionId, VersionOptions? VersionOptions) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdPublishing.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdPublishing.cs new file mode 100644 index 0000000..5a1e9a5 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdPublishing.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// +/// Represents a notification sent when a workflow definition is about to be published by its ID. +/// +public record WorkflowDefinitionIdPublishing(string WorkflowDefinitionId) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetracting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetracting.cs new file mode 100644 index 0000000..17a7864 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetracting.cs @@ -0,0 +1,5 @@ +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionIdRetracting(string WorkflowDefinitionId) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetractingFailed.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetractingFailed.cs new file mode 100644 index 0000000..eaf1ded --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionIdRetractingFailed.cs @@ -0,0 +1,6 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionIdRetractingFailed(string WorkflowDefinitionId, ValidationErrors Errors) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublished.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublished.cs new file mode 100644 index 0000000..3906193 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublished.cs @@ -0,0 +1,7 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// Represents a notification sent when a workflow definition is published. +public record WorkflowDefinitionPublished(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishing.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishing.cs new file mode 100644 index 0000000..a8fde73 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishing.cs @@ -0,0 +1,7 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// Represents a notification sent when a workflow definition is about to be published. +public record WorkflowDefinitionPublishing(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishingFailed.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishingFailed.cs new file mode 100644 index 0000000..4c169ba --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionPublishingFailed.cs @@ -0,0 +1,10 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// +/// A notification sent when a workflow definition failed to publish. +/// +public record WorkflowDefinitionPublishingFailed(WorkflowDefinition WorkflowDefinition, ValidationErrors Errors) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracted.cs new file mode 100644 index 0000000..576e360 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracted.cs @@ -0,0 +1,6 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionRetracted(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracting.cs new file mode 100644 index 0000000..dfcbaf0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetracting.cs @@ -0,0 +1,6 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionRetracting(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetractingFailed.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetractingFailed.cs new file mode 100644 index 0000000..34efc63 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionRetractingFailed.cs @@ -0,0 +1,7 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionRetractingFailed(WorkflowDefinition WorkflowDefinition, ValidationErrors Errors) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionReverted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionReverted.cs new file mode 100644 index 0000000..4a46f94 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionReverted.cs @@ -0,0 +1,6 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionReverted(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaved.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaved.cs new file mode 100644 index 0000000..40c8bcb --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaved.cs @@ -0,0 +1,7 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// Represents a notification sent when a workflow definition has been saved. +public record WorkflowDefinitionSaved(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaving.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaving.cs new file mode 100644 index 0000000..b1665d7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSaving.cs @@ -0,0 +1,7 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// Represents a notification sent when a workflow definition is about to be saved. +public record WorkflowDefinitionSaving(WorkflowDefinition WorkflowDefinition) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSavingFailed.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSavingFailed.cs new file mode 100644 index 0000000..ae43807 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionSavingFailed.cs @@ -0,0 +1,10 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +/// +/// A notification sent when a workflow definition failed to save. +/// +public record WorkflowDefinitionSavingFailed(WorkflowDefinition WorkflowDefinition, ValidationErrors Errors) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleted.cs new file mode 100644 index 0000000..9f23ebd --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleted.cs @@ -0,0 +1,6 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionVersionDeleted(WorkflowDefinitionVersion WorkflowDefinitionVersion) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleting.cs new file mode 100644 index 0000000..e3ee2b7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionDeleting.cs @@ -0,0 +1,6 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionVersionDeleting(WorkflowDefinitionVersion WorkflowDefinitionVersion) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverted.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverted.cs new file mode 100644 index 0000000..5253120 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverted.cs @@ -0,0 +1,6 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionVersionReverted(WorkflowDefinitionVersion WorkflowDefinitionVersion) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverting.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverting.cs new file mode 100644 index 0000000..14aba7d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Notifications/WorkflowDefinitionVersionReverting.cs @@ -0,0 +1,6 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Domain.Notifications; + +public record WorkflowDefinitionVersionReverting(WorkflowDefinitionVersion WorkflowDefinitionVersion) : INotification; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/ActivityPortProviderBase.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/ActivityPortProviderBase.cs new file mode 100644 index 0000000..1ae866d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/ActivityPortProviderBase.cs @@ -0,0 +1,45 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Humanizer; + +namespace Elsa.Studio.Workflows.Domain.Providers; + +/// +public abstract class ActivityPortProviderBase : IActivityPortProvider +{ + /// + public virtual double Priority => 0; + + /// + public abstract bool GetSupportsActivityType(PortProviderContext context); + + /// + public abstract IEnumerable GetPorts(PortProviderContext context); + + /// + public virtual JsonObject? ResolvePort(string portName, PortProviderContext context) + { + var activity = context.Activity; + var propName = portName.Camelize(); + return activity.GetProperty(propName)?.AsObject(); + } + + /// + public virtual void AssignPort(string portName, JsonObject activity, PortProviderContext context) + { + var container = context.Activity; + var propName = portName.Camelize(); + container.SetProperty(activity, propName); + } + + /// + public virtual void ClearPort(string portName, PortProviderContext context) + { + var container = context.Activity; + var propName = portName.Camelize(); + container.Remove(propName); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/DefaultActivityPortProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/DefaultActivityPortProvider.cs new file mode 100644 index 0000000..53114ff --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/PortProviders/DefaultActivityPortProvider.cs @@ -0,0 +1,23 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Providers; + +/// +/// A default implementation of that returns the ports defined by the activity descriptor. +/// +public class DefaultActivityPortProvider : ActivityPortProviderBase +{ + /// + public override double Priority => -1000; + + /// + public override bool GetSupportsActivityType(PortProviderContext context) => true; + + /// + public override IEnumerable GetPorts(PortProviderContext context) + { + return context.ActivityDescriptor.Ports.ToList(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityDisplaySettingsRegistry.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityDisplaySettingsRegistry.cs new file mode 100644 index 0000000..44236c4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityDisplaySettingsRegistry.cs @@ -0,0 +1,53 @@ +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class DefaultActivityDisplaySettingsRegistry : IActivityDisplaySettingsRegistry +{ + private readonly IEnumerable _providers; + private IDictionary? _settings; + + /// + /// Initializes a new instance of the class. + /// + public DefaultActivityDisplaySettingsRegistry(IEnumerable providers) + { + _providers = providers; + } + + private static ActivityDisplaySettings DefaultSettings { get; set; } = new(DefaultActivityColors.Default); + + /// + public ActivityDisplaySettings GetSettings(string activityType) + { + var dictionary = GetSettingsDictionary(); + return dictionary.TryGetValue(activityType, out var settings) ? settings : DefaultSettings; + } + + /// + public void MarkStale() + { + _settings = null; + } + + private IDictionary GetSettingsDictionary() + { + if(_settings != null) + return _settings; + + var settings = new Dictionary(); + + foreach (var provider in _providers) + { + var providerSettings = provider.GetSettings(); + + foreach (var (activityType, activityDisplaySettings) in providerSettings) + settings[activityType] = activityDisplaySettings; + } + + _settings = settings; + return _settings; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityNameGenerator.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityNameGenerator.cs new file mode 100644 index 0000000..1230b98 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityNameGenerator.cs @@ -0,0 +1,38 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class DefaultActivityNameGenerator : IActivityNameGenerator +{ + /// + public bool GetNameExists(IEnumerable activities, string name) + { + return activities.Any(x => x.GetName() == name); + } + + /// + public string GenerateNextName(IEnumerable activities, ActivityDescriptor activityDescriptor) + { + var max = 10000; + var enumerable = activities as JsonObject[] ?? activities.ToArray(); + var count = GetNextNumber(enumerable, activityDescriptor); + + while (count++ < max) + { + var nextName = $"{activityDescriptor.Name}{count}"; + if (!GetNameExists(enumerable, nextName)) + return nextName; + } + + throw new Exception("Could not generate a unique name."); + } + + private static int GetNextNumber(IEnumerable activities, ActivityDescriptor activityDescriptor) + { + return activities.Count(x => x.GetTypeName() == activityDescriptor.TypeName); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityPortService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityPortService.cs new file mode 100644 index 0000000..b108257 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityPortService.cs @@ -0,0 +1,34 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class DefaultActivityPortService : IActivityPortService +{ + private readonly IEnumerable _providers; + + /// + /// Initializes a new instance of the class. + /// + public DefaultActivityPortService(IEnumerable providers) + { + _providers = providers; + } + + /// + public IActivityPortProvider GetProvider(PortProviderContext context) + { + var activityType = context.ActivityDescriptor.TypeName; + var provider = _providers.Where(x => x.GetSupportsActivityType(context)).MaxBy(x => x.Priority); + return provider ?? throw new Exception($"No port provider found for activity type '{activityType}'."); + } + + /// + public IEnumerable GetPorts(PortProviderContext context) + { + var provider = GetProvider(context); + return provider.GetPorts(context); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityRegistry.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityRegistry.cs new file mode 100644 index 0000000..4366d3b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityRegistry.cs @@ -0,0 +1,82 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Notifications; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class DefaultActivityRegistry : IActivityRegistry +{ + private readonly IActivityRegistryProvider _provider; + private readonly IMediator _mediator; + private Dictionary<(string ActivityTypeName, int Version), ActivityDescriptor> _activityDescriptors = new(); + private readonly SemaphoreSlim _semaphore = new(1, 1); + private bool _isStale = true; + + /// + /// Initializes a new instance of the class. + /// + public DefaultActivityRegistry(IActivityRegistryProvider provider, IMediator mediator) + { + _provider = provider; + _mediator = mediator; + } + + /// + public async Task RefreshAsync(CancellationToken cancellationToken = default) + { + var descriptors = await _provider.ListAsync(cancellationToken); + _activityDescriptors = descriptors.ToDictionary(x => (x.TypeName, x.Version)); + _isStale = false; + await _mediator.NotifyAsync(new ActivityRegistryRefreshed(), cancellationToken); + } + + /// + public async Task EnsureLoadedAsync(CancellationToken cancellationToken = default) + { + await _semaphore.WaitAsync(cancellationToken); + + try + { + if (!_isStale) + return; + + await RefreshAsync(cancellationToken); + } + finally + { + _semaphore.Release(); + } + } + + /// + public IEnumerable List() + { + // Return the latest version of each activity descriptor from _activityDescriptors. + return _activityDescriptors.Values + .GroupBy(activityDescriptor => activityDescriptor.TypeName) + .Select(grouping => grouping.OrderByDescending(y => y.Version).First()); + } + + /// + public ActivityDescriptor? Find(string activityType, int? version = default) + { + version ??= 1; + return _activityDescriptors.GetValueOrDefault((activityType, version.Value)); + } + + /// + public IEnumerable FindAll(string activityType) + { + return _activityDescriptors + .Where(kvp => kvp.Key.ActivityTypeName == activityType) + .Select(kvp => kvp.Value); + } + + /// + public void MarkStale() + { + _isStale = true; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityVisitor.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityVisitor.cs new file mode 100644 index 0000000..c4c226d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/DefaultActivityVisitor.cs @@ -0,0 +1,64 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class DefaultActivityVisitor : IActivityVisitor +{ + private readonly IEnumerable _portResolvers; + + /// + /// Initializes a new instance of the class. + /// + public DefaultActivityVisitor(IEnumerable portResolvers) + { + _portResolvers = portResolvers.OrderByDescending(x => x.Priority).ToList(); + } + + /// + public async Task VisitAsync(JsonObject activity, CancellationToken cancellationToken = default) + { + var collectedActivities = new HashSet(new[] { activity }); + var graph = new ActivityNode(activity); + var collectedNodes = new HashSet(new[] { graph }); + await VisitRecursiveAsync((graph, activity), collectedActivities, collectedNodes, cancellationToken); + return graph; + } + + private async Task VisitRecursiveAsync((ActivityNode Node, JsonObject Activity) pair, HashSet collectedActivities, HashSet collectedNodes, CancellationToken cancellationToken) + { + await VisitPortsRecursiveAsync(pair, collectedActivities, collectedNodes, cancellationToken); + } + + private async Task VisitPortsRecursiveAsync((ActivityNode Node, JsonObject Activity) pair, HashSet collectedActivities, HashSet collectedNodes, CancellationToken cancellationToken) + { + var resolver = _portResolvers.FirstOrDefault(x => x.GetSupportsActivity(pair.Activity)); + + if (resolver == null) + return; + + var embeddedActivities = await resolver.GetActivitiesAsync(pair.Activity, cancellationToken); + + foreach (var embeddedActivity in embeddedActivities) + { + // Continue if the specified activity was already encountered. + if (collectedActivities.Contains(embeddedActivity.Activity)) + continue; + + var childNode = collectedNodes.FirstOrDefault(x => x.Activity == embeddedActivity.Activity); + + if (childNode == null) + { + childNode = new ActivityNode(embeddedActivity.Activity, embeddedActivity.PropertyName); + collectedNodes.Add(childNode); + } + + childNode.Parents.Add(pair.Node); + pair.Node.Children.Add(childNode); + collectedActivities.Add(embeddedActivity.Activity); + await VisitRecursiveAsync((childNode, embeddedActivity.Activity), collectedActivities, collectedNodes, cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RandomLongIdentityGenerator.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RandomLongIdentityGenerator.cs new file mode 100644 index 0000000..d1b495c --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RandomLongIdentityGenerator.cs @@ -0,0 +1,19 @@ +using System.Security.Cryptography; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// Generates a unique identifier using a random long value. +/// +public class RandomLongIdentityGenerator : IIdentityGenerator +{ + /// + public string GenerateId() + { + var bytes = new byte[8]; + RandomNumberGenerator.Fill(bytes); + var randomLong = BitConverter.ToInt64(bytes, 0); + return randomLong.ToString("x"); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityExecutionService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityExecutionService.cs new file mode 100644 index 0000000..d633886 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityExecutionService.cs @@ -0,0 +1,73 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityExecutions.Contracts; +using Elsa.Api.Client.Resources.ActivityExecutions.Models; +using Elsa.Api.Client.Resources.ActivityExecutions.Requests; +using Elsa.Api.Client.Resources.Resilience.Contracts; +using Elsa.Api.Client.Resources.Resilience.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// An activity execution service that uses a remote backend to retrieve activity execution reports. +/// +public class RemoteActivityExecutionService(IBackendApiClientProvider backendApiClientProvider) : IActivityExecutionService +{ + /// + public async Task GetReportAsync(string workflowInstanceId, JsonObject containerActivity, CancellationToken cancellationToken = default) + { + var activityNodeIds = containerActivity.GetActivities().Select(x => x.GetNodeId()).ToList(); + var request = new GetActivityExecutionReportRequest + { + WorkflowInstanceId = workflowInstanceId, + ActivityNodeIds = activityNodeIds + }; + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + return await api.GetReportAsync(request, cancellationToken); + } + + /// + public async Task> ListAsync(string workflowInstanceId, string activityNodeId, CancellationToken cancellationToken = default) + { + var request = new ListActivityExecutionsRequest + { + WorkflowInstanceId = workflowInstanceId, + ActivityNodeId = activityNodeId + }; + + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(request, cancellationToken); + return response.Items; + } + + /// + public async Task> ListSummariesAsync(string workflowInstanceId, string activityNodeId, CancellationToken cancellationToken = default) + { + var request = new ListActivityExecutionsRequest + { + WorkflowInstanceId = workflowInstanceId, + ActivityNodeId = activityNodeId + }; + + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListSummariesAsync(request, cancellationToken); + return response.Items; + } + + /// + public async Task GetAsync(string id, CancellationToken cancellationToken = default) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + return await api.GetAsync(id, cancellationToken); + } + + /// + public async Task> GetRetriesAsync(string activityInstanceId, int? skip = null, int? take = null, CancellationToken cancellationToken = default) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + return await api.ListAsync(activityInstanceId, skip, take, cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityRegistryProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityRegistryProvider.cs new file mode 100644 index 0000000..c1c62bd --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteActivityRegistryProvider.cs @@ -0,0 +1,26 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Contracts; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.ActivityDescriptors.Requests; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// An activity registry provider that uses a remote backend to retrieve activity descriptors. +/// +public class RemoteActivityRegistryProvider(IBackendApiClientProvider remoteBackendApiClientProvider) : IActivityRegistryProvider +{ + /// + public async Task> ListAsync(CancellationToken cancellationToken = default) + { + var api = await remoteBackendApiClientProvider.GetApiAsync(cancellationToken); + var request = new ListActivityDescriptorsRequest + { + Refresh = true + }; + var response = await api.ListAsync(request, cancellationToken); + + return response.Items; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteCommitStrategiesProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteCommitStrategiesProvider.cs new file mode 100644 index 0000000..7721cb7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteCommitStrategiesProvider.cs @@ -0,0 +1,41 @@ +using Elsa.Api.Client.Resources.CommitStrategies.Contracts; +using Elsa.Api.Client.Resources.CommitStrategies.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class RemoteCommitStrategiesProvider(IBackendApiClientProvider backendApiClientProvider) : ICommitStrategiesProvider +{ + private ICollection? _workflowCommitStrategies; + private ICollection? _activityCommitStrategies; + + /// + public async ValueTask> GetWorkflowCommitStrategiesAsync(CancellationToken cancellationToken = default) + { + if (_workflowCommitStrategies == null) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListWorkflowStrategiesAsync(cancellationToken); + + _workflowCommitStrategies = response.Items; + } + + return _workflowCommitStrategies; + } + + /// + public async ValueTask> GetActivityCommitStrategiesAsync(CancellationToken cancellationToken = default) + { + if (_activityCommitStrategies == null) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListActivityStrategiesAsync(cancellationToken); + + _activityCommitStrategies = response.Items; + } + + return _activityCommitStrategies; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteIncidentStrategiesProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteIncidentStrategiesProvider.cs new file mode 100644 index 0000000..e8ca521 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteIncidentStrategiesProvider.cs @@ -0,0 +1,21 @@ +using Elsa.Api.Client.Resources.IncidentStrategies.Contracts; +using Elsa.Api.Client.Resources.IncidentStrategies.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// Provides incident strategies from a remote server. +/// +public class RemoteIncidentStrategiesProvider(IBackendApiClientProvider backendApiClientProvider) : IIncidentStrategiesProvider +{ + /// + public async ValueTask> GetIncidentStrategiesAsync(CancellationToken cancellationToken = default) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + + return response.Items; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteLogPersistenceStrategyService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteLogPersistenceStrategyService.cs new file mode 100644 index 0000000..3a9f5ad --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteLogPersistenceStrategyService.cs @@ -0,0 +1,24 @@ +using Elsa.Api.Client.Resources.LogPersistenceStrategies; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class RemoteLogPersistenceStrategyService(IBackendApiClientProvider backendApiClientProvider) : ILogPersistenceStrategyService +{ + private ICollection? _descriptors; + + /// + public async Task> GetLogPersistenceStrategiesAsync(CancellationToken cancellationToken = default) + { + if (_descriptors == null) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + _descriptors = response.Items; + } + + return _descriptors; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteResilienceStrategyCatalog.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteResilienceStrategyCatalog.cs new file mode 100644 index 0000000..76a77e1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteResilienceStrategyCatalog.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.Resilience.Contracts; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +public class RemoteResilienceStrategyCatalog(IBackendApiClientProvider backendApiClientProvider) : IResilienceStrategyCatalog +{ + /// + public async ValueTask> ListAsync(string category, CancellationToken cancellationToken = default) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(category, cancellationToken); + + return response.Items; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteServerInformationProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteServerInformationProvider.cs new file mode 100644 index 0000000..fa94867 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteServerInformationProvider.cs @@ -0,0 +1,31 @@ +using Elsa.Api.Client.Resources.Package.Contracts; +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// Provides information about a remote server. +/// +public class RemoteServerInformationProvider : IServerInformationProvider +{ + private readonly IBackendApiClientProvider _backendApiClientProvider; + + /// + /// Initializes a new instance of the class. + /// + public RemoteServerInformationProvider(IBackendApiClientProvider backendApiClientProvider) + { + _backendApiClientProvider = backendApiClientProvider; + } + + /// + public async ValueTask GetInfoAsync(CancellationToken cancellationToken = default) + { + var api = await _backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.GetAsync(cancellationToken); + var packageVersion = response.PackageVersion.ToString(); + + return new (PackageVersion: packageVersion); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteStorageDriverService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteStorageDriverService.cs new file mode 100644 index 0000000..9680e10 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteStorageDriverService.cs @@ -0,0 +1,31 @@ +using Elsa.Api.Client.Resources.StorageDrivers.Contracts; +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A storage driver service that uses a remote backend to retrieve storage drivers. +/// +public class RemoteStorageDriverService : IStorageDriverService +{ + private readonly IBackendApiClientProvider _backendApiClientProvider; + + /// + /// Initializes a new instance of the class. + /// + public RemoteStorageDriverService(IBackendApiClientProvider backendApiClientProvider) + { + _backendApiClientProvider = backendApiClientProvider; + } + + /// + public async Task> GetStorageDriversAsync(CancellationToken cancellationToken = default) + { + var api = await _backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + + return response.Items; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteVariableTypeService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteVariableTypeService.cs new file mode 100644 index 0000000..929cdf2 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteVariableTypeService.cs @@ -0,0 +1,30 @@ +using Elsa.Api.Client.Resources.VariableTypes.Contracts; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A variable type service that uses a remote backend to retrieve variable types. +/// +public class RemoteVariableTypeService : IVariableTypeService +{ + private readonly IBackendApiClientProvider _backendApiClientProvider; + + /// + /// Initializes a new instance of the class. + /// + public RemoteVariableTypeService(IBackendApiClientProvider backendApiClientProvider) + { + _backendApiClientProvider = backendApiClientProvider; + } + + /// + public async Task> GetVariableTypesAsync(CancellationToken cancellationToken = default) + { + var api = await _backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + return response.Items; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowActivationStrategyService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowActivationStrategyService.cs new file mode 100644 index 0000000..00228ed --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowActivationStrategyService.cs @@ -0,0 +1,20 @@ +using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Contracts; +using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A workflow activation strategy service that uses a remote backend to retrieve workflow activation strategies. +/// +public class RemoteWorkflowActivationStrategyService(IBackendApiClientProvider backendApiClientProvider) : IWorkflowActivationStrategyService +{ + /// + public async Task> GetWorkflowActivationStrategiesAsync(CancellationToken cancellationToken = default) + { + var api = await backendApiClientProvider.GetApiAsync(cancellationToken); + var response = await api.ListAsync(cancellationToken); + return response.Items; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowInstanceService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowInstanceService.cs new file mode 100644 index 0000000..e1b0be3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/RemoteWorkflowInstanceService.cs @@ -0,0 +1,130 @@ +using System.Net; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.WorkflowInstances.Contracts; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A workflow instance service that uses a remote backend to retrieve workflow instances. +/// +public class RemoteWorkflowInstanceService : IWorkflowInstanceService +{ + private readonly IBackendApiClientProvider _backendApiClientProvider; + + /// + /// Initializes a new instance of the class. + /// + public RemoteWorkflowInstanceService(IBackendApiClientProvider backendApiClientProvider) + { + _backendApiClientProvider = backendApiClientProvider; + } + + /// + public async Task> ListAsync(ListWorkflowInstancesRequest request, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + return await api.ListAsync(request, cancellationToken); + } + + /// + public async Task DeleteAsync(string instanceId, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await api.DeleteAsync(instanceId, cancellationToken); + } + + /// + public async Task BulkDeleteAsync(IEnumerable instanceIds, CancellationToken cancellationToken = default) + { + var request = new BulkDeleteWorkflowInstancesRequest + { + Ids = instanceIds.ToList() + }; + var api = await GetApiAsync(cancellationToken); + await api.BulkDeleteAsync(request, cancellationToken); + } + + /// + public async Task CancelAsync(string instanceId, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await api.CancelAsync(instanceId, cancellationToken); + } + + /// + public async Task BulkCancelAsync(BulkCancelWorkflowInstancesRequest request, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await api.BulkCancelAsync(request, cancellationToken); + } + + /// + public async Task GetAsync(string id, CancellationToken cancellationToken = default) + { + try + { + var api = await GetApiAsync(cancellationToken); + return await api.GetAsync(id, cancellationToken); + } + catch (ApiException e) when (e.StatusCode == HttpStatusCode.NotFound) + { + return null; + } + } + + /// + public async Task> GetJournalAsync(string instanceId, JournalFilter? filter = null, int? skip = null, int? take = null, CancellationToken cancellationToken = default) + { + var request = new GetFilteredJournalRequest + { + Filter = filter + }; + var api = await GetApiAsync(cancellationToken); + return await api.GetFilteredJournalAsync(instanceId, request, skip, take, cancellationToken); + } + + /// + public async Task ExportAsync(string id, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + var response = await api.ExportAsync(id, cancellationToken); + var fileName = response.GetDownloadedFileNameOrDefault($"workflow-instance-{id}.json"); + + return new(fileName, response.Content!); + } + + /// + public async Task BulkExportAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + var request = new BulkExportWorkflowInstancesRequest(ids.ToArray()); + var response = await api.BulkExportAsync(request, cancellationToken); + var fileName = response.GetDownloadedFileNameOrDefault("workflow-instances.zip"); + return new(fileName, response.Content!); + } + + /// + public async Task BulkImportAsync(IEnumerable streamParts, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + var response = await api.BulkImportAsync(streamParts.ToList(), cancellationToken); + return response.Count; + } + + /// + public async Task> GetVariablesAsync(string instanceId, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + var response = await api.GetVariablesAsync(instanceId, cancellationToken); + return response.Items; + } + + private async Task GetApiAsync(CancellationToken cancellationToken = default) => await _backendApiClientProvider.GetApiAsync(cancellationToken); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SchemaWorkflowJsonDetector.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SchemaWorkflowJsonDetector.cs new file mode 100644 index 0000000..d36b95b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SchemaWorkflowJsonDetector.cs @@ -0,0 +1,27 @@ +using System.Text.Json; +using Elsa.Studio.Workflows.Domain.Contracts; +using JetBrains.Annotations; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A service that detects whether a JSON string is a workflow definition using a schema. +/// +[UsedImplicitly] +public class SchemaWorkflowJsonDetector : IWorkflowJsonDetector +{ + /// + public bool IsWorkflowSchema(string json) + { + var jsonDocument = JsonDocument.Parse(json); + var rootElement = jsonDocument.RootElement; + + if (!rootElement.TryGetProperty("$schema", out var schemaUrl)) + return false; + + if (schemaUrl.GetString()?.StartsWith("https://elsaworkflows.io/schemas/workflow-definition") == false) + return false; + + return true; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/ShortGuidActivityIdGenerator.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/ShortGuidActivityIdGenerator.cs new file mode 100644 index 0000000..70420b1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/ShortGuidActivityIdGenerator.cs @@ -0,0 +1,13 @@ +using DEDrake; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// Generates unique activity IDs using . +/// +public class ShortGuidIdentityGenerator : IIdentityGenerator +{ + /// + public string GenerateId() => ShortGuid.NewGuid().ToString(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SimpleWorkflowJsonDetector.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SimpleWorkflowJsonDetector.cs new file mode 100644 index 0000000..6bc16ee --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/SimpleWorkflowJsonDetector.cs @@ -0,0 +1,33 @@ +using System.Text.Json; +using Elsa.Studio.Workflows.Domain.Contracts; +using JetBrains.Annotations; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A service that detects whether a JSON string is a workflow definition using a simple heuristic. +/// +[UsedImplicitly] +public class SimpleWorkflowJsonDetector : IWorkflowJsonDetector +{ + /// + public bool IsWorkflowSchema(string json) + { + var jsonDocument = JsonDocument.Parse(json); + var rootElement = jsonDocument.RootElement; + + if (!rootElement.TryGetProperty("definitionId", out _)) + return false; + + if (!rootElement.TryGetProperty("id", out _)) + return false; + + if (!rootElement.TryGetProperty("root", out _)) + return false; + + if (!rootElement.TryGetProperty("name", out _)) + return false; + + return true; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionEditorService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionEditorService.cs new file mode 100644 index 0000000..cfcf2f9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionEditorService.cs @@ -0,0 +1,140 @@ +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Responses; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Extensions; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Domain.Notifications; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A workflow definition service that uses a remote backend to retrieve workflow definitions. +/// +public class WorkflowDefinitionEditorService(IBackendApiClientProvider backendApiClientProvider, IMediator mediator) : IWorkflowDefinitionEditorService +{ + /// + public async Task> SaveAsync(WorkflowDefinition workflowDefinition, bool publish, Func? workflowSavedCallback = null, CancellationToken cancellationToken = default) + { + var request = new SaveWorkflowDefinitionRequest + { + Model = new WorkflowDefinitionModel + { + Id = workflowDefinition.Id, + Description = workflowDefinition.Description, + Name = workflowDefinition.Name, + ToolVersion = workflowDefinition.ToolVersion, + Inputs = workflowDefinition.Inputs, + Options = workflowDefinition.Options, + Outcomes = workflowDefinition.Outcomes, + Outputs = workflowDefinition.Outputs, + Variables = workflowDefinition.Variables.Select(x => new VariableDefinition + { + Id = x.Id, + Name = x.Name, + TypeName = x.TypeName, + Value = x.Value?.ToString(), + IsArray = x.IsArray, + StorageDriverTypeName = x.StorageDriverTypeName + }).ToList(), + Version = workflowDefinition.Version, + CreatedAt = workflowDefinition.CreatedAt, + CustomProperties = workflowDefinition.CustomProperties, + DefinitionId = workflowDefinition.DefinitionId, + IsLatest = workflowDefinition.IsLatest, + IsPublished = workflowDefinition.IsPublished, + Root = workflowDefinition.Root + }, + Publish = publish, + }; + + var api = await GetApiAsync(cancellationToken); + + try + { + if (request.Publish == true) await mediator.NotifyAsync(new WorkflowDefinitionPublishing(workflowDefinition), cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionSaving(workflowDefinition), cancellationToken); + var response = await api.SaveAsync(request, cancellationToken); + + if(workflowSavedCallback != null) + await workflowSavedCallback(response.WorkflowDefinition); + + await mediator.NotifyAsync(new WorkflowDefinitionSaved(response.WorkflowDefinition), cancellationToken); + if (request.Publish == true) await mediator.NotifyAsync(new WorkflowDefinitionPublished(response.WorkflowDefinition), cancellationToken); + return new(response); + } + catch (ValidationApiException e) + { + var errors = e.GetValidationErrors(); + await mediator.NotifyAsync(new WorkflowDefinitionSavingFailed(workflowDefinition, errors), cancellationToken); + if (request.Publish == true) await mediator.NotifyAsync(new WorkflowDefinitionPublishingFailed(workflowDefinition, errors), cancellationToken); + return new(errors); + } + } + + /// + public async Task PublishAsync(WorkflowDefinition workflowDefinition, Func? workflowPublishedCallback = null, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionPublishing(workflowDefinition), cancellationToken); + var response = await api.PublishAsync(workflowDefinition.DefinitionId, new PublishWorkflowDefinitionRequest(), cancellationToken); + if(workflowPublishedCallback != null) await workflowPublishedCallback(workflowDefinition); + await mediator.NotifyAsync(new WorkflowDefinitionPublished(workflowDefinition), cancellationToken); + return response; + } + + /// + public async Task> RetractAsync(WorkflowDefinition workflowDefinition, Func? workflowRetractedCallback = null, CancellationToken cancellationToken = default) + { + try + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionRetracting(workflowDefinition), cancellationToken); + var definition = await api.RetractAsync(workflowDefinition.DefinitionId, new RetractWorkflowDefinitionRequest(), cancellationToken); + if(workflowRetractedCallback != null) await workflowRetractedCallback(definition); + await mediator.NotifyAsync(new WorkflowDefinitionRetracted(definition), cancellationToken); + return new(definition); + } + catch (ValidationApiException e) + { + var errors = e.GetValidationErrors(); + await mediator.NotifyAsync(new WorkflowDefinitionRetractingFailed(workflowDefinition, errors), cancellationToken); + return new(errors); + } + } + + /// + public async Task ExportAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionExporting(workflowDefinition), cancellationToken); + var response = await api.ExportAsync(workflowDefinition.DefinitionId, VersionOptions.SpecificVersion(workflowDefinition.Version), cancellationToken); + var fileName = response.GetDownloadedFileNameOrDefault($"workflow-definition-{workflowDefinition.DefinitionId}-v{workflowDefinition.Version}.json"); + var fileDownload = new FileDownload(fileName, response.Content!); + await mediator.NotifyAsync(new WorkflowDefinitionExported(workflowDefinition, fileDownload), cancellationToken); + + return fileDownload; + } + + /// + public async Task RevertAsync(WorkflowDefinitionVersion workflowDefinitionVersion, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionVersionReverting(workflowDefinitionVersion), cancellationToken); + var newWorkflowDefinitionSummary = await api.RevertVersionAsync(workflowDefinitionVersion.WorkflowDefinitionId, workflowDefinitionVersion.Version, cancellationToken); + var newWorkflowDefinitionVersion = WorkflowDefinitionVersion.FromDefinitionSummary(newWorkflowDefinitionSummary); + await mediator.NotifyAsync(new WorkflowDefinitionVersionReverted(newWorkflowDefinitionVersion), cancellationToken); + return newWorkflowDefinitionSummary; + } + + private async Task GetApiAsync(CancellationToken cancellationToken = default) + { + return await backendApiClientProvider.GetApiAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionHistoryService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionHistoryService.cs new file mode 100644 index 0000000..70e53ef --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionHistoryService.cs @@ -0,0 +1,54 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Extensions; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Domain.Notifications; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A workflow definition service that uses a remote backend to retrieve workflow definitions. +/// +public class WorkflowDefinitionHistoryService(IBackendApiClientProvider backendApiClientProvider, IMediator mediator) : IWorkflowDefinitionHistoryService +{ + /// + public async Task> RetractAsync(WorkflowDefinition workflowDefinition, Func? workflowRetractedCallback = null, CancellationToken cancellationToken = default) + { + try + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionRetracting(workflowDefinition), cancellationToken); + var definition = await api.RetractAsync(workflowDefinition.DefinitionId, new RetractWorkflowDefinitionRequest(), cancellationToken); + if(workflowRetractedCallback != null) await workflowRetractedCallback(definition); + await mediator.NotifyAsync(new WorkflowDefinitionRetracted(definition), cancellationToken); + return new(definition); + } + catch (ValidationApiException e) + { + var errors = e.GetValidationErrors(); + await mediator.NotifyAsync(new WorkflowDefinitionRetractingFailed(workflowDefinition, errors), cancellationToken); + return new(errors); + } + } + + /// + public async Task RevertAsync(WorkflowDefinitionVersion workflowDefinitionVersion, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionVersionReverting(workflowDefinitionVersion), cancellationToken); + var newWorkflowDefinitionSummary = await api.RevertVersionAsync(workflowDefinitionVersion.WorkflowDefinitionId, workflowDefinitionVersion.Version, cancellationToken); + var newWorkflowDefinitionVersion = WorkflowDefinitionVersion.FromDefinitionSummary(newWorkflowDefinitionSummary); + await mediator.NotifyAsync(new WorkflowDefinitionVersionReverted(newWorkflowDefinitionVersion), cancellationToken); + return newWorkflowDefinitionSummary; + } + + private async Task GetApiAsync(CancellationToken cancellationToken = default) + { + return await backendApiClientProvider.GetApiAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionImporter.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionImporter.cs new file mode 100644 index 0000000..96cdee0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionImporter.cs @@ -0,0 +1,158 @@ +using System.IO.Compression; +using System.Net.Mime; +using System.Text.Json; +using System.Text.Json.Serialization; +using Elsa.Api.Client.Converters; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Domain.Notifications; +using Microsoft.AspNetCore.Components.Forms; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A workflow definition service that uses a remote backend to retrieve workflow definitions. +/// +public class WorkflowDefinitionImporter(IBackendApiClientProvider backendApiClientProvider, IMediator mediator, IWorkflowJsonDetector workflowJsonDetector) : IWorkflowDefinitionImporter +{ + private async Task GetApiAsync(CancellationToken cancellationToken = default) + { + return await backendApiClientProvider.GetApiAsync(cancellationToken); + } + + /// + public async Task> ImportFilesAsync(IReadOnlyList files, ImportOptions? options = null) + { + var maxAllowedSize = options?.MaxAllowedSize ?? 1024 * 1024 * 10; // 10 MB + var results = new List(); + + foreach (var file in files) + { + await mediator.NotifyAsync(new ImportingFile(file)); + await using var stream = file.OpenReadStream(maxAllowedSize); + + if (file.ContentType == MediaTypeNames.Application.Zip || file.Name.EndsWith(".zip")) + { + var importZipFileResults = await ImportZipFileAsync(stream, options); + results.AddRange(importZipFileResults); + await mediator.NotifyAsync(new ImportedFile(file)); + } + + else if (file.ContentType == MediaTypeNames.Application.Json || file.Name.EndsWith(".json")) + { + var importFromStreamResult = await ImportFromStreamAsync(file.Name, stream, options); + results.Add(importFromStreamResult); + await mediator.NotifyAsync(new ImportedFile(file)); + } + } + + return results; + } + + private async Task> ImportZipFileAsync(Stream stream, ImportOptions? options) + { + using var memoryStream = new MemoryStream(); + await stream.CopyToAsync(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + var importResultList = new List(); + + try + { + var zipArchive = new ZipArchive(memoryStream); + foreach (var entry in zipArchive.Entries.Where(x => !x.FullName.StartsWith("__MACOSX", StringComparison.OrdinalIgnoreCase))) + { + if (entry.FullName.EndsWith(".json")) + { + await using var entryStream = entry.Open(); + var result = await ImportFromStreamAsync(entry.Name, entryStream, options); + + importResultList.Add(result); + } + else if (entry.FullName.EndsWith(".zip")) + { + await using var entryStream = entry.Open(); + var results = await ImportZipFileAsync(entryStream, options); + importResultList.AddRange(results); + } + } + } + catch (Exception e) + { + if (options?.ErrorCallback != null) + await options.ErrorCallback(e); + importResultList.Add(new() + { + Failure = new(e.Message, WorkflowImportFailureType.Exception) + }); + } + + return importResultList; + } + + private async Task ImportFromStreamAsync(string fileName, Stream stream, ImportOptions? options) + { + using var reader = new StreamReader(stream); + var json = await reader.ReadToEndAsync(); + var jsonSerializerOptions = CreateJsonSerializerOptions(); + + try + { + await mediator.NotifyAsync(new ImportingJson(json)); + + if (!workflowJsonDetector.IsWorkflowSchema(json)) + { + return new() + { + FileName = fileName, + Failure = new("Invalid schema", WorkflowImportFailureType.InvalidSchema) + }; + } + + var model = JsonSerializer.Deserialize(json, jsonSerializerOptions)!; + + if (options?.DefinitionId != null) + model.DefinitionId = options.DefinitionId; + + await mediator.NotifyAsync(new ImportingWorkflowDefinition(model)); + var api = await GetApiAsync(); + var newWorkflowDefinition = await api.ImportAsync(model); + + if (options?.ImportedCallback != null) + await options.ImportedCallback(newWorkflowDefinition); + + await mediator.NotifyAsync(new ImportedWorkflowDefinition(newWorkflowDefinition)); + await mediator.NotifyAsync(new ImportedJson(json)); + + return new() + { + FileName = fileName, + WorkflowDefinition = newWorkflowDefinition + }; + } + catch (Exception e) + { + if (options?.ErrorCallback != null) + await options.ErrorCallback(e); + return new() + { + FileName = fileName, + Failure = new(e.Message, WorkflowImportFailureType.Exception) + }; + } + } + + private static JsonSerializerOptions CreateJsonSerializerOptions() + { + JsonSerializerOptions options = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + + options.Converters.Add(new JsonStringEnumConverter()); + options.Converters.Add(new VersionOptionsJsonConverter()); + return options; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionService.cs b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionService.cs new file mode 100644 index 0000000..f3139a6 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Domain/Services/WorkflowDefinitionService.cs @@ -0,0 +1,293 @@ +using System.Net; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Responses; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Extensions; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Domain.Notifications; +using Refit; + +namespace Elsa.Studio.Workflows.Domain.Services; + +/// +/// A workflow definition service that uses a remote backend to retrieve workflow definitions. +/// +public class RemoteWorkflowDefinitionService(IBackendApiClientProvider backendApiClientProvider, IIdentityGenerator identityGenerator, IMediator mediator) : IWorkflowDefinitionService +{ + /// + public async Task> ListAsync(ListWorkflowDefinitionsRequest request, VersionOptions? versionOptions = null, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + return await api.ListAsync(request, versionOptions, cancellationToken); + } + + /// + public async Task FindByDefinitionIdAsync(string definitionId, VersionOptions? versionOptions = null, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + return await api.GetByDefinitionIdAsync(definitionId, versionOptions, cancellationToken); + } + + /// + public async Task FindByIdAsync(string id, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + return await api.GetByIdAsync(id, cancellationToken); + } + + /// + public async Task> FindManyByIdAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + var response = await api.GetManyByIdAsync(ids.ToList(), cancellationToken); + return response.Items; + } + + /// + public async Task FindSubgraphAsync(string id, string? parentNodeId = null, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + return await api.GetSubgraphAsync(id, parentNodeId, cancellationToken); + } + + /// + public async Task GetPathSegmentsAsync(string id, string? childNodeId = null, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + return await api.GetPathSegmentsGetAsync(id, childNodeId, cancellationToken); + } + + /// + public async Task PublishAsync(string definitionId, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionIdPublishing(definitionId), cancellationToken); + var response = await api.PublishAsync(definitionId, new PublishWorkflowDefinitionRequest(), cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionPublished(response.WorkflowDefinition), cancellationToken); + return response; + } + + /// + public async Task> RetractAsync(string definitionId, CancellationToken cancellationToken = default) + { + try + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionIdRetracting(definitionId), cancellationToken); + var definition = await api.RetractAsync(definitionId, new RetractWorkflowDefinitionRequest(), cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionRetracted(definition), cancellationToken); + return new(definition); + } + catch (ValidationApiException e) + { + var errors = e.GetValidationErrors(); + await mediator.NotifyAsync(new WorkflowDefinitionIdRetractingFailed(definitionId, errors), cancellationToken); + return new(errors); + } + } + + /// + public async Task DeleteAsync(string definitionId, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + + try + { + await mediator.NotifyAsync(new WorkflowDefinitionDeleting(definitionId), cancellationToken); + await api.DeleteAsync(definitionId, cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionDeleted(definitionId), cancellationToken); + return true; + } + catch (ApiException e) when (e.StatusCode == HttpStatusCode.NotFound) + { + return false; + } + } + + /// + public async Task DeleteVersionAsync(WorkflowDefinitionVersion workflowDefinitionVersion, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + + try + { + await mediator.NotifyAsync(new WorkflowDefinitionVersionDeleting(workflowDefinitionVersion), cancellationToken); + await api.DeleteVersionAsync(workflowDefinitionVersion.WorkflowDefinitionVersionId, cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionVersionDeleted(workflowDefinitionVersion), cancellationToken); + return true; + } + catch (ApiException e) when (e.StatusCode == HttpStatusCode.NotFound) + { + return false; + } + } + + /// + public async Task BulkDeleteAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default) + { + var definitionIdList = definitionIds.ToList(); + await mediator.NotifyAsync(new BulkWorkflowDefinitionsDeleting(definitionIdList), cancellationToken); + var request = new BulkDeleteWorkflowDefinitionsRequest(definitionIdList); + var api = await GetApiAsync(cancellationToken); + var response = await api.BulkDeleteAsync(request, cancellationToken); + await mediator.NotifyAsync(new BulkWorkflowDefinitionsDeleted(definitionIdList), cancellationToken); + return response.Deleted; + } + + /// + public async Task BulkDeleteVersionsAsync(IEnumerable workflowDefinitionVersions, CancellationToken cancellationToken = default) + { + var versions = workflowDefinitionVersions.ToList(); + var ids = versions.Select(x => x.WorkflowDefinitionVersionId).ToList(); + await mediator.NotifyAsync(new BulkWorkflowDefinitionVersionsDeleting(versions), cancellationToken); + var request = new BulkDeleteWorkflowDefinitionVersionsRequest(ids); + var api = await GetApiAsync(cancellationToken); + var response = await api.BulkDeleteVersionsAsync(request, cancellationToken); + await mediator.NotifyAsync(new BulkWorkflowDefinitionVersionsDeleted(versions), cancellationToken); + return response.Deleted; + } + + /// + public async Task BulkPublishAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default) + { + var request = new BulkPublishWorkflowDefinitionsRequest(definitionIds); + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new BulkWorkflowDefinitionsPublishing(request.DefinitionIds), cancellationToken); + var response = await api.BulkPublishAsync(request, cancellationToken); + await mediator.NotifyAsync(new BulkWorkflowDefinitionsPublished(response.Published), cancellationToken); + return response; + } + + /// + public async Task BulkRetractAsync(IEnumerable definitionIds, CancellationToken cancellationToken = default) + { + var definitionIdList = definitionIds.ToList(); + await mediator.NotifyAsync(new BulkWorkflowDefinitionsRetracting(definitionIdList), cancellationToken); + var request = new BulkRetractWorkflowDefinitionsRequest(definitionIdList); + var api = await GetApiAsync(cancellationToken); + var response = await api.BulkRetractAsync(request, cancellationToken); + await mediator.NotifyAsync(new BulkWorkflowDefinitionsRetracted(response.Retracted), cancellationToken); + return response; + } + + /// + public async Task GetIsNameUniqueAsync(string name, string? definitionId = null, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + var response = await api.GetIsNameUniqueAsync(name, definitionId, cancellationToken); + + return response.IsUnique; + } + + /// + public async Task GenerateUniqueNameAsync(CancellationToken cancellationToken = default) + { + const int maxAttempts = 100; + var attempt = 0; + + while (attempt < maxAttempts) + { + var name = $"Workflow {++attempt}"; + var isUnique = await GetIsNameUniqueAsync(name, null, cancellationToken); + + if (isUnique) + return name; + } + + throw new Exception($"Failed to generate a unique workflow name after {maxAttempts} attempts."); + } + + /// + public async Task> CreateNewDefinitionAsync(string name, string? description = null, CancellationToken cancellationToken = default) + { + var saveRequest = new SaveWorkflowDefinitionRequest + { + Model = new WorkflowDefinitionModel + { + Name = name, + Description = description, + Version = 1, + ToolVersion = ToolVersion.Version, + IsLatest = true, + IsPublished = false, + Root = new JsonObject(new Dictionary + { + ["id"] = identityGenerator.GenerateId(), + ["type"] = "Elsa.Flowchart", + ["version"] = 1, + ["name"] = "Flowchart1" + }) + } + }; + + var api = await GetApiAsync(cancellationToken); + + try + { + var response = await api.SaveAsync(saveRequest, cancellationToken); + return new Result(response.WorkflowDefinition); + } + catch (ValidationApiException e) + { + var errors = e.GetValidationErrors(); + return new Result(errors); + } + } + + /// + public async Task ExportDefinitionAsync(string definitionId, VersionOptions? versionOptions = null, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + await mediator.NotifyAsync(new WorkflowDefinitionIdExporting(definitionId, versionOptions), cancellationToken); + var response = await api.ExportAsync(definitionId, versionOptions, cancellationToken); + var fileName = response.GetDownloadedFileNameOrDefault($"workflow-definition-{definitionId}.json"); + var fileDownload = new FileDownload(fileName, response.Content!); + await mediator.NotifyAsync(new WorkflowDefinitionIdExported(definitionId, versionOptions, fileDownload), cancellationToken); + + return fileDownload; + } + + /// + public async Task BulkExportDefinitionsAsync(IEnumerable ids, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + var request = new BulkExportWorkflowDefinitionsRequest(ids.ToArray()); + var response = await api.BulkExportAsync(request, cancellationToken); + var fileName = response.GetDownloadedFileNameOrDefault("workflow-definitions.zip"); + return new FileDownload(fileName, response.Content!); + } + + /// + public async Task UpdateReferencesAsync(string definitionId, CancellationToken cancellationToken = default) + { + var api = await GetApiAsync(cancellationToken); + return await api.UpdateReferencesAsync(definitionId, new UpdateConsumingWorkflowReferencesRequest(), cancellationToken); + } + + /// + public async Task ExecuteAsync(string definitionId, ExecuteWorkflowDefinitionRequest? request, CancellationToken cancellationToken = default) + { + var api = await GetExecuteWorkflowApiAsync(cancellationToken); + var response = await api.ExecuteAsync(definitionId, request, cancellationToken); + var workflowInstanceId = response.Headers.TryGetValues("x-elsa-workflow-instance-id", out var workflowInstanceIdValues) ? workflowInstanceIdValues.FirstOrDefault() : null; + var cannotStart = string.Equals(response.Headers.TryGetValues("x-elsa-workflow-cannot-start", out var cannotStartValues) ? cannotStartValues.FirstOrDefault() : null, "true", StringComparison.OrdinalIgnoreCase); + return new ExecuteWorkflowResult(workflowInstanceId, cannotStart); + } + + private async Task GetApiAsync(CancellationToken cancellationToken = default) + { + return await backendApiClientProvider.GetApiAsync(cancellationToken); + } + + private async Task GetExecuteWorkflowApiAsync(CancellationToken cancellationToken = default) + { + return await backendApiClientProvider.GetApiAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Elsa.Studio.Workflows.Core.csproj b/src/modules/Elsa.Studio.Workflows.Core/Elsa.Studio.Workflows.Core.csproj new file mode 100644 index 0000000..a079001 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Elsa.Studio.Workflows.Core.csproj @@ -0,0 +1,22 @@ + + + + Elsa Studio workflows core services. + elsa studio core + Elsa.Studio.Workflows + + + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityExtensions.cs b/src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityExtensions.cs new file mode 100644 index 0000000..f31fa48 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityExtensions.cs @@ -0,0 +1,29 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; + +namespace Elsa.Studio.Workflows.Extensions; + +/// +/// Provides extension methods for representing an activity +/// +public static class ActivityExtensions +{ + /// + /// Gets the flowchart from the specified activity. + /// + /// + /// + /// + public static JsonObject GetFlowchart(this JsonObject activity) + { + var activityTypeName = activity.GetTypeName(); + + if (activityTypeName == "Elsa.Flowchart") + return activity; + + if (activityTypeName == "Elsa.Workflow") + return activity.GetRoot()!; + + throw new NotSupportedException(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityVisitorExtensions.cs b/src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityVisitorExtensions.cs new file mode 100644 index 0000000..b4d5442 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Extensions/ActivityVisitorExtensions.cs @@ -0,0 +1,62 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Extensions; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Extensions; + +/// A set of extensions for . +public static class ActivityVisitorExtensions +{ + /// Returns a lookup dictionary by activity ID. + public static async Task> VisitAndMapAsync(this IActivityVisitor visitor, WorkflowDefinition workflowDefinition) + { + var workflowActivity = ToActivity(workflowDefinition); + return await visitor.VisitAndMapAsync(workflowActivity); + } + + /// Returns a lookup dictionary by activity ID. + public static async Task VisitAsync(this IActivityVisitor visitor, WorkflowDefinition workflowDefinition) + { + var workflowActivity = ToActivity(workflowDefinition); + return await visitor.VisitAsync(workflowActivity); + } + + /// Returns a lookup dictionary by activity ID. + public static async Task> VisitAndMapAsync(this IActivityVisitor visitor, JsonObject activity) + { + var graph = await visitor.VisitAsync(activity); + var nodes = graph.Flatten(); + return nodes.ToDictionary(x => x.NodeId); + } + + /// Creates an activity graph based on the provided workflow definition. + public static async Task VisitAndCreateGraphAsync(this IActivityVisitor visitor, WorkflowDefinition workflowDefinition) + { + var workflowActivity = ToActivity(workflowDefinition); + return await visitor.VisitAndCreateGraphAsync(workflowActivity); + } + + /// Creates an activity graph based on the provided JSON activity. + public static async Task VisitAndCreateGraphAsync(this IActivityVisitor visitor, JsonObject activity) + { + return await new ActivityGraph(activity, visitor).IndexAsync(); + } + + /// Creates an activity from the specified workflow definition. + private static JsonObject ToActivity(WorkflowDefinition workflowDefinition) + { + var workflowActivity = new JsonObject(); + workflowActivity.SetId("Workflow1"); + workflowActivity.SetNodeId("Workflow1"); + workflowActivity.SetTypeName("Elsa.Workflow"); + workflowActivity.SetVersion(1); + workflowActivity.SetName(workflowDefinition.Name); + workflowActivity.SetRoot(workflowDefinition.Root); + return workflowActivity; + } + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Workflows.Core/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..f274b44 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,85 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Services; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Providers; +using Elsa.Studio.Workflows.Domain.Services; +using Elsa.Studio.Workflows.Resolvers; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Providers; +using Elsa.Studio.Workflows.UI.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Workflows.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the workflows module. + /// + public static IServiceCollection AddWorkflowsCore(this IServiceCollection services) + { + services + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + ; + + services.AddActivityDisplaySettingsProvider(); + services.AddActivityPortProvider(); + + return services; + } + + /// + /// Adds a to the service collection. + /// + public static IServiceCollection AddDiagramDesignerProvider(this IServiceCollection services) where T : class, IDiagramDesignerProvider + { + services.AddScoped(); + return services; + } + + /// + /// Adds a to the service collection. + /// + public static IServiceCollection AddActivityDisplaySettingsProvider(this IServiceCollection services) where T : class, IActivityDisplaySettingsProvider + { + services.AddScoped(); + return services; + } + + /// + /// Adds a to the service collection. + /// + public static IServiceCollection AddActivityPortProvider(this IServiceCollection services) where T : class, IActivityPortProvider + { + services.AddScoped(); + return services; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xml b/src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xsd b/src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/Resolvers/DefaultActivityResolver.cs b/src/modules/Elsa.Studio.Workflows.Core/Resolvers/DefaultActivityResolver.cs new file mode 100644 index 0000000..2cbb070 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/Resolvers/DefaultActivityResolver.cs @@ -0,0 +1,33 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; + +namespace Elsa.Studio.Workflows.Resolvers; + +/// +/// A default resolver. +/// +public class DefaultActivityResolver : IActivityResolver +{ + /// + public int Priority => -1; + + /// + public bool GetSupportsActivity(JsonObject activity) => true; + + /// + public ValueTask> GetActivitiesAsync(JsonObject activity, CancellationToken cancellationToken = default) + { + var containedActivities = + from prop in activity + where prop.Value is JsonObject jsonObject && jsonObject.IsActivity() || prop.Value is JsonArray + let isCollection = prop.Value is JsonArray + let containedItems = isCollection ? ((JsonArray)prop.Value).ToArray() : new[] { prop.Value.AsObject() } + from containedItem in containedItems where containedItem is JsonObject && containedItem.AsObject().IsActivity() + let containedObject = containedItem.AsObject() + select new EmbeddedActivity(containedObject, prop.Key); + + return new(containedActivities.ToList()); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Args/ActivityEmbeddedPortSelectedArgs.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Args/ActivityEmbeddedPortSelectedArgs.cs new file mode 100644 index 0000000..38286bf --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Args/ActivityEmbeddedPortSelectedArgs.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.UI.Args; + +/// +/// Represents the arguments for the ActivityEmbeddedPortSelected event. +/// +/// The activity that contains the port. +/// The name of the port. +public record ActivityEmbeddedPortSelectedArgs(JsonObject Activity, string PortName); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contexts/DisplayContext.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contexts/DisplayContext.cs new file mode 100644 index 0000000..1688c03 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contexts/DisplayContext.cs @@ -0,0 +1,26 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Args; +using Elsa.Studio.Workflows.UI.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.UI.Contexts; + +/// +/// Represents a context for displaying an activity. +/// +/// The activity to display. +/// A callback that is invoked when an activity is selected. +/// A callback that is invoked when an embedded port is selected. +/// A callback that is invoked when the graph is updated. +/// Whether the activity is read-only. +/// A map of activity stats. +public record DisplayContext( + JsonObject Activity, + EventCallback ActivitySelectedCallback = default, + EventCallback ActivityUpdated = default, + EventCallback ActivityEmbeddedPortSelectedCallback = default, + EventCallback ActivityDoubleClickCallback = default, + EventCallback GraphUpdatedCallback = default, + bool IsReadOnly = false, + IDictionary? ActivityStats = null); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsProvider.cs new file mode 100644 index 0000000..f2d9eab --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsProvider.cs @@ -0,0 +1,17 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.UI.Contracts; + +/// +/// Provides mappings between activity types and icons. +/// +public interface IActivityDisplaySettingsProvider +{ + /// + /// Returns a dictionary of activity type to display settings. + /// + /// + /// + IDictionary GetSettings(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsRegistry.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsRegistry.cs new file mode 100644 index 0000000..738b836 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IActivityDisplaySettingsRegistry.cs @@ -0,0 +1,21 @@ +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.UI.Contracts; + +/// +/// Provides mappings between activity types and icons. +/// +public interface IActivityDisplaySettingsRegistry +{ + /// + /// Retrieves the display settings for the specified activity type. + /// + /// The activity type. + /// The display settings for the specified activity type. + ActivityDisplaySettings GetSettings(string activityType); + + /// + /// Marks the activity display settings registry as stale. + /// + void MarkStale(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesigner.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesigner.cs new file mode 100644 index 0000000..e77f26f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesigner.cs @@ -0,0 +1,50 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Contexts; +using Elsa.Studio.Workflows.UI.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.UI.Contracts; + +/// +/// Represents a diagram editor. +/// +public interface IDiagramDesigner +{ + /// + /// Loads the specified root activity int the designer. + /// + /// The root activity to load. + /// A map of activity stats. + Task LoadRootActivityAsync(JsonObject activity, IDictionary? activityStatsMap); + + /// + /// Updates the specified activity in the diagram. This is used to update the diagram when an activity is updated in the activity editor. + /// + /// The ID of the activity to update. + /// The activity to update. + Task UpdateActivityAsync(string id, JsonObject activity); + + /// + /// Updates the stats of the specified activity. + /// + /// The ID of the activity to update. + /// The stats to update. + Task UpdateActivityStatsAsync(string id, ActivityStats stats); + + /// + /// Selects the specified activity in the diagram. + /// + /// The ID of the activity to select. + Task SelectActivityAsync(string id); + + /// + /// Reads the root activity from the diagram. + /// + Task ReadRootActivityAsync(); + + /// + /// Display the designer. + /// + RenderFragment DisplayDesigner(DisplayContext context); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerProvider.cs new file mode 100644 index 0000000..0dce249 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerProvider.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.UI.Contracts; + +/// +/// Implement this interface to provide a diagram editor for a given workflow definition's root activity. +/// +public interface IDiagramDesignerProvider +{ + double Priority { get; } + bool GetSupportsActivity(JsonObject activity); + IDiagramDesigner GetEditor(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerService.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerService.cs new file mode 100644 index 0000000..49d41cb --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerService.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.UI.Contracts; + +/// +/// A service for managing diagram editors. +/// +public interface IDiagramDesignerService +{ + /// + /// Gets the diagram designer for the specified activity. + /// + IDiagramDesigner GetDiagramDesigner(JsonObject activity); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerToolboxProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerToolboxProvider.cs new file mode 100644 index 0000000..add5672 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IDiagramDesignerToolboxProvider.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.UI.Contracts; + +/// +/// Implement this interface to provide toolbox items for the diagram editor. +/// +public interface IDiagramDesignerToolboxProvider : IDiagramDesigner +{ + IEnumerable GetToolboxItems(bool isReadOnly); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IWorkspace.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IWorkspace.cs new file mode 100644 index 0000000..39bcc99 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Contracts/IWorkspace.cs @@ -0,0 +1,17 @@ +namespace Elsa.Studio.Workflows.UI.Contracts; + +/// +/// Represents a workspace. +/// +public interface IWorkspace +{ + /// + /// Gets a value indicating whether the workspace is read-only. + /// + bool IsReadOnly { get; } + + /// + /// Geta a value indicating whether the user has permissions to edit the workflow. + /// + bool HasWorkflowEditPermission { get; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Models/ActivityDisplaySettings.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Models/ActivityDisplaySettings.cs new file mode 100644 index 0000000..2452d7f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Models/ActivityDisplaySettings.cs @@ -0,0 +1,33 @@ +namespace Elsa.Studio.Workflows.UI.Models; + +/// +/// Represents display settings for an activity. +/// +public class ActivityDisplaySettings +{ + /// + /// Initializes a new instance of the class. + /// + public ActivityDisplaySettings() + { + } + + /// + /// Initializes a new instance of the class. + /// + public ActivityDisplaySettings(string color, string? icon = default) + { + Color = color; + Icon = icon; + } + + /// + /// Gets or sets the icon. + /// + public string? Icon { get; set; } + + /// + /// Gets or sets the color. + /// + public string Color { get; set; } = default!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Models/DefaultActivityColors.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Models/DefaultActivityColors.cs new file mode 100644 index 0000000..c1e970a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Models/DefaultActivityColors.cs @@ -0,0 +1,20 @@ +namespace Elsa.Studio.Workflows.UI.Models; + +/// +/// A static class with default activity colors. +/// +public static class DefaultActivityColors +{ + public static string Default { get; set; } = "var(--mud-palette-primary)"; + public static string NotFound { get; set; } = "var(--mud-palette-error)"; + public static string Composition { get; set; } = "#f97316"; + public static string Console { get; set; } = "#0369a1"; + public static string Http { get; set; } = "#2dd4bf"; + public static string Scripting { get; set; } = "#22c55e"; + public static string Flowchart { get; set; } = "#06b6d4"; + public static string Looping { get; set; } = "#6366f1"; + public static string Primitives { get; set; } = Default; + public static string Email { get; set; } = "#fcd34d"; + public static string Branching { get; set; } = "#06b6d4"; + public static string Timer { get; set; } = "#d946ef"; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Providers/DefaultActivityDisplaySettingsProvider.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Providers/DefaultActivityDisplaySettingsProvider.cs new file mode 100644 index 0000000..5249b5d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Providers/DefaultActivityDisplaySettingsProvider.cs @@ -0,0 +1,86 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Models; +using JetBrains.Annotations; +using MudBlazor; + +namespace Elsa.Studio.Workflows.UI.Providers; + +/// Provides default activity display settings. +[UsedImplicitly] +public class DefaultActivityDisplaySettingsProvider : IActivityDisplaySettingsProvider +{ + /// + /// + public IDictionary GetSettings() => new Dictionary + { + // Not Found Activity + ["Elsa.NotFoundActivity"] = new(DefaultActivityColors.NotFound, ElsaStudioIcons.Heroicons.Exclamation), + + // Branching + ["Elsa.If"] = new(DefaultActivityColors.Branching, ElsaStudioIcons.Heroicons.Question), + ["Elsa.FlowDecision"] = new(DefaultActivityColors.Branching, ElsaStudioIcons.Heroicons.Question), + ["Elsa.Switch"] = new(DefaultActivityColors.Branching, ElsaStudioIcons.Tabler.SwitchDiagonal), + ["Elsa.FlowSwitch"] = new(DefaultActivityColors.Branching, ElsaStudioIcons.Tabler.SwitchDiagonal), + ["Elsa.FlowJoin"] = new(DefaultActivityColors.Branching, ElsaStudioIcons.Tabler.GitMerge), + ["Elsa.FlowFork"] = new(DefaultActivityColors.Branching, ElsaStudioIcons.Tabler.GitFork), + + // Composition + ["Elsa.Complete"] = new(DefaultActivityColors.Composition, ElsaStudioIcons.Tabler.CheckCircle), + ["Elsa.SetOutput"] = new (DefaultActivityColors.Composition), + ["Elsa.DispatchWorkflow"] = new (DefaultActivityColors.Composition), + ["Elsa.BulkDispatchWorkflows"] = new (DefaultActivityColors.Composition), + ["Elsa.ExecuteWorkflow"] = new (DefaultActivityColors.Composition), + + // Console + ["Elsa.WriteLine"] = new(DefaultActivityColors.Console, ElsaStudioIcons.Tabler.Pencil), + ["Elsa.ReadLine"] = new(DefaultActivityColors.Console, ElsaStudioIcons.Tabler.Text), + + // Email + ["Elsa.SendEmail"] = new(DefaultActivityColors.Email, Icons.Material.Outlined.Email), + + // Flowchart + ["Elsa.Flowchart"] = new(DefaultActivityColors.Flowchart, ElsaStudioIcons.Tabler.GitFork), + ["Elsa.FlowNode"] = new(DefaultActivityColors.Flowchart, ElsaStudioIcons.Tabler.Hexagon), + ["Elsa.Start"] = new(DefaultActivityColors.Flowchart, Icons.Material.Outlined.Start), + ["Elsa.End"] = new(DefaultActivityColors.Flowchart, Icons.Material.Outlined.OutlinedFlag), + + // HTTP + ["Elsa.HttpEndpoint"] = new(DefaultActivityColors.Http, ElsaStudioIcons.Tabler.Cloud), + ["Elsa.WriteHttpResponse"] = new(DefaultActivityColors.Http, ElsaStudioIcons.Heroicons.PencilPaper), + ["Elsa.WriteFileHttpResponse"] = new(DefaultActivityColors.Http, Icons.Material.Outlined.FileDownload), + ["Elsa.SendHttpRequest"] = new(DefaultActivityColors.Http, ElsaStudioIcons.Tabler.World), + ["Elsa.FlowSendHttpRequest"] = new(DefaultActivityColors.Http, ElsaStudioIcons.Tabler.World), + ["Elsa.DownloadHttpFile"] = new(DefaultActivityColors.Http, @Icons.Material.Outlined.CloudDownload), + + // Looping + ["Elsa.While"] = new(DefaultActivityColors.Looping, ElsaStudioIcons.Tabler.RepeatOne), + ["Elsa.ForEach"] = new(DefaultActivityColors.Looping, ElsaStudioIcons.Tabler.RepeatOne), + ["Elsa.For"] = new(DefaultActivityColors.Looping, ElsaStudioIcons.Tabler.RepeatOne), + ["Elsa.ParallelForEach"] = new(DefaultActivityColors.Looping, ElsaStudioIcons.Tabler.RepeatOne), + ["Elsa.Break"] = new(DefaultActivityColors.Looping, ElsaStudioIcons.Tabler.Back1), + + // Primitives + ["Elsa.SetVariable"] = new(DefaultActivityColors.Primitives, ElsaStudioIcons.Tabler.Pencil), + ["Elsa.SetName"] = new(DefaultActivityColors.Primitives, ElsaStudioIcons.Tabler.Italic), + ["Elsa.Finish"] = new(DefaultActivityColors.Primitives, ElsaStudioIcons.Tabler.CheckShield), + ["Elsa.Fault"] = new(DefaultActivityColors.Primitives, Icons.Material.Outlined.ErrorOutline), + ["Elsa.Correlate"] = new(DefaultActivityColors.Primitives, Icons.Material.Outlined.DatasetLinked), + ["Elsa.RunTask"] = new(DefaultActivityColors.Primitives, Icons.Material.Outlined.Settings), + ["Elsa.PublishEvent"] = new(DefaultActivityColors.Primitives, Icons.Material.Outlined.FlashOn), + ["Elsa.Event"] = new(DefaultActivityColors.Primitives, Icons.Material.Outlined.FlashOn), + + // Timers + ["Elsa.Timer"] = new(DefaultActivityColors.Timer, Icons.Material.Outlined.Timer), + ["Elsa.Cron"] = new(DefaultActivityColors.Timer, Icons.Material.Outlined.Timer), + ["Elsa.Delay"] = new(DefaultActivityColors.Timer, Icons.Material.Outlined.RotateLeft), + ["Elsa.StartAt"] = new(DefaultActivityColors.Timer, Icons.Material.Outlined.CalendarMonth), + + // Scripting + ["Elsa.RunJavaScript"] = new(DefaultActivityColors.Scripting, Icons.Material.Outlined.Javascript), + + // Azure Service Bus + ["Elsa.AzureServiceBus.MessageReceived"] = new("#a21caf", ElsaStudioIcons.Heroicons.Incoming), + ["Elsa.AzureServiceBus.SendMessage"] = new("#a21caf", ElsaStudioIcons.Heroicons.Outgoing), + }; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Core/UI/Services/DefaultDiagramDesignerService.cs b/src/modules/Elsa.Studio.Workflows.Core/UI/Services/DefaultDiagramDesignerService.cs new file mode 100644 index 0000000..cb77a80 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Core/UI/Services/DefaultDiagramDesignerService.cs @@ -0,0 +1,28 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Studio.Workflows.UI.Contracts; + +namespace Elsa.Studio.Workflows.UI.Services; + +/// +public class DefaultDiagramDesignerService : IDiagramDesignerService +{ + private readonly IEnumerable _providers; + + /// + /// Initializes a new instance of the class. + /// + public DefaultDiagramDesignerService(IEnumerable providers) + { + _providers = providers; + } + + /// + public IDiagramDesigner GetDiagramDesigner(JsonObject activity) + { + var provider = _providers + .OrderByDescending(x => x.Priority) + .FirstOrDefault(x => x.GetSupportsActivity(activity)) ?? throw new Exception($"No diagram editor provider found for activity {activity.GetTypeName()}."); + return provider.GetEditor(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v1.css b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v1.css new file mode 100644 index 0000000..feb8cfb --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v1.css @@ -0,0 +1,26 @@ +.elsa-flowchart-diagram-designer-v1 .x6-graph-background { + background-color: var(--mud-palette-background); +} + +.elsa-flowchart-diagram-designer-v1 .x6-widget-selection-box { + border: 2px dashed var(--mud-palette-secondary); +} + +.elsa-flowchart-diagram-designer-v1 .x6-widget-selection-inner { + border: 1px solid var(--mud-palette-secondary); +} + +.elsa-flowchart-diagram-designer-v1 .elsa-snapline .x6-widget-snapline-horizontal, +.elsa-flowchart-diagram-designer-v1 .elsa-snapline .x6-widget-snapline-vertical { + stroke: var(--mud-palette-secondary); +} + +.elsa-flowchart-diagram-designer-v1 .elsa-activity { + border-left: solid 6px var(--mud-palette-info); + filter: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06)); + height: 100%; +} + +.elsa-flowchart-diagram-designer-v1 .elsa-activity-wrapper-badge.has-retries .mud-badge-wrapper .mud-badge { + background-color: #FFEB3B !important; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v2.css b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v2.css new file mode 100644 index 0000000..fd2f09a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/css/designer.v2.css @@ -0,0 +1,101 @@ +.elsa-flowchart-diagram-designer-v2 .x6-graph-background { + background-color: var(--mud-palette-surface); +} + +.elsa-flowchart-diagram-designer-v2 .x6-widget-selection-box { + border: dashed 2px var(--mud-palette-gray-light); + box-shadow: none; +} + +.elsa-flowchart-diagram-designer-v2 .x6-widget-selection-inner { + border: dashed 2px var(--mud-palette-gray-light); + box-shadow: none; +} + +.elsa-flowchart-diagram-designer-v2 .x6-widget-transform { + border: none; +} + +.elsa-flowchart-diagram-designer-v2 .elsa-snapline .x6-widget-snapline-horizontal, +.elsa-flowchart-diagram-designer-v2 .elsa-snapline .x6-widget-snapline-vertical { + stroke: var(--mud-palette-secondary); +} + +.elsa-flowchart-diagram-designer-v2 .elsa-activity-wrapper-badge { + +} + +.elsa-flowchart-diagram-designer-v2 .elsa-activity-wrapper-badge.has-retries .mud-badge-wrapper .mud-badge { + background-color: #FFEB3B !important; +} + +.elsa-flowchart-diagram-designer-v2 .elsa-activity { + height: 100%; +} + +/* Use equal 16px padding all around */ +.elsa-flowchart-diagram-designer-v2 .activity-grid { + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + column-gap: 12px; + padding: 16px; /* top/right/bottom/left = 16px */ + border-radius: 8px; +} + +/* Icon container */ +.elsa-flowchart-diagram-designer-v2 .activity-icon { + background-color: #1976d2; + width: 42px; + height: 42px; + min-width: 42px; /* enforce at least 42px */ + min-height: 42px; + flex: none; /* don’t let flex or grid shrink it */ + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; +} + +/* Middle content (label, type, ports, description) */ +.elsa-flowchart-diagram-designer-v2 .activity-content { + display: flex; + flex-direction: column; + justify-content: center; +} + +/* First line: activity label stays default color */ +.elsa-flowchart-diagram-designer-v2 .activity-label { + white-space: nowrap; +} + +/* Second line: lighter grey to mimic original */ +.elsa-flowchart-diagram-designer-v2 .activity-type { + color: var(--mud-palette-gray-light); + font-size: 0.75rem; /* slightly smaller */ + white-space: nowrap; +} + +/* Embedded ports row */ +.elsa-flowchart-diagram-designer-v2 .activity-ports { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 4px; +} + +.elsa-flowchart-diagram-designer-v2 .activity-ports .mud-input.mud-input-outlined .mud-input-outlined-border { + border-style: dashed !important; +} + +/* Optional description below */ +.elsa-flowchart-diagram-designer-v2 .activity-description { + margin-top: 4px; + font-size: 0.75rem; + color: #666; +} + +/* Menu on the right: vertically center */ +.elsa-flowchart-diagram-designer-v2 .activity-menu { + align-self: center; +} diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/package.json b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/package.json new file mode 100644 index 0000000..1003231 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/package.json @@ -0,0 +1,32 @@ +{ + "name": "elsa-designer-dependencies", + "description": "Bundle dependencies for the designer.", + "repository": "https://github.com/elsa-workflows/elsa-dashboard", + "license": "MIT", + "version": "1.0.0", + "dependencies": { + "@antv/layout": "^0.3.25", + "@antv/x6": "^2.18.1", + "@antv/x6-plugin-clipboard": "^2.1.6", + "@antv/x6-plugin-history": "^2.2.4", + "@antv/x6-plugin-keyboard": "^2.2.3", + "@antv/x6-plugin-scroller": "^2.0.10", + "@antv/x6-plugin-selection": "^2.2.2", + "@antv/x6-plugin-snapline": "^2.1.7", + "@antv/x6-plugin-transform": "^2.1.8", + "lodash.camelcase": "^4.3.0", + "uuid": "^10.0.0" + }, + "devDependencies": { + "copy-webpack-plugin": "^13.0.0", + "css-loader": "^7.1.2", + "style-loader": "^4.0.0", + "ts-loader": "^9.5.1", + "typescript": "^5.3.3", + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4" + }, + "scripts": { + "build": "webpack" + } +} diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer.ts new file mode 100644 index 0000000..5f8eb1d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer.ts @@ -0,0 +1,7 @@ +import "../css/designer.v1.css"; +import "../css/designer.v2.css"; +import {initialize} from "./designer/internal/init"; + +export * from "./designer/api"; + +initialize(); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/add-activity-node.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/add-activity-node.ts new file mode 100644 index 0000000..887e2cf --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/add-activity-node.ts @@ -0,0 +1,19 @@ +import {Node} from "@antv/x6"; +import {graphBindings} from "./graph-bindings"; + +export async function addActivityNode(graphId: string, node: Node.Properties) { + // Get graph reference. + const {graph} = graphBindings[graphId]; + + // Convert the node coordinates from page to local. + const {x, y} = graph.pageToLocal(node.position); + + node.position = {x, y}; + node.size = {width: 200, height: 50}; + node.id = node.id!; + + // Add the node to the graph. + graph.addNode(node); + graph.cleanSelection(); + graph.select(node.id); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/auto-layout.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/auto-layout.ts new file mode 100644 index 0000000..0700726 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/auto-layout.ts @@ -0,0 +1,21 @@ +import {Model} from '@antv/x6'; +import {DagreLayout} from '@antv/layout'; +import {loadGraph} from './load-graph'; +import {graphBindings} from './graph-bindings'; + +const dagreLayout = new DagreLayout({ + type: 'dagre', + rankdir: 'LR', + align: 'DL', + ranksep: 35, + nodesep: 15, +}) + +export async function autoLayout(graphId: string, data: string | Model.FromJSONData) { + const {graph, interop} = graphBindings[graphId]; + const model = typeof data === 'string' ? JSON.parse(data) : data; + const newModel = dagreLayout.layout(model); + + loadGraph(graphId, newModel); + await interop.raiseGraphUpdated(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/calculate-activity-size.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/calculate-activity-size.ts new file mode 100644 index 0000000..8d2240b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/calculate-activity-size.ts @@ -0,0 +1,47 @@ +import {activityTagName, createActivityElement} from "../internal/create-activity-element"; +import {Activity, Size} from "../models"; + +export function calculateActivitySize(activity: Activity): Promise { + const wrapper = document.createElement('div'); + const dummyActivityElement = createActivityElement(activity, true); + wrapper.style.position = 'absolute'; + wrapper.appendChild(dummyActivityElement); + + // Append the temporary element to the DOM. + const bodyElement = document.getElementsByTagName('body')[0]; + bodyElement.append(wrapper); + + // Wait for the activity element to be completely rendered. + // When using custom elements, they are rendered after they are mounted. Before then, they have a 0 width and height. + return new Promise((resolve, reject) => { + const checkSize = () => { + const activityElement: Element = wrapper.getElementsByTagName(activityTagName)[0]; + + if(activityElement == null) { + reject('Activity element not found.'); + return; + } + + const activityElementRect = activityElement.getBoundingClientRect(); + + // If the custom element has no width or height yet, it means it has not yet rendered. + if (activityElementRect.width == 0 || activityElementRect.height == 0) { + // Request an animation frame and call ourselves back immediately after. + window.requestAnimationFrame(checkSize); + } else { + const rect = wrapper.getElementsByClassName("elsa-activity")[0].getBoundingClientRect(); + const width = rect.width; + const height = rect.height; + + // Remove the temporary element (used only to calculate its size). + wrapper.remove(); + + // Update the size of the activity node and resolve the promise. + resolve({width, height}); + } + }; + + // Begin to try to get our element size. + checkSize(); + }); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/center-content.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/center-content.ts new file mode 100644 index 0000000..3fc03d4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/center-content.ts @@ -0,0 +1,10 @@ +import {graphBindings} from "./graph-bindings"; + +export function centerContent(graphId: string) { + const {graph} = graphBindings[graphId]; + + graph.centerContent({ + padding: 20, + useCellGeometry: true + }); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/create-graph.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/create-graph.ts new file mode 100644 index 0000000..7b491b9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/create-graph.ts @@ -0,0 +1,392 @@ +import {Graph, Shape, Node, Edge} from '@antv/x6'; +import {Selection} from "@antv/x6-plugin-selection"; +import {Snapline} from "@antv/x6-plugin-snapline"; +import {Transform} from "@antv/x6-plugin-transform"; +import {Keyboard} from "@antv/x6-plugin-keyboard"; +import {Clipboard} from '@antv/x6-plugin-clipboard'; +import {History} from '@antv/x6-plugin-history'; +import {DotNetComponentRef, graphBindings} from "./graph-bindings"; +import {DotNetFlowchartDesigner} from "./dotnet-flowchart-designer"; +import {Activity} from "../models"; + +export async function createGraph(containerId: string, componentRef: DotNetComponentRef, readOnly: boolean, settings?: any): Promise { + const containerElement = document.getElementById(containerId); + const interop = new DotNetFlowchartDesigner(componentRef); + let lastSelectedNode: Node.Properties = null; + + const graph = new Graph({ + container: containerElement, + autoResize: true, + grid: { + type: settings?.grid?.type || 'dot', + visible: settings?.grid?.visible || true, + size: settings?.grid?.size || 10, + args: settings?.grid?.args || { + color: '#334154', + thickness: 1, + } + }, + magnetThreshold: settings?.magnetThreshold || 0, + panning: settings?.panning || { + enabled: true, + }, + mousewheel: settings?.mousewheel || { + enabled: true, + factor: 1.05, + minScale: 0.4, + maxScale: 3, + }, + interacting: { + nodeMovable: () => !readOnly, + arrowheadMovable: () => !readOnly, + edgeMovable: () => !readOnly, + vertexMovable: () => !readOnly, + vertexAddable: () => !readOnly, + vertexDeletable: () => !readOnly, + edgeLabelMovable: () => !readOnly, + magnetConnectable: () => !readOnly, + toolsAddable: () => !readOnly, + useEdgeTools: () => !readOnly, + }, + connecting: { + router: 'manhattan', + connector: { + name: 'rounded', + args: { + radius: 8, + }, + }, + anchor: 'center', + connectionPoint: 'anchor', + allowBlank: false, + snap: { + radius: 20, + anchor: "bbox" + }, + createEdge() { + return graph.createEdge({ + shape: 'elsa-edge', + attrs: { + line: { + strokeDasharray: '5 5', + }, + }, + zIndex: -1, + }) + }, + validateConnection({sourceMagnet, targetMagnet}) { + if (!sourceMagnet || sourceMagnet.getAttribute('port-group') === 'in') { + return false + } + + if (!targetMagnet || targetMagnet.getAttribute('port-group') !== 'in') { + return false + } + + return true + }, + }, + highlighting: { + magnetAdsorbed: { + name: 'stroke', + args: { + attrs: { + fill: '#fff', + stroke: '#31d0c6', + strokeWidth: 4, + }, + }, + }, + embedding: { + name: 'stroke', + args: { + padding: -1, + attrs: { + stroke: '#73d13d', + }, + }, + }, + } + }); + + graph.use( + new History({ + enabled: true, + beforeAddCommand: (e: string, args: any) => { + if (args.key == 'tools') + return false; + + const supportedEvents = ['cell:added', 'cell:removed', 'cell:change:*']; + return supportedEvents.indexOf(e) >= 0; + }, + }), + ) + + graph.use(new Snapline({ + enabled: true, + className: 'elsa-snapline', + })); + + graph.use( + new Selection({ + enabled: true, + multiple: !readOnly, + modifiers: ['ctrl', 'shift'], + rubberEdge: false, + rubberNode: true, + rubberband: true, + movable: !readOnly, + showNodeSelectionBox: true, + className: 'elsa-selection' + }), + ); + + if (!readOnly) { + graph.use( + new Keyboard({ + enabled: true + }) + ); + + graph.use( + new Clipboard({ + enabled: true, + }), + ) + + graph.use( + new Transform({ + resizing: { + enabled: true, + + } + }) + ); + + // Copy the cells in the graph to the internal clipboard with Ctrl+C. + graph.bindKey(['ctrl+c', 'meta+c'], () => { + const cells = graph.getSelectedCells() + if (cells.length) { + graph.copy(cells) + } + + return false; + }); + + graph.bindKey(['meta+x', 'ctrl+x'], () => { + const cells = graph.getSelectedCells() + if (cells.length) { + graph.cut(cells) + } + + return false; + }); + + // Paste + graph.bindKey(['ctrl+v', 'meta+v'], () => { + if (!graph.isClipboardEmpty()) { + const cells = graph.getCellsInClipboard(); + + if (cells.length == 0) + return; + + const activityCells = cells.filter(x => x.shape == 'elsa-activity'); + const edgeCells: Edge[] = cells.filter(x => x.shape == 'elsa-edge'); + + interop.raisePasteCellsRequested(activityCells, edgeCells); + } + + return false; + }); + + // Undo + graph.bindKey(['meta+z', 'ctrl+z'], () => { + if (graph.canUndo()) { + graph.undo() + } + return false + }); + + // Redo + graph.bindKey(['meta+y', 'ctrl+y'], () => { + if (graph.canRedo()) { + graph.redo() + } + return false + }); + + // Delete + graph.bindKey('del', () => { + const cells = graph.getSelectedCells() + if (cells.length) { + graph.removeCells(cells) + } + + return false; + }); + } + + // Select all + graph.bindKey(['meta+a', 'ctrl+a'], () => { + const nodes = graph.getNodes() + if (nodes) { + graph.select(nodes) + } + + return false; + }); + + // zoom + graph.bindKey(['ctrl+1', 'meta+1'], () => { + const zoom = graph.zoom() + if (zoom < 1.5) { + graph.zoom(0.1) + } + return false; + }); + + graph.bindKey(['ctrl+2', 'meta+2'], () => { + const zoom = graph.zoom() + if (zoom > 0.5) { + graph.zoom(-0.1) + } + return false; + }); + + graph.on('blank:click', async () => { + if (!!lastSelectedNode) { + lastSelectedNode.setProp('selected-port', null); + } + await interop.raiseCanvasSelected(); + return false; + }); + + // Move the clicked node to the front. This helps when the user clicks on a node that is behind another node. + graph.on('node:mousedown', ({node}) => { + node.toFront(); + return false; + }); + + // Change the edge's color and style when it is connected to a magnet. + graph.on('edge:connected', ({edge}) => { + edge.attr({ + line: { + strokeDasharray: '', + }, + }); + return false; + }); + + graph.on("edge:mouseenter", ({cell}) => { + cell.addTools([ + {name: "vertices"}, + { + name: "button-remove", + args: {distance: 20}, + }, + ]); + return false; + }); + + graph.on("edge:mouseleave", ({cell}) => { + if (cell.hasTool("button-remove")) { + cell.removeTool("button-remove"); + } + return false; + }); + + graph.on('node:click', async args => { + const {e, node} = args; + const activity: Activity = node.data; + const activityId = activity.id; + const activityElementId = `activity-${activityId}`; + const activityElement = document.getElementById(activityElementId); + const menuButtonElement = activityElement.querySelector('.mud-button-root'); + const embeddedPortElements = activityElement.querySelectorAll('.embedded-port'); + const mousePosition = graph.clientToLocal(e.clientX, e.clientY); + + // Check if the menu button was clicked. + const menuButtonElementRect = menuButtonElement.getBoundingClientRect(); + const menuButtonElementBBox = graph.pageToLocal(menuButtonElementRect); + + if (menuButtonElementBBox.containsPoint(mousePosition)) { + await interop.raiseActivityMenuButtonClicked(activity); + return; + } + + // Check which of the embedded ports intersect with the selected node. + for (let i = 0; i < embeddedPortElements.length; i++) { + const embeddedPortElement = embeddedPortElements[i]; + const embeddedPortElementRect = embeddedPortElement.getBoundingClientRect(); + const embeddedPortElementBBox = graph.pageToLocal(embeddedPortElementRect); + + if (!embeddedPortElementBBox.containsPoint(mousePosition)) + continue; + + // Mark the node as unselected. + if (graph.isSelected(node)) { + graph.unselect(node); + } + + const embeddedPortName = embeddedPortElement.getAttribute('data-port-name'); + node.setProp('selected-port', embeddedPortName); + lastSelectedNode = node; + + await interop.raiseActivityEmbeddedPortSelected(activity, embeddedPortName); + return; + } + + if (!graph.isSelected(node)) { + graph.select(node); + } + + node.setProp('selected-port', null); + }); + + graph.on('node:dblclick', async args => { + const {node} = args; + const activity: Activity = node.data; + await interop.raiseActivityDoubleClick(activity); + }); + + graph.on('node:selected', async args => { + const {node} = args; + const activity: Activity = node.data; + await interop.raiseActivitySelected(activity); + }); + + const onGraphUpdated = async (e: any) => { + await interop.raiseGraphUpdated(); + return false; + }; + + const onNodeRemoved = async (e: any) => { + await onGraphUpdated(e); + return false; + }; + + const onNodeAdded = async (e: any) => { + await onGraphUpdated(e); + return false; + }; + + graph.on('node:moved', onGraphUpdated); + graph.on('node:added', onNodeAdded); + graph.on('node:removed', onNodeRemoved); + graph.on('node:change:size', onGraphUpdated); + graph.on('edge:removed', onGraphUpdated); + graph.on('edge:connected', onGraphUpdated); + graph.on('edge:vertexs:added', onGraphUpdated); + graph.on('edge:vertexs:removed', onGraphUpdated); + + // Register the graph. + const graphId = containerId; + + graphBindings[graphId] = { + graphId: graphId, + graph: graph, + interop: interop + }; + + return graphId; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dispose-graph.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dispose-graph.ts new file mode 100644 index 0000000..64454f5 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dispose-graph.ts @@ -0,0 +1,5 @@ +import {graphBindings} from "./graph-bindings"; + +export function disposeGraph(graphId) { + delete graphBindings[graphId]; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dotnet-flowchart-designer.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dotnet-flowchart-designer.ts new file mode 100644 index 0000000..fd4f3d9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/dotnet-flowchart-designer.ts @@ -0,0 +1,56 @@ +import {DotNetComponentRef} from "./graph-bindings"; +import {Activity} from "../models"; + +export class DotNetFlowchartDesigner { + constructor(private componentRef: DotNetComponentRef) { + } + + /// + /// Raises the event. + /// + async raiseActivitySelected(activity: Activity): Promise { + await this.componentRef.invokeMethodAsync('HandleActivitySelected', activity); + } + + /// + /// Raises the event. + /// + async raiseActivityMenuButtonClicked(activity: Activity): Promise { + await this.componentRef.invokeMethodAsync('HandleActivityMenuButtonClicked', activity); + } + + /// + /// Raises the event. + /// + async raiseActivityEmbeddedPortSelected(activity: Activity, portName: string): Promise { + await this.componentRef.invokeMethodAsync('HandleActivityEmbeddedPortSelected', activity, portName); + } + + /// + /// Raises the event. + /// + async raiseActivityDoubleClick(activity: Activity): Promise { + await this.componentRef.invokeMethodAsync('HandleActivityDoubleClick', activity); + } + + /// + /// Raises the event. + /// + async raiseCanvasSelected(): Promise { + await this.componentRef.invokeMethodAsync('HandleCanvasSelected'); + } + + /// + /// Raises the event. + /// + async raiseGraphUpdated(): Promise { + await this.componentRef.invokeMethodAsync('HandleGraphUpdated'); + } + + /// + /// Raises the event. + /// + async raisePasteCellsRequested(activityCells: any[], edgeCells: any[]): Promise { + await this.componentRef.invokeMethodAsync('HandlePasteCellsRequested', activityCells, edgeCells); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/graph-bindings.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/graph-bindings.ts new file mode 100644 index 0000000..d6e652a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/graph-bindings.ts @@ -0,0 +1,18 @@ +import {Graph} from '@antv/x6'; +import {DotNetFlowchartDesigner} from "./dotnet-flowchart-designer"; + +// This is a global dictionary that is used to store graph instances. +export const graphBindings: { [key: string]: GraphBinding } = {}; + +// A dotnet component reference. +export interface DotNetComponentRef { + invokeMethodAsync(methodName: string, ...args: any[]): Promise; + dispose(): void; +} + +export interface GraphBinding { + graphId: string; + graph: Graph; + interop: DotNetFlowchartDesigner; +} + diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/index.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/index.ts new file mode 100644 index 0000000..6fc1487 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/index.ts @@ -0,0 +1,19 @@ +export * from './add-activity-node'; +export * from './calculate-activity-size'; +export * from './center-content'; +export * from './create-graph'; +export * from './dispose-graph'; +export * from './graph-bindings'; +export * from './load-graph'; +export * from './paste-cells'; +export * from './read-graph'; +export * from './raise-activity-selected'; +export * from './raise-activity-embedded-port-selected'; +export * from './select-activity'; +export * from './set-grid-color'; +export * from './update-activity'; +export * from './update-activity-size'; +export * from './update-activity-stats'; +export * from './zoom-to-fit'; +export * from './auto-layout'; +export {DotNetFlowchartDesigner} from "./dotnet-flowchart-designer"; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/load-graph.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/load-graph.ts new file mode 100644 index 0000000..adc2934 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/load-graph.ts @@ -0,0 +1,27 @@ +import {Graph, Model} from '@antv/x6'; +import {graphBindings} from "./graph-bindings"; + +export function loadGraph(graphId: string, data: string | Model.FromJSONData) { + const {graph} = graphBindings[graphId]; + const model = typeof data === 'string' ? JSON.parse(data) : data; + graph.fromJSON(model); + + waitUntilCanvasHasNonZeroHeight(graph).then(() => graph.centerContent({padding: 20})); +} + +function waitUntilCanvasHasNonZeroHeight(graph: Graph): Promise { + const container = graph.container; + + return new Promise((resolve, reject) => { + const checkSize = () => { + const clientRect = container.getBoundingClientRect(); + + if (clientRect.height == 0) + window.requestAnimationFrame(checkSize); + else + resolve(); + }; + + checkSize(); + }); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/paste-cells.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/paste-cells.ts new file mode 100644 index 0000000..d382278 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/paste-cells.ts @@ -0,0 +1,21 @@ +import {Cell, Node, Edge} from "@antv/x6"; +import {graphBindings} from "./graph-bindings"; + +export async function pasteCells(graphId: string, nodeProps: Node.Properties[], edgeProps: Edge.Properties[]) { + // Get graph reference. + const {graph} = graphBindings[graphId]; + + // Create nodes and edges from node props and edge props. + const nodes = nodeProps.map(x => graph.createNode(x)); + const edges = edgeProps.map(x => graph.createEdge(x)); + + // Add the nodes and edges to the graph. + graph.addCell(nodes); + graph.addCell(edges); + + // Wait for the new cells to be rendered. + requestAnimationFrame(() => { + graph.cleanSelection(); + graph.select([...nodes, ...edges]); + }); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-embedded-port-selected.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-embedded-port-selected.ts new file mode 100644 index 0000000..f65302f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-embedded-port-selected.ts @@ -0,0 +1,21 @@ +import {Activity} from "../models"; +import {graphBindings} from "./graph-bindings"; + +export async function raiseActivityEmbeddedPortSelected(elementId: string, activityModel: Activity | string, portName: string) { + // Get wrapper element. + const wrapper = document.getElementById(elementId); + + // Get container element. + const container = wrapper.closest('.graph-container'); + + // Get graph ID. + const graphId = container.id; + + // Get graph reference. + const {interop} = graphBindings[graphId]; + + // Parse activity model. + const activity = typeof activityModel === 'string' ? JSON.parse(activityModel) : activityModel; + + await interop.raiseActivityEmbeddedPortSelected(activity, portName); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-selected.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-selected.ts new file mode 100644 index 0000000..cbd6e28 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/raise-activity-selected.ts @@ -0,0 +1,21 @@ +import {Activity} from "../models"; +import {graphBindings} from "./graph-bindings"; + +export async function raiseActivitySelected(elementId: string, activityModel: Activity | string) { + // Get wrapper element. + const wrapper = document.getElementById(elementId); + + // Get container element. + const container = wrapper.closest('.graph-container'); + + // Get graph ID. + const graphId = container.id; + + // Get graph reference. + const {interop} = graphBindings[graphId]; + + // Parse activity model. + const activity = typeof activityModel === 'string' ? JSON.parse(activityModel) : activityModel; + + await interop.raiseActivitySelected(activity); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/read-graph.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/read-graph.ts new file mode 100644 index 0000000..e8bc211 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/read-graph.ts @@ -0,0 +1,28 @@ +import {Cell, Edge} from '@antv/x6'; +import {graphBindings} from "./graph-bindings"; + +export function readGraph(graphId: string): { + cells: Cell.Properties[]; +} { + const {graph} = graphBindings[graphId]; + const model = graph.toJSON(); + + // Filter out edges that don't have both a star and end node. + model.cells = model.cells.filter((cell: Cell.Properties) => { + + if(cell.shape == 'elsa-activity') + return true; + + if(cell.shape == 'elsa-edge') + { + const edge = cell as any; + + if(!!edge.source?.cell && !!edge.target?.cell) + return true; + } + + return false; + }); + + return model; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/select-activity.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/select-activity.ts new file mode 100644 index 0000000..b889932 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/select-activity.ts @@ -0,0 +1,34 @@ +import {graphBindings} from "./graph-bindings"; + +export async function selectActivity(elementId: string, activityId: string) { + // Get wrapper element. + const wrapper = document.getElementById(elementId); + + if (wrapper == null) { + console.warn(`Could not find wrapper element with ID ${elementId}`); + return; + } + + // Get container element. + const container = wrapper.closest('.graph-container'); + + // Get graph ID. + const graphId = container.id; + + // Get graph reference. + const {graph} = graphBindings[graphId]; + + // Get activity node. + const node = graph.getNodes().find(x => x.id == activityId); + + if (node == null) { + console.warn(`Could not find node with ID ${activityId} in graph ${graphId}`); + return; + } + + // Select the node. + graph.select(node); + + // Center the selected node. + graph.centerCell(node); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/set-grid-color.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/set-grid-color.ts new file mode 100644 index 0000000..e8a8313 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/set-grid-color.ts @@ -0,0 +1,6 @@ +import {graphBindings} from "./graph-bindings"; + +export function setGridColor(graphId: string, color: string) { + const {graph} = graphBindings[graphId]; + graph.grid.update({color: color}); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-size.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-size.ts new file mode 100644 index 0000000..c49c5ce --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-size.ts @@ -0,0 +1,49 @@ +import {calculateActivitySize} from "./calculate-activity-size"; +import {Activity, Size} from "../models"; +import {graphBindings} from "./graph-bindings"; + +export async function updateActivitySize(elementId: string, activityModel: Activity | string, size?: Size) { + // Get wrapper element. + const wrapper = document.getElementById(elementId); + + if (wrapper == null) { + console.warn(`Could not find wrapper element with ID ${elementId}`); + return; + } + + // Get container element. + const container = wrapper.closest('.graph-container'); + + // Get graph ID. + const graphId = container.id; + + // Get graph reference. + const {graph} = graphBindings[graphId]; + + // Parse activity model. + const activity = typeof activityModel === 'string' ? JSON.parse(activityModel) : activityModel; + + // Calculate the size of the activity. + const rect = await calculateActivitySize(activity); + let width = rect.width; + let height = rect.height; + + // Get the node from the graph and update its size. + const activityId = activity.id; + const node = graph.getNodes().find(x => x.id == activityId); + + if (node == null) { + console.warn(`Could not find node with ID ${activityId} in graph ${graphId}`); + return; + } + + if (!!size) { + if (size.width > width) + width = size.width; + + if (size.height > height) + height = size.height; + } + + node.size(width, height); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-stats.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-stats.ts new file mode 100644 index 0000000..6f1caf2 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity-stats.ts @@ -0,0 +1,31 @@ +import {ActivityStats} from "../models"; +import {graphBindings} from "./graph-bindings"; + +export async function updateActivityStats(elementId: string, activityId: string, activityStats: ActivityStats) { + // Get wrapper element. + const wrapper = document.getElementById(elementId); + + if (wrapper == null) { + console.warn(`Could not find wrapper element with ID ${elementId}`); + return; + } + + // Get container element. + const container = wrapper.closest('.graph-container'); + + // Get graph ID. + const graphId = container.id; + + // Get graph reference. + const {graph} = graphBindings[graphId]; + + // Get the node from the graph and update its size. + const node = graph.getNodes().find(x => x.id == activityId); + + if (node == null) { + console.warn(`Could not find node with ID ${activityId} in graph ${graphId}`); + return; + } + + node.setProp('activityStats', activityStats); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity.ts new file mode 100644 index 0000000..8afcc20 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/update-activity.ts @@ -0,0 +1,41 @@ +import {Node} from "@antv/x6"; +import {Activity} from "../models"; +import {graphBindings} from "./graph-bindings"; +import {Ports} from "../models/x6"; + +export async function updateActivity(graphId: string, activity: Activity, ports?: Ports) { + // Get graph reference. + const {graph, interop} = graphBindings[graphId]; + + // Get the node from the graph. + const activityId = activity.id; + let node = graph.getNodes().find(x => x.id == activityId); + + // Update the node data. + if (!!node) { + + // Update the node's data with the activity. + node.setData(activity, {overwrite: true}); + + // Update ports. + if (!!ports) { + updatePorts(node, ports); + } + + // Publish changed event. + await interop.raiseGraphUpdated(); + } +} + +const updatePorts = (node: Node, ports: Ports) => { + const desiredPorts = ports.items; + const actualPorts = node.ports.items; + const addedPorts = desiredPorts.filter(x => !actualPorts.some(y => y.id == x.id)); + const removedPorts = actualPorts.filter(x => !desiredPorts.some(y => y.id == x.id)); + + if (addedPorts.length > 0) + node.addPorts(addedPorts); + + if (removedPorts.length > 0) + node.removePorts(removedPorts); +}; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/zoom-to-fit.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/zoom-to-fit.ts new file mode 100644 index 0000000..d0be583 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/api/zoom-to-fit.ts @@ -0,0 +1,10 @@ +import {graphBindings} from "./graph-bindings"; + +export function zoomToFit(graphId: string) { + const {graph} = graphBindings[graphId]; + graph.zoomToFit({ + padding: 20, + minScale: 0.5, + maxScale: 3 + }); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/create-activity-element.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/create-activity-element.ts new file mode 100644 index 0000000..0563e5b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/create-activity-element.ts @@ -0,0 +1,24 @@ +import {Activity, ActivityStats} from "../models"; + +export const activityTagName = "elsa-activity-wrapper"; + +export function createActivityElement(activity: Activity, detached?: boolean, selectedPort?: string, stats?: ActivityStats): HTMLElement { + const activityElement = document.createElement(activityTagName) as any; + const activityId = activity.id; + const elementId = `activity-${activityId}`; + + if(!detached) { + activityElement.id = elementId; + activityElement.setAttribute("element-id", elementId); + } + + if(!!selectedPort) + activityElement.setAttribute("selected-port-name", selectedPort); + + activityElement.stats = stats; + //activityElement.activity = activity; // activity can be too deeply nested when dealing with workflow definition activities, exceeding the max depth of 32 with JSInterop. + activityElement.setAttribute("activity-json", JSON.stringify(activity)); + activityElement.setAttribute("activity-id", activityId); + + return activityElement; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/init.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/init.ts new file mode 100644 index 0000000..7478216 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/internal/init.ts @@ -0,0 +1,80 @@ +import {Graph, Shape} from '@antv/x6'; +import {createActivityElement} from "./create-activity-element"; +import {Activity} from "../models"; + +export function initialize() { + + Shape.HTML.register({ + shape: "elsa-activity", + effect: ["data", "activityStats"], + html(cell) { + const activity: Activity = cell.getData(); + const selectedPort = cell.prop('selected-port'); + const activityStats = cell.prop('activityStats'); + return createActivityElement(activity, false, selectedPort, activityStats); + }, + ports: { + groups: { + in: { + position: "left", + attrs: { + circle: { + r: 5, + magnet: true, + stroke: "#0ea5e9", + strokeWidth: 2, + fill: "#fff", + }, + text: { + fontSize: 12, + fill: "#888", + }, + }, + label: { + position: { + name: "outside", + }, + }, + }, + out: { + position: "right", + attrs: { + circle: { + r: 5, + magnet: true, + stroke: "#fff", + strokeWidth: 2, + fill: "#0ea5e9", + }, + text: { + fontSize: 12, + fill: "#888", + }, + }, + label: { + position: { + name: "outside", + }, + }, + }, + }, + } + }); + + Graph.registerEdge( + 'elsa-edge', + { + inherit: 'edge', + attrs: { + line: { + stroke: '#C2C8D5', + strokeWidth: 1, + targetMarker: 'classic', + size: 6, + }, + }, + }, + true, + ); + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity-stats.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity-stats.ts new file mode 100644 index 0000000..3b521af --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity-stats.ts @@ -0,0 +1,6 @@ +export interface ActivityStats { + started: number; + completed: number; + uncompleted: number; + blocked: boolean; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity.ts new file mode 100644 index 0000000..41f6e1e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/activity.ts @@ -0,0 +1,14 @@ +import {ActivityDesignerMetadata, ActivityDisplayTextMetadata} from "./metadata"; + +export interface Activity { + id: string; + type: string; + version: number; + metadata: any | ActivityDisplayTextMetadata | ActivityDesignerMetadata; + canStartWorkflow?: boolean; + runAsynchronously?: boolean; + customProperties?: any; + + [name: string]: any; +} + diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/connection.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/connection.ts new file mode 100644 index 0000000..686b10c --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/connection.ts @@ -0,0 +1,6 @@ +export interface Connection { + source: string; + target: string; + sourcePort: string; + targetPort: string; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/container.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/container.ts new file mode 100644 index 0000000..7f1a4f9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/container.ts @@ -0,0 +1,5 @@ +import {Activity} from "./activity"; + +export interface Container extends Activity { + activities: Array; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/index.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/index.ts new file mode 100644 index 0000000..471c2e3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/index.ts @@ -0,0 +1,6 @@ +export * from './activity'; +export * from './activity-stats'; +export * from './connection'; +export * from './container'; +export * from "./metadata"; +export * from './size'; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/metadata.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/metadata.ts new file mode 100644 index 0000000..4ab4354 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/metadata.ts @@ -0,0 +1,12 @@ +export interface ActivityDisplayTextMetadata { + displayText?: string; +} + +export interface ActivityDesignerMetadata { + designer: { + position: { + x: number; + y: number; + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/size.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/size.ts new file mode 100644 index 0000000..a535bd4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/size.ts @@ -0,0 +1,4 @@ +export interface Size { + width: number; + height: number; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/x6.ts b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/x6.ts new file mode 100644 index 0000000..f5a528a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/src/designer/models/x6.ts @@ -0,0 +1,17 @@ +export interface Port { + id: string; + group?: string; +} + +export interface Ports +{ + items: Port[]; +} + +export interface Node +{ + id: string; + ports: Ports; + addPorts(ports: Port[]): void + removePorts(ports: Port[]): void +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/tsconfig.json b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/tsconfig.json new file mode 100644 index 0000000..5b77e76 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "outDir": "../wwwroot", + "sourceMap": true, + "noImplicitAny": false, + "module": "ES2022", + "target": "ES2022", + "jsx": "react", + "allowJs": true, + "moduleResolution": "node" + }, + "include": [ + "./src/**/*" + ] +} diff --git a/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/webpack.config.js b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/webpack.config.js new file mode 100644 index 0000000..568603d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/ClientLib/webpack.config.js @@ -0,0 +1,53 @@ +const path = require('path'); +const CopyPlugin = require('copy-webpack-plugin'); + +module.exports = { + entry: { + designer: './src/designer.ts' + }, + output: { + filename: '[name].entry.js', + path: path.resolve(__dirname, '..', 'wwwroot'), + library: { + type: "module", + }, + module: true, // Enable outputting ES6 modules. + environment: { + module: true, // The environment supports ES6 modules. + }, + }, + experiments: { + outputModule: true, // This enables the experimental support for outputting ES6 modules + }, + devtool: 'source-map', + mode: 'development', + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + { + test: /\.css$/, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.(eot|woff(2)?|ttf|otf|svg)$/i, + type: 'asset' + }, + ] + }, + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, + plugins: [ + new CopyPlugin({ + patterns: [ + {from: 'css/designer.v1.css', to: './'}, + {from: 'css/designer.v2.css', to: './'}, + {from: 'css/designer.v2.css', to: './designer.css'}, // Default + ], + }), + ] +}; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/ActivityWrapperBase.cs b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/ActivityWrapperBase.cs new file mode 100644 index 0000000..554d94b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/ActivityWrapperBase.cs @@ -0,0 +1,102 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Components; +using Elsa.Studio.Workflows.Designer.Interop; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Designer.Components.ActivityWrappers; + +/// +/// A wrapper for an activity component. +/// +public abstract class ActivityWrapperBase : StudioComponentBase +{ + /// + /// Gets or sets the element ID. + /// + [Parameter] public string? ElementId { get; set; } + + /// + /// Gets or sets the activity ID. + /// + [Parameter] public string ActivityId { get; set; } = null!; + + /// + /// Gets or sets the activity. + /// + [Parameter] public JsonObject Activity { get; set; } = null!; + + /// + /// Until the max depth of JSInterop is configurable to exceed 32, we need to pass the activity JSON as a string. + /// + [Parameter] public string ActivityJson { get; set; } = null!; + + /// + /// Gets or sets the selected port name. + /// + [Parameter] public string? SelectedPortName { get; set; } + + /// + /// Gets or sets the activity stats. + /// + [Parameter] public ActivityStats? Stats { get; set; } + + [Inject] protected DesignerJsInterop DesignerInterop { get; set; } = null!; + [Inject] protected IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] protected IActivityDisplaySettingsRegistry ActivityDisplaySettingsRegistry { get; set; } = null!; + [Inject] protected IActivityPortService ActivityPortService { get; set; } = null!; + [Inject] protected IServiceProvider ServiceProvider { get; set; } = null!; + + protected bool CanStartWorkflow => Activity.GetCanStartWorkflow() == true; + protected string Label { get; private set; } = null!; + protected string TypeName { get; private set; } = null!; + protected string Description { get; private set; } = null!; + protected bool ShowDescription { get; private set; } + protected string Color { get; private set; } = null!; + protected string? Icon { get; private set; } + protected ActivityDescriptor? ActivityDescriptor { get; private set; } + protected ICollection Ports { get; private set; } = new List(); + + /// + protected override async Task OnParametersSetAsync() + { + if (!string.IsNullOrWhiteSpace(ActivityJson)) + Activity = JsonSerializer.Deserialize(ActivityJson, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase })!; + + await ActivityRegistry.EnsureLoadedAsync(); + + var activity = Activity; + var activityDisplayText = activity.GetDisplayText()?.Trim(); + var activityDescription = activity.GetDescription()?.Trim(); + var activityType = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var descriptor = ActivityRegistry.Find(activityType, activityVersion); + var displaySettings = ActivityDisplaySettingsRegistry.GetSettings(activityType); + + Label = !string.IsNullOrEmpty(activityDisplayText) ? activityDisplayText : descriptor?.DisplayName ?? descriptor?.Name ?? "Unknown Activity"; + TypeName = descriptor?.DisplayName ?? "Unknown Activity"; + Description = !string.IsNullOrEmpty(activityDescription) ? activityDescription : descriptor?.Description ?? string.Empty; + ShowDescription = activity.GetShowDescription() == true; + Color = displaySettings.Color; + Icon = displaySettings.Icon; + ActivityDescriptor = descriptor!; + Ports = descriptor != null ? ActivityPortService.GetPorts(new PortProviderContext(descriptor, activity)).ToList() : []; + + await UpdateSizeAsync(); + } + + private async Task UpdateSizeAsync() + { + if (!string.IsNullOrEmpty(ElementId)) + { + var size = Activity.GetDesignerMetadata().Size; + await DesignerInterop.UpdateActivitySizeAsync(ElementId, Activity, size); + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/EmbeddedActivityWrapper.razor.cs b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/EmbeddedActivityWrapper.razor.cs new file mode 100644 index 0000000..c9ecf2a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/EmbeddedActivityWrapper.razor.cs @@ -0,0 +1,52 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Components; +using Elsa.Studio.Workflows.Designer.Interop; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Designer.Components.ActivityWrappers; + +public abstract class EmbeddedActivityWrapperBase : StudioComponentBase +{ + [Parameter] public string? ElementId { get; set; } + [Parameter] public string ActivityId { get; set; } = null!; + [Parameter] public JsonObject Activity { get; set; } = null!; + [Parameter] public bool IsSelected { get; set; } + + [Inject] DesignerJsInterop DesignerInterop { get; set; } = null!; + [Inject] IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] IActivityDisplaySettingsRegistry ActivityDisplaySettingsRegistry { get; set; } = null!; + [Inject] IServiceProvider ServiceProvider { get; set; } = null!; + + protected bool CanStartWorkflow => Activity.GetCanStartWorkflow() == true; + protected string Label { get; private set; } = null!; + protected string Description { get; private set; } = null!; + protected bool ShowDescription { get; private set; } + protected string Color { get; private set; } = null!; + protected string? Icon { get; private set; } + protected ActivityDescriptor ActivityDescriptor { get; private set; } = null!; + + /// + protected override async Task OnInitializedAsync() + { + await ActivityRegistry.EnsureLoadedAsync(); + + var activity = Activity; + var activityType = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var descriptor = (ActivityRegistry.Find(activityType, activityVersion) ?? ActivityRegistry.Find("Elsa.UnknownActivity"))!; + var activityDisplayText = activity.GetDisplayText()?.Trim() ?? activity.GetName() ?? descriptor.DisplayName ?? descriptor.Name; + var activityDescription = activity.GetDescription()?.Trim(); + var displaySettings = ActivityDisplaySettingsRegistry.GetSettings(activityType); + + Label = activityDisplayText; + Description = !string.IsNullOrEmpty(activityDescription) ? activityDescription : descriptor.Description ?? string.Empty; + ShowDescription = activity.GetShowDescription() == true; + Color = displaySettings.Color; + Icon = displaySettings.Icon; + ActivityDescriptor = descriptor; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor new file mode 100644 index 0000000..a9558f0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor @@ -0,0 +1,70 @@ +@using System.Text.Json +@using System.Text.Json.Nodes +@using Elsa.Api.Client.Resources.ActivityDescriptors.Enums +@using Elsa.Api.Client.Extensions +@using Elsa.Studio.Workflows.Domain.Contexts +@inherits ActivityWrapperBase +@inject ILocalizer Localizer +@{ + const string white = "#ffffff"; + var colorStyle = CanStartWorkflow ? $"color: {white};" : ""; + var metadata = Stats?.Metadata; + var hasRetryAttempts = metadata != null && metadata.TryGetValue("HasRetryAttempts", out var hasRetryAttemptsValue) && hasRetryAttemptsValue is JsonElement { ValueKind: JsonValueKind.True }; + var color = Stats == null ? MudBlazor.Color.Transparent : Stats.Faulted ? MudBlazor.Color.Error : Stats.Blocked ? MudBlazor.Color.Warning : Stats.Uncompleted > Stats.Completed ? MudBlazor.Color.Info : Stats.Completed > 0 ? MudBlazor.Color.Success : MudBlazor.Color.Default; + var content = Stats == null ? null : Stats.Faulted || Stats.Blocked ? Stats.Started.ToString() : Stats.Completed.ToString(); + var icon = Stats == null ? null : content == null ? Stats.Blocked ? Icons.Material.Outlined.HourglassTop : Stats.Uncompleted > 0 ? Icons.Material.Outlined.PlayArrow : null : null; + var showBadge = Stats != null; + var cssClass = hasRetryAttempts ? "elsa-activity-wrapper-badge has-retries" : "elsa-activity-wrapper-badge"; + + + + + @if (Icon != null) + { + + } + + @Localizer[Label] + @{ + var visiblePorts = Ports.Where(x => x is { Type: PortType.Embedded, IsBrowsable: true }).ToList(); + } + @if (visiblePorts.Any()) + { + + @foreach (var port in visiblePorts) + { + var portName = port.Name; + var providerContext = new PortProviderContext(ActivityDescriptor, Activity); + var portProvider = ActivityPortService.GetProvider(providerContext); + var childActivity = portProvider.ResolvePort(portName, new(ActivityDescriptor, Activity)); + + @if (childActivity != null) + { + +
+ +
+
+ } + else + { + + @port.DisplayName + + } + } +
+ } + + @if (!string.IsNullOrWhiteSpace(Description) && ShowDescription) + { + @Description + } +
+
+
+
+} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor.cs b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor.cs new file mode 100644 index 0000000..55adfa1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/ActivityWrapper.razor.cs @@ -0,0 +1,19 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.Designer.Interop; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Designer.Components.ActivityWrappers.V1; + +/// +/// A wrapper for an activity component. +/// +public partial class ActivityWrapper : ActivityWrapperBase +{ +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor new file mode 100644 index 0000000..0b8e55d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor @@ -0,0 +1,25 @@ +@inherits EmbeddedActivityWrapperBase +@{ + var colorStyle = IsSelected ? $"color: {Color};" : ""; +} + + + @if (Icon != null) + { + + } + + @Label + + @if (!string.IsNullOrWhiteSpace(Description) && ShowDescription) + { + @Description + } + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor.cs b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor.cs new file mode 100644 index 0000000..c371bc3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V1/EmbeddedActivityWrapper.razor.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Workflows.Designer.Components.ActivityWrappers.V1; + +public partial class EmbeddedActivityWrapper; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor new file mode 100644 index 0000000..af6e562 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor @@ -0,0 +1,105 @@ +@using System.Text.Json +@using Elsa.Api.Client.Resources.ActivityDescriptors.Enums +@using Elsa.Api.Client.Extensions +@using Elsa.Studio.Workflows.Domain.Contexts +@inherits ActivityWrapperBase +@inject ILocalizer Localizer + +@{ + const string white = "#ffffff"; + const string transparent = "rgba(0,0,0,0)"; + var colorStyle = CanStartWorkflow ? $"color: {white};" : ""; + var backgroundColor = CanStartWorkflow ? Color : white; + var iconBgColor = CanStartWorkflow ? transparent : Color; + var iconColor = white; + var menuIconColor = CanStartWorkflow ? white : "var(--mud-palette-text-primary)"; + var metadata = Stats?.Metadata; + var hasRetryAttempts = metadata != null && metadata.TryGetValue("HasRetryAttempts", out var hasRetryAttemptsValue) && hasRetryAttemptsValue is JsonElement { ValueKind: JsonValueKind.True }; + var color = Stats == null ? MudBlazor.Color.Transparent : Stats.Faulted ? MudBlazor.Color.Error : Stats.Blocked ? MudBlazor.Color.Warning : Stats.Uncompleted > Stats.Completed ? MudBlazor.Color.Info : Stats.Completed > 0 ? MudBlazor.Color.Success : MudBlazor.Color.Default; + var content = Stats == null ? null : Stats.Faulted || Stats.Blocked ? Stats.Started.ToString() : Stats.Completed.ToString(); + var icon = Stats == null ? null : content == null ? Stats.Blocked ? Icons.Material.Outlined.HourglassTop : Stats.Uncompleted > 0 ? Icons.Material.Outlined.PlayArrow : null : null; + var showBadge = Stats != null; + var cssClass = hasRetryAttempts ? "elsa-activity-wrapper-badge has-retries" : "elsa-activity-wrapper-badge"; + var visiblePorts = Ports.Where(x => x is { Type: PortType.Embedded, IsBrowsable: true }).ToList(); + var isTrigger = ActivityDescriptor?.Kind == ActivityKind.Trigger; + var toggleCanStartText = isTrigger ? "Trigger" : "Starting point"; +} + + + + + + + + + @if (Icon != null) + { +
+ +
+ } + + +
+ @Localizer[Label] + @Localizer[TypeName] +
+ + +
+ + + + + + + + + + +
+
+ + @if (visiblePorts.Any() && ActivityDescriptor != null) + { +
+ @foreach (var port in visiblePorts) + { + var portName = port.Name; + var providerContext = new PortProviderContext(ActivityDescriptor, Activity); + var portProvider = ActivityPortService.GetProvider(providerContext); + var childActivity = portProvider.ResolvePort(portName, new(ActivityDescriptor, Activity)); + + @if (childActivity != null) + { + +
+ +
+
+ } + else + { + + @port.DisplayName + + } + } +
+ } + + @if (!string.IsNullOrWhiteSpace(Description) && ShowDescription) + { +
+ @Description +
+ } +
+
+
diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor.cs b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor.cs new file mode 100644 index 0000000..d041f90 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/ActivityWrapper.razor.cs @@ -0,0 +1,6 @@ +namespace Elsa.Studio.Workflows.Designer.Components.ActivityWrappers.V2; + +/// +/// A wrapper for an activity component. +/// +public partial class ActivityWrapper : ActivityWrapperBase; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor new file mode 100644 index 0000000..2ead2d1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor @@ -0,0 +1,21 @@ +@inherits EmbeddedActivityWrapperBase +@{ + var colorStyle = IsSelected ? $"color: {Color};" : ""; +} + + + + @Label + + @if (!string.IsNullOrWhiteSpace(Description) && ShowDescription) + { + @Description + } + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor.cs b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor.cs new file mode 100644 index 0000000..14ba294 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/ActivityWrappers/V2/EmbeddedActivityWrapper.razor.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Workflows.Designer.Components.ActivityWrappers.V2; + +public partial class EmbeddedActivityWrapper; \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor b/src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor new file mode 100644 index 0000000..49f21ea --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor @@ -0,0 +1,9 @@ +@inherits StudioComponentBase +@{ + var cssClass = "elsa-flowchart-diagram-designer" + (string.IsNullOrEmpty(Options.Value.DesignerCssClass) ? "" : " " + Options.Value.DesignerCssClass); +} + +
+
+
+
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor.cs b/src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor.cs new file mode 100644 index 0000000..ebde09a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Components/FlowchartDesigner.razor.cs @@ -0,0 +1,416 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Workflows.Designer.Contracts; +using Elsa.Studio.Workflows.Designer.Interop; +using Elsa.Studio.Workflows.Designer.Models; +using Elsa.Studio.Workflows.Designer.Options; +using Elsa.Studio.Workflows.Designer.Services; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Workflows.UI.Args; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.JSInterop; +using MudBlazor.Utilities; +using ThrottleDebounce; + +namespace Elsa.Studio.Workflows.Designer.Components; + +/// +/// A Blazor component that renders a flowchart designer. +/// +public partial class FlowchartDesigner : IDisposable, IAsyncDisposable +{ + private readonly string _containerId = $"container-{Guid.NewGuid():N}"; + private DotNetObjectReference? _componentRef; + private IFlowchartMapper? _flowchartMapper; + private IActivityMapper? _activityMapper; + private X6GraphApi _graphApi = null!; + private readonly PendingActionsQueue _pendingGraphActions; + private readonly RateLimitedFunc _rateLimitedLoadFlowchartAction; + private IDictionary? _activityStats; + private JsonObject? _flowchart; + + /// + public FlowchartDesigner() + { + _pendingGraphActions = new(() => new(_graphApi != null!), () => Logger); + _rateLimitedLoadFlowchartAction = Debouncer.Debounce(async () => { await InvokeAsync(async () => await LoadFlowchartAsync(Flowchart, ActivityStats)); }, TimeSpan.FromMilliseconds(100)); + } + + /// The flowchart to render. + [Parameter] public JsonObject Flowchart { get; set; } = null!; + + /// The activity stats to render. + [Parameter] public IDictionary? ActivityStats { get; set; } + + /// Whether the flowchart is read-only. + [Parameter] public bool IsReadOnly { get; set; } + + /// An event raised when an activity is selected. + [Parameter] public EventCallback ActivitySelected { get; set; } + + [Parameter] public EventCallback ActivityPropsChanged { get; set; } + + /// An event raised when an activity-embedded port is selected. + [Parameter] public EventCallback ActivityEmbeddedPortSelected { get; set; } + + /// An event raised when an activity is double-clicked. + [Parameter] public EventCallback ActivityDoubleClick { get; set; } + + /// An event raised when the canvas is selected. + [Parameter] public EventCallback CanvasSelected { get; set; } + + /// An event raised when the graph is updated. + [Parameter] public EventCallback GraphUpdated { get; set; } + + [Inject] private DesignerJsInterop DesignerJsInterop { get; set; } = null!; + [Inject] private IThemeService ThemeService { get; set; } = null!; + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] private IMapperFactory MapperFactory { get; set; } = null!; + [Inject] private IIdentityGenerator IdentityGenerator { get; set; } = null!; + [Inject] private IActivityNameGenerator ActivityNameGenerator { get; set; } = null!; + [Inject] private IOptions Options { get; set; } = null!; + [Inject] private ILogger Logger { get; set; } = null!; + + /// + /// Invoked from JavaScript when an activity is selected. + /// + /// The selected activity. + [JSInvokable] + public async Task HandleActivitySelected(JsonObject activity) + { + if (ActivitySelected.HasDelegate) + await ActivitySelected.InvokeAsync(activity); + } + + public async Task UpdateActivityAsync(JsonObject activity) + { + if (ActivityPropsChanged.HasDelegate) + await ActivityPropsChanged.InvokeAsync(activity); + } + + /// + /// Invoked from JavaScript when an activity embedded port is selected. + /// + /// The selected activity. + /// The selected port name. + [JSInvokable] + public async Task HandleActivityEmbeddedPortSelected(JsonObject activity, string portName) + { + if (ActivityEmbeddedPortSelected.HasDelegate) + { + var args = new ActivityEmbeddedPortSelectedArgs(activity, portName); + await ActivityEmbeddedPortSelected.InvokeAsync(args); + } + } + + /// + /// Invoked from JavaScript when an activity is double-clicked. + /// + /// The clicked activity. + [JSInvokable] + public async Task HandleActivityDoubleClick(JsonObject activity) + { + if (ActivityDoubleClick.HasDelegate) + { + await ActivityDoubleClick.InvokeAsync(activity); + } + } + + /// Invoked from JavaScript when the canvas is selected. + [JSInvokable] + public async Task HandleCanvasSelected() + { + if (CanvasSelected.HasDelegate) + await CanvasSelected.InvokeAsync(); + } + + /// Invoked from JavaScript when the graph is updated. + [JSInvokable] + public async Task HandleGraphUpdated() + { + if (GraphUpdated.HasDelegate) + await GraphUpdated.InvokeAsync(); + } + + /// Invoked from JavaScript when the graph is updated. + [JSInvokable] + public async Task HandlePasteCellsRequested(X6ActivityNode[] activityNodes, X6Edge[] edges) + { + var allActivities = Flowchart.GetActivities().ToList(); + var activityLookup = new Dictionary(); + var container = Flowchart; + + foreach (var activityNode in activityNodes) + { + var activity = activityNode.Data; + var activityType = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var descriptor = ActivityRegistry.Find(activityType, activityVersion)!; + var newActivityId = IdentityGenerator.GenerateId(); + var newName = ActivityNameGenerator.GenerateNextName(allActivities, descriptor); + + // Capture the original activity ID so we can update the edges. + activityLookup[activityNode.Id] = activityNode; + + // Update the activity ID and name. + activity.SetId(newActivityId); + activity.SetNodeId($"{container.GetNodeId()}:{newActivityId}"); + activity.SetName(newName); + activityNode.Id = newActivityId; + + // Add activity to the list of all activities. This is used to generate a new name for the next activity. + allActivities.Add(activity); + + // Update the activity metadata. + var designerMetadata = activity.GetDesignerMetadata(); + designerMetadata.Position.X = activityNode.Position.X + 64; + designerMetadata.Position.Y = activityNode.Position.Y + 64; + activityNode.Position.X = designerMetadata.Position.X; + activityNode.Position.Y = designerMetadata.Position.Y; + activity.SetDesignerMetadata(designerMetadata); + + // If the activity contains embedded ports, generate new IDs for the contained flowchart. + ProcessEmbeddedPorts(activity, descriptor); + } + + // Update the edges. + foreach (var edge in edges) + { + var sourceActivityId = edge.Source.Cell; + var targetActivityId = edge.Target.Cell; + var sourceActivity = activityLookup[sourceActivityId]; + var targetActivity = activityLookup[targetActivityId]; + + edge.Source.Cell = sourceActivity.Data.GetId(); + edge.Target.Cell = targetActivity.Data.GetId(); + } + + // Update the flowchart. + await ScheduleGraphActionAsync(async () => await _graphApi.PasteCellsAsync(activityNodes, edges)); + } + + /// + /// Reads the flowchart from the graph. + /// + /// The flowchart. + public async Task ReadFlowchartAsync() + { + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + return await ScheduleGraphActionAsync(async () => + { + var data = await _graphApi.ReadGraphAsync(); + var cells = data.GetProperty("cells").EnumerateArray(); + var nodes = cells.Where(x => x.GetProperty("shape").GetString() == "elsa-activity").Select(x => x.Deserialize(serializerOptions)!).ToList(); + var edges = cells.Where(x => x.GetProperty("shape").GetString() == "elsa-edge").Select(x => x.Deserialize(serializerOptions)!).ToList(); + var graph = new X6Graph(nodes, edges); + var flowchartMapper = await GetFlowchartMapperAsync(); + var exportedFlowchart = flowchartMapper.Map(graph); + var activities = exportedFlowchart.GetActivities(); + var connections = exportedFlowchart.GetConnections(); + + var flowchart = Flowchart; + flowchart.SetProperty(activities, "activities"); + flowchart.SetProperty(connections.SerializeToNode(), "connections"); + + return flowchart; + }); + } + + /// + /// Loads the flowchart into the graph. + /// + /// The flowchart to load. + /// The activity stats to load. + public async Task LoadFlowchartAsync(JsonObject activity, IDictionary? activityStats) + { + Flowchart = activity; + ActivityStats = activityStats; + var flowchartMapper = await GetFlowchartMapperAsync(); + var flowchart = activity.GetFlowchart(); + var graph = flowchartMapper.Map(flowchart, activityStats); + await ScheduleGraphActionAsync(() => _graphApi.LoadGraphAsync(graph)); + } + + /// + /// Adds an activity to the graph. + /// + /// The activity to add. + public async Task AddActivityAsync(JsonObject activity) + { + var mapper = await GetActivityMapperAsync(); + var node = mapper.MapActivity(activity); + await ScheduleGraphActionAsync(() => _graphApi.AddActivityNodeAsync(node)); + } + + /// + /// Selects the specified activity in the graph. + /// + /// The ID of the activity to select. + public async Task SelectActivityAsync(string id) + { + await ScheduleGraphActionAsync(() => _graphApi.SelectActivityAsync(id)); + } + + /// Zoom the canvas to fit all activities. + public async Task ZoomToFitAsync() => await ScheduleGraphActionAsync(() => _graphApi.ZoomToFitAsync()); + + /// + /// Center the canvas content. + /// + public async Task CenterContentAsync() => await ScheduleGraphActionAsync(() => _graphApi.CenterContentAsync()); + + /// Update the Graph Layout. + public async Task AutoLayoutAsync(JsonObject activity, IDictionary? activityStats) + { + var flowchartMapper = await GetFlowchartMapperAsync(); + var flowchart = activity.GetFlowchart(); + var graph = flowchartMapper.Map(flowchart, activityStats); + await ScheduleGraphActionAsync(() => _graphApi.AutoLayoutAsync(graph)); + } + + /// + /// Update the specified activity on the graph. + /// + /// The activity ID. + /// The updated activity. + public async Task UpdateActivityAsync(string id, JsonObject activity) => await ScheduleGraphActionAsync(() => _graphApi.UpdateActivityAsync(activity)); + + /// + /// Update the specified activity stats on the graph. + /// + /// The activity ID. + /// The updated activity stats. + public async Task UpdateActivityStatsAsync(string activityId, ActivityStats stats) => await ScheduleGraphActionAsync(() => DesignerJsInterop.UpdateActivityStatsAsync($"activity-{activityId}", activityId, stats)); + + /// + protected override void OnInitialized() + { + ThemeService.IsDarkModeChanged += OnDarkModeChanged; + _flowchart = Flowchart; + } + + /// + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + _componentRef = DotNetObjectReference.Create(this); + _graphApi = await DesignerJsInterop.CreateGraphAsync(_containerId, _componentRef, IsReadOnly); + await _pendingGraphActions.ProcessAsync(); + } + } + + /// + protected override async Task OnParametersSetAsync() + { + if (!Equals(_flowchart, Flowchart) && _flowchart?.GetNodeId() != Flowchart.GetNodeId()) + { + _flowchart = Flowchart; + await _rateLimitedLoadFlowchartAction.InvokeAsync(); + } + + if (!Equals(_activityStats, ActivityStats)) + { + _activityStats = ActivityStats; + await _rateLimitedLoadFlowchartAction.InvokeAsync(); + } + } + + private async Task GetFlowchartMapperAsync() => _flowchartMapper ??= await MapperFactory.CreateFlowchartMapperAsync(); + private async Task GetActivityMapperAsync() => _activityMapper ??= await MapperFactory.CreateActivityMapperAsync(); + private async Task SetGridColorAsync(string color) => await ScheduleGraphActionAsync(() => _graphApi.SetGridColorAsync(color)); + private async Task ScheduleGraphActionAsync(Func action) => await _pendingGraphActions.EnqueueAsync(action); + private async Task ScheduleGraphActionAsync(Func> action) => await _pendingGraphActions.EnqueueAsync(action); + + private void GenerateNewActivityIds(JsonObject container) + { + var activities = container.GetActivities().ToList(); + var activityLookup = new Dictionary(); + var newContainerId = IdentityGenerator.GenerateId(); + + // Update the container ID. + container.SetId(newContainerId); + container.SetNodeId($"{container.GetNodeId()}:{newContainerId}"); + + foreach (var activity in activities) + { + var activityType = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var descriptor = ActivityRegistry.Find(activityType, activityVersion)!; + var newActivityId = IdentityGenerator.GenerateId(); + + // Capture the original activity ID so we can update the edges. + activityLookup[activity.GetId()] = activity; + + // Update the activity ID. + activity.SetId(newActivityId); + activity.SetNodeId($"{container.GetNodeId()}:{newActivityId}"); + + // If the activity contains embedded ports, generate new IDs for the contained flowchart. + ProcessEmbeddedPorts(activity, descriptor); + } + + // Update connections. + var connections = container.GetConnections().ToList(); + + foreach (var connection in connections) + { + var sourceActivityId = connection.Source.ActivityId; + var targetActivityId = connection.Target.ActivityId; + var sourceActivity = activityLookup[sourceActivityId]; + var targetActivity = activityLookup[targetActivityId]; + + connection.Source.ActivityId = sourceActivity.GetId(); + connection.Target.ActivityId = targetActivity.GetId(); + } + + container.SetConnections(connections); + } + + /// Processes each embedded port's activity and generates new IDs for the contained flowchart. + private void ProcessEmbeddedPorts(JsonObject activity, ActivityDescriptor descriptor) + { + var embeddedPorts = descriptor.Ports.Where(x => x.Type == PortType.Embedded); + foreach (var embeddedPort in embeddedPorts) + { + var camelName = embeddedPort.Name.Camelize(); + if (activity.TryGetPropertyValue(camelName, out var propValue) && propValue is JsonObject childActivity) + GenerateNewActivityIds(childActivity); + } + } + + private async void OnDarkModeChanged() + { + var palette = ThemeService.CurrentPalette; + var gridColor = palette.BackgroundGray; + await SetGridColorAsync(gridColor.ToString(MudColorOutputFormats.HexA)); + } + + async ValueTask IAsyncDisposable.DisposeAsync() + { + if (_graphApi != null!) + await _graphApi.DisposeGraphAsync(); + + ((IDisposable)this).Dispose(); + } + + void IDisposable.Dispose() + { + ThemeService.IsDarkModeChanged -= OnDarkModeChanged; + _componentRef?.Dispose(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IActivityMapper.cs b/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IActivityMapper.cs new file mode 100644 index 0000000..97a071e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IActivityMapper.cs @@ -0,0 +1,37 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Workflows.Designer.Models; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.Designer.Contracts; + +/// +/// Maps an Activity to an X6Node. +/// +public interface IActivityMapper +{ + /// + /// Maps an activity to an X6Node. + /// + /// The activity. + /// Activity stats. + X6ActivityNode MapActivity(JsonObject activity, ActivityStats? activityStats = null); + + /// + /// Gets the outbound ports for an activity. + /// + /// The activity. + IEnumerable GetOutPorts(JsonObject activity); + + /// + /// Gets the inbound ports for an activity. + /// + /// The activity. + IEnumerable GetInPorts(JsonObject activity); + + /// + /// Gets the inbound and outbound ports for an activity. + /// + /// The activity. + X6Ports GetPorts(JsonObject activity); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IFlowchartMapper.cs b/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IFlowchartMapper.cs new file mode 100644 index 0000000..4b73e7e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IFlowchartMapper.cs @@ -0,0 +1,26 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Workflows.Designer.Models; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.Designer.Contracts; + +/// +/// Maps a Flowchart activity from and to an X6Graph. +/// +public interface IFlowchartMapper +{ + /// + /// Maps a flowchart activity to an X6Graph. + /// + /// The flowchart activity. + /// A map of activity stats. + X6Graph Map(JsonObject flowchart, IDictionary? activityStatsMap = null); + + /// + /// Maps an X6 graph to a flowchart activity. + /// + /// The X6 graph. + JsonObject Map(X6Graph graph); + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IMapperFactory.cs b/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IMapperFactory.cs new file mode 100644 index 0000000..ee780f2 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Contracts/IMapperFactory.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Workflows.Designer.Contracts; + +internal interface IMapperFactory +{ + Task CreateFlowchartMapperAsync(CancellationToken cancellationToken = default); + Task CreateActivityMapperAsync(CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Elsa.Studio.Workflows.Designer.csproj b/src/modules/Elsa.Studio.Workflows.Designer/Elsa.Studio.Workflows.Designer.csproj new file mode 100644 index 0000000..721bdb1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Elsa.Studio.Workflows.Designer.csproj @@ -0,0 +1,30 @@ + + + + Adds workflow designer Blazor components powered by JS interop with X6. + elsa studio module x6 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Extensions/ComponentConfigurationExtensions.cs b/src/modules/Elsa.Studio.Workflows.Designer/Extensions/ComponentConfigurationExtensions.cs new file mode 100644 index 0000000..43185fa --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Extensions/ComponentConfigurationExtensions.cs @@ -0,0 +1,21 @@ +using Elsa.Studio.Workflows.Designer.Components.ActivityWrappers.V2; +using Microsoft.AspNetCore.Components.Web; + +namespace Elsa.Studio.Workflows.Designer.Extensions; + +/// +/// Contains extension methods for . +/// +public static class ComponentConfigurationExtensions +{ + /// + /// Registers custom elements. + /// + public static IJSComponentConfiguration RegisterCustomElsaStudioElements(this IJSComponentConfiguration configuration, Type? activityComponentType = null) + { + activityComponentType ??= typeof(ActivityWrapper); + configuration.RegisterForJavaScript(activityComponentType, "elsa-activity-wrapper", "registerBlazorCustomElement"); + + return configuration; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Workflows.Designer/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..3fc9848 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,18 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Designer.Contracts; +using Elsa.Studio.Workflows.Designer.Interop; +using Elsa.Studio.Workflows.Designer.Services; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Studio.Workflows.Designer.Extensions; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddWorkflowsDesigner(this IServiceCollection services) + { + return services + .AddScoped() + .AddScoped() + .AddScoped(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xml b/src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xsd b/src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Interop/DesignerJsInterop.cs b/src/modules/Elsa.Studio.Workflows.Designer/Interop/DesignerJsInterop.cs new file mode 100644 index 0000000..59a0a6d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Interop/DesignerJsInterop.cs @@ -0,0 +1,70 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Text.Json.Serialization; +using Elsa.Studio.Workflows.Designer.Components; +using Elsa.Studio.Workflows.Designer.Options; +using Elsa.Studio.Workflows.Domain.Models; +using Microsoft.Extensions.Options; +using Microsoft.JSInterop; + +namespace Elsa.Studio.Workflows.Designer.Interop; + +/// +/// Provides access to the designer JavaScript module. +/// +public class DesignerJsInterop(IJSRuntime jsRuntime, IOptions options, IServiceProvider serviceProvider) : JsInteropBase(jsRuntime) +{ + protected override string ModuleName => "designer"; + + /// + /// Creates a new X6 graph object and returns its ID. + /// + /// The ID of the container element. + /// A reference to the component. + /// Whether the graph is read-only. + /// The ID of the graph. + public async ValueTask CreateGraphAsync(string containerId, DotNetObjectReference componentRef, bool isReadOnly = false) + { + return await TryInvokeAsync(async module => + { + var graphSettings = options.Value.GraphSettings; + await module.InvokeAsync("createGraph", containerId, componentRef, isReadOnly, graphSettings); + return new X6GraphApi(module, serviceProvider, containerId); + }); + } + + public async Task UpdateActivitySizeAsync(string elementId, JsonObject activity, Elsa.Api.Client.Shared.Models.Size? size = null) + { + var serializerOptions = GetSerializerOptions(); + var activityJson = JsonSerializer.Serialize(activity, serializerOptions); + await TryInvokeAsync(module => module.InvokeVoidAsync("updateActivitySize", elementId, activityJson, size)); + } + + public async Task UpdateActivityStatsAsync(string elementId, string activityId, ActivityStats stats) => + await TryInvokeAsync(module => module.InvokeVoidAsync("updateActivityStats", elementId, activityId, stats)); + + public async Task RaiseActivitySelectedAsync(string elementId, JsonObject activity) + { + var serializerOptions = GetSerializerOptions(); + var activityJson = JsonSerializer.Serialize(activity, serializerOptions); + await TryInvokeAsync(module => module.InvokeVoidAsync("raiseActivitySelected", elementId, activityJson)); + } + + public async Task RaiseActivityEmbeddedPortSelectedAsync(string elementId, JsonObject activity, string portName) + { + var serializerOptions = GetSerializerOptions(); + var activityJson = JsonSerializer.Serialize(activity, serializerOptions); + await TryInvokeAsync(module => module.InvokeVoidAsync("raiseActivityEmbeddedPortSelected", elementId, activityJson, portName)); + } + + private static JsonSerializerOptions GetSerializerOptions() + { + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + serializerOptions.Converters.Add(new JsonStringEnumConverter()); + return serializerOptions; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Interop/JsInteropBase.cs b/src/modules/Elsa.Studio.Workflows.Designer/Interop/JsInteropBase.cs new file mode 100644 index 0000000..903f4de --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Interop/JsInteropBase.cs @@ -0,0 +1,81 @@ +using Microsoft.JSInterop; + +namespace Elsa.Studio.Workflows.Designer.Interop; + +/// +/// Provides access to the designer JavaScript module. +/// +public abstract class JsInteropBase : IAsyncDisposable +{ + private readonly Lazy> _moduleTask; + + protected abstract string ModuleName { get; } + + /// Initializes a new instance of + protected JsInteropBase(IJSRuntime jsRuntime) + { + _moduleTask = new(() => jsRuntime.InvokeAsync("import", $"./_content/Elsa.Studio.Workflows.Designer/{ModuleName}.entry.js").AsTask()); + } + + public async ValueTask DisposeAsync() + { + if (_moduleTask.IsValueCreated) + { + var module = await _moduleTask.Value; + + try + { + await module.DisposeAsync(); + } + catch (JSDisconnectedException) + { + // This exception is thrown when the browser window is closed or the page reloads. + // We can safely ignore it. + } + } + } + + protected async Task InvokeAsync(Func func) + { + var module = await _moduleTask.Value; + await func(module); + } + + protected async Task TryInvokeAsync(Func func) + { + try + { + var module = await _moduleTask.Value; + await func(module); + } + catch (JSException) + { + // Ignore. + } + } + + protected async Task InvokeAsync(Func> func) + { + var module = await _moduleTask.Value; + return await func(module); + } + + protected async Task TryInvokeAsync(Func> func) + { + try + { + var module = await _moduleTask.Value; + return await func(module); + } + catch (JSException) + { + // Ignore. + } + catch(ObjectDisposedException) + { + // Ignore. + } + + return default!; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Interop/X6GraphApi.cs b/src/modules/Elsa.Studio.Workflows.Designer/Interop/X6GraphApi.cs new file mode 100644 index 0000000..c28d41f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Interop/X6GraphApi.cs @@ -0,0 +1,150 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Text.Json.Serialization; +using Elsa.Studio.Workflows.Designer.Contracts; +using Elsa.Studio.Workflows.Designer.Models; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.JSInterop; + +namespace Elsa.Studio.Workflows.Designer.Interop; + +/// Provides a wrapper around the X6 graph API. +public class X6GraphApi +{ + private readonly IJSObjectReference _module; + private readonly IServiceProvider _serviceProvider; + private readonly string _containerId; + + /// + /// Initializes a new instance of the class. + /// + /// The JavaScript module reference. + /// The service provider. + /// The ID of the container element. + public X6GraphApi(IJSObjectReference module, IServiceProvider serviceProvider, string containerId) + { + _module = module; + _serviceProvider = serviceProvider; + _containerId = containerId; + } + + /// + /// Reads the flowchart from the graph. + /// + /// The flowchart. + public async Task ReadGraphAsync() => await InvokeAsync(module => module.InvokeAsync("readGraph", _containerId)); + + /// Disposes the graph. + public async Task DisposeGraphAsync() => await TryInvokeAsync(module => module.InvokeVoidAsync("disposeGraph", _containerId)); + + /// + /// Sets the grid color. + /// + /// The color. + public async Task SetGridColorAsync(string color) => await InvokeAsync(module => module.InvokeVoidAsync("setGridColor", _containerId, color)); + + /// + /// Adds a node to the graph. + /// + /// The node. + public async Task AddActivityNodeAsync(X6ActivityNode node) + { + var serializerOptions = GetSerializerOptions(); + var nodeElement = JsonSerializer.SerializeToElement(node, serializerOptions); + + await InvokeAsync(module => module.InvokeVoidAsync("addActivityNode", _containerId, nodeElement)); + } + + /// + /// Selects the specified activity in the graph. + /// + /// The ID of the activity to select. + public async Task SelectActivityAsync(string id) + { + await InvokeAsync(module => module.InvokeVoidAsync("selectActivity", _containerId, id)); + } + + /// + /// Adds the specified activity nodes and edges to the graph. + /// + /// The activity nodes. + /// The edges. + public async Task PasteCellsAsync(IEnumerable activityNodes, X6Edge[] edges) + { + var serializerOptions = GetSerializerOptions(); + var activityNodeElements = JsonSerializer.SerializeToElement(activityNodes, serializerOptions); + var edgeElements = JsonSerializer.SerializeToElement(edges, serializerOptions); + await InvokeAsync(module => module.InvokeVoidAsync("pasteCells", _containerId, activityNodeElements, edgeElements)); + } + + /// + /// Loads the specified model into the graph. + /// + /// The model. + public async Task LoadGraphAsync(X6Graph graph) + { + var serializedGraph = SerializeGraph(graph); + await InvokeAsync(module => module.InvokeVoidAsync("loadGraph", _containerId, serializedGraph)); + } + + /// Zoom the canvas to fit the content. + public async Task ZoomToFitAsync() => await InvokeAsync(module => module.InvokeVoidAsync("zoomToFit", _containerId)); + + /// Center the canvas content. + public async Task CenterContentAsync() => await InvokeAsync(module => module.InvokeVoidAsync("centerContent", _containerId)); + + /// Adjusts the graph layout. + public async Task AutoLayoutAsync(X6Graph graph) + { + var serializedGraph = SerializeGraph(graph); + await InvokeAsync(module => module.InvokeVoidAsync("autoLayout", _containerId, serializedGraph)); + } + + /// + /// Updates the node with the specified activity. + /// + /// The activity. + public async Task UpdateActivityAsync(JsonObject activity) + { + var serializerOptions = GetSerializerOptions(); + var mapperFactory = _serviceProvider.GetRequiredService(); + var activityMapper = await mapperFactory.CreateActivityMapperAsync(); + var ports = activityMapper.GetPorts(activity); + var activityElement = JsonSerializer.SerializeToElement(activity, serializerOptions); + await InvokeAsync(module => module.InvokeVoidAsync("updateActivity", _containerId, activityElement, ports)); + } + + private async Task InvokeAsync(Func func) => await func(_module); + + private async Task TryInvokeAsync(Func func) + { + try + { + await func(_module); + } + catch (JSDisconnectedException) + { + // Ignore. + } + } + + private async Task InvokeAsync(Func> func) => await func(_module); + + // Serializing the graph here instead of relying on the JS interop layer to avoid the max depth of 32 exception. + private static string SerializeGraph(X6Graph graph) + { + var options = GetSerializerOptions(); + return JsonSerializer.Serialize(graph, options); + } + + private static JsonSerializerOptions GetSerializerOptions() + { + var serializerOptions = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + serializerOptions.Converters.Add(new JsonStringEnumConverter()); + return serializerOptions; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6ActivityNode.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6ActivityNode.cs new file mode 100644 index 0000000..52286c4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6ActivityNode.cs @@ -0,0 +1,17 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6ActivityNode +{ + public string Id { get; set; } = null!; + public string Shape { get; set; } = null!; + public X6Position Position { get; set; } = null!; + public X6Size Size { get; set; } = null!; + public JsonObject Data { get; set; } = null!; + public X6Ports Ports { get; set; } = new(); + public ActivityStats? ActivityStats { get; set; } + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Attrs.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Attrs.cs new file mode 100644 index 0000000..103efde --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Attrs.cs @@ -0,0 +1,6 @@ +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Attrs : Dictionary +{ + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Edge.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Edge.cs new file mode 100644 index 0000000..d32206a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Edge.cs @@ -0,0 +1,9 @@ +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Edge +{ + public X6Endpoint Source { get; set; } = null!; + public X6Endpoint Target { get; set; } = null!; + public string? Shape { get; set; } + public X6Position[] Vertices { get; set; } = []; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Endpoint.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Endpoint.cs new file mode 100644 index 0000000..3bd0f42 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Endpoint.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Endpoint +{ + public string Cell { get; set; } = null!; + public string Port { get; set; } = null!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Graph.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Graph.cs new file mode 100644 index 0000000..7115ae7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Graph.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Serialization; + +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Graph +{ + [JsonConstructor] + public X6Graph() + { + } + + public X6Graph(IEnumerable nodes, IEnumerable edges) + { + Nodes = nodes.ToList(); + Edges = edges.ToList(); + } + + public ICollection Nodes { get; set; } = new List(); + public ICollection Edges { get; set; } = new List(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Port.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Port.cs new file mode 100644 index 0000000..cac8670 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Port.cs @@ -0,0 +1,10 @@ +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Port +{ + public string Id { get; set; } = null!; + public string Group { get; set; } = null!; + public string? Type { get; set; } + public string? Position { get; set; } + public IDictionary? Attrs { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Ports.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Ports.cs new file mode 100644 index 0000000..1d2c439 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Ports.cs @@ -0,0 +1,6 @@ +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Ports +{ + public ICollection Items { get; set; } = new List(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Position.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Position.cs new file mode 100644 index 0000000..64aa307 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Position.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Serialization; + +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Position +{ + [JsonConstructor] + public X6Position() + { + } + + public X6Position(double x, double y) + { + X = x; + Y = y; + } + + public double X { get; set; } + public double Y { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Size.cs b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Size.cs new file mode 100644 index 0000000..2e4d1e9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Models/X6Size.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Serialization; + +namespace Elsa.Studio.Workflows.Designer.Models; + +public class X6Size +{ + [JsonConstructor] + public X6Size() + { + } + + public X6Size(double width, double height) + { + Width = width; + Height = height; + } + + public double Width { get; set; } + public double Height { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Module.cs b/src/modules/Elsa.Studio.Workflows.Designer/Module.cs new file mode 100644 index 0000000..7498b49 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Module.cs @@ -0,0 +1,8 @@ +using Elsa.Studio.Abstractions; + +namespace Elsa.Studio.Workflows.Designer; + +public class Feature : FeatureBase +{ + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Options/DesignerOptions.cs b/src/modules/Elsa.Studio.Workflows.Designer/Options/DesignerOptions.cs new file mode 100644 index 0000000..2ccb116 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Options/DesignerOptions.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Workflows.Designer.Options; + +public class DesignerOptions +{ + public string? DesignerCssClass { get; set; } = "elsa-flowchart-diagram-designer-v2"; + public X6GraphSettings GraphSettings { get; set; } = new(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Options/X6GraphSettings.cs b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6GraphSettings.cs new file mode 100644 index 0000000..d04c2bd --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6GraphSettings.cs @@ -0,0 +1,9 @@ +namespace Elsa.Studio.Workflows.Designer.Options; + +public class X6GraphSettings +{ + public X6Grid Grid { get; set; } = new(); + public double MagnetThreshold { get; set; } + public X6Panning Panning { get; set; } = new(); + public X6Mousewheel Mousewheel { get; set; } = new(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Grid.cs b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Grid.cs new file mode 100644 index 0000000..d912f55 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Grid.cs @@ -0,0 +1,9 @@ +namespace Elsa.Studio.Workflows.Designer.Options; + +public class X6Grid +{ + public string Type { get; set; } = "dot"; + public bool Visible { get; set; } = true; + public double Size { get; set; } = 20; + public object? Args { get; set; } = new X6GridArgs(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Options/X6GridArgs.cs b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6GridArgs.cs new file mode 100644 index 0000000..518ce88 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6GridArgs.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Workflows.Designer.Options; + +public class X6GridArgs +{ + public string Color { get; set; } = "#334154"; //f1f1f1 for V1 + public double Thickness { get; set; } = 1; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Mousewheel.cs b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Mousewheel.cs new file mode 100644 index 0000000..763b874 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Mousewheel.cs @@ -0,0 +1,9 @@ +namespace Elsa.Studio.Workflows.Designer.Options; + +public class X6Mousewheel +{ + public bool Enabled { get; set; } = true; + public double factor { get; set; } = 1.05; + public double MinScale { get; set; } = 0.4; + public double MaxScale { get; set; } = 3; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Panning.cs b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Panning.cs new file mode 100644 index 0000000..8b6bc24 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Options/X6Panning.cs @@ -0,0 +1,6 @@ +namespace Elsa.Studio.Workflows.Designer.Options; + +public class X6Panning +{ + public bool Enabled { get; set; } = true; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Services/ActivityMapper.cs b/src/modules/Elsa.Studio.Workflows.Designer/Services/ActivityMapper.cs new file mode 100644 index 0000000..69a7e4e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Services/ActivityMapper.cs @@ -0,0 +1,148 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Studio.Workflows.Designer.Contracts; +using Elsa.Studio.Workflows.Designer.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.Designer.Services; + +internal class ActivityMapper( + IActivityRegistry activityRegistry, + IActivityPortService activityPortService, + IActivityDisplaySettingsRegistry activityDisplaySettingsRegistry) + : IActivityMapper +{ + public X6ActivityNode MapActivity(JsonObject activity, ActivityStats? activityStats = null) + { + var activityId = activity.GetId(); + var designerMetadata = activity.GetDesignerMetadata(); + var position = designerMetadata.Position; + var size = designerMetadata.Size; + var x = position?.X ?? 0; + var y = position?.Y ?? 0; + var width = size?.Width ?? 0; + var height = size?.Height ?? 0; + + if (width == 0) width = 200; + if (height == 0) height = 50; + + // Create node. + var node = new X6ActivityNode + { + Id = activityId, + Data = activity, + Size = new X6Size(width, height), + Position = new X6Position(x, y), + Shape = "elsa-activity", + Ports = GetPorts(activity) + }; + + node.ActivityStats = activityStats; + + return node; + } + + public X6Ports GetPorts(JsonObject activity) + { + // Create input ports. + var inPorts = GetInPorts(activity); + + // Create output ports. + var outPorts = GetOutPorts(activity); + + // Concatenate input and output ports. + return new X6Ports + { + Items = inPorts.Concat(outPorts).ToList() + }; + } + + public IEnumerable GetOutPorts(JsonObject activity) + { + var activityType = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var activityDescriptor = activityRegistry.Find(activityType, activityVersion)!; + var sourcePorts = activityPortService.GetPorts(new PortProviderContext(activityDescriptor, activity)).Where(x => x.Type == PortType.Flow); + var displaySettings = activityDisplaySettingsRegistry.GetSettings(activity.GetTypeName()); + + var ports = sourcePorts.Select(sourcePort => new X6Port + { + Id = sourcePort.Name, + Group = "out", + Attrs = new X6Attrs + { + ["text"] = new X6Attrs + { + ["text"] = sourcePort.DisplayName ?? string.Empty + }, + ["circle"] = new X6Attrs + { + ["fill"] = displaySettings.Color, + } + } + }).ToList(); + + if (ports.All(port => port.Group != "out")) + { + // Create default output port, except for terminal nodes. + var isTerminalNode = activityDescriptor.IsTerminal; + + if (!isTerminalNode) + { + ports.Add(new X6Port + { + Id = "Done", + Group = "out", + Attrs = new X6Attrs + { + ["text"] = new X6Attrs + { + ["text"] = "Done" + }, + ["circle"] = new X6Attrs + { + ["fill"] = displaySettings.Color, + } + } + }); + } + } + + return ports; + } + + public IEnumerable GetInPorts(JsonObject activity) + { + var displaySettings = activityDisplaySettingsRegistry.GetSettings(activity.GetTypeName()); + var activityType = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var activityDescriptor = activityRegistry.Find(activityType, activityVersion)!; + + var ports = new List(); + // Create default output port, except for terminal nodes. + var isStart = activityDescriptor.IsStart; + if (!isStart) + { + // Create default input port. + ports.Add(new X6Port + { + Id = "In", + Group = "in", + Attrs = new X6Attrs + { + ["circle"] = new X6Attrs + { + ["stroke"] = displaySettings.Color, + } + } + }); + } + + return ports; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Services/FlowchartMapper.cs b/src/modules/Elsa.Studio.Workflows.Designer/Services/FlowchartMapper.cs new file mode 100644 index 0000000..827ce45 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Services/FlowchartMapper.cs @@ -0,0 +1,102 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Designer.Contracts; +using Elsa.Studio.Workflows.Designer.Models; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.Designer.Services; + +internal class FlowchartMapper(IActivityMapper activityMapper) : IFlowchartMapper +{ + public X6Graph Map(JsonObject flowchart, IDictionary? activityStatsMap = null) + { + var graph = new X6Graph(); + var activities = flowchart.GetActivities(); + var connections = flowchart.GetConnections(); + + foreach (var activity in activities) + { + var activityNodeId = activity.GetNodeId(); + var activityStats = activityStatsMap?.TryGetValue(activityNodeId, out var stats) == true ? stats : null; + var node = activityMapper.MapActivity(activity, activityStats); + graph.Nodes.Add(node); + } + + foreach (var connection in connections) + { + var source = connection.Source; + var target = connection.Target; + var sourceId = source.ActivityId; + var sourcePort = source.Port ?? "Done"; + var targetId = target.ActivityId; + var targetPort = target.Port ?? "In"; + var connector = new X6Edge + { + Shape = "elsa-edge", + Source = new() + { + Cell = sourceId, + Port = sourcePort + }, + Target = new() + { + Cell = targetId, + Port = targetPort + }, + Vertices = connection.Vertices.Select(x => new X6Position(x.X, x.Y)).ToArray() + }; + + graph.Edges.Add(connector); + } + + return graph; + } + + public JsonObject Map(X6Graph graph) + { + var activities = new List(); + var connections = new List(); + + foreach (var node in graph.Nodes) + { + var activity = node.Data; + var designerMetadata = activity.GetDesignerMetadata(); + + designerMetadata.Position = new() + { + X = node.Position.X, + Y = node.Position.Y + }; + + designerMetadata.Size = new() + { + Width = node.Size.Width, + Height = node.Size.Height + }; + + activity.SetDesignerMetadata(designerMetadata); + activities.Add(activity); + } + + foreach (var edge in graph.Edges) + { + var connection = new Connection + { + Source = new(edge.Source.Cell, edge.Source.Port), + Target = new(edge.Target.Cell, edge.Target.Port), + Vertices = edge.Vertices.Select(x => new Position(x.X, x.Y)).ToArray(), + }; + connections.Add(connection); + } + + var flowchart = new JsonObject(new Dictionary + { + ["activities"] = activities.SerializeToArray(), + ["connections"] = connections.SerializeToArray() + }); + + return flowchart; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Services/MapperFactory.cs b/src/modules/Elsa.Studio.Workflows.Designer/Services/MapperFactory.cs new file mode 100644 index 0000000..2314988 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Services/MapperFactory.cs @@ -0,0 +1,20 @@ +using Elsa.Studio.Workflows.Designer.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; + +namespace Elsa.Studio.Workflows.Designer.Services; + +internal class MapperFactory(IActivityRegistry activityRegistry, IActivityPortService activityPortService, IActivityDisplaySettingsRegistry activityDisplaySettingsRegistry) : IMapperFactory +{ + public async Task CreateFlowchartMapperAsync(CancellationToken cancellationToken = default) + { + var activityMapper = await CreateActivityMapperAsync(cancellationToken); + return new FlowchartMapper(activityMapper); + } + + public async Task CreateActivityMapperAsync(CancellationToken cancellationToken = default) + { + await activityRegistry.EnsureLoadedAsync(cancellationToken); + return new ActivityMapper(activityRegistry, activityPortService, activityDisplaySettingsRegistry); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/Services/PendingActionsQueue.cs b/src/modules/Elsa.Studio.Workflows.Designer/Services/PendingActionsQueue.cs new file mode 100644 index 0000000..4adc533 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/Services/PendingActionsQueue.cs @@ -0,0 +1,72 @@ +using Microsoft.Extensions.Logging; + +namespace Elsa.Studio.Workflows.Designer.Services; + +/// +/// A queue for pending actions that can be processed in a FIFO manner. +/// +public class PendingActionsQueue(Func> shortCircuit, Func logger) +{ + private readonly Queue> _pendingActions = new(); + + /// + /// Processes all pending actions. + /// + public async Task ProcessAsync() + { + while (_pendingActions.Any()) + { + var action = _pendingActions.Dequeue(); + await TryExecuteActionAsync(action); + } + } + + /// + /// Enqueues an action to be executed. + /// + public async Task EnqueueAsync(Func action) + { + if(await shortCircuit()) + { + await TryExecuteActionAsync(action); + return; + } + + var tsc = new TaskCompletionSource(); + _pendingActions.Enqueue(async () => + { + await action(); + tsc.SetResult(); + }); + await tsc.Task; + } + + /// + /// Enqueues an action to be executed. + /// + public async Task EnqueueAsync(Func> action) + { + if(await shortCircuit()) + return await action(); + + var tsc = new TaskCompletionSource(); + _pendingActions.Enqueue(async () => + { + var result = await action(); + tsc.SetResult(result); + }); + return await tsc.Task; + } + + private async Task TryExecuteActionAsync(Func action) + { + try + { + await action(); + } + catch(Exception ex) + { + logger().LogWarning(ex, "An error occurred while executing a pending action."); + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows.Designer/_Imports.razor b/src/modules/Elsa.Studio.Workflows.Designer/_Imports.razor new file mode 100644 index 0000000..1704912 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows.Designer/_Imports.razor @@ -0,0 +1,4 @@ +@using Microsoft.AspNetCore.Components.Web +@using Elsa.Studio.Components +@using Elsa.Studio.Localization +@using MudBlazor \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor new file mode 100644 index 0000000..c6137b6 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor @@ -0,0 +1,68 @@ +@using Elsa.Studio.Workflows.Services +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Resources.ActivityDescriptors.Models +@using System.Text.Json.Nodes +@using System.Text.Json +@using Elsa.Studio.Workflows.Domain.Contracts +@using Elsa.Studio.Workflows.Models +@using Elsa.Studio.Workflows.UI.Contracts +@inherits StudioComponentBase +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + + + + + + + + + + + @foreach (var grouping in GroupedActivityDescriptors.OrderBy(x => x.Key)) + { + var activityDescriptors = grouping.OrderBy(x => x.DisplayName ?? x.Name).ToList(); + var category = grouping.Key; + + + + @foreach (var activityDescriptor in activityDescriptors) + { + var displaySettings = ActivityDisplaySettingsRegistry.GetSettings(activityDescriptor.TypeName); + var icon = displaySettings.Icon; + var color = displaySettings.Color; + + + + + @if (icon != null) + { + + } + @(Localizer[activityDescriptor.DisplayName ?? activityDescriptor.Name]) + + + + } + + + } + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor.cs new file mode 100644 index 0000000..3154eed --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityPicker.razor.cs @@ -0,0 +1,72 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Extensions; +using Elsa.Studio.Workflows.Domain.Notifications; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.Services; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; +using System.Globalization; +using System.Resources; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components; + +/// +/// A component that allows the user to pick an activity. +/// +public partial class ActivityPicker +{ + private string _searchText = ""; + + private IEnumerable> GroupedActivityDescriptors + { + get + { + if (string.IsNullOrWhiteSpace(_searchText)) + return ActivityDescriptors.GroupBy(x => x.Category); // Return all items grouped by category + + var items = ActivityDescriptors.Where(item => + item.Name.Contains(_searchText, StringComparison.InvariantCultureIgnoreCase) || + item.TypeName.Contains(_searchText, StringComparison.InvariantCultureIgnoreCase) || + (item.DisplayName != null && item.DisplayName.Contains(_searchText, StringComparison.InvariantCultureIgnoreCase)) || + item.Category.Contains(_searchText, StringComparison.InvariantCultureIgnoreCase) || + (item.Description != null && item.Description.Contains(_searchText, StringComparison.InvariantCultureIgnoreCase)) + ); + return items + .GroupBy(x => x.Category); + } + } + + /// + /// The drag and drop manager. + /// + [CascadingParameter] public DragDropManager DragDropManager { get; set; } = default!; + + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = default!; + [Inject] private IActivityDisplaySettingsRegistry ActivityDisplaySettingsRegistry { get; set; } = default!; + [Inject] private IMediator Mediator { get; set; } = default!; + + private IEnumerable ActivityDescriptors { get; set; } = new List(); + + /// + protected override async Task OnInitializedAsync() + { + await Refresh(); + } + + private async Task Refresh() + { + await ActivityRegistry.EnsureLoadedAsync(); + ActivityDescriptors = ActivityRegistry.ListBrowsable(); + StateHasChanged(); + } + + private void OnDragStart(ActivityDescriptor activityDescriptor) + { + DragDropManager.Payload = activityDescriptor; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor new file mode 100644 index 0000000..b93fac0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor @@ -0,0 +1,134 @@ +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs.Outputs.Components +@using Elsa.Studio.Extensions +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@inject ILocalizer Localizer + + + + + + @if (ActivityDescriptor?.Inputs.Any(x => x.IsBrowsable != false) == true) + { + + + + } + else + { + + @Localizer["This activity does not have any input properties."] + + } + + + + @if (ActivityDescriptor?.Outputs.Any(x => x.IsBrowsable != false) == true) + { + + + + } + else + { + + @Localizer["This activity does not have any output properties."] + + } + + + + @if (Activity != null && ActivityDescriptor != null) + { + + + + } + else + { + + @Localizer["This activity does not have any common properties."] + + } + + + + @if (Activity != null) + { + + + + } + else + { + + @Localizer["This activity does not have any common properties."] + + } + + + @if (IsTaskActivity) + { + + + + + + } + + + + + + + + + + @if (ActivityDescriptor != null) + { + + + + } + + + @if (IsWorkflowAsActivity) + { + + + + + + } + + @if (DisplayResilienceTab) + { + + + + + + } + + @foreach (var tab in PluginTabs) + { + + + @tab.Render((new { WorkflowDefinition, Activity, ActivityDescriptor, OnActivityUpdated }).ToDictionary()) + + + } + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor.cs new file mode 100644 index 0000000..bb7aa15 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/ActivityPropertiesPanel.razor.cs @@ -0,0 +1,67 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties; + +/// +/// Renders the properties of an activity. +/// +public partial class ActivityPropertiesPanel +{ + /// + /// Gets or sets the workflow definition. + /// + [Parameter] + public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// + /// Gets or sets the activity. + /// + [Parameter] + public JsonObject? Activity { get; set; } + + /// + /// Gets or sets the activity descriptor. + /// + [Parameter] + public ActivityDescriptor? ActivityDescriptor { get; set; } + + /// + /// Gets or sets a callback that is invoked when the activity is updated. + /// + [Parameter] + public Func? OnActivityUpdated { get; set; } + + /// + /// Gets or sets the visible pane height. + /// + [Parameter] + public int VisiblePaneHeight { get; set; } + + [Inject] private IExpressionService ExpressionService { get; set; } = null!; + + [Inject] private IEnumerable PluginTabs { get; set; } = new List(); + [Inject] private IRemoteFeatureProvider RemoteFeatureProvider { get; set; } = null!; + + private ExpressionDescriptorProvider ExpressionDescriptorProvider { get; } = new(); + private bool IsResilienceEnabled { get; set; } + private bool IsResilientActivity => ActivityDescriptor?.CustomProperties.TryGetValue("Resilient", out var resilientObj) == true && resilientObj.ConvertTo(); + private bool DisplayResilienceTab => IsResilienceEnabled && IsResilientActivity; + + /// + protected override async Task OnInitializedAsync() + { + var descriptors = await ExpressionService.ListDescriptorsAsync(); + IsResilienceEnabled = await RemoteFeatureProvider.IsEnabledAsync("Elsa.Resilience"); + ExpressionDescriptorProvider.AddRange(descriptors); + } + + private bool IsWorkflowAsActivity => ActivityDescriptor != null && ActivityDescriptor.CustomProperties.TryGetValue("RootType", out var value) && value.ConvertTo() == "WorkflowDefinitionActivity"; + private bool IsTaskActivity => ActivityDescriptor?.Kind == ActivityKind.Task; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Models.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Models.cs new file mode 100644 index 0000000..9574770 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Models.cs @@ -0,0 +1,5 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties; + +public record ActivityInputDisplayModel(RenderFragment Editor); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor new file mode 100644 index 0000000..964c279 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor @@ -0,0 +1,21 @@ +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Resources.CommitStrategies.Models +@inject ILocalizer Localizer + + + + @foreach (var commitStrategy in _commitStrategies) + { + @(commitStrategy?.DisplayName ?? Localizer["Default"]) + } + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor.cs new file mode 100644 index 0000000..d6a832d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommitStrategyTab.razor.cs @@ -0,0 +1,48 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.CommitStrategies.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +/// +/// The Task tab for an activity. +/// +public partial class CommitStrategyTab +{ + /// The activity. + [Parameter] public JsonObject? Activity { get; set; } + + /// An event raised when the activity is updated. + [Parameter] public Func? OnActivityUpdated { get; set; } + [CascadingParameter] private IWorkspace? Workspace { get; set; } + [Inject] private ICommitStrategiesProvider CommitStrategiesProvider { get; set; } = null!; + private bool IsReadOnly => Workspace?.IsReadOnly == true; + private ICollection _commitStrategies = []; + private CommitStrategyDescriptor? _selectedCommitStrategy; + + /// + protected override async Task OnInitializedAsync() + { + var commitStrategies = (await CommitStrategiesProvider.GetActivityCommitStrategiesAsync()).ToList(); + commitStrategies.Insert(0, null!); + _commitStrategies = commitStrategies!; + _selectedCommitStrategy = _commitStrategies.FirstOrDefault(x => x?.Name == Activity!.GetCommitStrategy()); + await base.OnInitializedAsync(); + } + + private async Task RaiseActivityUpdated() + { + if (OnActivityUpdated != null) + await OnActivityUpdated(Activity!); + } + + private async Task OnCommitStrategySelectionChanged(CommitStrategyDescriptor? value) + { + _selectedCommitStrategy = value; + Activity!.SetCommitStrategy(value?.Name); + await RaiseActivityUpdated(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor new file mode 100644 index 0000000..7d69f52 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor @@ -0,0 +1,83 @@ +@using Elsa.Studio.Workflows.Services +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Extensions +@inherits StudioComponentBase +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + +
+ @if (Activity != null && ActivityDescriptor != null) + { + + + + @Activity.GetId() + + + + + + + + + + + + + + + + + + + } +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor.cs new file mode 100644 index 0000000..fea16d1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/CommonTab.razor.cs @@ -0,0 +1,67 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +/// The common tab for an activity. +public partial class CommonTab +{ + /// The activity. + [Parameter] public JsonObject? Activity { get; set; } + + /// The activity descriptor. + [Parameter] public ActivityDescriptor? ActivityDescriptor { get; set; } + + /// An event raised when the activity is updated. + [Parameter] public Func? OnActivityUpdated { get; set; } + [CascadingParameter] private IWorkspace? Workspace { get; set; } + + private bool IsTrigger => ActivityDescriptor?.Kind == ActivityKind.Trigger; + private bool IsReadOnly => Workspace?.IsReadOnly == true; + + private async Task OnActivityIdChanged(string value) + { + Activity!.SetId(value); + await RaiseActivityUpdated(); + } + + private async Task RaiseActivityUpdated() + { + if (OnActivityUpdated != null) + await OnActivityUpdated(Activity!); + } + + private async Task OnActivityNameChanged(string value) + { + Activity!.SetName(value); + await RaiseActivityUpdated(); + } + + private async Task OnActivityDisplayTextChanged(string value) + { + Activity!.SetDisplayText(value); + await RaiseActivityUpdated(); + } + + private async Task OnActivityDescriptionChanged(string value) + { + Activity!.SetDescription(value); + await RaiseActivityUpdated(); + } + + private async Task OnShowDescriptionChanged(bool? value) + { + Activity!.SetShowDescription(value == true); + await RaiseActivityUpdated(); + } + + private async Task OnCanStartWorkflowChanged(bool? value) + { + Activity!.SetCanStartWorkflow(value == true); + await RaiseActivityUpdated(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor new file mode 100644 index 0000000..679d9a3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor @@ -0,0 +1,5 @@ +@inject ILocalizer Localizer + + @Localizer["Information"] + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor.cs new file mode 100644 index 0000000..b6f48b5 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InfoTab.razor.cs @@ -0,0 +1,31 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +/// +/// The info tab for an activity. +/// +public partial class InfoTab +{ + /// + /// The activity descriptor. + /// + [Parameter] + public ActivityDescriptor ActivityDescriptor { get; set; } = default!; + + private DataPanelModel ActivityInfo { get; } = new(); + + /// + protected override void OnParametersSet() + { + ActivityDescriptor.ConstructionProperties.TryGetValue("WorkflowDefinitionId", out var link); + + ActivityInfo.Clear(); + + ActivityInfo.Add(Localizer["Type"], ActivityDescriptor.TypeName, link == null ? null : $"/workflows/definitions/{link}/edit"); + ActivityInfo.Add(Localizer["Description"], ActivityDescriptor.Description); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor new file mode 100644 index 0000000..8112b9c --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor @@ -0,0 +1,10 @@ +@inherits StudioComponentBase + + + + @foreach (var inputModel in InputDisplayModels) + { + @inputModel.Editor + } + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor.cs new file mode 100644 index 0000000..91e8aee --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/InputsTab.razor.cs @@ -0,0 +1,228 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptorOptions.Contracts; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; +using ThrottleDebounce; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +/// +/// A tab for editing the inputs of an activity. +/// +public partial class InputsTab +{ + private readonly RateLimitedFunc>> _rateLimitedBuildInputEditorModelsAsync; + + /// + public InputsTab() + { + _rateLimitedBuildInputEditorModelsAsync = Debouncer.Debounce(BuildInputEditorModels, TimeSpan.FromMilliseconds(50), true); + } + + /// + /// Gets or sets the workflow definition. + /// + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// + /// Gets or sets the activity to edit. + /// + [Parameter] public JsonObject? Activity { get; set; } + + /// + /// Gets or sets the activity descriptor. + /// + [Parameter] public ActivityDescriptor? ActivityDescriptor { get; set; } + + /// + /// An event that is invoked when the activity is updated. + /// + [Parameter] public Func? OnActivityUpdated { get; set; } + + [CascadingParameter] private IWorkspace? Workspace { get; set; } + [CascadingParameter] private ExpressionDescriptorProvider ExpressionDescriptorProvider { get; set; } = null!; + [Inject] private IUIHintService UIHintService { get; set; } = null!; + + [Inject] private IBackendApiClientProvider BackendApiClientProvider { get; set; } = null!; + private ICollection InputDescriptors { get; set; } = new List(); + private ICollection OutputDescriptors { get; set; } = new List(); + private ICollection InputDisplayModels { get; set; } = new List(); + + /// + protected override async Task OnParametersSetAsync() + { + if (Activity == null || ActivityDescriptor == null) + return; + + InputDescriptors = ActivityDescriptor.Inputs.ToList(); + OutputDescriptors = ActivityDescriptor.Outputs.ToList(); + + var task = _rateLimitedBuildInputEditorModelsAsync.Invoke(); + if (task != null) InputDisplayModels = (await task).ToList(); + } + + private Task> BuildInputEditorModels() + { + return BuildInputEditorModels(Activity!, ActivityDescriptor!, InputDescriptors); + } + + private async Task> BuildInputEditorModels(JsonObject activity, ActivityDescriptor activityDescriptor, ICollection inputDescriptors) + { + var models = new List(); + var browsableInputDescriptors = inputDescriptors.Where(x => x.IsBrowsable == true).OrderBy(x => x.Order).ToList(); + + foreach (var inputDescriptor in browsableInputDescriptors) + { + var inputName = inputDescriptor.Name.Camelize(); + var value = activity.GetProperty(inputName); + var wrappedInput = inputDescriptor.IsWrapped ? ToWrappedInput(value) : null; + var syntaxProvider = wrappedInput != null ? GetSyntaxProvider(wrappedInput, inputDescriptor) : null; + + // Check if refresh is needed. + if (inputDescriptor.UISpecifications != null + && inputDescriptor.UISpecifications.TryGetValue("Refresh", out var refreshInput) + && bool.Parse(refreshInput.ToString()!)) + { + await RefreshDescriptor(activity, activityDescriptor, inputDescriptors, inputDescriptor); + } + + var uiHintHandler = UIHintService.GetHandler(inputDescriptor.UIHint); + object? input = inputDescriptor.IsWrapped ? wrappedInput : value; + + var context = new DisplayInputEditorContext + { + WorkflowDefinition = WorkflowDefinition!, + Activity = activity, + ActivityDescriptor = activityDescriptor, + InputDescriptor = inputDescriptor, + Value = input, + SelectedExpressionDescriptor = syntaxProvider, + UIHintHandler = uiHintHandler, + IsReadOnly = (Workspace?.IsReadOnly ?? false) || (inputDescriptor.IsReadOnly ?? false), + }; + + context.OnValueChanged = async v => await HandleValueChangedAsync(context, v); + var editor = uiHintHandler.DisplayInputEditor(context); + models.Add(new(editor)); + } + + return models; + } + + private async Task RefreshDescriptor(JsonObject activity, ActivityDescriptor activityDescriptor, IEnumerable inputDescriptors, InputDescriptor currentInputDescriptor) + { + try + { + var activityTypeName = activityDescriptor.TypeName; + var propertyName = currentInputDescriptor.Name; + + // Embed all props value in the context. + var contextDictionary = new Dictionary(); + foreach (var inputDescriptor in inputDescriptors) + { + var inputName = inputDescriptor.Name.Camelize(); + var value = activity.GetProperty(inputName); + if (value != null) + contextDictionary.Add(inputName, value); + } + + var api = await BackendApiClientProvider.GetApiAsync(); + + var result = await api.GetAsync(activityTypeName, propertyName, new() + { + Context = contextDictionary + }); + + currentInputDescriptor.UISpecifications = result.Items; + + // After refreshing, update the UI for any affected inputs + await UpdateInputDisplayModelsAsync(activity, activityDescriptor, inputDescriptors.ToList(), currentInputDescriptor); + } + catch (Exception) + { + // If an error occurs during refresh, we still want to keep the application running + // Errors might happen if backend is unavailable or returns an error response + // We could log the error here or show a notification, but for now we'll just silently continue + } + } + + private bool _isRefreshingModels; + + private async Task UpdateInputDisplayModelsAsync(JsonObject activity, ActivityDescriptor activityDescriptor, ICollection inputDescriptors, InputDescriptor refreshedInputDescriptor) + { + if (_isRefreshingModels) + return; + + try + { + _isRefreshingModels = true; + + // Rebuild all models + InputDisplayModels = (await BuildInputEditorModels(activity, activityDescriptor, inputDescriptors)).ToList(); + + // Force UI refresh + StateHasChanged(); + } + finally + { + _isRefreshingModels = false; + } + } + + private static WrappedInput? ToWrappedInput(object? value) + { + var converterOptions = new ObjectConverterOptions(serializerOptions => { serializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); + + return value.ConvertTo(converterOptions); + } + + private async Task HandleValueChangedAsync(DisplayInputEditorContext context, object? value) + { + var activity = context.Activity; + var inputDescriptor = context.InputDescriptor; + + if (inputDescriptor.IsWrapped) + { + var wrappedInput = (WrappedInput)value!; + var syntaxProvider = ExpressionDescriptorProvider.GetByType(wrappedInput.Expression.Type); + context.SelectedExpressionDescriptor = syntaxProvider; + } + + var options = new JsonSerializerOptions + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + var propName = inputDescriptor.Name.Camelize(); + activity.SetProperty(value?.SerializeToNode(options), propName); + + if (OnActivityUpdated != null) + await OnActivityUpdated(activity); + + //await InvokeAsync(StateHasChanged); + } + + private ExpressionDescriptor? GetSyntaxProvider(WrappedInput wrappedInput, InputDescriptor inputDescriptor) + { + // Safely read UIHint + var uiHint = inputDescriptor.UIHint; + + // If this is the code editor scenario and we have a DefaultSyntax, use that + if (uiHint.Equals("code-editor", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrWhiteSpace(inputDescriptor.DefaultSyntax)) + return ExpressionDescriptorProvider.GetByType(inputDescriptor.DefaultSyntax); + + // Otherwise fall back to the wrapped expression's type—but guard null + var exprType = wrappedInput?.Expression?.Type; + return string.IsNullOrEmpty(exprType) ? null : ExpressionDescriptorProvider.GetByType(exprType); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor new file mode 100644 index 0000000..225d974 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor @@ -0,0 +1,123 @@ +@using Elsa.Api.Client.Extensions +@using Elsa.Api.Client.Resources.ActivityDescriptors.Models +@using Elsa.Api.Client.Resources.Scripting.Models +@using Elsa.Api.Client.Shared.Models +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@inject ILocalizer Localizer + +@{ + RenderFragment RenderSelectComponent( + string label, + PropertyDescriptor? propertyDescriptor, + LogPersistenceConfiguration? logPersistenceConfig, + EventCallback onExpressionChanged, + EventCallback onStrategyTypeChanged) + { + var expression = logPersistenceConfig?.Expression; + var strategyType = logPersistenceConfig?.StrategyType; + var props = GetExpressionEditorProps(propertyDescriptor); + var activityId = Activity?.GetNodeId() ?? "default"; + var key = activityId; + + return @ + + @foreach (var descriptor in _logPersistenceStrategyDescriptors) + { + @Localizer[descriptor.DisplayName] + } + + ; + } +} +
+ + + @Localizer["Default Configuration"] + @RenderSelectComponent( + @Localizer["Default Strategy"], + null, + _persistenceConfiguration.Default, + EventCallback.Factory.Create(this, OnDefaultExpressionChanged), + EventCallback.Factory.Create(this, OnDefaultStrategyChanged) + ) + + @Localizer["Internal State"] + @RenderSelectComponent( + @Localizer["Internal State"], + null, + _persistenceConfiguration.InternalState, + EventCallback.Factory.Create(this, OnInternalStateExpressionChanged), + EventCallback.Factory.Create(this, OnInternalStateStrategyChanged) + ) + + @Localizer["Input Properties"] + @if (!InputDescriptors.Any()) + { + + + @Localizer["This activity does not have any input properties."] + + + } + else + { + foreach (var input in InputDescriptors) + { + var config = GetLogPersistenceConfig(input.Name, _persistenceConfiguration.Inputs); + @RenderSelectComponent( + input.Name, + input, + config, + EventCallback.Factory.Create(this, expr => OnPropertyExpressionChanged(input.Name, _persistenceConfiguration.Inputs, expr)), + EventCallback.Factory.Create(this, value => OnPropertyStrategyChanged(input.Name, _persistenceConfiguration.Inputs, value))) + } + } + + + @Localizer["Output Properties"] + @if (!OutputDescriptors.Any()) + { + + + @Localizer["This activity does not have any output properties."] + + + } + else + { + foreach (var output in OutputDescriptors) + { + var config = GetLogPersistenceConfig(output.Name, _persistenceConfiguration.Outputs); + @RenderSelectComponent( + output.Name, + output, + config, + EventCallback.Factory.Create(this, expr => OnPropertyExpressionChanged(output.Name, _persistenceConfiguration.Outputs, expr)), + EventCallback.Factory.Create(this, value => OnPropertyStrategyChanged(output.Name, _persistenceConfiguration.Outputs, value))) + } + } + + +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor.cs new file mode 100644 index 0000000..32e2844 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/LogPersistenceTab.razor.cs @@ -0,0 +1,313 @@ +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Enums; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.LogPersistenceStrategies; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Serialization; +using Elsa.Api.Client.Shared.Enums; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contracts; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +/// +/// Represents the persistence tab. +/// +public partial class LogPersistenceTab +{ + /// An event raised when the activity is updated. + [Parameter] public Func? OnActivityUpdated { get; set; } + + /// + /// Gets or sets the workflow definition. + /// + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// + /// Gets or sets the activity to edit. + /// + [Parameter] public JsonObject? Activity { get; set; } + + /// + /// The workspace. + /// + [CascadingParameter] public IWorkspace? Workspace { get; set; } + + /// + /// Gets or sets the activity descriptor. + /// + [Parameter] public ActivityDescriptor? ActivityDescriptor { get; set; } + + [Inject] private ILogPersistenceStrategyService LogPersistenceStrategyService { get; set; } = null!; + + private ICollection InputDescriptors { get; set; } = new List(); + private ICollection OutputDescriptors { get; set; } = new List(); + private bool IsReadOnly => Workspace?.IsReadOnly == true; + private LegacyPersistenceActivityConfiguration _legacyPersistenceConfiguration = new(); + private PersistenceActivityConfiguration _persistenceConfiguration = new(); + private ICollection _logPersistenceStrategyDescriptors = new List(); + private const string LogPersistenceModeKey = "logPersistenceMode"; + private const string LogPersistenceConfigKey = "logPersistenceConfig"; + + /// + protected override async Task OnInitializedAsync() + { + _legacyPersistenceConfiguration = new(); + _persistenceConfiguration = new(); + _logPersistenceStrategyDescriptors = (await LogPersistenceStrategyService.GetLogPersistenceStrategiesAsync()).ToList(); + } + + /// + protected override void OnParametersSet() + { + if (Activity == null || ActivityDescriptor == null) + return; + + InputDescriptors = ActivityDescriptor.Inputs.ToList(); + OutputDescriptors = ActivityDescriptor.Outputs.ToList(); + + SetPersistenceProperties(); + } + + private async Task OnDefaultStrategyChanged(string? value) + { + _persistenceConfiguration.Default = new() + { + EvaluationMode = LogPersistenceEvaluationMode.Strategy, + StrategyType = value + }; + await PersistLogPersistenceStrategies(); + } + + private async Task OnDefaultExpressionChanged(Expression? expression) + { + _persistenceConfiguration.Default = new() + { + EvaluationMode = LogPersistenceEvaluationMode.Expression, + Expression = expression + }; + await PersistLogPersistenceStrategies(); + } + + private async Task OnInternalStateStrategyChanged(string? value) + { + _persistenceConfiguration.InternalState = new() + { + EvaluationMode = LogPersistenceEvaluationMode.Strategy, + StrategyType = value + }; + await PersistLogPersistenceStrategies(); + } + + private async Task OnInternalStateExpressionChanged(Expression? expression) + { + _persistenceConfiguration.InternalState = new() + { + EvaluationMode = LogPersistenceEvaluationMode.Expression, + Expression = expression + }; + await PersistLogPersistenceStrategies(); + } + + private async Task OnPropertyStrategyChanged(string propertyName, IDictionary properties, string? value) + { + SetLogPersistenceStrategyTypeName(propertyName, properties, value); + await PersistLogPersistenceStrategies(); + } + + private async Task OnPropertyExpressionChanged(string propertyName, IDictionary properties, Expression expression) + { + SetLogPersistenceExpression(propertyName, properties, expression); + await PersistLogPersistenceStrategies(); + } + + private async Task PersistLogPersistenceStrategies() + { + var props = _persistenceConfiguration.SerializeToNode(SerializerOptions.LogPersistenceConfigSerializerOptions); + Activity?.SetProperty(props, "customProperties", LogPersistenceConfigKey); + + await RaiseActivityUpdated(); + } + + private void SetPersistenceProperties() + { + var customProperties = GetCustomProperties(); + var legacyPersistence = ((JsonObject)customProperties).GetProperty(SerializerOptions.LogPersistenceConfigSerializerOptions, LogPersistenceModeKey) ?? new LegacyPersistenceActivityConfiguration(); + var persistence = ((JsonObject)customProperties).GetProperty(SerializerOptions.LogPersistenceConfigSerializerOptions, LogPersistenceConfigKey) ?? new PersistenceActivityConfiguration(); + + _legacyPersistenceConfiguration = legacyPersistence; + _persistenceConfiguration = persistence; + UpgradeLegacyModel(_persistenceConfiguration, _legacyPersistenceConfiguration); + + if (Activity == null) + return; + + var serializedLegacyPersistenceConfiguration = _legacyPersistenceConfiguration.SerializeToNode(SerializerOptions.LogPersistenceConfigSerializerOptions); + var serializedPersistenceConfiguration = _persistenceConfiguration.SerializeToNode(SerializerOptions.LogPersistenceConfigSerializerOptions); + Activity.SetProperty(serializedLegacyPersistenceConfiguration, "customProperties", LogPersistenceModeKey); + Activity.SetProperty(serializedPersistenceConfiguration, "customProperties", LogPersistenceConfigKey); + } + + private void UpgradeLegacyModel(PersistenceActivityConfiguration newModel, LegacyPersistenceActivityConfiguration oldModel) + { + // Update the new model with the legacy model. + foreach (var input in oldModel.Inputs) + { + if (newModel.Inputs.ContainsKey(input.Key)) + continue; + newModel.Inputs[input.Key] = new() + { + EvaluationMode = LogPersistenceEvaluationMode.Strategy, + StrategyType = input.Value.ToString() + }; + } + + foreach (var output in oldModel.Outputs) + { + if (newModel.Outputs.ContainsKey(output.Key)) + continue; + newModel.Outputs[output.Key] = new() + { + EvaluationMode = LogPersistenceEvaluationMode.Strategy, + StrategyType = output.Value.ToString() + }; + } + } + + private JsonNode GetCustomProperties() + { + var customProperties = Activity?.GetProperty("customProperties"); + if (customProperties != null) return customProperties; + customProperties = new JsonObject(new List>()); + Activity?.SetProperty(customProperties, "customProperties"); + return customProperties; + } + + private string? GetPropertyLogPersistenceStrategyTypeName(string propertyName, IDictionary properties) + { + return GetLogPersistenceConfig(propertyName, properties)?.StrategyType; + } + + private Expression? GetPropertyLogPersistenceExpression(string propertyName, IDictionary properties) + { + return GetLogPersistenceConfig(propertyName, properties)?.Expression; + } + + private LogPersistenceConfiguration? GetLogPersistenceConfig(string propertyName, IDictionary properties) + { + var prop = propertyName.Camelize(); + return properties.TryGetValue(prop, out var v) ? v : null; + } + + private void SetLogPersistenceStrategyTypeName(string propertyName, IDictionary properties, string? value) + { + var currentConfig = GetLogPersistenceConfig(propertyName, properties); + var prop = propertyName.Camelize(); + var config = new LogPersistenceConfiguration + { + EvaluationMode = LogPersistenceEvaluationMode.Strategy, + StrategyType = value, + Expression = currentConfig?.Expression + }; + properties[prop] = config; + } + + private void SetLogPersistenceExpression(string propertyName, IDictionary properties, Expression expression) + { + var currentConfig = GetLogPersistenceConfig(propertyName, properties); + var prop = propertyName.Camelize(); + var config = new LogPersistenceConfiguration + { + EvaluationMode = LogPersistenceEvaluationMode.Expression, + Expression = expression, + StrategyType = currentConfig?.StrategyType + }; + properties[prop] = config; + } + + [Obsolete] + private LogPersistenceMode GetPropertyLogPersistenceMode(string propertyName, IDictionary properties) + { + var prop = propertyName.Camelize(); + if (properties.All(o => o.Key != prop)) + properties[prop] = LogPersistenceMode.Inherit; + return properties[prop]; + } + + [Obsolete] + private void SetLogPersistenceMode(string propertyName, IDictionary properties, LogPersistenceMode value) + { + var prop = propertyName.Camelize(); + properties[prop] = value; + } + + private async Task RaiseActivityUpdated() + { + if (OnActivityUpdated != null) + await OnActivityUpdated(Activity!); + } + + private IDictionary GetExpressionEditorProps(PropertyDescriptor? propertyDescriptor) + { + var props = new Dictionary(); + + if(ActivityDescriptor != null) props[nameof(ActivityDescriptor)] = ActivityDescriptor; + if(propertyDescriptor != null) props[nameof(PropertyDescriptor)] = propertyDescriptor; + props["WorkflowDefinitionId"] = WorkflowDefinition!.DefinitionId; + + return props; + } +} + +/// +/// Defines the Persistence Strategy Configuration for an activity +/// +[Obsolete] +public class LegacyPersistenceActivityConfiguration +{ + /// + /// Default Configuration Strategy for the activity + /// + public LogPersistenceMode Default { get; set; } = LogPersistenceMode.Inherit; + + /// + /// Define Configuration Strategy for each Input properties + /// + public IDictionary Inputs { get; set; } = new Dictionary(); + + /// + /// Define Configuration Strategy for each Output properties + /// + public IDictionary Outputs { get; set; } = new Dictionary(); +} + +/// +/// Defines the Persistence Strategy Configuration for an activity +/// +public class PersistenceActivityConfiguration +{ + /// + /// Default strategy type name for the entire activity. + /// + public LogPersistenceConfiguration? Default { get; set; } + + /// + /// Strategy type name for internal activity state. + /// + public LogPersistenceConfiguration? InternalState { get; set; } + + /// + /// Strategy type names for individual Input properties. + /// + public IDictionary Inputs { get; set; } = new Dictionary(); + + /// + /// Strategy type names for individual Output properties. + /// + public IDictionary Outputs { get; set; } = new Dictionary(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor new file mode 100644 index 0000000..36aae2b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor @@ -0,0 +1,51 @@ +@using Elsa.Studio.Workflows.Services +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Extensions +@using Elsa.Api.Client.Shared.Models +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs.Outputs.Models +@inherits StudioComponentBase +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + +
+ + + @foreach (var outputDescriptor in OutputDescriptors) + { + var activity = Activity; + var displayName = string.IsNullOrWhiteSpace(outputDescriptor.DisplayName) ? outputDescriptor.Name : outputDescriptor.DisplayName; + var propertyName = outputDescriptor.Name.Camelize(); + var propertyValue = activity.GetProperty(propertyName); + var propertyType = _variableTypes.TryGetValue(outputDescriptor.TypeName, out var type) ? type : default; + var propertyTypeName = propertyType?.DisplayName ?? outputDescriptor.TypeName; + var selectedValue = _bindingTargetOptions.FirstOrDefault(x => x.Value == propertyValue?.MemoryReference?.Id); + + + - + @foreach (var bindingTargetGroup in _bindingTargetGroups) + { + @* MudSelect doesn't support (yet?), while MudSelectExtended does. However, MudSelectExtended doesn't seem to support AdornmentText (even though the property is exposed, it doesn't display) + * So we're not currently using MudSelectExtended and not rendering * + *@ + @foreach (var bindingTargetOption in bindingTargetGroup.Options) + { + @bindingTargetOption.Text + } + } + + } + + +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor.cs new file mode 100644 index 0000000..228f3e4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Components/OutputsTab.razor.cs @@ -0,0 +1,109 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs.Outputs.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs.Outputs.Components; + +/// +/// Displays the outputs of an activity. +/// +public partial class OutputsTab +{ + private ICollection _bindingTargetGroups = new List(); + private ICollection _bindingTargetOptions = new List(); + private IDictionary _variableTypes = new Dictionary(); + + /// + /// The workflow definition. + /// + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + + /// + /// The activity. + /// + [Parameter] public JsonObject Activity { get; set; } = default!; + + /// + /// The activity descriptor. + /// + [Parameter] public ActivityDescriptor ActivityDescriptor { get; set; } = default!; + + /// + /// An event raised when the activity is updated. + /// + [Parameter] public Func? OnActivityUpdated { get; set; } + + /// + /// The workspace. + /// + [CascadingParameter] public IWorkspace? Workspace { get; set; } + + [Inject] IVariableTypeService VariableTypeService { get; set; } = default!; + + private IReadOnlyCollection OutputDescriptors => ActivityDescriptor.Outputs; + private bool IsReadOnly => Workspace?.IsReadOnly == true; + + /// + protected override bool ShouldRender() => WorkflowDefinition != null! && Activity != null! && ActivityDescriptor != null!; + + /// + protected override async Task OnInitializedAsync() + { + _variableTypes = (await VariableTypeService.GetVariableTypesAsync()).ToDictionary(x => x.TypeName); + } + + /// + protected override Task OnParametersSetAsync() + { + var bindingTargetGroups = new List(); + var variables = WorkflowDefinition.Variables; + var outputDefinitions = WorkflowDefinition.Outputs; + + var variableBindingTargets = variables + .Select(variable => new BindingTargetOption(variable.Name, variable.Id)) + .ToList(); + + var outputBindingTargets = outputDefinitions + .Select(outputDefinition => new BindingTargetOption(outputDefinition.DisplayName, outputDefinition.Name)) + .ToList(); + + if (variableBindingTargets.Any()) bindingTargetGroups.Add(new BindingTargetGroup("Variables", BindingKind.Variable, variableBindingTargets)); + + if (outputBindingTargets.Any()) bindingTargetGroups.Add(new BindingTargetGroup("Outputs", BindingKind.Output, outputBindingTargets)); + + _bindingTargetGroups = bindingTargetGroups; + _bindingTargetOptions = variableBindingTargets.Concat(outputBindingTargets).ToList(); + return Task.CompletedTask; + } + + private async Task OnBindingChanged(BindingTargetOption? bindingTargetOption, OutputDescriptor outputDescriptor) + { + var activity = Activity; + var propertyName = outputDescriptor.Name.Camelize(); + + var activityOutput = bindingTargetOption == null + ? default + : new ActivityOutput + { + TypeName = outputDescriptor.TypeName, + MemoryReference = new MemoryReference + { + Id = bindingTargetOption.Value + } + }; + + activity.SetProperty(activityOutput!.SerializeToNode(), propertyName); + + if (OnActivityUpdated != null) + await OnActivityUpdated(activity); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingKind.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingKind.cs new file mode 100644 index 0000000..787bd32 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingKind.cs @@ -0,0 +1,7 @@ +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs.Outputs.Models; + +public enum BindingKind +{ + Variable, + Output +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetGroup.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetGroup.cs new file mode 100644 index 0000000..b52d129 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetGroup.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs.Outputs.Models; + +public record BindingTargetGroup(string Text, BindingKind Kind, ICollection Options); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetOption.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetOption.cs new file mode 100644 index 0000000..d7b0657 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/Outputs/Models/BindingTargetOption.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs.Outputs.Models; + +public record BindingTargetOption(string Text, string Value); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor new file mode 100644 index 0000000..e4e4a2f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor @@ -0,0 +1,30 @@ +@using Elsa.Api.Client.Extensions +@using Variant = MudBlazor.Variant +@inject ILocalizer Localizer + + + + + @foreach (var strategy in ResilienceStrategies) + { + var id = strategy.GetResilienceStrategyId(); + var displayName = strategy.GetResilienceStrategyDisplayName(); + @Localizer[displayName] + } + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor.cs new file mode 100644 index 0000000..669fd1e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/ResilienceTab.razor.cs @@ -0,0 +1,130 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.Resilience.Models; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Components; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +/// +/// The Task tab for an activity. +/// +public partial class ResilienceTab +{ + private const string DefaultCategory = "Default"; + private bool _isInitialized; + + /// + /// Gets or sets the workflow definition. + /// + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// The activity. + [Parameter] public JsonObject? Activity { get; set; } + + /// The activity descriptor. + [Parameter] public ActivityDescriptor? ActivityDescriptor { get; set; } = null!; + + /// An event raised when the activity is updated. + [Parameter] public Func? OnActivityUpdated { get; set; } + + [Inject] private IResilienceStrategyCatalog ResilienceStrategyCatalog { get; set; } = null!; + [CascadingParameter] private IWorkspace? Workspace { get; set; } + private ExpressionEditor? ExpressionEditor { get; set; } + private bool IsReadOnly => Workspace?.IsReadOnly == true; + private ICollection ResilienceStrategies { get; set; } = []; + private string ResilienceCategory { get; set; } = DefaultCategory; + private ResilienceStrategyConfig? ResilienceStrategyConfig { get; set; } + private Expression? Expression { get; set; } + private string? ResilienceStrategyId { get; set; } + + /// + protected override async Task OnParametersSetAsync() + { + if (Activity == null || ActivityDescriptor == null) + return; + + await SetPropertiesAsync(); + + if (!_isInitialized) + { + if (ResilienceStrategyConfig?.Mode == ResilienceStrategyConfigMode.Expression && Expression != null && ExpressionEditor != null) + { + _isInitialized = true; + await ExpressionEditor.UpdateAsync(Expression); + } + } + } + + /// + protected override async Task OnInitializedAsync() + { + var strategies = await ResilienceStrategyCatalog.ListAsync(ResilienceCategory); + ResilienceStrategies = strategies.ToList(); + } + + private IDictionary GetExpressionEditorProps() + { + var props = new Dictionary(); + + if (ActivityDescriptor != null) props[nameof(ActivityDescriptor)] = ActivityDescriptor; + props["WorkflowDefinitionId"] = WorkflowDefinition!.DefinitionId; + + return props; + } + + private async Task RaiseActivityUpdatedAsync() + { + if (OnActivityUpdated != null) + await OnActivityUpdated(Activity!); + } + + private async Task PersistStrategyConfigAsync() + { + var config = ResilienceStrategyConfig ?? new ResilienceStrategyConfig(); + var expressionType = Expression?.Type ?? "Default"; + config.Expression = Expression; + config.StrategyId = ResilienceStrategyId; + config.Mode = expressionType == "Default" ? ResilienceStrategyConfigMode.Identifier : ResilienceStrategyConfigMode.Expression; + ResilienceStrategyConfig = config; + Activity?.SetResilienceStrategy(config); + + await RaiseActivityUpdatedAsync(); + } + + private async Task SetPropertiesAsync() + { + if (Activity == null || ActivityDescriptor == null) + return; + + var config = Activity.GetResilienceStrategy(); + var previousCategory = ResilienceCategory; + ResilienceCategory = ActivityDescriptor.CustomProperties.TryGetValue("ResilienceCategory", out var category) ? category.ToString() ?? DefaultCategory : DefaultCategory; + ResilienceStrategyConfig = config; + Expression = config?.Expression; + ResilienceStrategyId = config?.StrategyId; + + if (previousCategory != ResilienceCategory || ResilienceStrategies.Count == 0) + { + var strategies = await ResilienceStrategyCatalog.ListAsync(ResilienceCategory); + ResilienceStrategies = strategies.ToList(); + } + } + + private async Task OnExpressionChangedAsync(Expression? expression) + { + Expression = expression; + await PersistStrategyConfigAsync(); + } + + private async Task OnStrategyChanged(string id) + { + ResilienceStrategyId = id; + await PersistStrategyConfigAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor new file mode 100644 index 0000000..6d8c868 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor @@ -0,0 +1,22 @@ +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Extensions +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor.cs new file mode 100644 index 0000000..d35f89e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/TaskTab.razor.cs @@ -0,0 +1,42 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +/// +/// The Task tab for an activity. +/// +public partial class TaskTab +{ + /// The activity. + [Parameter] public JsonObject? Activity { get; set; } + + /// The activity descriptor. + [Parameter] + public ActivityDescriptor ActivityDescriptor { get; set; } = default!; + + /// An event raised when the activity is updated. + [Parameter] public Func? OnActivityUpdated { get; set; } + [CascadingParameter] private IWorkspace? Workspace { get; set; } + private bool IsReadOnly => Workspace?.IsReadOnly == true; + + /// + protected override void OnParametersSet() + { + } + + private async Task RaiseActivityUpdated() + { + if (OnActivityUpdated != null) + await OnActivityUpdated(Activity!); + } + + private async Task OnRunAsynchronouslyChanged(bool? value) + { + Activity!.SetRunAsynchronously(value == true); + await RaiseActivityUpdated(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor new file mode 100644 index 0000000..bf512b9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor @@ -0,0 +1,43 @@ +@using Elsa.Api.Client.Resources.WorkflowDefinitions.Models +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +
+ + + @Localizer["Used"] + @Localizer["Version"] + @Localizer["Created"] + + + + + @if (context.Version == CurrentVersionUsed) + { + + } + + @context.Version + @context.CreatedAt.ToString("g") + + + @Localizer["Use this version"] + + + + + + + +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor.cs new file mode 100644 index 0000000..64eb259 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/ActivityProperties/Tabs/VersionTab.razor.cs @@ -0,0 +1,90 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Enums; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs; + +public partial class VersionTab +{ + [Parameter] public ActivityDescriptor ActivityDescriptor { get; set; } = default!; + [Parameter] public JsonObject Activity { get; set; } = default!; + [Parameter] public Func? OnActivityUpdated { get; set; } + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = default!; + [Inject] IActivityRegistry ActivityRegistry { get; set; } = default!; + private MudTable Table { get; set; } = default!; + [CascadingParameter] private IWorkspace? Workspace { get; set; } + private bool IsReadOnly => Workspace?.IsReadOnly == true; + + private string DefinitionId + { + get => Activity.GetProperty("workflowDefinitionId")!.GetValue(); + set => Activity.SetProperty(value, "workflowDefinitionId"); + } + + private string DefinitionVersionId + { + get => Activity.GetProperty("workflowDefinitionVersionId")!.GetValue(); + set => Activity.SetProperty(value, "workflowDefinitionVersionId"); + } + + private int CurrentVersionUsed + { + get => Activity.GetProperty("version")!.GetValue(); + set => Activity.SetProperty(value, "version"); + } + + private string CurrentActivityType => Activity.GetTypeName(); + + private IEnumerable _versionsUsableAsActivity = []; + + private async Task> LoadVersionsAsync(TableState tableState, CancellationToken cancellationToken) + { + if (Activity == null! || ActivityDescriptor == null!) + return new TableData(); + + var page = tableState.Page; + var pageSize = tableState.PageSize; + var definitionId = DefinitionId; + + var request = new ListWorkflowDefinitionsRequest + { + DefinitionIds = [definitionId], + OrderDirection = OrderDirection.Descending, + OrderBy = OrderByWorkflowDefinition.Version, + Page = page, + PageSize = pageSize + }; + + _versionsUsableAsActivity = ActivityRegistry.FindAll(CurrentActivityType).Select(d => d.Version); + + var response = await WorkflowDefinitionService.ListAsync(request, VersionOptions.All); + + return new TableData + { + Items = response.Items, + TotalItems = (int)response.TotalCount + }; + } + + private async Task OnUseVersionClicked(WorkflowDefinitionSummary workflowDefinitionVersion) + { + var version = workflowDefinitionVersion.Version; + + if (version == CurrentVersionUsed) + return; + + CurrentVersionUsed = version; + DefinitionVersionId = workflowDefinitionVersion.Id; + + if (OnActivityUpdated != null) + await OnActivityUpdated(Activity); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor new file mode 100644 index 0000000..d9af6db --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor @@ -0,0 +1,23 @@ +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties +@using Orientation = Radzen.Orientation +@inherits WorkflowEditorComponentBase +@using Variant = MudBlazor.Variant +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + + + + + + + @Localizer["Export"] + + @($"Version {_workflowDefinition?.Version ?? 0}") + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor.cs new file mode 100644 index 0000000..41d8345 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionVersionViewer.razor.cs @@ -0,0 +1,125 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Shared.Components; +using Elsa.Studio.Workflows.UI.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Radzen; +using Radzen.Blazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components; + +public partial class WorkflowDefinitionVersionViewer +{ + private RadzenSplitterPane _activityPropertiesPane = default!; + private int _activityPropertiesPaneHeight = 300; + private DiagramDesignerWrapper? _diagramDesigner; + + /// Gets or sets the workflow definition to view. + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + + /// Gets or sets the event triggered when an activity is selected. + [Parameter] public Func? ActivitySelected { get; set; } + + /// Gets the ID of the selected activity. + public string? SelectedActivityId { get; private set; } + + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = default!; + [Inject] private IActivityVisitor ActivityVisitor { get; set; } = default!; + [Inject] private IDiagramDesignerService DiagramDesignerService { get; set; } = default!; + [Inject] private IDomAccessor DomAccessor { get; set; } = default!; + [Inject] private IFiles Files { get; set; } = default!; + + private JsonObject? Activity => _workflowDefinition?.Root; + private JsonObject? SelectedActivity { get; set; } + private ActivityDescriptor? ActivityDescriptor { get; set; } + private ActivityProperties.ActivityPropertiesPanel? ActivityPropertiesTab { get; set; } + + private RadzenSplitterPane ActivityPropertiesPane + { + get => _activityPropertiesPane; + set + { + _activityPropertiesPane = value; + + // Prefix the ID with a non-numerical value, so it can always be used as a query selector (sometimes, Radzen generates a unique ID starting with a number). + _activityPropertiesPane.UniqueID = $"pane-{value.UniqueID}"; + } + } + + /// + protected override async Task OnInitializedAsync() + { + _workflowDefinition = WorkflowDefinition; + await ActivityRegistry.EnsureLoadedAsync(); + + if (_workflowDefinition?.Root == null) + return; + + SelectActivity(_workflowDefinition.Root); + } + + /// + protected override async Task OnParametersSetAsync() + { + if (WorkflowDefinition == _workflowDefinition) + return; + + _workflowDefinition = WorkflowDefinition; + + if (_workflowDefinition?.Root == null) + return; + + if (_diagramDesigner != null) + await _diagramDesigner.LoadActivityAsync(_workflowDefinition.Root); + + SelectActivity(_workflowDefinition.Root); + } + + private void SelectActivity(JsonObject activity) + { + // Setting the activity to null first and then requesting an update is a workaround to ensure that BlazorMonaco gets destroyed first. + // Otherwise, the Monaco editor will not be updated with a new value. Perhaps we should consider updating the Monaco Editor via its imperative API instead of via binding. + SelectedActivity = null; + ActivityDescriptor = null; + StateHasChanged(); + + SelectedActivity = activity; + SelectedActivityId = activity.GetId(); + ActivityDescriptor = ActivityRegistry.Find(activity.GetTypeName(), activity.GetVersion()); + StateHasChanged(); + } + + private async Task OnActivitySelected(JsonObject activity) + { + SelectActivity(activity); + if(ActivitySelected != null) + await ActivitySelected(activity); + } + + private async Task OnSelectedActivityUpdated(JsonObject activity) + { + StateHasChanged(); + await _diagramDesigner!.UpdateActivityAsync(SelectedActivityId!, activity); + } + + private async Task OnDownloadClicked() + { + var download = await WorkflowDefinitionService.ExportDefinitionAsync(_workflowDefinition!.DefinitionId, VersionOptions.SpecificVersion(_workflowDefinition.Version)); + var fileName = $"{_workflowDefinition.Name.Kebaberize()}.json"; + await Files.DownloadFileFromStreamAsync(fileName, download.Content); + } + + private async Task OnResize(RadzenSplitterResizeEventArgs arg) + { + var paneQuerySelector = $"#{ActivityPropertiesPane.UniqueID}"; + var visibleHeight = await DomAccessor.GetVisibleHeightAsync(paneQuerySelector); + _activityPropertiesPaneHeight = (int)visibleHeight + 50; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor new file mode 100644 index 0000000..dd7ee11 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor @@ -0,0 +1,55 @@ +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties +@using Orientation = Radzen.Orientation +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + + + + + + @if (_selectedWorkflowDefinition != null) + { + + + + @if (!IsReadOnly) + { + + } + else + { + + } + + + + + } + + + + @if (_selectedWorkflowDefinition != null) + { + + } + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor.cs new file mode 100644 index 0000000..d2d65fa --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowDefinitionWorkspace.razor.cs @@ -0,0 +1,124 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components; + +/// A workspace for editing a workflow definition. +public partial class WorkflowDefinitionWorkspace : IWorkspace +{ + private MudDynamicTabs _dynamicTabs = null!; + private WorkflowDefinition? _workflowDefinition = null!; + private WorkflowDefinition? _selectedWorkflowDefinition = null!; + + /// Gets or sets the workflow definition to edit. + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = null!; + + /// Gets or sets a specific version of the workflow definition to view. + [Parameter] public WorkflowDefinition SelectedWorkflowDefinition { get; set; } = null!; + + /// An event that is invoked when a workflow definition has been executed. + /// The ID of the workflow instance is provided as the value to the event callback. + [Parameter] public Func? WorkflowDefinitionExecuted { get; set; } + + /// Gets or sets the event that occurs when the workflow definition version is updated. + [Parameter] public Func? WorkflowDefinitionVersionSelected { get; set; } + + /// Gets or sets the event that occurs when an activity is selected. + [Parameter] public Func? ActivitySelected { get; set; } + + /// An event that is invoked when the workflow definition is updated. + public event Func? WorkflowDefinitionUpdated; + + /// + public bool IsReadOnly => _selectedWorkflowDefinition.GetIsReadOnly(); + + /// + public bool HasWorkflowEditPermission => (_selectedWorkflowDefinition?.Links?.Count(l => l.Rel == "publish") ?? 0) > 0; + + /// Gets the selected activity ID. + public string? SelectedActivityId => WorkflowEditor.SelectedActivityId; + + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = null!; + [Inject] private IMediator Mediator { get; set; } = null!; + + private WorkflowEditor WorkflowEditor { get; set; } = null!; + + /// + protected override void OnInitialized() + { + _workflowDefinition = WorkflowDefinition; + _selectedWorkflowDefinition = SelectedWorkflowDefinition; + } + + /// + protected override void OnParametersSet() + { + _workflowDefinition = WorkflowDefinition; + _selectedWorkflowDefinition = SelectedWorkflowDefinition; + + if (_selectedWorkflowDefinition == null) + _selectedWorkflowDefinition = _workflowDefinition; + } + + /// Displays the specified workflow definition version. + public async Task DisplayWorkflowDefinitionVersionAsync(WorkflowDefinition workflowDefinition) + { + if(_selectedWorkflowDefinition == workflowDefinition) + return; + + _selectedWorkflowDefinition = workflowDefinition; + + if(workflowDefinition.IsLatest) + _workflowDefinition = workflowDefinition; + + if (WorkflowDefinitionVersionSelected != null) + await WorkflowDefinitionVersionSelected(_selectedWorkflowDefinition); + + StateHasChanged(); + } + + /// Gets the currently selected workflow definition version. + public WorkflowDefinition? GetSelectedWorkflowDefinitionVersion() => _selectedWorkflowDefinition; + + /// Determines whether the workspace is currently viewing a specific version of a workflow definition. + public bool IsSelectedDefinition(string definitionVersionId) + { + return _selectedWorkflowDefinition?.Id == definitionVersionId; + } + + /// Gets the selected workflow definition. + public WorkflowDefinition? GetSelectedDefinition() + { + return _selectedWorkflowDefinition; + } + + /// Displays the latest version of a workflow definition asynchronously. + public async Task DisplayLatestWorkflowDefinitionVersionAsync() + { + var definitionId = _workflowDefinition!.DefinitionId; + var definition = (await WorkflowDefinitionService.FindByDefinitionIdAsync(definitionId, VersionOptions.Latest))!; + await DisplayWorkflowDefinitionVersionAsync(definition); + } + + private async Task OnWorkflowDefinitionPropsUpdated() + { + await WorkflowEditor.NotifyWorkflowChangedAsync(); + } + + private async Task OnWorkflowDefinitionUpdated() + { + _workflowDefinition = WorkflowEditor.WorkflowDefinition!; + _selectedWorkflowDefinition = _workflowDefinition; + StateHasChanged(); + + if (WorkflowDefinitionUpdated != null) + await WorkflowDefinitionUpdated(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor new file mode 100644 index 0000000..f2e91c3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor @@ -0,0 +1,57 @@ +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties +@using Elsa.Studio.Workflows.Services +@using Orientation = Radzen.Orientation +@using Variant = MudBlazor.Variant +@inherits WorkflowEditorComponentBase +@inject ILocalizer Localizer + + + + + + + + + + + + +
+ +
+ + + + + + @if (_workflowDefinition?.IsPublished == true) + { + + @Localizer["Unpublish"] + + + } + + @Localizer["Export"] + + + @Localizer["Import"] + + + + + +
+
+
+ + + +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor.cs new file mode 100644 index 0000000..7427a80 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditor.razor.cs @@ -0,0 +1,408 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Responses; +using Elsa.Studio.Contracts; +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.Extensions; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.Shared.Components; +using Elsa.Studio.Workflows.UI.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.Extensions.Logging; +using MudBlazor; +using Radzen; +using Radzen.Blazor; +using ThrottleDebounce; +using Variant = MudBlazor.Variant; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components; + +/// A component that allows the user to edit a workflow definition. +public partial class WorkflowEditor +{ + private readonly RateLimitedFunc _rateLimitedSaveChangesAsync; + private bool _autoSave = true; + private bool _isDirty; + private RadzenSplitterPane _activityPropertiesPane = null!; + private int _activityPropertiesPaneHeight = 300; + private DiagramDesignerWrapper _diagramDesigner = null!; + + /// + public WorkflowEditor() + { + _rateLimitedSaveChangesAsync = Debouncer.Debounce(readDiagram => SaveChangesAsync(readDiagram, false, false), TimeSpan.FromMilliseconds(500)); + } + + /// Gets or sets the drag and drop manager via property injection. + [CascadingParameter] public DragDropManager DragDropManager { get; set; } = null!; + + /// Gets or sets the workflow definition. + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// Gets or sets a callback invoked when the workflow definition is updated. + [Parameter] public Func? WorkflowDefinitionUpdated { get; set; } + + /// Gets or sets the event triggered when an activity is selected. + [Parameter] public Func? ActivitySelected { get; set; } + + /// Gets the selected activity ID. + public string? SelectedActivityId { get; private set; } + + [Inject] private IWorkflowDefinitionEditorService WorkflowDefinitionEditorService { get; set; } = null!; + [Inject] private IWorkflowDefinitionImporter WorkflowDefinitionImporter { get; set; } = null!; + [Inject] private IActivityVisitor ActivityVisitor { get; set; } = null!; + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] private IDiagramDesignerService DiagramDesignerService { get; set; } = null!; + [Inject] private IDomAccessor DomAccessor { get; set; } = null!; + [Inject] private IFiles Files { get; set; } = null!; + [Inject] private IMediator Mediator { get; set; } = null!; + [Inject] private IServiceProvider ServiceProvider { get; set; } = null!; + [Inject] private ILogger Logger { get; set; } = null!; + [Inject] private IWorkflowJsonDetector WorkflowJsonDetector { get; set; } = null!; + [Inject] private IBackendApiClientProvider BackendApiClientProvider { get; set; } = null!; + + private JsonObject? Activity => _workflowDefinition?.Root; + private JsonObject? SelectedActivity { get; set; } + private ActivityDescriptor? ActivityDescriptor { get; set; } + private ActivityPropertiesPanel? ActivityPropertiesPanel { get; set; } + + private RadzenSplitterPane ActivityPropertiesPane + { + get => _activityPropertiesPane; + set + { + _activityPropertiesPane = value; + + // Prefix the ID with a non-numerical value, so it can always be used as a query selector + // (sometimes, Radzen generates a unique ID starting with a number). + _activityPropertiesPane.UniqueID = $"pane-{value.UniqueID}"; + } + } + + /// Gets or sets a flag indicating whether the workflow definition is dirty. + public async Task NotifyWorkflowChangedAsync() + { + await HandleChangesAsync(false); + } + + /// + protected override async Task OnInitializedAsync() + { + _workflowDefinition = WorkflowDefinition; + + await ActivityRegistry.EnsureLoadedAsync(); + + if (_workflowDefinition?.Root == null) + return; + + SelectActivity(_workflowDefinition.Root); + } + + /// + protected override async Task OnParametersSetAsync() + { + if (WorkflowDefinition == _workflowDefinition) + return; + + _workflowDefinition = WorkflowDefinition; + + if (_workflowDefinition?.Root == null) + return; + + await _diagramDesigner.LoadActivityAsync(_workflowDefinition!.Root); + SelectActivity(_workflowDefinition.Root); + } + + /// + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + await UpdateActivityPropertiesVisibleHeightAsync(); + } + + private async Task HandleChangesAsync(bool readDiagram) + { + _isDirty = true; + StateHasChanged(); + + if (_autoSave) + await SaveChangesRateLimitedAsync(readDiagram); + } + + private async Task> SaveAsync(bool readDiagram, bool publish) + { + var workflowDefinition = _workflowDefinition ?? new WorkflowDefinition(); + + if (readDiagram) + { + var root = await _diagramDesigner.GetActivityAsync(); + workflowDefinition.Root = root; + } + + var result = await WorkflowDefinitionEditorService.SaveAsync(workflowDefinition, publish, async definition => await SetWorkflowDefinitionAsync(definition)); + + _isDirty = false; + StateHasChanged(); + + return result; + } + + private async Task PublishAsync(Func? onSuccess = null, Func? onFailure = null) + { + await SaveChangesAsync(true, true, true, onSuccess, onFailure); + } + + private async Task RetractAsync(Func? onSuccess = null, Func? onFailure = null) + { + var result = await WorkflowDefinitionEditorService.RetractAsync(_workflowDefinition!, async definition => await SetWorkflowDefinitionAsync(definition)); + await result.OnSuccessAsync(async _ => + { + if (onSuccess != null) await onSuccess(); + }); + + await result.OnFailedAsync(async errors => + { + if (onFailure != null) await onFailure(errors); + }); + } + + private async Task SaveChangesRateLimitedAsync(bool readDiagram) + { + await _rateLimitedSaveChangesAsync.InvokeAsync(readDiagram); + } + + private async Task SaveChangesAsync(bool readDiagram, bool showLoader, bool publish, Func? onSuccess = null, Func? onFailure = null) + { + await InvokeAsync(async () => + { + if (showLoader) + { + IsProgressing = true; + StateHasChanged(); + } + + // Because this method is rate-limited, it's possible that the designer has been disposed of since the last invocation. + // Therefore, we need to wrap this in a try/catch block. + try + { + var result = await SaveAsync(readDiagram, publish); + await result.OnSuccessAsync(response => + { + onSuccess?.Invoke(response); + return Task.CompletedTask; + }).ConfigureAwait(false); + + await result.OnFailedAsync(errors => + { + onFailure?.Invoke(errors); + foreach (var error in errors.Errors) + Snackbar.Add(error.ErrorMessage, Severity.Error, options => options.VisibleStateDuration = 5000); + return Task.CompletedTask; + }); + } + finally + { + if (showLoader) + { + IsProgressing = false; + StateHasChanged(); + } + } + }); + } + + private void SelectActivity(JsonObject activity) + { + // Setting the activity to null first and then requesting an update is a workaround to ensure that BlazorMonaco gets destroyed first. + // Otherwise, the Monaco editor will not be updated with a new value. Perhaps we should consider updating the Monaco Editor via its imperative API instead of via binding. + SelectedActivity = null; + ActivityDescriptor = null; + StateHasChanged(); + + SelectedActivity = activity; + SelectedActivityId = activity.GetId(); + ActivityDescriptor = ActivityRegistry.Find(activity.GetTypeName(), activity.GetVersion()); + StateHasChanged(); + } + + private async Task SetWorkflowDefinitionAsync(WorkflowDefinition workflowDefinition) + { + _workflowDefinition = WorkflowDefinition = workflowDefinition; + if (WorkflowDefinitionUpdated != null) await WorkflowDefinitionUpdated(); + } + + private async Task GetApiAsync(CancellationToken cancellationToken = default) + { + return await BackendApiClientProvider.GetApiAsync(cancellationToken); + } + + private async Task UpdateActivityPropertiesVisibleHeightAsync() + { + var paneQuerySelector = $"#{ActivityPropertiesPane.UniqueID}"; + var visibleHeight = await DomAccessor.GetVisibleHeightAsync(paneQuerySelector); + _activityPropertiesPaneHeight = (int)visibleHeight - 50; + } + + private async Task OnActivitySelected(JsonObject activity) + { + SelectActivity(activity); + if (ActivitySelected != null) await ActivitySelected(activity); + } + + private async Task OnSelectedActivityUpdated(JsonObject activity) + { + _isDirty = true; + StateHasChanged(); + await _diagramDesigner.UpdateActivityAsync(SelectedActivityId!, activity); + } + + private async Task OnSaveClick() + { + await SaveChangesAsync(true, true, false, _ => + { + Snackbar.Add(Localizer["Workflow saved"], Severity.Success); + return Task.CompletedTask; + }); + } + + private async Task OnPublishClicked() + { + await ProgressAsync(async () => await PublishAsync(async response => + { + // Depending on whether the workflow contains Not Found activities, display a different message. + var graph = await _diagramDesigner.GetActivityGraphAsync(); + var nodes = graph.ActivityNodeLookup.Values; + var hasNotFoundActivities = nodes.Any(x => x.Activity.GetTypeName() == "Elsa.NotFoundActivity"); + + if (hasNotFoundActivities) + Snackbar.Add(Localizer["Workflow published with Not Found activities"], Severity.Warning, options => options.VisibleStateDuration = 5000); + else + Snackbar.Add(Localizer["Workflow published"], Severity.Success); + + if (response.ConsumingWorkflowCount > 0) + { + Snackbar.Add(Localizer["{0} consuming workflow(s) updated", response.ConsumingWorkflowCount], Severity.Success, options => options.VisibleStateDuration = 3000); + } + })); + } + + private async Task OnRetractClicked() + { + await ProgressAsync(async () => await RetractAsync(() => + { + Snackbar.Add(Localizer["Workflow unpublished"], Severity.Success); + return Task.CompletedTask; + }, errors => + { + Snackbar.Add(string.Join(Environment.NewLine, errors), Severity.Error); + return Task.CompletedTask; + })); + } + + private async Task OnGraphUpdated() => await HandleChangesAsync(true); + + private async Task OnActivityUpdated(JsonObject activity) + { + await HandleChangesAsync(true); + } + + private async Task OnResize(RadzenSplitterResizeEventArgs arg) + { + await UpdateActivityPropertiesVisibleHeightAsync(); + } + + private async Task OnAutoSaveChanged(bool? value) + { + _autoSave = value ?? false; + + if (_autoSave) + await SaveChangesAsync(true, false, false); + } + + private async Task OnExportClicked() + { + var download = await WorkflowDefinitionEditorService.ExportAsync(_workflowDefinition!); + var fileName = $"{_workflowDefinition!.Name.Kebaberize()}.json"; + if (download.Content.CanSeek) download.Content.Seek(0, SeekOrigin.Begin); + await Files.DownloadFileFromStreamAsync(fileName, download.Content); + } + + private async Task OnImportClicked() + { + await DomAccessor.ClickElementAsync("#workflow-file-upload-button-wrapper input[type=file]"); + } + + private async Task OnFilesSelected(IReadOnlyList? files) + { + if (files == null || files.Count == 0) + return; + + await ImportFilesAsync(files); + _isDirty = false; + + StateHasChanged(); + } + + private async Task ImportFilesAsync(IReadOnlyList files) + { + _isDirty = true; + IsProgressing = true; + StateHasChanged(); + + var options = new ImportOptions + { + DefinitionId = WorkflowDefinition?.DefinitionId, + ImportedCallback = async definition => + { + await SetWorkflowDefinitionAsync(definition); + await _diagramDesigner.LoadActivityAsync(definition.Root); + }, + ErrorCallback = ex => + { + Snackbar.Add($"Failed to import workflow definition: {ex.Message}", Severity.Error); + return Task.CompletedTask; + } + }; + var importResults = (await WorkflowDefinitionImporter.ImportFilesAsync(files, options)).ToList(); + var failedImports = importResults.Where(x => !x.IsSuccess).ToList(); + var successfulImports = importResults.Where(x => x.IsSuccess).ToList(); + + IsProgressing = false; + _isDirty = false; + StateHasChanged(); + + if (importResults.Count == 0) + { + Snackbar.Add(Localizer["No workflows were imported."], Severity.Info); + return; + } + + if (successfulImports.Count == 1) + Snackbar.Add(Localizer["Successfully imported 1 workflow definition."], Severity.Success, ConfigureSnackbar); + else if (importResults.Count > 1) + Snackbar.Add(Localizer["Successfully imported {0} workflow definitions.", importResults.Count], Severity.Success, ConfigureSnackbar); + + if (failedImports.Count == 1) + Snackbar.Add(Localizer["Failed to import 1 workflow definition: {0}", failedImports[0].Failure!.ErrorMessage], Severity.Error, ConfigureSnackbar); + else if (failedImports.Count > 1) + Snackbar.Add(Localizer["Failed to import {0} workflow definitions. Errors: {1}", failedImports.Count, string.Join(", ", failedImports.Select(x => x.Failure!.ErrorMessage))], Severity.Error, ConfigureSnackbar); + + return; + void ConfigureSnackbar(SnackbarOptions snackbarOptions) + { + snackbarOptions.SnackbarVariant = Variant.Filled; + snackbarOptions.CloseAfterNavigation = failedImports.Count > 0; + snackbarOptions.VisibleStateDuration = failedImports.Count > 0 ? 10000 : 3000; + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditorComponentBase.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditorComponentBase.cs new file mode 100644 index 0000000..4b4afe3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowEditorComponentBase.cs @@ -0,0 +1,91 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Components; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components; + +public abstract class WorkflowEditorComponentBase : StudioComponentBase +{ + protected WorkflowDefinition? _workflowDefinition; + protected bool IsProgressing { get; set; } + + /// An event that is invoked when a workflow definition has been executed. + /// The ID of the workflow instance is provided as the value to the event callback. + [Parameter] public Func? WorkflowDefinitionExecuted { get; set; } + + /// + /// The injected workflow definition service. + /// + [Inject] protected IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = default!; + [Inject] private ILocalizer Localizer { get; set; } = default!; + + /// + /// The injected snackbar service. + /// + [Inject] protected ISnackbar Snackbar { get; set; } = default!; + + /// + /// The injected navigation manager. + /// + [Inject] protected NavigationManager NavigationManager { get; set; } = default!; + + /// + /// Invoked when the user clicked the "Run Workflow" button. + /// + protected async Task OnRunWorkflowClicked() + { + var executeResult = await ProgressAsync(async () => + { + var request = new ExecuteWorkflowDefinitionRequest + { + VersionOptions = VersionOptions.Latest + }; + + var definitionId = _workflowDefinition!.DefinitionId; + return await WorkflowDefinitionService.ExecuteAsync(definitionId, request); + }); + + if (executeResult.CannotStart) + { + Snackbar.Add(Localizer["The workflow cannot be started"], Severity.Error); + return; + } + + var workflowInstanceId = executeResult.WorkflowInstanceId; + + if(workflowInstanceId != null) + { + Snackbar.Add(Localizer["Successfully started workflow"], Severity.Success); + + if (WorkflowDefinitionExecuted != null) + await WorkflowDefinitionExecuted(workflowInstanceId); + else + NavigationManager.NavigateTo($"workflows/instances/{workflowInstanceId}/view"); + } + } + + protected async Task ProgressAsync(Func action) + { + IsProgressing = true; + StateHasChanged(); + await action.Invoke(); + IsProgressing = false; + StateHasChanged(); + } + + protected async Task ProgressAsync(Func> action) + { + IsProgressing = true; + StateHasChanged(); + var result = await action.Invoke(); + IsProgressing = false; + StateHasChanged(); + + return result; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor new file mode 100644 index 0000000..84da7a1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor @@ -0,0 +1,11 @@ +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Inputs +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Outputs +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Outcomes +@using Variant = MudBlazor.Variant + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor.cs new file mode 100644 index 0000000..7dcadaa --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/InputOutputTab.razor.cs @@ -0,0 +1,15 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components; + +public partial class InputOutputTab +{ + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + [CascadingParameter] public IWorkspace? Workspace { get; set; } + + private bool IsReadOnly => Workspace?.IsReadOnly ?? true; + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor new file mode 100644 index 0000000..3634885 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor @@ -0,0 +1,51 @@ +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Resources.StorageDrivers.Models +@using Elsa.Api.Client.Resources.VariableTypes.Models +@using Elsa.Api.Client.Resources.WorkflowDefinitions.Models +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@inherits StudioComponentBase + + + + + + + + + @foreach (var grouping in _groupedVariableTypes) + { + + @foreach (var variableType in grouping) + { + @variableType.DisplayName + } + + } + + + + + + + + + @foreach(var uiHint in _uiHints) + { + @uiHint.DisplayName + } + + + @foreach (var storageDriver in _storageDriverDescriptors) + { + @storageDriver.DisplayName + } + + + + + + @Localizer["Cancel"] + @Localizer["Ok"] + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor.cs new file mode 100644 index 0000000..e451fff --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/EditInputDialog.razor.cs @@ -0,0 +1,136 @@ +using Blazored.FluentValidation; +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Models; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Validators; +using Elsa.Studio.Workflows.Domain.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Inputs; + +public partial class EditInputDialog +{ + private readonly InputDefinitionModel _model = new(); + private EditContext _editContext = default!; + private InputModelValidator _validator = default!; + private FluentValidationValidator _fluentValidationValidator = default!; + private ICollection _storageDriverDescriptors = new List(); + private ICollection _variableTypes = new List(); + private ICollection _uiHints = new List(); + private ICollection> _groupedVariableTypes = new List>(); + + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + [Parameter] public InputDefinition? Input { get; set; } + [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!; + [Inject] private IStorageDriverService StorageDriverService { get; set; } = default!; + [Inject] private IVariableTypeService VariableTypeService { get; set; } = default!; + + /// + protected override async Task OnInitializedAsync() + { + _editContext = new(_model); + _storageDriverDescriptors = (await StorageDriverService.GetStorageDriversAsync()).ToList(); + _variableTypes = (await VariableTypeService.GetVariableTypesAsync()).ToList(); + _uiHints = (await GetUIHintsAsync()).ToList(); + _groupedVariableTypes = _variableTypes.GroupBy(x => x.Category).ToList(); + } + + /// + protected override void OnParametersSet() + { + _editContext = new(_model); + _validator = new(WorkflowDefinition, Localizer); + + if (Input == null) + { + _model.Name = GetNewInputName(WorkflowDefinition.Inputs); + _model.DisplayName = _model.Name.Humanize(); + _model.StorageDriver = _storageDriverDescriptors.First(); + _model.Type = _variableTypes.First(); + _model.UIHint = _uiHints.First(); + } + else + { + _model.Name = Input.Name; + _model.Type = _variableTypes.FirstOrDefault(x => x.TypeName == Input.Type) ?? _variableTypes.First(); + _model.IsArray = Input.IsArray; + _model.StorageDriver = _storageDriverDescriptors.FirstOrDefault(x => x.TypeName == Input.StorageDriverType) ?? _storageDriverDescriptors.First(); + _model.UIHint = _uiHints.FirstOrDefault(x => x.Name == Input.UIHint) ?? _uiHints.First(); + _model.Description = Input.Description; + _model.Category = Input.Category; + _model.DisplayName = Input.DisplayName; + } + } + + private string GetNewInputName(ICollection existingInputs) + { + var count = 0; + + while (true) + { + var inputName = $"Input{++count}"; + + if (existingInputs.All(x => x.Name != inputName)) + return inputName; + } + } + + private Task> GetUIHintsAsync() + { + // TODO: Get these from the backend. + var descriptors = new[] + { + new UIHintDescriptor("singleline", Localizer["Single line"], Localizer["A single line of text input"]), + new UIHintDescriptor("multiline", Localizer["Multi line"], Localizer["Multiple lines of text input"]), + new UIHintDescriptor("checkbox", Localizer["Checkbox"], Localizer["A checkbox"]), + new UIHintDescriptor("checklist", Localizer["Checklist"], Localizer["A list of checkboxes"]), + new UIHintDescriptor("radiolist", Localizer["Radio list"], Localizer["A list of radio buttons"]), + new UIHintDescriptor("dropdown", Localizer["Dropdown"], Localizer["A dropdown list"]), + new UIHintDescriptor("multitext", Localizer["Multi text"], Localizer["An input for multiple words, like a tagging input"]), + new UIHintDescriptor("code-editor", Localizer["Code editor"], Localizer["A code editor"]), + new UIHintDescriptor("variable-picker", Localizer["Variable picker"], Localizer["A variable picker"]), + new UIHintDescriptor("workflow-definition-picker", Localizer["Workflow definition picker"], Localizer["A workflow definition picker"]), + new UIHintDescriptor("output-picker", Localizer["Output picker"], Localizer["A workflow output definition picker"]), + new UIHintDescriptor("outcome-picker", Localizer["Outcome picker"], Localizer["An outcome picker"]), + new UIHintDescriptor("json-editor", Localizer["JSON editor"], Localizer["A JSON editor"]), + }; + + return Task.FromResult(descriptors.AsEnumerable()); + } + + private Task OnCancelClicked() + { + MudDialog.Cancel(); + return Task.CompletedTask; + } + + private async Task OnSubmitClicked() + { + if (!await _fluentValidationValidator.ValidateAsync()) + return; + + await OnValidSubmit(); + } + + private Task OnValidSubmit() + { + var input = Input ?? new InputDefinition(); + + input.Name = _model.Name; + input.Type = _model.Type.TypeName; + input.IsArray = _model.IsArray; + input.StorageDriverType = _model.StorageDriver.TypeName; + input.Category = _model.Type.Category; + input.UIHint = _model.UIHint!.Name; + input.Description = _model.Description; + input.DisplayName = _model.DisplayName; + + MudDialog.Close(input); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor new file mode 100644 index 0000000..bc3582b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor @@ -0,0 +1,58 @@ +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +@Localizer["Inputs"] + + + + @Localizer["Add input"] + + + @if (!Inputs.Any()) + { + @Localizer["There are currently no inputs defined."] + } + else + { + + + + @Localizer["Name"] + @Localizer["Type"] + @Localizer["Storage"] + + + + + + @foreach (var input in Inputs) + { + var storageDescriptor = input.StorageDriverType != null ? GetStorageDriverDescriptor(input.StorageDriverType) : default; + var storageDriverName = storageDescriptor != null ? storageDescriptor.DisplayName : @Localizer["None"]; + var typeDescriptor = input.Type != null ? _variableTypes.FirstOrDefault(x => x.TypeName == input.Type) : default; + var typeName = typeDescriptor?.DisplayName ?? input.Type; + if(input.IsArray) typeName += "[]"; + + @input.Name + @typeName + @storageDriverName + + + @Localizer["Edit"] + @Localizer["Delete"] + + + + } + + + } + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor.cs new file mode 100644 index 0000000..6744e50 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Inputs/InputsSection.razor.cs @@ -0,0 +1,99 @@ +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Inputs; + +public partial class InputsSection +{ + private ICollection _variableTypes = new List(); + private ICollection _storageDriverDescriptors = new List(); + + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + [Parameter] public bool IsReadonly { get; set; } = default; + [Inject] private IStorageDriverService StorageDriverService { get; set; } = default!; + [Inject] private IDialogService DialogService { get; set; } = default!; + [Inject] private IVariableTypeService VariableTypeService { get; set; } = default!; + + private ICollection Inputs => WorkflowDefinition.Inputs; + + protected override async Task OnInitializedAsync() + { + _storageDriverDescriptors = (await StorageDriverService.GetStorageDriversAsync()).ToList(); + _variableTypes = (await VariableTypeService.GetVariableTypesAsync()).ToList(); + } + + private StorageDriverDescriptor? GetStorageDriverDescriptor(string typeName) + { + return _storageDriverDescriptors.FirstOrDefault(x => x.TypeName == typeName); + } + + private async Task RaiseWorkflowDefinitionUpdatedAsync() + { + if (WorkflowDefinitionUpdated.HasDelegate) + await WorkflowDefinitionUpdated.InvokeAsync(); + } + + private async Task OpenInputEditorDialog(InputDefinition? inputDefinition) + { + var isNew = inputDefinition == null; + + var parameters = new DialogParameters + { + [nameof(EditInputDialog.WorkflowDefinition)] = WorkflowDefinition + }; + + if (!isNew) + parameters[nameof(EditInputDialog.Input)] = inputDefinition; + + var options = new DialogOptions + { + MaxWidth = MaxWidth.Medium, + FullWidth = true, + CloseButton = true, + CloseOnEscapeKey = true + }; + + var title = inputDefinition == null ? Localizer["Create input"] : Localizer["Edit input"]; + var dialog = await DialogService.ShowAsync(title, parameters, options); + var result = await dialog.Result; + + if (result.Canceled) + return; + + if (isNew) + { + inputDefinition = (InputDefinition)result.Data; + WorkflowDefinition.Inputs.Add(inputDefinition); + } + + await RaiseWorkflowDefinitionUpdatedAsync(); + } + + private async Task OnEditClicked(InputDefinition input) + { + await OpenInputEditorDialog(input); + } + + private async Task OnDeleteClicked(InputDefinition input) + { + var result = await DialogService.ShowMessageBox(Localizer["Delete selected input?"], Localizer["Are you sure you want to delete the selected input?"], yesText: Localizer["Delete"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + WorkflowDefinition.Inputs.Remove(input); + + await RaiseWorkflowDefinitionUpdatedAsync(); + } + + private async Task OnAddInputClicked() + { + await OpenInputEditorDialog(null); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor new file mode 100644 index 0000000..11feed1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor @@ -0,0 +1,29 @@ +@using Variant = MudBlazor.Variant +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@if (WorkflowDefinition != null!) +{ + @Localizer["Outcomes"] + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor.cs new file mode 100644 index 0000000..cd8597a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outcomes/OutcomesSection.razor.cs @@ -0,0 +1,34 @@ +using System.Reflection; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using MudExtensions; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Outcomes; + +public partial class OutcomesSection +{ + private MudChipField _chipField = default!; + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + [Parameter] public bool IsReadonly { get; set; } = default; + + private List Outcomes => WorkflowDefinition.Outcomes.ToList(); + + private async Task OnValuesChanges(List values) + { + WorkflowDefinition.Outcomes = values; + if (WorkflowDefinitionUpdated.HasDelegate) + await WorkflowDefinitionUpdated.InvokeAsync(); + } + + private void OnKeyDown(KeyboardEventArgs arg) + { + // TODO: This is a hack to get the chips to update when the user presses enter. + // Ideally, we can configure this on MudChipField, but this is not currently supported. + if (arg.Key is not ("Enter" or "Tab")) return; + + var setChipsMethod = _chipField.GetType().GetMethod("SetChips", BindingFlags.Instance | BindingFlags.NonPublic); + setChipsMethod!.Invoke(_chipField, null); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor new file mode 100644 index 0000000..76960d1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor @@ -0,0 +1,37 @@ +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Resources.VariableTypes.Models +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + + + + + + + + + @foreach (var grouping in _groupedVariableTypes) + { + + @foreach (var variableType in grouping) + { + @variableType.DisplayName + } + + } + + + + + + + + + + + + @Localizer["Cancel"] + @Localizer["Ok"] + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor.cs new file mode 100644 index 0000000..2723b24 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/EditOutputDialog.razor.cs @@ -0,0 +1,110 @@ +using Blazored.FluentValidation; +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Models; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Validators; +using Elsa.Studio.Workflows.Domain.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Outputs; + +/// +/// A dialog for editing an output. +/// +public partial class EditOutputDialog +{ + private readonly OutputDefinitionModel _model = new(); + private EditContext _editContext = null!; + private OutputModelValidator _validator = null!; + private FluentValidationValidator _fluentValidationValidator = null!; + private ICollection _storageDriverDescriptors = new List(); + private ICollection _variableTypes = new List(); + private ICollection> _groupedVariableTypes = new List>(); + + /// + /// The workflow definition. + /// + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = null!; + + /// + /// The output to edit. + /// + [Parameter] public OutputDefinition? Output { get; set; } + [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = null!; + [Inject] private IStorageDriverService StorageDriverService { get; set; } = null!; + [Inject] private IVariableTypeService VariableTypeService { get; set; } = null!; + + /// + protected override async Task OnParametersSetAsync() + { + // Instantiate the edit context first so that it is available when rendering (which happens as soon as we call an async method on the next line). + _editContext = new(_model); + _validator = new(WorkflowDefinition, Localizer); + + _storageDriverDescriptors = (await StorageDriverService.GetStorageDriversAsync()).ToList(); + _variableTypes = (await VariableTypeService.GetVariableTypesAsync()).ToList(); + _groupedVariableTypes = _variableTypes.GroupBy(x => x.Category).ToList(); + + if (Output == null) + { + _model.Name = GetNewOutputName(WorkflowDefinition.Outputs); + _model.DisplayName = _model.Name.Humanize(); + _model.Type = _variableTypes.First(); + } + else + { + _model.Name = Output.Name; + _model.Type = _variableTypes.FirstOrDefault(x => x.TypeName == Output.Type) ?? _variableTypes.First(); + _model.IsArray = Output.IsArray; + _model.Description = Output.Description; + _model.Category = Output.Category; + _model.DisplayName = Output.DisplayName; + } + } + + private string GetNewOutputName(ICollection existingOutputs) + { + var count = 0; + + while (true) + { + var inputName = $"Output{++count}"; + + if (existingOutputs.All(x => x.Name != inputName)) + return inputName; + } + } + + private Task OnCancelClicked() + { + MudDialog.Cancel(); + return Task.CompletedTask; + } + + private async Task OnSubmitClicked() + { + if (!await _fluentValidationValidator.ValidateAsync()) + return; + + await OnValidSubmit(); + } + + private Task OnValidSubmit() + { + var output = Output ?? new OutputDefinition(); + + output.Name = _model.Name; + output.Type = _model.Type.TypeName; + output.IsArray = _model.IsArray; + output.Category = _model.Type.Category; + output.Description = _model.Description; + output.DisplayName = _model.DisplayName; + + MudDialog.Close(output); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor new file mode 100644 index 0000000..cd90bb1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor @@ -0,0 +1,54 @@ +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +@Localizer["Outputs"] + + + + @Localizer["Add output"] + + + @if (!Outputs.Any()) + { + @Localizer["There are currently no outputs defined."] + } + else + { + + + + @Localizer["Name"] + @Localizer["Type"] + + + + + + @foreach (var output in Outputs) + { + var typeDescriptor = output.Type != null ? _variableTypes.FirstOrDefault(x => x.TypeName == output.Type) : default; + var typeName = typeDescriptor?.DisplayName ?? output.Type; + if (output.IsArray) typeName += "[]"; + + @output.Name + @typeName + + + @Localizer["Edit"] + @Localizer["Delete"] + + + + } + + + } + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor.cs new file mode 100644 index 0000000..6bbee1a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Components/Outputs/OutputsSection.razor.cs @@ -0,0 +1,98 @@ +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Outputs; + +public partial class OutputsSection +{ + private ICollection _variableTypes = new List(); + private ICollection _storageDriverDescriptors = new List(); + + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + [Parameter] public bool IsReadonly { get; set; } = default; + [Inject] private IStorageDriverService StorageDriverService { get; set; } = default!; + [Inject] private IDialogService DialogService { get; set; } = default!; + [Inject] private IVariableTypeService VariableTypeService { get; set; } = default!; + + private ICollection Outputs => WorkflowDefinition.Outputs; + + protected override async Task OnInitializedAsync() + { + _storageDriverDescriptors = (await StorageDriverService.GetStorageDriversAsync()).ToList(); + } + + private StorageDriverDescriptor? GetStorageDriverDescriptor(string typeName) + { + return _storageDriverDescriptors.FirstOrDefault(x => x.TypeName == typeName); + } + + private async Task RaiseWorkflowDefinitionUpdatedAsync() + { + if (WorkflowDefinitionUpdated.HasDelegate) + await WorkflowDefinitionUpdated.InvokeAsync(); + } + + private async Task OpenOutputEditorDialog(OutputDefinition? outputDefinition) + { + var isNew = outputDefinition == null; + + var parameters = new DialogParameters + { + [nameof(EditOutputDialog.WorkflowDefinition)] = WorkflowDefinition + }; + + if (!isNew) + parameters[nameof(EditOutputDialog.Output)] = outputDefinition; + + var options = new DialogOptions + { + MaxWidth = MaxWidth.Medium, + FullWidth = true, + CloseButton = true, + CloseOnEscapeKey = true + }; + + var title = outputDefinition == null ? Localizer["Create output"] : Localizer["Edit output"]; + var dialog = await DialogService.ShowAsync(title, parameters, options); + var result = await dialog.Result; + + if (result.Canceled) + return; + + if (isNew) + { + outputDefinition = (OutputDefinition)result.Data; + WorkflowDefinition.Outputs.Add(outputDefinition); + } + + await RaiseWorkflowDefinitionUpdatedAsync(); + } + + private async Task OnEditClicked(OutputDefinition input) + { + await OpenOutputEditorDialog(input); + } + + private async Task OnDeleteClicked(OutputDefinition input) + { + var result = await DialogService.ShowMessageBox(Localizer["Delete selected output?"], Localizer["Are you sure you want to delete the selected output?"], yesText: Localizer["Delete"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + WorkflowDefinition.Outputs.Remove(input); + + await RaiseWorkflowDefinitionUpdatedAsync(); + } + + private async Task OnAddOutputClicked() + { + await OpenOutputEditorDialog(null); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/ArgumentDefinitionModel.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/ArgumentDefinitionModel.cs new file mode 100644 index 0000000..56d3fc5 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/ArgumentDefinitionModel.cs @@ -0,0 +1,13 @@ +using Elsa.Api.Client.Resources.VariableTypes.Models; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Models; + +public abstract class ArgumentDefinitionModel +{ + public VariableTypeDescriptor Type { get; set; } = default!; + public bool IsArray { get; set; } + public string Name { get; set; } = default!; + public string DisplayName { get; set; } = default!; + public string Description { get; set; } = default!; + public string Category { get; set; } = default!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/InputDefinitionModel.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/InputDefinitionModel.cs new file mode 100644 index 0000000..c3a8109 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/InputDefinitionModel.cs @@ -0,0 +1,11 @@ +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Models; + +public class InputDefinitionModel : ArgumentDefinitionModel +{ + public UIHintDescriptor? UIHint { get; set; } + + public StorageDriverDescriptor StorageDriver { get; set; } = default!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/OutputDefinitionModel.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/OutputDefinitionModel.cs new file mode 100644 index 0000000..7424088 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Models/OutputDefinitionModel.cs @@ -0,0 +1,5 @@ +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Models; + +public class OutputDefinitionModel : ArgumentDefinitionModel +{ +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/InputModelValidator.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/InputModelValidator.cs new file mode 100644 index 0000000..c1a1667 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/InputModelValidator.cs @@ -0,0 +1,23 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Models; +using FluentValidation; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Validators; + +public class InputModelValidator : AbstractValidator +{ + public InputModelValidator(WorkflowDefinition workflowDefinition, ILocalizer localizer) + { + RuleFor(x => x.Name).NotEmpty().WithMessage(localizer["Please enter a name for the input."]); + + RuleFor(x => x.Name) + .Must((context, name, cancellationToken) => + { + var existingInput = workflowDefinition.Inputs.FirstOrDefault(x => x.Name == name); + return existingInput == null || existingInput.Name == context.Name; + }) + .WithMessage(localizer["An input with this name already exists."]); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/OutputModelValidator.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/OutputModelValidator.cs new file mode 100644 index 0000000..cb930df --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/InputOutput/Validators/OutputModelValidator.cs @@ -0,0 +1,23 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Models; +using FluentValidation; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Validators; + +public class OutputModelValidator : AbstractValidator +{ + public OutputModelValidator(WorkflowDefinition workflowDefinition, ILocalizer localizer) + { + RuleFor(x => x.Name).NotEmpty().WithMessage(localizer["Please enter a name for the output."]); + + RuleFor(x => x.Name) + .Must((context, name, cancellationToken) => + { + var existingOutput = workflowDefinition.Outputs.FirstOrDefault(x => x.Name == name); + return existingOutput == null || existingOutput.Name == context.Name; + }) + .WithMessage(localizer["An input with this name already exists."]); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor new file mode 100644 index 0000000..2d33083 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor @@ -0,0 +1,6 @@ +@using Elsa.Studio.Extensions + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor.cs new file mode 100644 index 0000000..b1b1cf2 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/PropertiesTab.razor.cs @@ -0,0 +1,24 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties; + +/// +/// A component that renders the workflow definition properties tab. +/// +public partial class PropertiesTab +{ + /// + /// Gets or sets the workflow definition. + /// + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + + /// + /// Gets or sets the callback that is invoked when the workflow definition is updated. + /// + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + + [CascadingParameter] private IWorkspace? Workspace { get; set; } + private bool IsReadOnly => Workspace?.IsReadOnly ?? false; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor new file mode 100644 index 0000000..17bdea3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor @@ -0,0 +1,4 @@ +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@Localizer["Information"] + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor.cs new file mode 100644 index 0000000..43d2b6f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Info/Info.razor.cs @@ -0,0 +1,26 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties. + Sections.Info; + +public partial class Info +{ + private DataPanelModel _workflowInfo = new (); + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = null!; + + /// + protected override void OnParametersSet() + { + _workflowInfo = + [ + new DataPanelItem(Localizer["Definition ID"], WorkflowDefinition.DefinitionId), + new DataPanelItem(Localizer["Version ID"], WorkflowDefinition.Id), + new DataPanelItem(Localizer["Version"], WorkflowDefinition.Version.ToString()), + new DataPanelItem(Localizer["Status"], WorkflowDefinition.IsPublished ? Localizer["Published"] : Localizer["Draft"]), + new DataPanelItem(Localizer["Readonly"], WorkflowDefinition.IsReadonly ? Localizer["Yes"] : Localizer["No"]) + ]; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor new file mode 100644 index 0000000..bba53b0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor @@ -0,0 +1,15 @@ +@using Elsa.Studio.Workflows.Services +@using Variant = MudBlazor.Variant +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + +
+ @Localizer["Metadata"] + + + + + + + +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor.cs new file mode 100644 index 0000000..96a1ae9 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Metadata/Metadata.razor.cs @@ -0,0 +1,59 @@ +using Blazored.FluentValidation; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.Validators; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties.Sections.Metadata; + +/// +/// A component that renders the workflow definition metadata. +/// +public partial class Metadata +{ + private readonly WorkflowMetadataModel _model = new(); + private FluentValidationValidator _fluentValidationValidator = default!; + private WorkflowPropertiesModelValidator _validator = default!; + private EditContext _editContext = default!; + + /// + /// Gets or sets the workflow definition. + /// + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + + /// + /// Gets or sets the callback that is invoked when the workflow definition is updated. + /// + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + [CascadingParameter] private IWorkspace? Workspace { get; set; } + + private bool IsReadOnly => Workspace?.IsReadOnly ?? false; + + /// + protected override void OnParametersSet() + { + _model.DefinitionId = WorkflowDefinition.DefinitionId; + _model.Description = WorkflowDefinition.Description; + _model.Name = WorkflowDefinition.Name; + _editContext = new EditContext(_model); + } + + private async Task ValidateForm() + { + if (!await _fluentValidationValidator.ValidateAsync()) + return; + + await OnValidSubmit(); + } + + private async Task OnValidSubmit() + { + WorkflowDefinition.Description = _model.Description; + WorkflowDefinition.Name = _model.Name; + + if (WorkflowDefinitionUpdated.HasDelegate) + await WorkflowDefinitionUpdated.InvokeAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor new file mode 100644 index 0000000..dc0f246 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor @@ -0,0 +1,122 @@ +@using Elsa.Api.Client.Resources.CommitStrategies.Models +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Models +@using Elsa.Api.Client.Resources.IncidentStrategies.Models +@using Elsa.Api.Client.Resources.LogPersistenceStrategies +@inherits StudioComponentBase +@inject ILocalizer Localizer + +@if (WorkflowDefinition != null) +{ +
+ @Localizer["Settings"] + + + @foreach (var strategy in _activationStrategies) + { + @strategy.DisplayName + } + + + @foreach (var strategy in _incidentStrategies) + { + @(strategy?.DisplayName ?? @Localizer["Default"]) + } + + + + @foreach (var strategy in _logPersistenceStrategyDescriptors) + { + @(strategy?.DisplayName ?? "Inherit") + } + + + + @Localizer["Commit Strategy"] + + + @foreach (var strategy in _commitStrategies) + { + @(string.IsNullOrWhiteSpace(strategy?.DisplayName) ? Localizer["Default"] : strategy.DisplayName) + } + + + @Localizer["Activity"] + + + + + @if (WorkflowDefinition.Options.UsableAsActivity == true) + { + + + + + } + +
+} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor.cs new file mode 100644 index 0000000..43ef231 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Properties/Sections/Settings/Settings.razor.cs @@ -0,0 +1,192 @@ +using Elsa.Api.Client.Resources.IncidentStrategies.Models; +using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Enums; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using System.Text.Json; +using Elsa.Api.Client.Resources.CommitStrategies.Models; +using Elsa.Api.Client.Resources.LogPersistenceStrategies; +using Elsa.Api.Client.Resources.Scripting.Models; +using Elsa.Api.Client.Serialization; +using Elsa.Api.Client.Shared.Enums; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties.Sections.Settings; + +/// +/// Displays the settings of a workflow. +/// +public partial class Settings +{ + private readonly JsonSerializerOptions _serializerOptions = SerializerOptions.LogPersistenceConfigSerializerOptions; + + /// + /// The workflow definition. + /// + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// + /// An event raised when the workflow is updated. + /// + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + + /// + /// The workspace. + /// + [CascadingParameter] public IWorkspace? Workspace { get; set; } + + [Inject] private IWorkflowActivationStrategyService WorkflowActivationStrategyService { get; set; } = null!; + [Inject] private IIncidentStrategiesProvider IncidentStrategiesProvider { get; set; } = null!; + [Inject] private ILogPersistenceStrategyService LogPersistenceStrategyService { get; set; } = null!; + [Inject] private ICommitStrategiesProvider CommitStrategiesProvider { get; set; } = null!; + + private bool IsReadOnly => Workspace?.IsReadOnly ?? false; + private ICollection _activationStrategies = new List(); + private ICollection _incidentStrategies = new List(); + private ICollection _logPersistenceStrategyDescriptors = new List(); + private ICollection _commitStrategies = new List(); + private WorkflowActivationStrategyDescriptor? _selectedActivationStrategy; + private IncidentStrategyDescriptor? _selectedIncidentStrategy; + private LogPersistenceStrategyDescriptor? _selectedLogPersistenceStrategy; + private LogPersistenceConfiguration? _logPersistenceConfiguration; + private CommitStrategyDescriptor? _selectedCommitStrategy; + private ExpressionEditor _logPersistenceExpressionEditor = null!; + + /// + protected override async Task OnInitializedAsync() + { + _activationStrategies = (await WorkflowActivationStrategyService.GetWorkflowActivationStrategiesAsync()).ToList(); + var incidentStrategies = (await IncidentStrategiesProvider.GetIncidentStrategiesAsync()).ToList(); + var commitStrategies = (await CommitStrategiesProvider.GetWorkflowCommitStrategiesAsync()).ToList(); + _incidentStrategies = new IncidentStrategyDescriptor?[] { null }.Concat(incidentStrategies).ToList(); + _commitStrategies = new CommitStrategyDescriptor?[] { null }.Concat(commitStrategies).ToList(); + _logPersistenceStrategyDescriptors = (await LogPersistenceStrategyService.GetLogPersistenceStrategiesAsync()).ToList(); + _selectedActivationStrategy = _activationStrategies.FirstOrDefault(x => x.TypeName == WorkflowDefinition!.Options.ActivationStrategyType) ?? _activationStrategies.FirstOrDefault(); + _selectedIncidentStrategy = _incidentStrategies.FirstOrDefault(x => x?.TypeName == WorkflowDefinition!.Options.IncidentStrategyType) ?? _incidentStrategies.FirstOrDefault(); + _selectedCommitStrategy = _commitStrategies.FirstOrDefault(x => x?.Name == WorkflowDefinition!.Options.CommitStrategyName) ?? _commitStrategies.FirstOrDefault(); + _logPersistenceConfiguration = GetLogPersistenceConfiguration(); + _selectedLogPersistenceStrategy = _logPersistenceStrategyDescriptors.FirstOrDefault(x => x.TypeName == _logPersistenceConfiguration?.StrategyType) ?? _logPersistenceStrategyDescriptors.FirstOrDefault(); + await _logPersistenceExpressionEditor.UpdateAsync(_logPersistenceConfiguration?.Expression); + } + + private LogPersistenceMode? GetLegacyGetLogPersistenceMode() + { + if (WorkflowDefinition!.CustomProperties.TryGetValue("logPersistenceMode", out var value) && value != null!) + { + var persistenceString = ((JsonElement)value).GetProperty("default"); + return (LogPersistenceMode)Enum.Parse(typeof(LogPersistenceMode), persistenceString.ToString()); + } + + return null; + } + + private LogPersistenceConfiguration? GetLogPersistenceConfiguration() + { + if (WorkflowDefinition!.CustomProperties.TryGetValue("logPersistenceConfig", out var value) && value != null!) + { + var configJson = ((JsonElement)value).GetProperty("default"); + var config = JsonSerializer.Deserialize(configJson, _serializerOptions); + return config; + } + + var legacyMode = GetLegacyGetLogPersistenceMode(); + var strategyDescriptor = _logPersistenceStrategyDescriptors.FirstOrDefault(x => x.DisplayName == legacyMode.ToString()) ?? _logPersistenceStrategyDescriptors.FirstOrDefault(); + return new() + { + EvaluationMode = LogPersistenceEvaluationMode.Strategy, + StrategyType = strategyDescriptor?.TypeName + }; + } + + private async Task RaiseWorkflowUpdatedAsync() + { + if (WorkflowDefinitionUpdated.HasDelegate) + await WorkflowDefinitionUpdated.InvokeAsync(); + } + + private async Task UpdateLogPersistenceConfigAsync(LogPersistenceConfiguration newConfig) + { + _logPersistenceConfiguration = newConfig; + var dictionary = new Dictionary { { "default", newConfig } }; + var dictionaryJson = JsonSerializer.SerializeToElement(dictionary, _serializerOptions); + WorkflowDefinition!.CustomProperties["logPersistenceConfig"] = dictionaryJson; + await RaiseWorkflowUpdatedAsync(); + } + + private IDictionary GetExpressionEditorProps() + { + var props = new Dictionary + { + ["WorkflowDefinitionId"] = WorkflowDefinition!.DefinitionId + }; + + return props; + } + + private async Task OnActivationStrategyChanged(WorkflowActivationStrategyDescriptor value) + { + _selectedActivationStrategy = value; + WorkflowDefinition!.Options.ActivationStrategyType = value.TypeName; + await RaiseWorkflowUpdatedAsync(); + } + + private async Task OnIncidentStrategyChanged(IncidentStrategyDescriptor? value) + { + _selectedIncidentStrategy = value; + WorkflowDefinition!.Options.IncidentStrategyType = value?.TypeName; + await RaiseWorkflowUpdatedAsync(); + } + + private async Task OnLogPersistenceStrategySelectionChanged(LogPersistenceStrategyDescriptor? value) + { + _selectedLogPersistenceStrategy = value; + var currentConfig = _logPersistenceConfiguration; + var newConfig = new LogPersistenceConfiguration + { + EvaluationMode = LogPersistenceEvaluationMode.Strategy, + StrategyType = value?.TypeName, + Expression = currentConfig?.Expression + }; + await UpdateLogPersistenceConfigAsync(newConfig); + } + + private async Task OnLogPersistenceExpressionChanged(Expression? value) + { + var currentConfig = _logPersistenceConfiguration; + var newConfig = new LogPersistenceConfiguration + { + EvaluationMode = LogPersistenceEvaluationMode.Expression, + StrategyType = currentConfig?.StrategyType, + Expression = value + }; + await UpdateLogPersistenceConfigAsync(newConfig); + } + + private async Task OnUsableAsActivityCheckChanged(bool? value) + { + WorkflowDefinition!.Options.UsableAsActivity = value; + await RaiseWorkflowUpdatedAsync(); + } + + private async Task OnAutoUpdateConsumingWorkflowsCheckChanged(bool? value) + { + WorkflowDefinition!.Options.AutoUpdateConsumingWorkflows = value == true; + await RaiseWorkflowUpdatedAsync(); + } + + private async Task OnCategoryChanged(string value) + { + WorkflowDefinition!.Options.ActivityCategory = value; + await RaiseWorkflowUpdatedAsync(); + } + + private async Task OnCommitStrategySelectionChanged(CommitStrategyDescriptor? value) + { + _selectedCommitStrategy = value; + WorkflowDefinition!.Options.CommitStrategyName = value?.Name; + await RaiseWorkflowUpdatedAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor new file mode 100644 index 0000000..47f9d01 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor @@ -0,0 +1,44 @@ +@using Variant = MudBlazor.Variant +@using Elsa.Api.Client.Resources.StorageDrivers.Models +@using Elsa.Api.Client.Resources.VariableTypes.Models +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@inherits StudioComponentBase + + + + + + + @_model.Id + + + @foreach (var grouping in _groupedVariableTypes) + { + + @foreach (var variableType in grouping) + { + @variableType.DisplayName + } + + } + + + + + + + @foreach (var storageDriver in _storageDriverDescriptors) + { + var displayName = storageDriver.Deprecated ? $"{storageDriver.DisplayName} (Deprecated)" : storageDriver.DisplayName; + @displayName + } + + + + + + @Localizer["Cancel"] + @Localizer["Ok"] + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor.cs new file mode 100644 index 0000000..fbbfca5 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/EditVariableDialog.razor.cs @@ -0,0 +1,110 @@ +using Blazored.FluentValidation; +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.VariableTypes.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Models; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Validators; +using Elsa.Studio.Workflows.Domain.Contracts; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Components; + +/// +/// A dialog that allows the user to edit a variable. +/// +public partial class EditVariableDialog +{ + private readonly VariableModel _model = new(); + private EditContext _editContext = null!; + private VariableModelValidator _validator = null!; + private FluentValidationValidator _fluentValidationValidator = null!; + private ICollection _storageDriverDescriptors = new List(); + private ICollection _variableTypes = new List(); + private ICollection> _groupedVariableTypes = new List>(); + + /// + /// The workflow definition that the variable belongs to. + /// + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = null!; + /// + /// The variable to edit. If null, a new variable will be created. + /// + [Parameter] public Variable? Variable { get; set; } + [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; + [Inject] private IStorageDriverService StorageDriverService { get; set; } = null!; + [Inject] private IVariableTypeService VariableTypeService { get; set; } = null!; + [Inject] private IIdentityGenerator IdentityGenerator { get; set; } = null!; + + /// + protected override async Task OnParametersSetAsync() + { + // Instantiate the edit context first, so that it is available when rendering (which happens as soon as we call an async method on the next lines). + _editContext = new(_model); + _validator = new(WorkflowDefinition, Localizer); + + _storageDriverDescriptors = (await StorageDriverService.GetStorageDriversAsync()).OrderByDescending(x => x.Priority).ToList(); + _variableTypes = (await VariableTypeService.GetVariableTypesAsync()).ToList(); + _groupedVariableTypes = _variableTypes.GroupBy(x => x.Category).ToList(); + + if (Variable == null) + { + _model.Id = IdentityGenerator.GenerateId(); + _model.Name = GetNewVariableName(WorkflowDefinition.Variables); + _model.StorageDriver = _storageDriverDescriptors.First(); + _model.VariableType = _variableTypes.First(); + } + else + { + _model.Id = Variable.Id; + _model.Name = Variable.Name; + _model.VariableType = _variableTypes.FirstOrDefault(x => x.TypeName == Variable.TypeName) ?? _variableTypes.First(); + _model.DefaultValue = Variable.Value?.ToString() ?? ""; + _model.IsArray = Variable.IsArray; + _model.StorageDriver = _storageDriverDescriptors.FirstOrDefault(x => x.TypeName == Variable.StorageDriverTypeName) ?? _storageDriverDescriptors.First(); + } + } + + private string GetNewVariableName(ICollection existingVariables) + { + var count = 0; + + while (true) + { + var variableName = $"Variable{++count}"; + + if (existingVariables.All(x => x.Name != variableName)) + return variableName; + } + } + + private Task OnCancelClicked() + { + MudDialog.Cancel(); + return Task.CompletedTask; + } + + private async Task OnSubmitClicked() + { + if (!await _fluentValidationValidator.ValidateAsync()) + return; + + await OnValidSubmit(); + } + + private Task OnValidSubmit() + { + var variable = Variable ?? new Variable(); + + variable.Id = _model.Id; + variable.Name = _model.Name; + variable.TypeName = _model.VariableType.TypeName; + variable.Value = _model.DefaultValue; + variable.IsArray = _model.IsArray; + variable.StorageDriverTypeName = _model.StorageDriver.TypeName; + + MudDialog.Close(variable); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor new file mode 100644 index 0000000..892c733 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor @@ -0,0 +1,60 @@ +@using Variant = MudBlazor.Variant +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@inherits StudioComponentBase + + + + @Localizer["Variables"] + + + + @Localizer["Add variable"] + + + @if (!Variables.Any()) + { + @Localizer["There are currently no variables defined."] + } + else + { + + + + + @Localizer["Name"] + @Localizer["Type"] + @Localizer["Storage"] + + + + + + @foreach (var variable in Variables) + { + var storageDescriptor = variable.StorageDriverTypeName != null ? GetStorageDriverDescriptor(variable.StorageDriverTypeName) : default; + var storageDriverName = storageDescriptor != null ? storageDescriptor.DisplayName : @Localizer["None"]; + + @variable.Name + @variable.GetTypeDisplayName() + @storageDriverName + + + @Localizer["Edit"] + @Localizer["Delete"] + + + + } + + + + } + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor.cs new file mode 100644 index 0000000..1e6d41e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Components/VariablesTab.razor.cs @@ -0,0 +1,98 @@ +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components.Outputs; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Components; + +public partial class VariablesTab +{ + private ICollection _storageDriverDescriptors = new List(); + + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } + [CascadingParameter] public IWorkspace? Workspace { get; set; } + [Inject] IStorageDriverService StorageDriverService { get; set; } = default!; + [Inject] IDialogService DialogService { get; set; } = default!; + + private bool IsReadOnly => Workspace?.IsReadOnly ?? true; + private ICollection Variables => WorkflowDefinition.Variables; + + protected override async Task OnInitializedAsync() + { + _storageDriverDescriptors = (await StorageDriverService.GetStorageDriversAsync()).ToList(); + } + + private StorageDriverDescriptor? GetStorageDriverDescriptor(string typeName) + { + return _storageDriverDescriptors.FirstOrDefault(x => x.TypeName == typeName); + } + + private async Task RaiseWorkflowDefinitionUpdatedAsync() + { + if (WorkflowDefinitionUpdated.HasDelegate) + await WorkflowDefinitionUpdated.InvokeAsync(); + } + + private async Task OpenVariableEditorDialog(Variable? variable) + { + var isNew = variable == null; + + var parameters = new DialogParameters + { + [nameof(EditVariableDialog.WorkflowDefinition)] = WorkflowDefinition + }; + + if (!isNew) + parameters[nameof(EditVariableDialog.Variable)] = variable; + + var options = new DialogOptions + { + MaxWidth = MaxWidth.Medium, + FullWidth = true, + CloseButton = true, + CloseOnEscapeKey = true + }; + + var title = variable == null ? Localizer["Create variable"] : Localizer["Edit variable"]; + var dialog = await DialogService.ShowAsync(title, parameters, options); + var result = await dialog.Result; + + if (result.Canceled) + return; + + if (isNew) + { + variable = (Variable)result.Data; + WorkflowDefinition.Variables.Add(variable); + } + + await RaiseWorkflowDefinitionUpdatedAsync(); + } + + private async Task OnEditClicked(Variable variable) + { + await OpenVariableEditorDialog(variable); + } + + private async Task OnDeleteClicked(Variable variable) + { + var result = await DialogService.ShowMessageBox(Localizer["Delete selected variable?"], Localizer["Are you sure you want to delete the selected variable?"], yesText: Localizer["Delete"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + WorkflowDefinition.Variables.Remove(variable); + + await RaiseWorkflowDefinitionUpdatedAsync(); + } + + private async Task OnAddVariableClicked() + { + await OpenVariableEditorDialog(null); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Models/VariableModel.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Models/VariableModel.cs new file mode 100644 index 0000000..3ad494c --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Models/VariableModel.cs @@ -0,0 +1,14 @@ +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.VariableTypes.Models; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Models; + +public class VariableModel +{ + public string Id { get; set; } = default!; + public string Name { get; set; } = default!; + public VariableTypeDescriptor VariableType { get; set; } = default!; + public bool IsArray { get; set; } + public string? DefaultValue { get; set; } + public StorageDriverDescriptor StorageDriver { get; set; } = default!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Validators/VariableModelValidator.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Validators/VariableModelValidator.cs new file mode 100644 index 0000000..9d9fd80 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/Variables/Validators/VariableModelValidator.cs @@ -0,0 +1,26 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Models; +using FluentValidation; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Validators; + +/// +/// Validates a variable model. +/// +public class VariableModelValidator : AbstractValidator +{ + public VariableModelValidator(WorkflowDefinition workflowDefinition, ILocalizer localizer) + { + RuleFor(x => x.Name).NotEmpty().WithMessage(localizer["Please enter a name for the variable."]); + + RuleFor(x => x.Name) + .Must((context, name, cancellationToken) => + { + var existingVariable = workflowDefinition.Variables.FirstOrDefault(x => x.Name == name && x.Id != context.Id); + return existingVariable == null || existingVariable.Id == context.Name; + }) + .WithMessage(localizer["A variable with this name already exists in the current scope."]); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor new file mode 100644 index 0000000..9dd5d68 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor @@ -0,0 +1,60 @@ +@using Elsa.Api.Client.Resources.WorkflowDefinitions.Models +@using Variant = MudBlazor.Variant +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@inherits StudioComponentBase +
+ + @Localizer["Version history"] + + + @Localizer["Delete"] + + + + + @Localizer["Published"] + @Localizer["Version"] + @Localizer["Created"] + + + + + @if (context.IsPublished) + { + + } + + @context.Version + @context.CreatedAt.ToString("g") + + + @Localizer["View"] + @Localizer["Rollback to this version"] + @Localizer["Delete"] + + + + + + + + + + +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor.cs new file mode 100644 index 0000000..6e3cae3 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/Tabs/VersionHistory/VersionHistoryTab.razor.cs @@ -0,0 +1,144 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Enums; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Domain.Notifications; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.VersionHistory; + +/// Represents a tab in the version history section of a workflow definition workspace. +public partial class VersionHistoryTab : IDisposable +{ + /// Gets or sets the definition ID. + [Parameter] public string DefinitionId { get; set; } = default!; + + [CascadingParameter] private WorkflowDefinitionWorkspace Workspace { get; set; } = default!; + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = default!; + [Inject] private IWorkflowDefinitionHistoryService WorkflowDefinitionHistoryService { get; set; } = default!; + [Inject] private IDialogService DialogService { get; set; } = default!; + [Inject] private IMediator Mediator { get; set; } = default!; + + private HashSet SelectedDefinitions { get; set; } = new(); + private MudTable Table { get; set; } = default!; + private bool IsReadOnly => Workspace.IsReadOnly; + private bool HasWorkflowEditPermission => Workspace.HasWorkflowEditPermission; + private long _recordCount = 0; + + /// + protected override void OnInitialized() + { + Workspace.WorkflowDefinitionUpdated += OnWorkflowDefinitionUpdated; + } + + void IDisposable.Dispose() + { + Workspace.WorkflowDefinitionUpdated -= OnWorkflowDefinitionUpdated; + } + + private async Task> LoadVersionsAsync(TableState tableState, CancellationToken cancellationToken) + { + var page = tableState.Page; + var pageSize = tableState.PageSize; + + var request = new ListWorkflowDefinitionsRequest + { + DefinitionIds = [DefinitionId], + OrderDirection = OrderDirection.Descending, + OrderBy = OrderByWorkflowDefinition.Version, + Page = page, + PageSize = pageSize + }; + + var response = await WorkflowDefinitionService.ListAsync(request, VersionOptions.All); + + _recordCount = response.TotalCount; + return new TableData + { + Items = response.Items, + TotalItems = (int)response.TotalCount + }; + } + + private async Task ViewVersionAsync(WorkflowDefinitionSummary workflowDefinitionSummary) + { + var workflowDefinition = (await WorkflowDefinitionService.FindByIdAsync(workflowDefinitionSummary.Id))!; + await Workspace.DisplayWorkflowDefinitionVersionAsync(workflowDefinition); + } + + private async Task ReloadTableAsync() + { + await Table.ReloadServerData(); + } + + private bool CanRollback(WorkflowDefinitionSummary workflowDefinitionSummary) + { + return HasWorkflowEditPermission && workflowDefinitionSummary is { IsLatest: false }; + } + + private bool CanDelete(WorkflowDefinitionSummary workflowDefinitionSummary) + { + return HasWorkflowEditPermission && _recordCount > 1; + } + + private async Task OnWorkflowDefinitionUpdated() => await ReloadTableAsync(); + + private async Task OnViewClicked(WorkflowDefinitionSummary workflowDefinitionSummary) + { + await ViewVersionAsync(workflowDefinitionSummary); + } + + private async Task OnDeleteClicked(WorkflowDefinitionSummary workflowDefinitionSummary) + { + var confirmed = await DialogService.ShowMessageBox(Localizer["Delete version {0}", workflowDefinitionSummary.Version], Localizer["Are you sure you want to delete this version?"]); + + if (confirmed != true) + return; + + var workflowDefinitionVersion = WorkflowDefinitionVersion.FromDefinitionSummary(workflowDefinitionSummary); + await WorkflowDefinitionService.DeleteVersionAsync(workflowDefinitionVersion); + await ReloadTableAsync(); + + if (Workspace.IsSelectedDefinition(workflowDefinitionVersion.WorkflowDefinitionVersionId)) + await Workspace.DisplayLatestWorkflowDefinitionVersionAsync(); + } + + private async Task OnRowClick(TableRowClickEventArgs arg) + { + await ViewVersionAsync(arg.Item); + } + + private async Task OnBulkDeleteClicked() + { + var confirmed = await DialogService.ShowMessageBox(Localizer["Delete selected versions"], Localizer["Are you sure you want to delete the selected versions?"]); + + if (confirmed != true) + return; + + var definitionVersions = SelectedDefinitions.Select(WorkflowDefinitionVersion.FromDefinitionSummary).ToList(); + await WorkflowDefinitionService.BulkDeleteVersionsAsync(definitionVersions); + await ReloadTableAsync(); + + var selectedDefinition = Workspace.GetSelectedDefinition(); + if (selectedDefinition != null && definitionVersions.Any(x => x.WorkflowDefinitionVersionId == selectedDefinition.Id)) + await Workspace.DisplayLatestWorkflowDefinitionVersionAsync(); + } + + private async Task OnRollbackClicked(WorkflowDefinitionSummary workflowDefinitionSummary) + { + var definitionVersionId = workflowDefinitionSummary.Id; + var definitionId = workflowDefinitionSummary.DefinitionId; + var version = workflowDefinitionSummary.Version; + var revertingVersion = new WorkflowDefinitionVersion(definitionId, definitionVersionId, version); + var newDefinitionVersion = await WorkflowDefinitionHistoryService.RevertAsync(revertingVersion); + await ReloadTableAsync(); + var newWorkflowDefinition = (await WorkflowDefinitionService.FindByIdAsync(newDefinitionVersion.Id))!; + await Workspace.DisplayWorkflowDefinitionVersionAsync(newWorkflowDefinition); + await Mediator.NotifyAsync(new WorkflowDefinitionReverted(newWorkflowDefinition)); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor new file mode 100644 index 0000000..f9483ce --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor @@ -0,0 +1,23 @@ +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Variables.Components +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.InputOutput.Components +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.VersionHistory +@using Elsa.Studio.Workflows.Shared.Args +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@inherits StudioComponentBase + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor.cs new file mode 100644 index 0000000..cf4c0d5 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/Components/WorkflowProperties/WorkflowProperties.razor.cs @@ -0,0 +1,10 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties; + +public partial class WorkflowProperties +{ + [Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!; + [Parameter] public EventCallback WorkflowDefinitionUpdated { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.razor new file mode 100644 index 0000000..f491667 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.razor @@ -0,0 +1,69 @@ +@using System.Text.Json.Nodes +@using Orientation = Radzen.Orientation +@using Elsa.Studio.Workflows.Models +@using Elsa.Api.Client.Resources.WorkflowDefinitions.Models +@using Elsa.Api.Client.Shared.Models +@using Elsa.Studio.Workflows.Domain.Contracts +@using Elsa.Studio.Workflows.Extensions +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +@inject IWorkflowDefinitionService WorkflowDefinitionService + +@if (IsReadOnly) +{ + @Localizer["Unable to make changes as the workflow or application is currently in read-only mode"]. +} + + + + + + + + + + + + +@code +{ + private readonly DragDropManager _dragDropManager = new(); + private WorkflowDefinition? _workflowDefinition; + private WorkflowDefinitionWorkspace WorkflowDefinitionWorkspace { get; set; } = null!; + + /// The ID of the workflow definition to load. + [Parameter] public string DefinitionId { get; set; } = null!; + + /// Gets or sets the event that occurs when the workflow definition version is updated. + [Parameter] public Func? WorkflowDefinitionVersionSelected { get; set; } + + /// Gets or sets the event triggered when an activity is selected. + [Parameter] public Func? ActivitySelected { get; set; } + + /// Gets the currently selected workflow definition version. + public WorkflowDefinition? GetSelectedWorkflowDefinitionVersion() => WorkflowDefinitionWorkspace.GetSelectedWorkflowDefinitionVersion(); + + /// An event that is invoked when a workflow definition has been executed. + /// The ID of the workflow instance is provided as the value to the event callback. + [Parameter] public Func? WorkflowDefinitionExecuted { get; set; } + + /// Gets the currently selected activity ID. + public string? SelectedActivityId => WorkflowDefinitionWorkspace.SelectedActivityId; + + /// Gets a value that indicates if the workflow definition editor should be displayed in readonly mode. + private bool IsReadOnly => _workflowDefinition.GetIsReadOnly(); + + /// + protected override async Task OnParametersSetAsync() + { + _workflowDefinition = await WorkflowDefinitionService.FindByDefinitionIdAsync(DefinitionId, VersionOptions.Latest); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor new file mode 100644 index 0000000..7c4c3c7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor @@ -0,0 +1,20 @@ +@using Variant = MudBlazor.Variant +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + + + + + + + + + + + + + @Localizer["Cancel"] + @Localizer["Ok"] + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor.cs new file mode 100644 index 0000000..ac423f4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/CreateWorkflowDialog.razor.cs @@ -0,0 +1,56 @@ +using Blazored.FluentValidation; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.Validators; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionList; + +/// +/// A dialog that allows the user to create a new workflow. +/// +public partial class CreateWorkflowDialog +{ + private readonly WorkflowMetadataModel _metadataModel = new(); + private EditContext _editContext = null!; + private WorkflowPropertiesModelValidator _validator = null!; + private FluentValidationValidator _fluentValidationValidator = null!; + + /// + /// The name of the workflow to create. + /// + [Parameter] public string WorkflowName { get; set; } = "New workflow"; + [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = null!; + + /// + protected override void OnParametersSet() + { + _metadataModel.Name = WorkflowName; + _editContext = new(_metadataModel); + _validator = new(WorkflowDefinitionService, Localizer); + } + + private Task OnCancelClicked() + { + MudDialog.Cancel(); + return Task.CompletedTask; + } + + private async Task OnSubmitClicked() + { + if(!await _fluentValidationValidator.ValidateAsync()) + return; + + await OnValidSubmit(); + } + + private Task OnValidSubmit() + { + MudDialog.Close(_metadataModel); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor new file mode 100644 index 0000000..b8d8b16 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor @@ -0,0 +1,142 @@ +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@using Variant = MudBlazor.Variant +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + +@if (IsReadOnlyMode) +{ + @Localizer["You are running in read-only mode. Workflow operations are disabled"]. +} + + + + +
+ +
+ + + + + @Localizer["Delete"] + @Localizer["Publish"] + @Localizer["Unpublish"] + @Localizer["Export"] + + + + + + + @Localizer["Create workflow"] + + + @Localizer["Import"] + + + + + + + @Localizer["Definition ID"] + + + @Localizer["Name"] + + + @Localizer["Latest version"] + + + @Localizer["Published version"] + + + @Localizer["Description"] + + + + + @context.DefinitionId + + +
+ @context.Name +
+
+
+ @context.LatestVersion + @(context.PublishedVersion?.ToString() ?? "-") + + +
+ @context.Description +
+
+
+ + + @if (!IsReadOnlyMode && !context.IsReadOnlyMode) + { + @Localizer["Edit"] + } + else + { + @Localizer["View"] + } + @Localizer["Run"] + @Localizer["Delete"] + @Localizer["Cancel"] + + @Localizer["Publish"] + @Localizer["Unpublish"] + + @Localizer["Export"] + + + +
+ + @Localizer["No workflow definitions found"] + + + @Localizer["Loading"]... + + + + +
+
+ + diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor.cs new file mode 100644 index 0000000..3aaebd8 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowDefinitionList/WorkflowDefinitionList.razor.cs @@ -0,0 +1,402 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Enums; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Requests; +using Elsa.Api.Client.Resources.WorkflowInstances.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Models; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.JSInterop; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionList; + +/// Displays a list of workflow definitions. +public partial class WorkflowDefinitionList +{ + private MudTable _table = null!; + private HashSet _selectedRows = new(); + private long _totalCount; + + /// An event that is invoked when a workflow definition is edited. + [Parameter] public EventCallback EditWorkflowDefinition { get; set; } + + [Inject] private IDialogService DialogService { get; set; } = default!; + [Inject] private NavigationManager navigation { get; set; } + [Inject] private ISnackbar Snackbar { get; set; } = default!; + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = default!; + [Inject] private IWorkflowInstanceService WorkflowInstanceService { get; set; } = default!; + [Inject] private IWorkflowDefinitionImporter WorkflowDefinitionImporter { get; set; } = default!; + [Inject] private IFiles Files { get; set; } = default!; + [Inject] private IDomAccessor DomAccessor { get; set; } = default!; + [Inject] private IMediator Mediator { get; set; } = default!; + private string SearchTerm { get; set; } = string.Empty; + private bool IsReadOnlyMode { get; set; } + private string ReadonlyWorkflowsExcluded => Localizer["The read-only workflows will not be affected."]; + + private async Task> ServerReload(TableState state, CancellationToken cancellationToken) + { + var request = new ListWorkflowDefinitionsRequest + { + IsSystem = false, + Page = state.Page, + PageSize = state.PageSize, + SearchTerm = SearchTerm, + OrderBy = GetOrderBy(state.SortLabel), + OrderDirection = state.SortDirection == SortDirection.Descending + ? OrderDirection.Descending + : OrderDirection.Ascending + }; + + var latestWorkflowDefinitionsResponse = await WorkflowDefinitionService.ListAsync(request, VersionOptions.Latest); + IsReadOnlyMode = (latestWorkflowDefinitionsResponse?.Links?.Count(l => l.Rel == "bulk-publish") ?? 0) == 0; + var unpublishedWorkflowDefinitionIds = latestWorkflowDefinitionsResponse.Items.Where(x => !x.IsPublished).Select(x => x.DefinitionId).ToList(); + + var publishedWorkflowDefinitions = await WorkflowDefinitionService.ListAsync(new ListWorkflowDefinitionsRequest + { + DefinitionIds = unpublishedWorkflowDefinitionIds, + }, VersionOptions.Published); + + _totalCount = latestWorkflowDefinitionsResponse.TotalCount; + + var workflowDefinitionRows = latestWorkflowDefinitionsResponse.Items + .Select(definition => + { + var latestVersionNumber = definition.Version; + var isPublished = definition.IsPublished; + var publishedVersion = isPublished + ? definition + : publishedWorkflowDefinitions.Items.FirstOrDefault(x => x.DefinitionId == definition.DefinitionId); + var publishedVersionNumber = publishedVersion?.Version; + + return new WorkflowDefinitionRow( + definition.Id, + definition.DefinitionId, + latestVersionNumber, + publishedVersionNumber, + definition.Name, + definition.Description, + definition.IsPublished, + (definition?.Links?.Count(l => l.Rel == "publish") ?? 0) == 0); + }) + .ToList(); + + return new TableData + { + TotalItems = (int)_totalCount, + Items = workflowDefinitionRows + }; + } + + private OrderByWorkflowDefinition? GetOrderBy(string sortLabel) + { + return sortLabel switch + { + "Name" => OrderByWorkflowDefinition.Name, + "Version" => OrderByWorkflowDefinition.Version, + "Created" => OrderByWorkflowDefinition.Created, + _ => null + }; + } + + private async Task OnCreateWorkflowClicked() + { + var workflowName = await WorkflowDefinitionService.GenerateUniqueNameAsync(); + + var parameters = new DialogParameters + { + { x => x.WorkflowName, workflowName } + }; + + var options = new DialogOptions + { + CloseOnEscapeKey = true, + Position = DialogPosition.Center, + CloseButton = true, + FullWidth = true, + MaxWidth = MaxWidth.Small + }; + + var dialogInstance = await DialogService.ShowAsync(Localizer["New workflow"], parameters, options); + var dialogResult = await dialogInstance.Result; + + if (!dialogResult.Canceled) + { + var newWorkflowModel = (WorkflowMetadataModel)dialogResult.Data; + var result = await WorkflowDefinitionService.CreateNewDefinitionAsync(newWorkflowModel.Name!, newWorkflowModel.Description!); + + await result.OnSuccessAsync(definition => EditAsync(definition.DefinitionId)); + result.OnFailed(errors => Snackbar.Add(string.Join(Environment.NewLine, errors.Errors))); + } + } + + private async Task EditAsync(string definitionId) + { + await EditWorkflowDefinition.InvokeAsync(definitionId); + } + + private void Reload() + { + _table.ReloadServerData(); + } + + private async Task OnEditClicked(string definitionId) + { + await EditAsync(definitionId); + } + + private async Task OnRowClick(TableRowClickEventArgs e) + { + await EditAsync(e.Item.DefinitionId); + } + + private async Task OnRunWorkflowClicked(WorkflowDefinitionRow workflowDefinitionRow) + { + var request = new ExecuteWorkflowDefinitionRequest + { + VersionOptions = VersionOptions.Latest + }; + + var definitionId = workflowDefinitionRow!.DefinitionId; + var response = await WorkflowDefinitionService.ExecuteAsync(definitionId, request); + + if (response.CannotStart) + { + Snackbar.Add(Localizer["The workflow cannot be started"], Severity.Error); + return; + } + + Snackbar.Add(Localizer["Successfully started workflow"], Severity.Success); + } + + private async Task OnDeleteClicked(WorkflowDefinitionRow workflowDefinitionRow) + { + var result = await DialogService.ShowMessageBox(Localizer["Delete workflow?"], + Localizer["Are you sure you want to delete this workflow?"], yesText: Localizer["Delete"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + var definitionId = workflowDefinitionRow.DefinitionId; + await WorkflowDefinitionService.DeleteAsync(definitionId); + Reload(); + } + + private async Task OnCancelClicked(WorkflowDefinitionRow workflowDefinitionRow) + { + var result = await DialogService.ShowMessageBox(Localizer["Cancel running workflow instances?"], + Localizer["Are you sure you want to cancel all running workflow instances of this workflow definition?"], yesText: Localizer["Yes"], cancelText: Localizer["No"]); + + if (result != true) + return; + + var request = new BulkCancelWorkflowInstancesRequest + { + DefinitionVersionId = workflowDefinitionRow.Id + }; + await WorkflowInstanceService.BulkCancelAsync(request); + Reload(); + } + + private async Task OnDownloadClicked(WorkflowDefinitionRow workflowDefinitionRow) + { + var download = await WorkflowDefinitionService.ExportDefinitionAsync(workflowDefinitionRow.DefinitionId, VersionOptions.Latest); + var fileName = $"{workflowDefinitionRow.Name.Kebaberize()}.json"; + await Files.DownloadFileFromStreamAsync(fileName, download.Content); + } + + private async Task OnBulkDeleteClicked() + { + var result = await DialogService.ShowMessageBox( + Localizer["Delete selected workflows?"], + Localizer["Are you sure you want to delete the selected workflows?"] + (_selectedRows.Count(w => w.IsReadOnlyMode) > 0 ? ReadonlyWorkflowsExcluded : ""), yesText: Localizer["Delete"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + var workflowDefinitionIds = _selectedRows.Select(x => x.DefinitionId).ToList(); + await WorkflowDefinitionService.BulkDeleteAsync(workflowDefinitionIds); + _selectedRows.Clear(); + Reload(); + } + + private async Task OnBulkPublishClicked() + { + var result = await DialogService.ShowMessageBox(Localizer["Publish selected workflows?"], + Localizer["Are you sure you want to publish the selected workflows?"] + (_selectedRows.Count(w => w.IsReadOnlyMode) > 0 ? ReadonlyWorkflowsExcluded : ""), yesText: Localizer["Publish"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + var workflowDefinitionIds = _selectedRows.Select(x => x.DefinitionId).ToList(); + var response = await WorkflowDefinitionService.BulkPublishAsync(workflowDefinitionIds); + + if (response.Published.Count > 0) + { + var message = response.Published.Count == 1 + ? Localizer["One workflow is published"] + : Localizer["{0} workflows are published", response.Published.Count]; + Snackbar.Add(message, Severity.Success, options => { options.SnackbarVariant = Variant.Filled; }); + } + + if (response.AlreadyPublished.Count > 0) + { + var message = response.AlreadyPublished.Count == 1 + ? Localizer["One workflow is already published"] + : Localizer["{0} workflows are already published", response.AlreadyPublished.Count]; + Snackbar.Add(message, Severity.Info, options => { options.SnackbarVariant = Variant.Filled; }); + } + + if (response.UpdatedConsumers.Count > 0) + { + var message = response.UpdatedConsumers.Count == 1 + ? Localizer["One workflow consuming a published workflow has been updated"] + : Localizer["{0} workflows consuming published workflows have been updated", response.UpdatedConsumers.Count]; + Snackbar.Add(message, Severity.Info, options => + { + options.SnackbarVariant = Variant.Filled; + options.VisibleStateDuration = 3000; + }); + } + + if (response.NotFound.Count > 0) + { + var message = response.NotFound.Count == 1 + ? Localizer["One workflow is not found"] + : Localizer["{0} workflows are not found", response.NotFound.Count]; + Snackbar.Add(message, Severity.Warning, options => { options.SnackbarVariant = Variant.Filled; }); + } + _selectedRows.Clear(); + Reload(); + } + + private async Task OnBulkRetractClicked() + { + var result = await DialogService.ShowMessageBox(Localizer["Unpublish selected workflows?"], + Localizer["Are you sure you want to unpublish the selected workflows?"] + (_selectedRows.Count(w => w.IsReadOnlyMode) > 0 ? ReadonlyWorkflowsExcluded : ""), yesText: Localizer["Unpublish"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + var workflowDefinitionIds = _selectedRows.Select(x => x.DefinitionId).ToList(); + var response = await WorkflowDefinitionService.BulkRetractAsync(workflowDefinitionIds); + + if (response.Retracted.Count > 0) + { + var message = response.Retracted.Count == 1 + ? Localizer["One workflow is unpublished"] + : Localizer["{0} workflows are unpublished", response.Retracted.Count]; + Snackbar.Add(message, Severity.Success, options => { options.SnackbarVariant = Variant.Filled; }); + } + + if (response.AlreadyRetracted.Count > 0) + { + var message = response.AlreadyRetracted.Count == 1 + ? Localizer["One workflow is already unpublished"] + : Localizer["{0} workflows are already unpublished", response.AlreadyRetracted.Count]; + Snackbar.Add(message, Severity.Info, options => { options.SnackbarVariant = Variant.Filled; }); + } + + if (response.NotFound.Count > 0) + { + var message = response.NotFound.Count == 1 + ? Localizer["One workflow is not found"] + : Localizer["{0} workflows are not found", response.NotFound.Count]; + Snackbar.Add(message, Severity.Warning, options => { options.SnackbarVariant = Variant.Filled; }); + } + _selectedRows.Clear(); + Reload(); + } + + private async Task OnBulkExportClicked() + { + var workflowVersionIds = _selectedRows.Select(x => x.Id).ToList(); + var download = await WorkflowDefinitionService.BulkExportDefinitionsAsync(workflowVersionIds); + var fileName = download.FileName; + await Files.DownloadFileFromStreamAsync(fileName, download.Content); + _selectedRows.Clear(); + Reload(); + } + + private Task OnImportClicked() + { + return DomAccessor.ClickElementAsync("#workflow-file-upload-button-wrapper input[type=file]"); + } + + private async Task OnFilesSelected(IReadOnlyList files) + { + var results = (await WorkflowDefinitionImporter.ImportFilesAsync(files)).ToList(); + var successfulResultCount = results.Count(x => x.IsSuccess); + var failedResultCount = results.Count(x => !x.IsSuccess); + var successfulWorkflowsTerm = successfulResultCount == 1 ? "workflow" : "workflows"; + var failedWorkflowsTerm = failedResultCount == 1 ? Localizer["workflow"] : Localizer["workflows"]; + var message = results.Count == 0 ? Localizer["No workflows found to import."] : + successfulResultCount > 0 && failedResultCount == 0 ? Localizer["{0} {1} imported successfully.", successfulResultCount, successfulWorkflowsTerm] : + successfulResultCount == 0 && failedResultCount > 0 ? Localizer["Failed to import {0} {1}.", failedResultCount, failedWorkflowsTerm] : Localizer["{0} {1} imported successfully.", successfulResultCount, successfulWorkflowsTerm] + " " + Localizer["Failed to import {0} {1}.", failedResultCount, failedWorkflowsTerm]; + var severity = results.Count == 0 ? Severity.Info : successfulResultCount > 0 && failedResultCount > 0 ? Severity.Warning : failedResultCount == 0 ? Severity.Success : Severity.Error; + Snackbar.Add(message, severity, options => + { + options.SnackbarVariant = Variant.Filled; + options.CloseAfterNavigation = failedResultCount > 0; + options.VisibleStateDuration = failedResultCount > 0 ? 10000 : 3000; + }); + Reload(); + } + + private void OnSearchTermChanged(string text) + { + if (SearchTerm != text) + { + SearchTerm = text; + Reload(); + } + } + + private async Task OnPublishClicked(string definitionId) + { + var response = await WorkflowDefinitionService.PublishAsync(definitionId); + if (response.AlreadyPublished) + { + Snackbar.Add(Localizer["Workflow was already published"], Severity.Info, options => { options.SnackbarVariant = Variant.Filled; }); + } + else + { + Snackbar.Add(Localizer["Workflow published"], Severity.Success, options => { options.SnackbarVariant = Variant.Filled; }); + } + + if (response.ConsumingWorkflowCount > 0) + { + var message = response.ConsumingWorkflowCount == 1 + ? Localizer["One workflow consuming a published workflow has been updated"] + : Localizer["{0} workflows consuming published workflows have been updated", response.ConsumingWorkflowCount]; + Snackbar.Add(message, Severity.Info, options => + { + options.SnackbarVariant = Variant.Filled; + options.VisibleStateDuration = 3000; + }); + } + + Reload(); + } + + private async Task OnRetractClicked(string definitionId) + { + await WorkflowDefinitionService.RetractAsync(definitionId); + Snackbar.Add(Localizer["Workflow retracted"], Severity.Success, options => { options.SnackbarVariant = Variant.Filled; }); + Reload(); + } + + private record WorkflowDefinitionRow( + string Id, + string DefinitionId, + int LatestVersion, + int? PublishedVersion, + string? Name, + string? Description, + bool IsPublished, + bool IsReadOnlyMode); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor new file mode 100644 index 0000000..841302a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor @@ -0,0 +1,15 @@ + + + @MudDialog.Title + + + + Are you sure you want to cancel the selected workflow instances? + + + + + No + Yes + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor.cs new file mode 100644 index 0000000..3f39bd7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Components/BulkCancelDialog.razor.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceList.Components; + +public partial class BulkCancelDialog : ComponentBase +{ + private bool ApplyToAllMatches { get; set; } + [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; + + private void Submit() => MudDialog.Close(DialogResult.Ok(ApplyToAllMatches)); + + private void Cancel() => MudDialog.Close(DialogResult.Cancel()); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/TimestampFilter.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/TimestampFilter.cs new file mode 100644 index 0000000..e79fdcc --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/TimestampFilter.cs @@ -0,0 +1,30 @@ +using Elsa.Api.Client.Shared.Enums; +using JetBrains.Annotations; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceList.Models; + +/// +/// Represents a timestamp filter used for filtering data based on a specified timestamp column and operator. +/// +public class TimestampFilterModel +{ + /// + /// Gets or sets the column to filter by. + /// + public string Column { get; set; } = default!; + + /// + /// Gets or sets the operator to use for filtering. + /// + public TimestampFilterOperator Operator { get; set; } + + /// + /// Gets or sets the date to filter by. + /// + public string Date { get; set; } + + /// + /// Gets or sets the time to filter by. + /// + public string? Time { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/WorkflowInstanceRow.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/WorkflowInstanceRow.cs new file mode 100644 index 0000000..f2215ba --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/Models/WorkflowInstanceRow.cs @@ -0,0 +1,18 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceList.Models; + +internal record WorkflowInstanceRow( + string WorkflowInstanceId, + string? CorrelationId, + string WorkflowDefinitionName, + int Version, + string? Name, + WorkflowStatus Status, + WorkflowSubStatus SubStatus, + int IncidentCount, + DateTimeOffset CreatedAt, + DateTimeOffset? UpdatedAt, + DateTimeOffset? FinishedAt +); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor new file mode 100644 index 0000000..cb9e638 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor @@ -0,0 +1,302 @@ +@inherits StudioComponentBase + +@using System.Globalization +@using Elsa.Api.Client.Resources.WorkflowDefinitions.Models +@using Elsa.Api.Client.Resources.WorkflowInstances.Enums +@using Elsa.Api.Client.Resources.WorkflowInstances.Models +@using Elsa.Api.Client.Shared.Enums +@using Elsa.Studio.Workflows.Components.WorkflowInstanceList.Models +@using Elsa.Studio.Workflows.Services +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + +@using AlignItems = MudBlazor.AlignItems +@using Variant = MudBlazor.Variant + +@Localizer["Workflow instances"] + + + + +
+ +
+ + + + + + @Localizer["Delete"] + @Localizer["Cancel"] + @* @Localizer["Retry"] *@ + @* Export *@ + + @Localizer["Import"] + + + + + + - + @Localizer["Yes"] + @Localizer["No"] + + + + + + + + + @Localizer["Running"] + @Localizer["Finished"] + + + + @Localizer["Executing"] + @Localizer["Suspended"] + @Localizer["Finished"] + @Localizer["Faulted"] + @Localizer["Cancelled"] + + + + + @Localizer["Date Filters"] + + + + + + @foreach (var timestampFilter in TimestampFilters) + { + + + + + + + + } + +
+ + + + @Localizer["Created"] + @Localizer["Updated"] + @Localizer["Finished"] + + + + @Localizer["Is"] + @Localizer["Is Not"] + @Localizer["Is After"] + @Localizer["Is on or After"] + @Localizer["Is Before"] + @Localizer["Is on or Before"] + + + + + + @* *@ +
+ + @Localizer["Add"] + @Localizer["Clear"] + + @Localizer["Apply"] + @Localizer["Close"] + +
+
+ + @Localizer["ID"] + @Localizer["Correlation ID"] + @Localizer["Workflows"] + @Localizer["Version"] + + @Localizer["Name"] + + + @Localizer["Status"] + + + @Localizer["Incidents"] + + + @Localizer["Created"] + + + @Localizer["Updated"] + + + @Localizer["Finished"] + + + + + @context.WorkflowInstanceId + + +
+ @context.CorrelationId +
+
+
+ + +
+ @context.WorkflowDefinitionName +
+
+
+ @context.Version + + +
+ @context.Name +
+
+
+ + + @Localizer[context.SubStatus.ToString()] + + + + + + + + + + + @Localizer["View"] + @Localizer["Delete"] + @Localizer["Cancel"] + @* Disabled until we fix an issue with Workflow Instance Exports. *@ + @* *@ + @* Export *@ + + +
+ + @Localizer["No workflow instances found"] + + + @Localizer["Loading"]... + + + + +
+
+ + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor.cs new file mode 100644 index 0000000..24831d0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceList/WorkflowInstanceList.razor.cs @@ -0,0 +1,438 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.Alterations.Contracts; +using Elsa.Api.Client.Resources.Alterations.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; +using Elsa.Api.Client.Resources.WorkflowInstances.Requests; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Contracts; +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.Workflows.Components.WorkflowInstanceList.Components; +using Elsa.Studio.Workflows.Components.WorkflowInstanceList.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Forms; +using MudBlazor; +using Refit; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Microsoft.Extensions.Logging; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceList; + +/// Represents the workflow instances list page. +public partial class WorkflowInstanceList : IAsyncDisposable +{ + private MudTable _table = null!; + private HashSet _selectedRows = new(); + private int _totalCount; + private Timer? _elapsedTimer; + + /// + /// An event that is invoked when a workflow definition is edited. + /// + [Parameter] public EventCallback ViewWorkflowInstance { get; set; } + + [Inject] private IDialogService DialogService { get; set; } = null!; + [Inject] private ISnackbar Snackbar { get; set; } = null!; + [Inject] private IWorkflowInstanceService WorkflowInstanceService { get; set; } = null!; + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = null!; + [Inject] private IBackendApiClientProvider BackendApiClientProvider { get; set; } = null!; + [Inject] private IFiles Files { get; set; } = null!; + [Inject] private IDomAccessor DomAccessor { get; set; } = null!; + [Inject] private ILogger Logger { get; set; } = null!; + + private ICollection WorkflowDefinitions { get; set; } = new List(); + private ICollection SelectedWorkflowDefinitions { get; set; } = new List(); + + private string SearchTerm { get; set; } = string.Empty; + private bool? HasIncidents { get; set; } + private bool IsDateRangePopoverOpen { get; set; } + + /// The selected statuses to filter by. + private ICollection SelectedStatuses { get; set; } = new List(); + + /// The selected sub-statuses to filter by. + private ICollection SelectedSubStatuses { get; set; } = new List(); + + // The selected timestamp filters to filter by. + private ICollection TimestampFilters { get; set; } = new List(); + + + /// + protected override async Task OnInitializedAsync() + { + await LoadWorkflowDefinitionsAsync(); + + // Disable auto refresh until we implement a way to maintain the selected state, pagination etc. + //StartElapsedTimer(); + } + + private async Task LoadWorkflowDefinitionsAsync() + { + var workflowDefinitionsResponse = await WorkflowDefinitionService.ListAsync(new(), VersionOptions.LatestOrPublished); + var workflowDefinitions = workflowDefinitionsResponse.Items; + + // Filter the definitions to ensure only the one with the highest version for each DefinitionId remains + var filteredWorkflowDefinitions = workflowDefinitions + .GroupBy(definition => definition.DefinitionId) // Group by DefinitionId + .Select(group => group.OrderByDescending(definition => definition.Version).First()) // Get the highest version in each group + .ToList(); + + WorkflowDefinitions = filteredWorkflowDefinitions; + } + + private async Task> LoadData(TableState state, CancellationToken cancellationToken) + { + var request = new ListWorkflowInstancesRequest + { + Page = state.Page, + PageSize = state.PageSize, + DefinitionIds = SelectedWorkflowDefinitions.Select(x => x.DefinitionId).ToList(), + Statuses = SelectedStatuses, + SubStatuses = SelectedSubStatuses, + SearchTerm = SearchTerm, + HasIncidents = HasIncidents, + IsSystem = false, + OrderBy = GetOrderBy(state.SortLabel), + OrderDirection = state.SortDirection == SortDirection.Descending ? OrderDirection.Descending : OrderDirection.Ascending, + TimestampFilters = TimestampFilters.Select(Map).Where(x => x.Timestamp.Date > DateTime.MinValue && !string.IsNullOrWhiteSpace(x.Column)).ToList() + }; + + try + { + var workflowInstancesResponse = await WorkflowInstanceService.ListAsync(request, cancellationToken); + var definitionVersionIds = workflowInstancesResponse.Items.Select(x => x.DefinitionVersionId).Distinct().ToList(); + + var workflowDefinitionVersionsResponse = await WorkflowDefinitionService.ListAsync(new() + { + Ids = definitionVersionIds, + }, cancellationToken: cancellationToken); + + var workflowDefinitionVersionsLookup = workflowDefinitionVersionsResponse.Items.ToDictionary(x => x.Id); + + // Select any workflow instances for which no corresponding workflow definition version was found. + // This can happen when a workflow definition is deleted. + var missingWorkflowDefinitionVersionIds = definitionVersionIds.Except(workflowDefinitionVersionsLookup.Keys).ToList(); + var filteredWorkflowInstances = workflowInstancesResponse.Items.Where(x => !missingWorkflowDefinitionVersionIds.Contains(x.DefinitionVersionId)); + + var rows = filteredWorkflowInstances.Select(x => new WorkflowInstanceRow( + x.Id, + x.CorrelationId, + workflowDefinitionVersionsLookup[x.DefinitionVersionId]?.Name ?? "", + x.Version, + x.Name, + x.Status, + x.SubStatus, + x.IncidentCount, + x.CreatedAt, + x.UpdatedAt, + x.FinishedAt)); + + _totalCount = (int)workflowInstancesResponse.TotalCount; + return new() { TotalItems = _totalCount, Items = rows }; + } + catch (TaskCanceledException) + { + Logger.LogWarning("Failed to list workflow instances due to a cancellation."); + _totalCount = 0; + return new() { TotalItems = 0, Items = Array.Empty() }; + } + catch (ApiException ex) when (ex.InnerException is TaskCanceledException) + { + Logger.LogWarning("Failed to list workflow instances due to a cancellation."); + _totalCount = 0; + return new() { TotalItems = 0, Items = Array.Empty() }; + } + } + + private async Task> TryListWorkflowDefinitionsAsync(ListWorkflowInstancesRequest request, CancellationToken cancellationToken) + { + try + { + return await WorkflowInstanceService.ListAsync(request, cancellationToken); + } + catch (ApiException ex) when (ex.InnerException is TaskCanceledException) + { + Logger.LogWarning("Failed to list workflow instances due to a timeout."); + return new() + { + Items = [] + }; + } + } + + private TimestampFilter Map(TimestampFilterModel source) + { + var date = !string.IsNullOrWhiteSpace(source.Date) ? DateTime.Parse(source.Date) : DateTime.MinValue; + var time = !string.IsNullOrWhiteSpace(source.Time) ? TimeSpan.Parse(source.Time) : TimeSpan.Zero; + var dateTime = date.Add(time); + var timestamp = dateTime == DateTime.MinValue ? DateTimeOffset.MinValue : new(dateTime); + + return new() + { + Column = source.Column, + Operator = source.Operator, + Timestamp = timestamp + }; + } + + private OrderByWorkflowInstance? GetOrderBy(string sortLabel) + { + return sortLabel switch + { + "Name" => OrderByWorkflowInstance.Name, + "Finished" => OrderByWorkflowInstance.Finished, + "Created" => OrderByWorkflowInstance.Created, + "LastExecuted" => OrderByWorkflowInstance.LastExecuted, + _ => null + }; + } + + private async Task ViewAsync(string instanceId) + { + await ViewWorkflowInstance.InvokeAsync(instanceId); + } + + private void Reload() => _table.ReloadServerData(); + + private bool FilterWorkflowDefinitions(WorkflowDefinitionSummary workflowDefinition, string term) + { + var trimmedTerm = term.Trim(); + + if (string.IsNullOrEmpty(term)) + return true; + + var sources = new[] + { + (string?)workflowDefinition.Name + }; + + return sources.Any(x => x?.Contains(trimmedTerm, StringComparison.OrdinalIgnoreCase) == true); + } + + private Color GetSubStatusColor(WorkflowSubStatus subStatus) + { + return subStatus switch + { + WorkflowSubStatus.Pending => Color.Tertiary, + WorkflowSubStatus.Suspended => Color.Warning, + WorkflowSubStatus.Finished => Color.Success, + WorkflowSubStatus.Faulted => Color.Error, + WorkflowSubStatus.Cancelled => Color.Tertiary, + WorkflowSubStatus.Executing => Color.Primary, + _ => Color.Default, + }; + } + + private string? GetWorkflowDefinitionDisplayText(WorkflowDefinitionSummary? definition) + { + return definition?.Name; + } + + private void ToggleDateRangePopover() + { + IsDateRangePopoverOpen = !IsDateRangePopoverOpen; + } + + private void OnViewClicked(string instanceId) => _ = ViewAsync(instanceId); + private void OnRowClick(TableRowClickEventArgs e) => _ = ViewAsync(e.Item!.WorkflowInstanceId); + + private async Task OnDeleteClicked(WorkflowInstanceRow row) + { + var result = await DialogService.ShowMessageBox(Localizer["Delete workflow instance?"], Localizer["Are you sure you want to delete this workflow instance?"], yesText: Localizer["Delete"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + var instanceId = row.WorkflowInstanceId; + await WorkflowInstanceService.DeleteAsync(instanceId); + Reload(); + } + + private async Task OnCancelClicked(WorkflowInstanceRow row) + { + var result = await DialogService.ShowMessageBox(Localizer["Cancel workflow instance?"], Localizer["Are you sure you want to cancel this workflow instance?"], yesText: Localizer["Yes"], cancelText: Localizer["No"]); + + if (result != true) + return; + + var instanceId = row.WorkflowInstanceId; + await WorkflowInstanceService.CancelAsync(instanceId); + Reload(); + } + + private async Task OnDownloadClicked(WorkflowInstanceRow workflowInstanceRow) + { + var download = await WorkflowInstanceService.ExportAsync(workflowInstanceRow.WorkflowInstanceId); + var fileName = $"{workflowInstanceRow.Name?.Kebaberize() ?? workflowInstanceRow.WorkflowInstanceId}.json"; + await Files.DownloadFileFromStreamAsync(fileName, download.Content); + } + + private async Task OnBulkDeleteClicked() + { + var result = await DialogService.ShowMessageBox(Localizer["Delete selected workflow instances?"], Localizer["Are you sure you want to delete the selected workflow instances?"], yesText: Localizer["Delete"], cancelText: Localizer["Cancel"]); + + if (result != true) + return; + + var workflowInstanceIds = _selectedRows.Select(x => x.WorkflowInstanceId).ToList(); + await WorkflowInstanceService.BulkDeleteAsync(workflowInstanceIds); + _selectedRows.Clear(); + Reload(); + } + + private async Task OnBulkCancelClicked() + { + var reference = await DialogService.ShowAsync(Localizer["Cancel selected workflow instances?"]); + var dialogResult = await reference.Result; + + if (dialogResult == null || dialogResult.Canceled) + return; + + var applyToAllMatches = (bool)(dialogResult.Data ?? false); + + if (applyToAllMatches) + { + var cancel = new JsonObject + { + ["type"] = "Cancel" + }; + + var plan = new AlterationPlanParams + { + Alterations = [cancel], + Filter = new() + { + EmptyFilterSelectsAll = true, + HasIncidents = HasIncidents, + IsSystem = false, + SearchTerm = SearchTerm, + Statuses = SelectedStatuses.Any() ? SelectedStatuses : null, + SubStatuses = SelectedSubStatuses.Any() ? SelectedSubStatuses : null, + TimestampFilters = TimestampFilters.Any() ? TimestampFilters.Select(Map).Where(x => x.Timestamp.Date > DateTime.MinValue && !string.IsNullOrWhiteSpace(x.Column)).ToList() : null, + DefinitionIds = SelectedWorkflowDefinitions.Any() ? SelectedWorkflowDefinitions.Select(x => x.DefinitionId).ToList() : null + } + }; + + var alterationsApi = await BackendApiClientProvider.GetApiAsync(); + await alterationsApi.Submit(plan); + Snackbar.Add("Workflow instances are being cancelled.", Severity.Info, options => + { + options.SnackbarVariant = Variant.Filled; + options.ShowTransitionDuration = 2000; + }); + } + else + { + var workflowInstanceIds = _selectedRows.Select(x => x.WorkflowInstanceId).ToList(); + var request = new BulkCancelWorkflowInstancesRequest + { + Ids = workflowInstanceIds + }; + await WorkflowInstanceService.BulkCancelAsync(request); + } + + Reload(); + } + + private Task OnImportClicked() + { + return DomAccessor.ClickElementAsync("#instance-file-upload-button-wrapper input[type=file]"); + } + + private async Task OnFilesSelected(IReadOnlyList files) + { + var maxAllowedSize = 1024 * 1024 * 10; // 10 MB + var streamParts = files.Select(x => new StreamPart(x.OpenReadStream(maxAllowedSize), x.Name, x.ContentType)).ToList(); + var count = await WorkflowInstanceService.BulkImportAsync(streamParts); + var message = count == 1 ? Localizer["Successfully imported one instance"] : Localizer["Successfully imported {0} instances", count]; + Snackbar.Add(message, Severity.Success, options => { options.SnackbarVariant = Variant.Filled; }); + Reload(); + } + + private async Task OnBulkExportClicked() + { + var workflowInstanceIds = _selectedRows.Select(x => x.WorkflowInstanceId).ToList(); + var download = await WorkflowInstanceService.BulkExportAsync(workflowInstanceIds); + var fileName = download.FileName; + await Files.DownloadFileFromStreamAsync(fileName, download.Content); + } + + private async Task OnSelectedWorkflowDefinitionsChanged(IEnumerable values) + { + SelectedWorkflowDefinitions = values.ToList(); + await _table.ReloadServerData(); + } + + private async Task OnSelectedStatusesChanged(IEnumerable values) + { + SelectedStatuses = values.ToList(); + await _table.ReloadServerData(); + } + + private async Task OnSelectedSubStatusesChanged(IEnumerable values) + { + SelectedSubStatuses = values.ToList(); + await _table.ReloadServerData(); + } + + private async Task OnSearchTermChanged(string text) + { + if (text != SearchTerm) + { + SearchTerm = text; + await _table.ReloadServerData(); + } + } + + private async Task OnHasIncidentsChanged(bool? value) + { + HasIncidents = value; + await _table.ReloadServerData(); + } + + private void OnAddTimestampFilterClicked() + { + TimestampFilters.Add(new()); + StateHasChanged(); + } + + private void OnRemoveTimestampFilterClicked(TimestampFilterModel filter) + { + TimestampFilters.Remove(filter); + StateHasChanged(); + } + + private void OnClearTimestampFiltersClicked() + { + TimestampFilters.Clear(); + StateHasChanged(); + } + + private async Task OnApplyTimestampFiltersClicked() + { + await _table.ReloadServerData(); + ToggleDateRangePopover(); + } + + private void StartElapsedTimer() + { + _elapsedTimer ??= new(_ => InvokeAsync(async () => await _table.ReloadServerData()), null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + } + + private void StopElapsedTimer() + { + if (_elapsedTimer != null) + { + _elapsedTimer.Dispose(); + _elapsedTimer = null; + } + } + + ValueTask IAsyncDisposable.DisposeAsync() + { + StopElapsedTimer(); + return ValueTask.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor new file mode 100644 index 0000000..9a5739b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor @@ -0,0 +1,51 @@ +@inherits StudioComponentBase +@inject ILocalizer Localizer + + + +
+ @Localizer["Activity"] + +
+ + @if (ActivityData.Any()) + { +
+ @Localizer["State"] + +
+ } + + @if (OutcomesData.Any()) + { +
+ @Localizer["Outcomes"] + +
+ } + + @if (OutputData.Any()) + { +
+ @Localizer["Output"] + +
+ } + + @if (ExceptionData.Any()) + { +
+ @Localizer["Fault"] + +
+ } + + @if (ResilienceStrategyData.Any()) + { +
+ @Localizer["Resilience Strategy"] + +
+ } +
+
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor.cs new file mode 100644 index 0000000..74499f4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityDetailsTab.razor.cs @@ -0,0 +1,153 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityExecutions.Models; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// Displays the details of an activity. +public partial class ActivityDetailsTab +{ + /// The height of the visible pane. + [Parameter] public int VisiblePaneHeight { get; set; } + + /// The activity to display details for. + [Parameter] public JsonObject Activity { get; set; } = null!; + + /// The latest activity execution record. Used for displaying the last state of the activity. + [Parameter] public ActivityExecutionRecord? LastActivityExecution { get; set; } + + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = null!; + + private DataPanelModel ActivityInfo { get; set; } = new(); + private DataPanelModel ActivityData { get; set; } = new(); + private DataPanelModel OutcomesData { get; set; } = new(); + private DataPanelModel OutputData { get; set; } = new(); + private DataPanelModel ExceptionData { get; set; } = new(); + private DataPanelModel ResilienceStrategyData { get; set; } = new(); + + /// Refreshes the component. + public void Refresh() + { + CreateDataModels(); + StateHasChanged(); + } + + /// + protected override void OnParametersSet() + { + } + + /// + protected override void OnInitialized() + { + CreateDataModels(); + } + + private void CreateDataModels() + { + var activity = Activity; + var activityDescriptor = ActivityRegistry.Find(activity.GetTypeName(), activity.GetVersion())!; + var activityId = activity.GetId(); + var activityName = activity.GetName(); + var activityType = activity.GetTypeName(); + var execution = LastActivityExecution; + var activityVersion = activity.GetVersion(); + var exception = execution?.Exception; + var workflowDefinitionId = activity.GetIsWorkflowDefinitionActivity() ? activity.GetWorkflowDefinitionId() : null; + var props = execution?.Properties; + var resilienceStrategy = props != null && props.TryGetValue("ResilienceStrategy", out var resilienceStrategyModel) && resilienceStrategyModel is JsonElement resilienceStrategyElement ? resilienceStrategyElement : default(JsonElement?); + + var activityInfo = new DataPanelModel + { + new DataPanelItem("ID", activityId), + new DataPanelItem(Localizer["Name"], activityName), + new DataPanelItem(Localizer["Type"], activityType, + string.IsNullOrWhiteSpace(workflowDefinitionId) + ? null + : $"/workflows/definitions/{workflowDefinitionId}/edit"), + new DataPanelItem(Localizer["Version"], activityVersion.ToString()) + }; + + var outcomesData = new DataPanelModel(); + var outputData = new DataPanelModel(); + + if (execution != null) + { + activityInfo.Add(Localizer["Status"], execution.Status.ToString()); + activityInfo.Add(Localizer["Instance ID"], execution.Id); + + if (execution.Payload != null) + if (execution.Payload.TryGetValue("Outcomes", out var outcomes)) + outcomesData.Add("Outcomes", outcomes.ToString()); + + var outputDescriptors = activityDescriptor.Outputs; + var outputs = execution.Outputs; + + foreach (var outputDescriptor in outputDescriptors) + { + var outputValue = outputs != null + ? outputs.TryGetValue(outputDescriptor.Name, out var value) ? value : null + : null; + outputData.Add(outputDescriptor.Name, outputValue?.ToString()); + } + } + else + { + activityInfo.Add("Status", Localizer["Not executed"]); + } + + var exceptionData = new DataPanelModel(); + + if (exception != null) + { + exceptionData.Add("Message", exception.Message); + exceptionData.Add("InnerException", exception.InnerException != null + ? exception.InnerException.Type + ": " + exception.InnerException.Message + : null); + exceptionData.Add("StackTrace", exception.StackTrace); + } + + var activityStateData = new DataPanelModel(); + var activityState = execution?.ActivityState; + + if (activityState != null) + { + foreach (var inputDescriptor in activityDescriptor.Inputs) + { + var inputValue = activityState.TryGetValue(inputDescriptor.Name, out var value) ? value : null; + activityStateData.Add(inputDescriptor.Name, inputValue?.ToString()); + } + } + + var resilienceStrategyData = new DataPanelModel(); + + if (resilienceStrategy != null) + { + var resilienceStrategyJson = JsonSerializer.Serialize(resilienceStrategy.Value, JsonSerializerOptions.Default); + var dict = JsonSerializer.Deserialize>(resilienceStrategyJson)!; + var type = "Unknown"; + + if (dict.ContainsKey("$type")) + { + type = dict["$type"].ToString(); + dict.Remove("$type"); + } + + var panelItems = dict.Select(x => new DataPanelItem(x.Key.Pascalize(), x.Value.ToString())); + resilienceStrategyData.Add("Type", type); + resilienceStrategyData.AddRange(panelItems); + } + + ActivityInfo = activityInfo; + ActivityData = activityStateData; + OutcomesData = outcomesData; + OutputData = outputData; + ExceptionData = exceptionData; + ResilienceStrategyData = resilienceStrategyData; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor new file mode 100644 index 0000000..a0f1626 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor @@ -0,0 +1,68 @@ +@inherits StudioComponentBase +@inject ILocalizer Localizer + + + + + + # + @Localizer["Started"] + @Localizer["Completed"] + @Localizer["Duration"] + @Localizer["Status"] + @Localizer["Has Retries"] + @Localizer["Activity Instance ID"] + + + @{ + var record = context.ActivityExecutionSummary; + } + @context.Number + + + @(record.CompletedAt != null ? (record.CompletedAt - record.StartedAt).Value.ToString("g") : "") + @record.Status + @(context.HasRetries ? Localizer["Yes"] : string.Empty) + @record.Id + + + + + + + @if (SelectedItem != null) + { +
+
+ @Localizer["State"] + +
+
+ @Localizer["Outcomes"] + +
+
+ @Localizer["Output"] + +
+ @if (Retries.TotalCount > 0) + { +
+ @Localizer["Retry Attempts"] + +
+ } +
+ } +
+
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor.cs new file mode 100644 index 0000000..87b98d7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ActivityExecutionsTab.razor.cs @@ -0,0 +1,138 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.ActivityExecutions.Models; +using Elsa.Api.Client.Resources.Resilience.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Extensions; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// Displays the details of an activity. +public partial class ActivityExecutionsTab : IAsyncDisposable +{ + /// Represents a row in the table of activity executions. + /// The number of executions. + /// The activity execution summary. + public record ActivityExecutionRecordTableRow(int Number, ActivityExecutionRecordSummary ActivityExecutionSummary) + { + /// Indicates whether the activity execution record has recorded retries. + public bool HasRetries => ActivityExecutionSummary.Metadata != null && ActivityExecutionSummary.Metadata.TryGetValue("HasRetryAttempts", out var retryAttempts) && retryAttempts is JsonElement { ValueKind: JsonValueKind.True }; + } + + /// The height of the visible pane. + [Parameter] public int VisiblePaneHeight { get; set; } + + /// The activity to display executions for. + [Parameter] public JsonObject Activity { get; set; } = null!; + + /// The activity execution record summaries. + [Parameter] public ICollection ActivityExecutionSummaries { get; set; } = new List(); + + [Inject] private IActivityExecutionService ActivityExecutionService { get; set; } = null!; + + private IEnumerable Items => ActivityExecutionSummaries.Select((x, i) => new ActivityExecutionRecordTableRow(i + 1, x)); + private ActivityExecutionRecord? SelectedItem { get; set; } + private PagedListResponse Retries { get; set; } = new(); + private DataPanelModel SelectedActivityState { get; set; } = new(); + private DataPanelModel SelectedOutcomesData { get; set; } = new(); + private DataPanelModel SelectedOutputData { get; set; } = new(); + private Timer? _refreshTimer; + + /// Refreshes the component. + public async Task RefreshAsync() + { + await StopRefreshTimerAsync(); + SelectedItem = null; + SelectedActivityState = new(); + SelectedOutcomesData = new(); + SelectedOutputData = new(); + } + + private void CreateSelectedItemDataModels(ActivityExecutionRecord? record) + { + if (record == null) + { + SelectedActivityState = new(); + SelectedOutcomesData = new(); + SelectedOutputData = new(); + return; + } + + var activityState = record.ActivityState? + .Where(x => !x.Key.StartsWith("_")) + .Select(x => new DataPanelItem(x.Key, x.Value?.ToString())) + .ToDataPanelModel(); + + var outcomesData = record.Payload?.TryGetValue("Outcomes", out var outcomesValue) == true + ? new DataPanelModel { new DataPanelItem("Outcomes", outcomesValue!.ToString()!) } + : null; + + var outputData = new DataPanelModel(); + + if (record.Outputs != null) + foreach (var (key, value) in record.Outputs) + outputData.Add(key, value?.ToString()); + + SelectedActivityState = activityState ?? new(); + SelectedOutcomesData = outcomesData ?? new(); + SelectedOutputData = outputData; + } + + private async Task RefreshSelectedItemAsync(string id) + { + SelectedItem = await ActivityExecutionService.GetAsync(id); + var retryAttempts = await ActivityExecutionService.GetRetriesAsync(id); + CreateSelectedItemDataModels(SelectedItem); + Retries = retryAttempts; + await InvokeAsync(StateHasChanged); + } + + private async Task OnActivityExecutionClicked(TableRowClickEventArgs arg) + { + await StopRefreshTimerAsync(); + var id = arg.Item?.ActivityExecutionSummary.Id; + + if (id == null) + return; + + await RefreshSelectedItemAsync(id); + + if (SelectedItem == null) + return; + + if (SelectedItem.IsFused()) + return; + + RefreshSelectedItemPeriodically(id); + } + + private void RefreshSelectedItemPeriodically(string id) + { + async void Callback(object? _) + { + await RefreshSelectedItemAsync(id); + + if (SelectedItem == null || SelectedItem.IsFused()) + await StopRefreshTimerAsync(); + } + + _refreshTimer = new Timer(Callback, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); + } + + private async Task StopRefreshTimerAsync() + { + if (_refreshTimer == null) return; + await _refreshTimer.DisposeAsync(); + _refreshTimer = null; + } + + async ValueTask IAsyncDisposable.DisposeAsync() + { + if (_refreshTimer != null) await _refreshTimer.DisposeAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor new file mode 100644 index 0000000..739c5b8 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor @@ -0,0 +1 @@ +@Elapsed.ToString(@"hh\:mm\:ss") \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor.cs new file mode 100644 index 0000000..1217682 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/ElapsedTime.razor.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// +/// Represents the elapsed time between a start and end point. +/// +public partial class ElapsedTime +{ + /// + /// Gets or sets the start time for the property. + /// + /// The start time. + /// + /// The start time represents the point in time from which the property should be considered. + /// The default value is set to the current UTC time. + /// + [Parameter] + public DateTimeOffset StartTime { get; set; } = DateTimeOffset.UtcNow; + + /// + /// Gets or sets the end time. + /// The end time represents the date and time when the event or activity ends. + /// + /// + /// The default value is set to the current Coordinated Universal Time (UTC) using . + /// + /// + /// The end time as a value. + /// + [Parameter] + public DateTimeOffset EndTime { get; set; } = DateTimeOffset.UtcNow; + + private TimeSpan Elapsed => EndTime < StartTime ? TimeSpan.Zero : EndTime - StartTime; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor new file mode 100644 index 0000000..84e7502 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor @@ -0,0 +1,88 @@ +@using Elsa.Studio.Workflows.Services +@using Variant = MudBlazor.Variant +@using Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models +@inherits StudioComponentBase +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + + + + + + + + + + + + + + +
+ + + @{ + var journalEntry = context; + var record = journalEntry.Record; + var activityDescriptor = journalEntry.ActivityDescriptor; + var displaySettings = journalEntry.ActivityDisplaySettings; + var activityIcon = displaySettings?.Icon; + var isEven = journalEntry.IsEven; + var timelineAlign = !isEven ? TimelineAlign.Default : TimelineAlign.End; + var timeMetric = context.TimeMetric; + var displayName = string.IsNullOrWhiteSpace(record.ActivityName) ? activityDescriptor?.DisplayName : record.ActivityName; + var bgClass = journalEntry == SelectedEntry ? "gray lighten-3 rounded" : ""; + + var statusColor = + record.EventName switch + { + "Started" => Color.Primary, + "Completed" => Color.Success, + "Faulted" => Color.Error, + "Suspended" => Color.Warning, + "Resumed" => Color.Warning, + _ => Color.Default + }; + } + + + + + + @displayName + @record.EventName + + +
+ +
+
+ + @timeMetric.ToString("hh\\:mm\\:ss\\.fff") +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor.cs new file mode 100644 index 0000000..d004d07 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/Journal.razor.cs @@ -0,0 +1,209 @@ +using Elsa.Api.Client.RealTime.Messages; +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Requests; +using Elsa.Studio.Workflows.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web.Virtualization; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// Displays the journal for a workflow instance. +public partial class Journal : IAsyncDisposable +{ + private IList _currentEntries = null!; + private WorkflowInstance? _workflowInstance; + + /// Gets or sets a callback invoked when a journal entry is selected. + [Parameter] public Func? JournalEntrySelected { get; set; } + + [Inject] private IWorkflowInstanceService WorkflowInstanceService { get; set; } = null!; + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] private IActivityDisplaySettingsRegistry ActivityDisplaySettingsRegistry { get; set; } = null!; + [Inject] private IWorkflowInstanceObserverFactory WorkflowInstanceObserverFactory { get; set; } = null!; + + private WorkflowInstance? WorkflowInstance { get; set; } + private IWorkflowInstanceObserver? WorkflowInstanceObserver { get; set; } + private TimeMetricMode TimeMetricMode { get; set; } = TimeMetricMode.Relative; + private bool ShowScopedEvents { get; set; } = true; + private bool ShowIncidents { get; set; } + private JournalEntry? SelectedEntry { get; set; } + private JournalFilter? JournalFilter { get; set; } + private Virtualize VirtualizeComponent { get; set; } = null!; + private int SelectedIndex { get; set; } = -1; + + /// Sets the workflow instance to display the journal for. + public async Task SetWorkflowInstanceAsync(WorkflowInstance workflowInstance, JournalFilter? filter = null) + { + WorkflowInstance = _workflowInstance = workflowInstance; + JournalFilter = filter; + await EnsureActivityDescriptorsAsync(); + await RefreshJournalAsync(); + await UpdateObserverAsync(); + StateHasChanged(); + } + + /// Clears the selection. + public void ClearSelection() + { + SelectedEntry = null; + SelectedIndex = -1; + StateHasChanged(); + } + + /// + protected override async Task OnInitializedAsync() + { + await EnsureActivityDescriptorsAsync(); + } + + /// + protected override async Task OnParametersSetAsync() + { + var hasDifferentState = _workflowInstance?.Id != WorkflowInstance?.Id || _workflowInstance?.Status != WorkflowInstance?.Status; + + if (_workflowInstance != WorkflowInstance) + { + _workflowInstance = WorkflowInstance; + + if (hasDifferentState) + await UpdateObserverAsync(); + } + } + + private async Task EnsureActivityDescriptorsAsync() => await ActivityRegistry.EnsureLoadedAsync(); + + private async Task RefreshJournalAsync() + { + if (VirtualizeComponent != null!) + await VirtualizeComponent.RefreshDataAsync(); + } + + private async Task UpdateObserverAsync() + { + if (WorkflowInstance?.Status == WorkflowStatus.Running) + await ObserveWorkflowInstanceAsync(); + } + + private TimeSpan GetTimeMetric(WorkflowExecutionLogRecord current, WorkflowExecutionLogRecord? previous) + { + return TimeMetricMode switch + { + TimeMetricMode.Relative => previous == null ? TimeSpan.Zero : current.Timestamp - previous.Timestamp, + TimeMetricMode.Accumulated => SumExecutionTime(current), + _ => throw new ArgumentOutOfRangeException() + }; + } + + private TimeSpan SumExecutionTime(WorkflowExecutionLogRecord current) => current.Timestamp - WorkflowInstance!.CreatedAt; + + private async ValueTask> FetchExecutionLogRecordsAsync(ItemsProviderRequest request) + { + if (WorkflowInstance == null) + return new([], 0); + + await EnsureActivityDescriptorsAsync(); + + var take = request.Count == 0 ? 10 : request.Count; + var skip = request.StartIndex > 0 ? request.StartIndex - 1 : 0; + var filter = new JournalFilter(); + + if (ShowScopedEvents) filter.ActivityNodeIds = JournalFilter?.ActivityNodeIds; + if (ShowIncidents) filter.EventNames = ["Faulted"]; + + filter.ExcludedActivityTypes = ["Elsa.Workflow", "Elsa.Flowchart"]; + + var response = await WorkflowInstanceService.GetJournalAsync(WorkflowInstance.Id, filter, skip, take); + var totalCount = request.StartIndex > 0 ? response.TotalCount - 1 : response.TotalCount; + var records = response.Items.ToArray(); + var localSkip = request.StartIndex > 0 ? 1 : 0; + var entries = records.Skip(localSkip).Select((record, index) => + { + var previousIndex = index - 1; + var previousRecord = previousIndex >= 0 ? records[previousIndex] : null; + var activityDescriptor = ActivityRegistry.Find(record.ActivityType, record.ActivityTypeVersion); + var activityDisplaySettings = ActivityDisplaySettingsRegistry.GetSettings(record.ActivityType); + var isEven = index % 2 == 0; + var timeMetric = GetTimeMetric(record, previousRecord); + + return new JournalEntry( + record, + activityDescriptor, + activityDisplaySettings, + isEven, + timeMetric); + }).ToList(); + + var selectedEntry = SelectedEntry; + _currentEntries = entries; + + // If the selected entry is still in the list, select it again. + SelectedEntry = entries.FirstOrDefault(x => x.Record.Id == selectedEntry?.Record.Id); + + return new(entries, (int)totalCount); + } + + private async Task DisposeObserverAsync() + { + if (WorkflowInstanceObserver != null) + { + WorkflowInstanceObserver.WorkflowJournalUpdated -= OnWorkflowJournalUpdatedAsync; + await WorkflowInstanceObserver.DisposeAsync(); + WorkflowInstanceObserver = null; + } + } + + private async Task ObserveWorkflowInstanceAsync() + { + await DisposeObserverAsync(); + WorkflowInstanceObserver = await WorkflowInstanceObserverFactory.CreateAsync(WorkflowInstance!.Id); + WorkflowInstanceObserver.WorkflowJournalUpdated += OnWorkflowJournalUpdatedAsync; + } + + private async Task OnWorkflowJournalUpdatedAsync(WorkflowExecutionLogUpdatedMessage message) + { + await InvokeAsync(RefreshJournalAsync); + } + + private async Task OnTimeMetricButtonToggleChanged(bool value) + { + TimeMetricMode = value ? TimeMetricMode.Accumulated : TimeMetricMode.Relative; + await RefreshJournalAsync(); + } + + private async Task OnScopeToggleChanged(bool value) + { + ShowScopedEvents = value; + await RefreshJournalAsync(); + } + + private async Task OnShowIncidentsToggleChanged(bool value) + { + ShowIncidents = value; + await RefreshJournalAsync(); + } + + private async Task OnJournalEntrySelected(int index) + { + if (index < 0 || index >= _currentEntries.Count) + { + SelectedEntry = null; + SelectedIndex = -1; + } + + var entry = index >= 0 && index < _currentEntries.Count ? _currentEntries[index] : null; + SelectedEntry = entry; + SelectedIndex = index; + + if (JournalEntrySelected != null && entry != null) + await JournalEntrySelected(entry); + } + + async ValueTask IAsyncDisposable.DisposeAsync() + { + await DisposeObserverAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor new file mode 100644 index 0000000..a709703 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor @@ -0,0 +1,29 @@ +@using Elsa.Studio.Models +@inherits StudioComponentBase +@inject ILocalizer Localizer + + + @if (JournalEntry != null!) + { + var record = JournalEntry.Record; + var payload = ParsePayload(record.Payload); + + var eventInfo = new DataPanelModel + { + new DataPanelItem(Localizer["Name"], record.EventName), + new DataPanelItem(Localizer["Timestamp"], TimeFormatter.Format(record.Timestamp, "s")), + new DataPanelItem(Localizer["Message"], record.Message) + }; + + Merge(eventInfo, payload); + +
+ +
+ @Localizer["Event"] + +
+
+
+ } +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor.cs new file mode 100644 index 0000000..8d44e71 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/JournalEntryDetailsTab.razor.cs @@ -0,0 +1,56 @@ +using System.Text.Json; +using Elsa.Studio.Components; +using Elsa.Studio.Localization.Time; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models; +using Humanizer; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// Displays the details of a journal entry. +public partial class JournalEntryDetailsTab +{ + /// The journal entry. + [Parameter] public JournalEntry JournalEntry { get; set; } = default!; + + /// The height of the visible pane. + [Parameter] public int VisiblePaneHeight { get; set; } + + [Inject] private ITimeFormatter TimeFormatter { get; set; } = default!; + + private DataPanelModel ParsePayload(object? payload) + { + if (payload == null) + return new(); + + if (payload is not JsonElement jsonElement) + return [new DataPanelItem("Payload", payload.ToString())]; + + var properties = jsonElement.EnumerateObject().Where(x => !x.Name.StartsWith("_")); + var result = new DataPanelModel(); + + foreach (var property in properties) + { + var propertyName = property.Name.Pascalize(); + var propertyValue = property.Value; + var propertyValueAsString = propertyValue.ToString(); + result.Add(propertyName, propertyValueAsString); + } + + return result; + } + + private static void Merge(DataPanelModel target, DataPanelModel input) + { + foreach (var item in input) + { + var existingItem = target.FirstOrDefault(x => x.Label == item.Label); + + if (existingItem != null) + target.Remove(existingItem); + + target.Add(item); + } + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor new file mode 100644 index 0000000..3add61a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor @@ -0,0 +1,45 @@ +@using Elsa.Api.Client.Resources.Resilience.Models +@inherits StudioComponentBase +@inject ILocalizer Localizer + + + + + # + @Localizer["Delay"] + @Localizer["Outcome"] + + + @{ + var record = context; + } + @record.AttemptNumber + @record.RetryDelay + @string.Join(", ", record.Details.Select(x => $"{x.Key}={x.Value}")) + + + + + + + @if (SelectedItem != null) + { +
+
+ @Localizer["Retry Details"] + +
+
+ } +
\ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor.cs new file mode 100644 index 0000000..394011e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/RetriesTab.razor.cs @@ -0,0 +1,39 @@ +using Elsa.Api.Client.Resources.Resilience.Models; +using Elsa.Studio.Models; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// Displays the details of an activity. +public partial class RetriesTab +{ + /// The activity execution record summaries. + [Parameter] public ICollection Retries { get; set; } = new List(); + + private RetryAttemptRecord? SelectedItem { get; set; } + private DataPanelModel SelectedRetryAttemptData { get; set; } = new(); + + + private void CreateSelectedItemDataModels(RetryAttemptRecord? record) + { + if (record == null) + { + SelectedRetryAttemptData = new(); + return; + } + + SelectedRetryAttemptData = new(); + + foreach (var detail in record.Details) + { + SelectedRetryAttemptData.Add(detail.Key, detail.Value); + } + } + + private void OnRetryAttemptClicked(TableRowClickEventArgs arg) + { + SelectedItem = arg.Item; + CreateSelectedItemDataModels(arg.Item); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor new file mode 100644 index 0000000..ca2b84a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor @@ -0,0 +1,55 @@ +@using Orientation = Radzen.Orientation +@using Elsa.Api.Client.Resources.WorkflowInstances.Enums +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer +@inherits StudioComponentBase + + + @if (WorkflowDefinition != null && WorkflowInstance != null!) + { + + + + + + + + + + } + + + @if (SelectedWorkflowExecutionLogRecord != null || SelectedActivity != null) + { + + @if (SelectedWorkflowExecutionLogRecord != null) + { + + + + } + + @if (SelectedActivity != null) + { + + + + + + + + } + + + } + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor.cs new file mode 100644 index 0000000..e843a8e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDesigner.razor.cs @@ -0,0 +1,404 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.RealTime.Messages; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.ActivityExecutions.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.DomInterop.Contracts; +using Elsa.Studio.Workflows.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models; +using Elsa.Studio.Workflows.Shared.Args; +using Elsa.Studio.Workflows.Shared.Components; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Models; +using Microsoft.AspNetCore.Components; +using MudBlazor; +using Radzen; +using Radzen.Blazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// +/// Displays the workflow instance. +/// +public partial class WorkflowInstanceDesigner : IAsyncDisposable +{ + private WorkflowInstance? _workflowInstance = null!; + private RadzenSplitterPane _activityPropertiesPane = null!; + private DiagramDesignerWrapper? _designer; + private ActivityDetailsTab? _activityDetailsTab = null!; + private ActivityExecutionsTab? _activityExecutionsTab = null!; + private int _propertiesPaneHeight = 300; + private readonly Dictionary> _activityExecutionRecordsLookup = new(); + private readonly Dictionary _lastActivityExecutionRecordLookup = new(); + private Timer? _elapsedTimer; + + /// The workflow instance. + [Parameter] public WorkflowInstance? WorkflowInstance { get; set; } + + /// The workflow definition. + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// The path changed callback. + [Parameter] public EventCallback PathChanged { get; set; } + + /// The activity selected callback. + [Parameter] public EventCallback ActivitySelected { get; set; } + + /// An event that is invoked when the workflow definition is requested to be edited. + [Parameter] public EventCallback EditWorkflowDefinition { get; set; } + + /// Gets or sets the current selected sub-workflow. + [Parameter] public JsonObject? SelectedSubWorkflow { get; set; } + + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] private IDiagramDesignerService DiagramDesignerService { get; set; } = null!; + [Inject] private IDomAccessor DomAccessor { get; set; } = null!; + [Inject] private IActivityVisitor ActivityVisitor { get; set; } = null!; + [Inject] private IActivityExecutionService ActivityExecutionService { get; set; } = null!; + [Inject] private IWorkflowInstanceObserverFactory WorkflowInstanceObserverFactory { get; set; } = null!; + [Inject] private IWorkflowInstanceService WorkflowInstanceService { get; set; } = null!; + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = null!; + [Inject] private NavigationManager NavigationManager { get; set; } = null!; + + private JsonObject? RootActivity => WorkflowDefinition?.Root; + private JsonObject? SelectedActivity { get; set; } + private ActivityDescriptor? ActivityDescriptor { get; set; } + private JournalEntry? SelectedWorkflowExecutionLogRecord { get; set; } + private IWorkflowInstanceObserver? WorkflowInstanceObserver { get; set; } = null!; + private ICollection SelectedActivityExecutions { get; set; } = new List(); + private ActivityExecutionRecord? LastActivityExecution { get; set; } + private Timer? _refreshTimer; + + private RadzenSplitterPane ActivityPropertiesPane + { + get => _activityPropertiesPane; + set + { + _activityPropertiesPane = value; + + // Prefix the ID with a non-numerical value so it can always be used as a query selector (sometimes, Radzen generates a unique ID starting with a number). + _activityPropertiesPane.UniqueID = $"pane-{value.UniqueID}"; + } + } + + private MudTabs PropertyTabs { get; set; } = null!; + private MudTabPanel EventsTabPanel { get; set; } = null!; + + /// Updates the selected sub-workflow. + public void UpdateSubWorkflow(JsonObject? obj) + { + SelectedSubWorkflow = obj; + StateHasChanged(); + } + + /// Selects the activity by its node ID. + public async Task SelectActivityAsync(string nodeId) + { + if (_designer == null) return; + await _designer.SelectActivityAsync(nodeId); + } + + /// Selects the activity by its ID. + public async Task SelectActivityByIdAsync(string activityId) + { + if (_designer == null) return; + await _designer.SelectActivityByActivityIdAsync(activityId); + } + + /// Sets the selected journal entry. + public async Task SelectWorkflowExecutionLogRecordAsync(JournalEntry entry) + { + var nodeId = entry.Record.NodeId; + SelectedWorkflowExecutionLogRecord = entry; + await SelectActivityAsync(nodeId); + StateHasChanged(); + } + + /// + protected override async Task OnInitializedAsync() + { + await ActivityRegistry.EnsureLoadedAsync(); + + if (WorkflowDefinition?.Root == null!) + return; + + await UpdateObserverAsync(); + } + + /// + protected override async Task OnParametersSetAsync() + { + var hasDifferentState = _workflowInstance?.Id != WorkflowInstance?.Id || _workflowInstance?.Status != WorkflowInstance?.Status; + + if (_workflowInstance != WorkflowInstance) + { + _workflowInstance = WorkflowInstance!; + + if (hasDifferentState) + await UpdateObserverAsync(); + } + } + + /// + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + if (WorkflowDefinition != null) + await HandleActivitySelectedAsync(WorkflowDefinition!.Root); + await UpdatePropertiesPaneHeightAsync(); + await UpdateObserverAsync(); + } + } + + private async Task UpdateObserverAsync() + { + if (WorkflowInstance?.Status == WorkflowStatus.Running) + { + await CreateObserverAsync(); + StartElapsedTimer(); + } + else + { + StopElapsedTimer(); + } + } + + private async Task CreateObserverAsync() + { + if (_workflowInstance == null || _designer == null) + return; + + await DisposeObserverAsync(); + var container = _designer.GetCurrentContainerActivityOrRoot(); + var observerContext = new WorkflowInstanceObserverContext + { + WorkflowInstanceId = _workflowInstance.Id, + ContainerActivity = container, + }; + WorkflowInstanceObserver = await WorkflowInstanceObserverFactory.CreateAsync(observerContext); + WorkflowInstanceObserver.ActivityExecutionLogUpdated += OnActivityExecutionLogUpdated; + } + + private async Task DisposeObserverAsync() + { + if (WorkflowInstanceObserver != null!) + { + WorkflowInstanceObserver.ActivityExecutionLogUpdated -= OnActivityExecutionLogUpdated; + await WorkflowInstanceObserver.DisposeAsync(); + WorkflowInstanceObserver = null; + } + } + + private async Task OnActivityExecutionLogUpdated(ActivityExecutionLogUpdatedMessage message) + { + if (_designer == null) return; + + foreach (var stats in message.Stats) + { + var activityNodeId = stats.ActivityNodeId; + var activityId = stats.ActivityId; + _activityExecutionRecordsLookup.Remove(activityNodeId); + _lastActivityExecutionRecordLookup.Remove(activityNodeId); + await _designer.UpdateActivityStatsAsync(activityId, Map(stats)); + } + + await InvokeAsync(StateHasChanged); + + // If we received an update for the selected activity, refresh the activity details. + var selectedActivityNodeId = SelectedActivity?.GetNodeId(); + var includesSelectedActivity = selectedActivityNodeId != null && message.Stats.Any(x => x.ActivityNodeId == selectedActivityNodeId); + + if (includesSelectedActivity) + { + await HandleActivitySelectedAsync(SelectedActivity!); + } + } + + private void StartElapsedTimer() + { + if (_elapsedTimer == null) + _elapsedTimer = new(_ => InvokeAsync(StateHasChanged), null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); + } + + private void StopElapsedTimer() + { + if (_elapsedTimer != null) + { + _elapsedTimer?.Dispose(); + _elapsedTimer = null; + } + } + + private async Task HandleActivitySelectedAsync(JsonObject activity) + { + await StopRefreshActivityStatePeriodically(); + await InvokeAsync(async () => + { + var activityNodeId = activity.GetNodeId(); + SelectedActivity = activity; + ActivityDescriptor = ActivityRegistry.Find(activity.GetTypeName(), activity.GetVersion()); + SelectedActivityExecutions = await GetActivityExecutionRecordsAsync(activityNodeId); + StateHasChanged(); + _activityDetailsTab?.Refresh(); + + if (_activityExecutionsTab != null) + await _activityExecutionsTab.RefreshAsync(); + }); + + if (SelectedActivityExecutions.Any()) + { + if (LastActivityExecution != null && (!LastActivityExecution.IsFused() || LastActivityExecution.Status == ActivityStatus.Running)) + RefreshActivityStatePeriodically(LastActivityExecution.Id); + } + } + + private async Task> GetActivityExecutionRecordsAsync(string activityNodeId) + { + if (!_activityExecutionRecordsLookup.TryGetValue(activityNodeId, out var records)) + { + records = (await ActivityExecutionService.ListSummariesAsync(WorkflowInstance!.Id, activityNodeId)).ToList(); + _activityExecutionRecordsLookup[activityNodeId] = records; + _lastActivityExecutionRecordLookup.Remove(activityNodeId); + } + + if (records.Any()) + { + var lastRecord = records.Last(); + var lastActivityExecution = _lastActivityExecutionRecordLookup.GetValueOrDefault(activityNodeId); + + if (lastActivityExecution == null || lastActivityExecution.Id != lastRecord.Id) + { + lastActivityExecution = await ActivityExecutionService.GetAsync(lastRecord.Id); + _lastActivityExecutionRecordLookup[activityNodeId] = lastActivityExecution!; + } + + LastActivityExecution = lastActivityExecution; + } + else + { + LastActivityExecution = null; + } + + return records; + } + + private async Task UpdatePropertiesPaneHeightAsync() + { + var paneQuerySelector = $"#{ActivityPropertiesPane.UniqueID}"; + var visibleHeight = await DomAccessor.GetVisibleHeightAsync(paneQuerySelector); + _propertiesPaneHeight = (int)visibleHeight - 50; + } + + private async Task RefreshSelectedItemAsync(string activityExecutionRecordId) + { + if (LastActivityExecution != null) + { + _activityExecutionRecordsLookup.Remove(LastActivityExecution.ActivityNodeId); + SelectedActivityExecutions = await GetActivityExecutionRecordsAsync(LastActivityExecution.ActivityNodeId); + } + + await InvokeAsync(() => + { + StateHasChanged(); + _activityDetailsTab?.Refresh(); + }); + } + + private void RefreshActivityStatePeriodically(string activityExecutionRecordId) + { + async void Callback(object? _) + { + await RefreshSelectedItemAsync(activityExecutionRecordId); + + if (LastActivityExecution == null || (LastActivityExecution.IsFused() && LastActivityExecution.Status != ActivityStatus.Running)) + await StopRefreshActivityStatePeriodically(); + else + _refreshTimer?.Change(TimeSpan.FromSeconds(1), Timeout.InfiniteTimeSpan); + } + + _refreshTimer = new(Callback, null, TimeSpan.FromSeconds(1), Timeout.InfiniteTimeSpan); + } + + private async Task StopRefreshActivityStatePeriodically() + { + if (_refreshTimer != null) + { + await _refreshTimer.DisposeAsync(); + _refreshTimer = null; + } + } + + private static ActivityStats Map(ActivityExecutionStats source) + { + return new() + { + Faulted = source.IsFaulted, + Blocked = source.IsBlocked, + Completed = source.CompletedCount, + Started = source.StartedCount, + Uncompleted = source.UncompletedCount, + Metadata = source.Metadata, + }; + } + + private async Task OnActivitySelected(JsonObject activity) + { + await HandleActivitySelectedAsync(activity); + + var activitySelected = ActivitySelected; + + if (activitySelected.HasDelegate) + await activitySelected.InvokeAsync(activity); + } + + private async Task OnResize(RadzenSplitterResizeEventArgs arg) + { + await UpdatePropertiesPaneHeightAsync(); + } + + private Task OnEditClicked() + { + var definitionId = WorkflowDefinition!.DefinitionId; + + if (SelectedSubWorkflow != null) + { + var typeName = SelectedSubWorkflow.GetTypeName(); + var version = SelectedSubWorkflow.GetVersion(); + var descriptor = ActivityRegistry.Find(typeName, version); + var isWorkflowActivity = descriptor != null && + descriptor.CustomProperties.TryGetValue("RootType", out var rootTypeNameElement) && + ((JsonElement)rootTypeNameElement).GetString() == "WorkflowDefinitionActivity"; + if (isWorkflowActivity) + { + definitionId = SelectedSubWorkflow.GetWorkflowDefinitionId(); + } + } + + var editWorkflowDefinition = EditWorkflowDefinition; + + if (editWorkflowDefinition.HasDelegate) + return editWorkflowDefinition.InvokeAsync(definitionId); + + NavigationManager.NavigateTo($"workflows/definitions/{definitionId}/edit"); + return Task.CompletedTask; + } + + async ValueTask IAsyncDisposable.DisposeAsync() + { + StopElapsedTimer(); + await DisposeObserverAsync(); + + if (_refreshTimer != null) + await _refreshTimer.DisposeAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor new file mode 100644 index 0000000..6958842 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor @@ -0,0 +1,144 @@ +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@using Microsoft.Extensions.Localization +@inject ILocalizer Localizer + +@if (WorkflowDefinition != null && WorkflowInstance != null) +{ + + + +
+ @Localizer["Workflow"] + +
+
+ + @if (WorkflowInstanceSubWorkflowData.Any()) + { + +
+ @Localizer["Sub-Workflow"] + +
+
+ } +
+ + @if (IncidentsData.Any()) + { + + + @foreach (var incident in IncidentsData) + { + + +
+ @incident.SingleOrDefault(i=>i.Label == "Message")?.Text +
+
+ + + + + +
+ } +
+
+ } + else + { + + No incidents + + } +
+ + +
+ @if (WorkflowVariableData.Any()) + { + + } + else + { + + @Localizer["No variables"] + + } +
+
+
+ + +
+ @Localizer["Inputs"] + @if (WorkflowInputData.Any()) + { + + } + else + { + + @Localizer["No inputs"] + + } +
+
+ @Localizer["Outputs"] + @if (WorkflowOutputData.Any()) + { + + } + else + { + + @Localizer["No outputs"] + + } +
+
+ + @if (SubWorkflowInputData.Any()) + { +
+ @Localizer["Sub-Workflow Inputs"] + +
+ } + @if (SubWorkflowOutputData.Any()) + { +
+ @Localizer["Sub-Workflow Outputs"] + +
+ } +
+
+
+} + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor.cs new file mode 100644 index 0000000..0868a12 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceDetails.razor.cs @@ -0,0 +1,347 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityExecutions.Models; +using Elsa.Api.Client.Resources.LogPersistenceStrategies; +using Elsa.Api.Client.Resources.StorageDrivers.Models; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Enums; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Api.Client.Serialization; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Localization.Time; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Humanizer; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +/// +/// Displays details about a workflow instance. +/// +public partial class WorkflowInstanceDetails +{ + private readonly JsonSerializerOptions _serializerOptions = SerializerOptions.LogPersistenceConfigSerializerOptions; + + private WorkflowInstance? _workflowInstance; + + private ActivityExecutionRecord? _workflowActivityExecutionRecord; + private ICollection _variables = []; + + /// + /// Gets or sets the workflow instance to display. + /// + [Parameter] public WorkflowInstance? WorkflowInstance { get; set; } + + /// + /// Gets or sets the workflow definition associated with the workflow instance. + /// + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// + /// Gets or sets the current selected sub-workflow. + /// + [Parameter] public JsonObject? SelectedSubWorkflow { get; set; } + + /// + /// Gets or sets the current selected sub-workflow executions. + /// + [Parameter] public ICollection? SelectedSubWorkflowExecutions { get; set; } + + /// + /// Gets or sets the current selected incident activity id. + /// + [Parameter] public Func? IncidentActivityNodeIdClicked { get; set; } + + [Inject] private IStorageDriverService StorageDriverService { get; set; } = null!; + [Inject] private IWorkflowInstanceService WorkflowInstanceService { get; set; } = null!; + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] private IActivityExecutionService ActivityExecutionService { get; set; } = null!; + [Inject] private ITimeFormatter TimeFormatter { get; set; } = null!; + + private IDictionary StorageDriverLookup { get; set; } = new Dictionary(); + + private DataPanelModel WorkflowInstanceData + { + get + { + if (_workflowInstance == null) + return new(); + + return new() + { + new DataPanelItem("ID", _workflowInstance.Id), + new DataPanelItem(Localizer["Name"], _workflowInstance.Name ?? WorkflowDefinition?.Name), + new DataPanelItem(Localizer["Definition ID"], _workflowInstance.DefinitionId, $"/workflows/definitions/{_workflowInstance.DefinitionId}/edit"), + new DataPanelItem(Localizer["Definition version"], _workflowInstance.Version.ToString()), + new DataPanelItem(Localizer["Definition version ID"], _workflowInstance.DefinitionVersionId), + new DataPanelItem(Localizer["Correlation ID"], _workflowInstance.CorrelationId), + new DataPanelItem(Localizer["Incident Strategy"], GetIncidentStrategyDisplayName(WorkflowDefinition?.Options.IncidentStrategyType)), + new DataPanelItem(Localizer["Status"], _workflowInstance.Status.ToString()), + new DataPanelItem(Localizer["Sub status"], _workflowInstance.SubStatus.ToString()), + new DataPanelItem(Localizer["Incidents"], _workflowInstance.IncidentCount.ToString()), + new DataPanelItem(Localizer["Created"], TimeFormatter.Format(_workflowInstance.CreatedAt)), + new DataPanelItem(Localizer["Updated"], TimeFormatter.Format(_workflowInstance.UpdatedAt)), + new DataPanelItem(Localizer["Finished"], TimeFormatter.Format(_workflowInstance.FinishedAt)), + new DataPanelItem(Localizer["Log Persistence Strategy"], GetLogPersistenceConfigurationDisplayName(GetLogPersistenceConfiguration()?.StrategyType)) + }; + } + } + + private LogPersistenceConfiguration? GetLogPersistenceConfiguration() + { + if (!WorkflowDefinition!.CustomProperties.TryGetValue("logPersistenceConfig", out var value) || value == null!) + return null; + + + var configJson = ((JsonElement)value).GetProperty("default"); + var config = JsonSerializer.Deserialize(configJson, _serializerOptions); + return config; + } + + private DataPanelModel WorkflowVariableData + { + get + { + return WorkflowDefinition == null + ? new DataPanelModel() + : new DataPanelModel(WorkflowDefinition.Variables.Select(entry => new DataPanelItem(entry.Name, GetVariableValue(entry)))); + } + } + + private DataPanelModel WorkflowInputData + { + get + { + if (_workflowInstance == null || WorkflowDefinition == null) + return new(); + + var inputData = new DataPanelModel(); + foreach (var input in WorkflowDefinition.Inputs) + { + _workflowInstance.WorkflowState.Input.TryGetValue(input.Name, out object? inputFromInstance); + var inputName = !string.IsNullOrWhiteSpace(input.DisplayName) ? input.DisplayName : input.Name; + inputData.Add(inputName, inputFromInstance?.ToString()); + } + + return inputData; + } + } + + private DataPanelModel WorkflowOutputData + { + get + { + if (_workflowInstance == null || WorkflowDefinition == null) + return new DataPanelModel(); + + var outputData = new DataPanelModel(); + foreach (var output in WorkflowDefinition.Outputs) + { + _workflowInstance.WorkflowState.Output.TryGetValue(output.Name, out object? outputFromInstance); + var outputName = !string.IsNullOrWhiteSpace(output.DisplayName) ? output.DisplayName : output.Name; + outputData.Add(outputName, outputFromInstance?.ToString()); + } + + return outputData; + } + } + + private DataPanelModel WorkflowInstanceSubWorkflowData + { + get + { + if (SelectedSubWorkflow == null) + return new(); + + var typeName = SelectedSubWorkflow.GetTypeName(); + var version = SelectedSubWorkflow.GetVersion(); + var descriptor = ActivityRegistry.Find(typeName, version); + var isWorkflowActivity = descriptor != null && + descriptor.CustomProperties.TryGetValue("RootType", out var rootTypeNameElement) && + ((JsonElement)rootTypeNameElement).GetString() == "WorkflowDefinitionActivity"; + var workflowDefinitionId = isWorkflowActivity ? SelectedSubWorkflow.GetWorkflowDefinitionId() : null; + + if (workflowDefinitionId == null) + return new(); + + return new() + { + new DataPanelItem("ID", SelectedSubWorkflow.GetId()), + new DataPanelItem(Localizer["Name"], SelectedSubWorkflow.GetName()), + new DataPanelItem(Localizer["Type"], SelectedSubWorkflow.GetTypeName()), + new DataPanelItem(Localizer["Definition ID"], workflowDefinitionId, $"/workflows/definitions/{workflowDefinitionId}/edit"), + new DataPanelItem(Localizer["Definition version"], SelectedSubWorkflow.GetVersion().ToString()), + }; + } + } + + private IEnumerable IncidentsData + { + get + { + if (_workflowInstance == null) + return new List(); + + return _workflowInstance.WorkflowState.Incidents + .Select(i => new DataPanelModel + { + new DataPanelItem("ActivityId", i.ActivityId), + new DataPanelItem("ActivityNodeId", i.ActivityNodeId, null, () => OnIncidentActivityNodeIdClicked(i.ActivityNodeId)), + new DataPanelItem("Message", i.Exception?.Message ?? ""), + new DataPanelItem("InnerException", i.Exception?.InnerException != null + ? i.Exception?.InnerException.Type + ": " + i.Exception?.InnerException.Message + : ""), + new DataPanelItem("StackTrace", i.Exception?.StackTrace ?? "") + }); + } + } + + private async Task OnIncidentActivityNodeIdClicked(string? activityNodeId) + { + if (IncidentActivityNodeIdClicked != null && !string.IsNullOrWhiteSpace(activityNodeId)) + await IncidentActivityNodeIdClicked(activityNodeId); + } + + private DataPanelModel SubWorkflowInputData + { + get + { + if (SelectedSubWorkflowExecutions == null || SelectedSubWorkflow == null) + return new(); + + var execution = SelectedSubWorkflowExecutions.LastOrDefault(); + var inputData = new DataPanelModel(); + var activityState = execution?.ActivityState; + if (activityState != null) + { + var activityDescriptor = ActivityRegistry.Find(SelectedSubWorkflow.GetTypeName(), SelectedSubWorkflow.GetVersion())!; + foreach (var inputDescriptor in activityDescriptor.Inputs) + { + var inputValue = activityState.TryGetValue(inputDescriptor.Name, out var value) ? value : null; + inputData.Add(inputDescriptor.DisplayName ?? inputDescriptor.Name, inputValue?.ToString()); + } + } + + return inputData; + } + } + + private DataPanelModel SubWorkflowOutputData + { + get + { + if (SelectedSubWorkflowExecutions == null || SelectedSubWorkflow == null) + return new(); + + var execution = SelectedSubWorkflowExecutions.LastOrDefault(); + var outputData = new DataPanelModel(); + + if (execution != null) + { + var outputs = execution.Outputs; + var activityDescriptor = + ActivityRegistry.Find(SelectedSubWorkflow.GetTypeName(), SelectedSubWorkflow.GetVersion())!; + var outputDescriptors = activityDescriptor.Outputs; + + foreach (var outputDescriptor in outputDescriptors) + { + var outputValue = outputs != null + ? outputs.TryGetValue(outputDescriptor.Name, out var value) ? value : null + : null; + outputData.Add(outputDescriptor.DisplayName ?? outputDescriptor.Name, outputValue?.ToString()); + } + } + + return outputData; + } + } + + /// Updates the selected sub-workflow. + public async Task UpdateSubWorkflowAsync(JsonObject? obj) + { + SelectedSubWorkflow = obj; + SelectedSubWorkflowExecutions = obj == null + ? null + : (await ActivityExecutionService.ListAsync(WorkflowInstance!.Id, obj.GetNodeId())).ToList(); + StateHasChanged(); + } + + /// + protected override async Task OnInitializedAsync() + { + var drivers = await StorageDriverService.GetStorageDriversAsync(); + StorageDriverLookup = drivers.ToDictionary(x => x.TypeName); + } + + /// + protected override async Task OnParametersSetAsync() + { + if (_workflowInstance != WorkflowInstance) + { + _workflowInstance = WorkflowInstance; + + if (_workflowInstance != null) + { + await GetWorkflowActivityExecutionRecordAsync(_workflowInstance.Id); + await GetVariablesAsync(_workflowInstance.Id); + } + } + } + + private async Task GetWorkflowActivityExecutionRecordAsync(string workflowInstanceId) + { + _workflowActivityExecutionRecord = await GetLastWorkflowActivityExecutionRecordAsync(workflowInstanceId); + } + + private async Task GetVariablesAsync(string workflowInstanceId) + { + _variables = (await WorkflowInstanceService.GetVariablesAsync(workflowInstanceId)).ToList(); + } + + private async Task GetLastWorkflowActivityExecutionRecordAsync(string workflowInstanceId) + { + var rootWorkflowActivityExecutionContext = WorkflowInstance?.WorkflowState.ActivityExecutionContexts.FirstOrDefault(x => x.ParentContextId == null); + if (rootWorkflowActivityExecutionContext == null) return null; + var rootWorkflowActivityNodeId = rootWorkflowActivityExecutionContext.ScheduledActivityNodeId; + var records = await ActivityExecutionService.ListAsync(workflowInstanceId, rootWorkflowActivityNodeId); + return records.MaxBy(x => x.StartedAt); + } + + private string GetStorageDriverDisplayName(string? storageDriverTypeName) + { + if (storageDriverTypeName == null) + return "None"; + + return !StorageDriverLookup.TryGetValue(storageDriverTypeName, out var descriptor) + ? storageDriverTypeName + : descriptor.DisplayName; + } + + [RequiresUnreferencedCode("Calls System.Text.Json.JsonSerializer.Deserialize(JsonSerializerOptions)")] + private string GetVariableValue(Variable variable) + { + var resolvedVariable = _variables.FirstOrDefault(x => x.Id == variable.Id); + return resolvedVariable?.Value?.ToString() ?? string.Empty; + } + + private static string GetIncidentStrategyDisplayName(string? incidentStrategyTypeName) + { + return incidentStrategyTypeName + ?.Split(",", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).First() + .Split(".", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Last() + .Replace("Strategy", "") + .Humanize() ?? "Default"; + } + + private static string? GetLogPersistenceConfigurationDisplayName(string? logPersistenceConfigurationTypeName) + { + //"Elsa.Workflows.LogPersistence.Strategies.Include, Elsa.Workflows.Core" + return logPersistenceConfigurationTypeName?.Split(",")[0].Split(".")[^1] ; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor new file mode 100644 index 0000000..02650f2 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor @@ -0,0 +1,39 @@ +@using Orientation = Radzen.Orientation +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + + + + + + + + @if (WorkflowInstance != null) + { + + + + } + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor.cs new file mode 100644 index 0000000..86b7656 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Components/WorkflowInstanceWorkspace.razor.cs @@ -0,0 +1,58 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models; +using Elsa.Studio.Workflows.Shared.Args; +using Elsa.Studio.Workflows.UI.Contracts; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; + +public partial class WorkflowInstanceWorkspace : IWorkspace +{ + private WorkflowInstanceDetails _workflowInstanceDetails = default!; + private WorkflowInstanceDesigner _workflowInstanceDesigner = default!; + private MudDynamicTabs _dynamicTabs = default!; + + /// Gets or sets the workflow instance to view. + [Parameter] public WorkflowInstance? WorkflowInstance { get; set; } + + /// Gets or sets the workflow definition of the workflow instance to view. + [Parameter] public WorkflowDefinition? WorkflowDefinition { get; set; } + + /// An event callback that is invoked when the current workflow graph path has changed. + [Parameter] public EventCallback PathChanged { get; set; } + + /// An event callback that is invoked when an activity is selected. + [Parameter] public EventCallback ActivitySelected { get; set; } + + /// An event that is invoked when a workflow definition is edited. + [Parameter] public EventCallback EditWorkflowDefinition { get; set; } + /// + public bool IsReadOnly => true; + + /// + public bool HasWorkflowEditPermission => true; + + /// Selects the associated activity in the designer and activates its Event tab. + public async Task SelectWorkflowExecutionLogRecordAsync(JournalEntry entry) + { + await _workflowInstanceDesigner.SelectWorkflowExecutionLogRecordAsync(entry); + } + + /// Selects the associated activity in the designer and activates its Event tab. + public async Task OnIncidentActivityNodeIdClicked(string activityNodeId) + { + await _workflowInstanceDesigner.SelectActivityAsync(activityNodeId); + } + + private async Task OnPathChanged(DesignerPathChangedArgs args) + { + await _workflowInstanceDetails.UpdateSubWorkflowAsync(args.ParentActivity); + _workflowInstanceDesigner.UpdateSubWorkflow(args.ParentActivity); + + if(PathChanged.HasDelegate) + await PathChanged.InvokeAsync(args); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/JournalEntry.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/JournalEntry.cs new file mode 100644 index 0000000..9d246e2 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/JournalEntry.cs @@ -0,0 +1,13 @@ +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Studio.Workflows.UI.Models; + +namespace Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models; + +public record JournalEntry( + WorkflowExecutionLogRecord Record, + ActivityDescriptor? ActivityDescriptor, + ActivityDisplaySettings? ActivityDisplaySettings, + bool IsEven, + TimeSpan TimeMetric +); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/TimeMetricMode.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/TimeMetricMode.cs new file mode 100644 index 0000000..d97bb8b --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/Models/TimeMetricMode.cs @@ -0,0 +1,14 @@ +namespace Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models; + +public enum TimeMetricMode +{ + /// + /// Show the delta between the current and previous log entry. + /// + Relative, + + /// + /// Show the accumulated time since the workflow instance started until the current log entry. + /// + Accumulated +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor new file mode 100644 index 0000000..620461d --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor @@ -0,0 +1,17 @@ +@inherits StudioComponentBase +@using Orientation = Radzen.Orientation + + + + + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor.cs b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor.cs new file mode 100644 index 0000000..372c7f7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Components/WorkflowInstanceViewer/WorkflowInstanceViewer.razor.cs @@ -0,0 +1,117 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.RealTime.Messages; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; +using Elsa.Api.Client.Resources.WorkflowInstances.Models; +using Elsa.Api.Client.Resources.WorkflowInstances.Requests; +using Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components; +using Elsa.Studio.Workflows.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models; +using Elsa.Studio.Workflows.Shared.Args; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Components.WorkflowInstanceViewer; + +/// The index page for viewing a workflow instance. +public partial class WorkflowInstanceViewer : IAsyncDisposable +{ + private WorkflowInstance _workflowInstance = default!; + private WorkflowDefinition _workflowDefinition = default!; + private WorkflowInstanceWorkspace _workspace = default!; + private IWorkflowInstanceObserver? _workflowInstanceObserver = default!; + + /// The ID of the workflow instance to view. + [Parameter] public string InstanceId { get; set; } = default!; + + /// An event that is invoked when a workflow definition is edited. + [Parameter] public EventCallback EditWorkflowDefinition { get; set; } + + [Inject] private IWorkflowInstanceService WorkflowInstanceService { get; set; } = default!; + + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = default!; + [Inject] private IWorkflowInstanceObserverFactory WorkflowInstanceObserverFactory { get; set; } = default!; + + private Journal Journal { get; set; } = default!; + + /// + protected override async Task OnInitializedAsync() + { + var instance = await WorkflowInstanceService.GetAsync(InstanceId) ?? throw new InvalidOperationException($"Workflow instance with ID {InstanceId} not found."); + var workflowDefinition = await WorkflowDefinitionService.FindByIdAsync(instance.DefinitionVersionId); + _workflowInstance = instance; + _workflowDefinition = workflowDefinition!; + await SelectWorkflowInstanceAsync(instance); + + if (_workflowInstance.Status == WorkflowStatus.Running) + await ObserveWorkflowInstanceAsync(); + } + + private async Task ObserveWorkflowInstanceAsync() + { + await DisposeObserverAsync(); + _workflowInstanceObserver = await WorkflowInstanceObserverFactory.CreateAsync(_workflowInstance.Id); + _workflowInstanceObserver.WorkflowInstanceUpdated += OnWorkflowInstanceUpdatedAsync; + } + + private async Task DisposeObserverAsync() + { + if (_workflowInstanceObserver != null) + { + _workflowInstanceObserver.WorkflowInstanceUpdated -= OnWorkflowInstanceUpdatedAsync; + await _workflowInstanceObserver.DisposeAsync(); + _workflowInstanceObserver = null; + } + } + + private async Task SelectWorkflowInstanceAsync(WorkflowInstance instance) + { + // Select activity node IDs that are direct children of the root. + var activityNodeIds = _workflowDefinition.Root.GetActivities().Select(x => x.GetNodeId()).ToList(); + var filter = new JournalFilter + { + ActivityNodeIds = activityNodeIds + }; + await Journal.SetWorkflowInstanceAsync(instance, filter); + } + + private async Task OnWorkflowInstanceUpdatedAsync(WorkflowInstanceUpdatedMessage message) + { + var workflowInstance = (await WorkflowInstanceService.GetAsync(_workflowInstance.Id))!; + await InvokeAsync(async () => + { + _workflowInstance = workflowInstance; + StateHasChanged(); + + if (_workflowInstance.Status == WorkflowStatus.Finished) + await Journal.SetWorkflowInstanceAsync(_workflowInstance); + }); + } + + private async Task OnDesignerPathChanged(DesignerPathChangedArgs args) + { + var activityNodeIds = args.ContainerActivity.GetActivities().Select(x => x.GetNodeId()).ToList(); + var filter = new JournalFilter + { + ActivityNodeIds = activityNodeIds + }; + await Journal.SetWorkflowInstanceAsync(_workflowInstance, filter); + } + + private async Task OnWorkflowExecutionLogRecordSelected(JournalEntry entry) + { + await _workspace.SelectWorkflowExecutionLogRecordAsync(entry); + } + + private Task OnActivitySelected(JsonObject arg) + { + Journal.ClearSelection(); + return Task.CompletedTask; + } + + async ValueTask IAsyncDisposable.DisposeAsync() + { + await DisposeObserverAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Constants/ZoneNames.cs b/src/modules/Elsa.Studio.Workflows/Constants/ZoneNames.cs new file mode 100644 index 0000000..39cc55f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Constants/ZoneNames.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Workflows.Constants; + +/// +/// Provides zone names. +/// +public static class ZoneNames +{ + /// + /// The zone for the workflow definition properties. + /// + public const string WorkflowDefinitionProperties = "workflow-definition-properties"; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserver.cs b/src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserver.cs new file mode 100644 index 0000000..553d315 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserver.cs @@ -0,0 +1,16 @@ +using Elsa.Api.Client.RealTime.Messages; + +namespace Elsa.Studio.Workflows.Contracts; + +/// Defines a contract for observing workflow instance events such as execution log updates and instance updates. +public interface IWorkflowInstanceObserver : IAsyncDisposable +{ + /// An event that is raised when the workflow execution log is updated. + event Func WorkflowJournalUpdated; + + /// An event that is raised when the activity execution log is updated. + event Func ActivityExecutionLogUpdated; + + /// An event that is raised when the workflow instance is updated. + event Func WorkflowInstanceUpdated; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserverFactory.cs b/src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserverFactory.cs new file mode 100644 index 0000000..70c803c --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Contracts/IWorkflowInstanceObserverFactory.cs @@ -0,0 +1,13 @@ +using Elsa.Studio.Workflows.Models; + +namespace Elsa.Studio.Workflows.Contracts; + +/// A factory for creating instances. +public interface IWorkflowInstanceObserverFactory +{ + /// Creates a new instance. + Task CreateAsync(string workflowInstanceId); + + /// Creates a new instance. + Task CreateAsync(WorkflowInstanceObserverContext context); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesigner.razor b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesigner.razor new file mode 100644 index 0000000..6f2c8fd --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesigner.razor @@ -0,0 +1,17 @@ +@using System.Text.Json.Nodes +@using Elsa.Api.Client.Extensions + + + @if (Activity != null) + { + + } + + + +@code { + + [Parameter] + public JsonObject? Activity { get; set; } + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesignerProvider.cs b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesignerProvider.cs new file mode 100644 index 0000000..891cc62 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDesignerProvider.cs @@ -0,0 +1,13 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Workflows.UI.Contracts; + +namespace Elsa.Studio.Workflows.DiagramDesigners.Fallback; + +public class FallbackDesignerProvider : IDiagramDesignerProvider +{ + public double Priority => -1000; + public bool GetSupportsActivity(JsonObject activity) => true; + + public IDiagramDesigner GetEditor() => new FallbackDiagramDesigner(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDiagramDesigner.cs b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDiagramDesigner.cs new file mode 100644 index 0000000..a493a44 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Fallback/FallbackDiagramDesigner.cs @@ -0,0 +1,59 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.UI.Contexts; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Models; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.DiagramDesigners.Fallback; + +/// A fallback diagram designer that displays a simplified view of the workflow. +public class FallbackDiagramDesigner : IDiagramDesigner +{ + private JsonObject _activity = default!; + + /// + public Task LoadRootActivityAsync(JsonObject activity, IDictionary? activityStatsMap) + { + _activity = activity; + return Task.CompletedTask; + } + + /// + public Task UpdateActivityAsync(string id, JsonObject activity) + { + return Task.CompletedTask; + } + + /// + public Task UpdateActivityStatsAsync(string id, ActivityStats stats) + { + return Task.CompletedTask; + } + + /// + public Task SelectActivityAsync(string id) + { + return Task.CompletedTask; + } + + /// + public Task ReadRootActivityAsync() + { + return Task.FromResult(_activity); + } + + /// + public RenderFragment DisplayDesigner(DisplayContext context) + { + _activity = context.Activity; + + return builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(FallbackDesigner.Activity), _activity); + builder.CloseComponent(); + }; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor new file mode 100644 index 0000000..9580bac --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor @@ -0,0 +1,19 @@ +@if (IsReadOnly) + +{ +
+ +
+} + +else + +{ +
+ +
+} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor.cs b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor.cs new file mode 100644 index 0000000..bf35424 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDesignerWrapper.razor.cs @@ -0,0 +1,197 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.ActivityDescriptors.Enums; +using Elsa.Api.Client.Resources.ActivityDescriptors.Models; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Designer.Components; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.UI.Args; +using Elsa.Studio.Workflows.UI.Models; +using Humanizer; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; + +namespace Elsa.Studio.Workflows.DiagramDesigners.Flowcharts; + +/// +/// A wrapper around the component that provides interactivity such as drag and drop and displaying the designer in edit or read-only mode. +/// +public partial class FlowchartDesignerWrapper +{ + /// + /// The flowchart to display. + /// + [Parameter] public JsonObject Flowchart { get; set; } = default!; + + /// + /// A map of activity stats. + /// + [Parameter] public IDictionary? ActivityStats { get; set; } + + /// + /// Whether the designer is read-only. + /// + [Parameter] public bool IsReadOnly { get; set; } + + /// + /// An event raised when an activity is selected. + /// + [Parameter] public EventCallback ActivitySelected { get; set; } + + [Parameter] public EventCallback ActivityUpdated { get; set; } + + /// + /// An event raised when an embedded port is selected. + /// + [Parameter] public EventCallback ActivityEmbeddedPortSelected { get; set; } + + /// + /// An event raised when an activity is double-clicked. + /// + [Parameter] public EventCallback ActivityDoubleClick { get; set; } + + /// + /// An event raised when the graph is updated. + /// + [Parameter] public EventCallback GraphUpdated { get; set; } + + [CascadingParameter] private DragDropManager DragDropManager { get; set; } = default!; + [Inject] private IIdentityGenerator IdentityGenerator { get; set; } = default!; + [Inject] private IActivityNameGenerator ActivityNameGenerator { get; set; } = default!; + private FlowchartDesigner Designer { get; set; } = default!; + + /// + /// Loads the specified flowchart activity into the designer. + /// + /// The flowchart activity to load. + /// A map of activity stats. + public async Task LoadFlowchartAsync(JsonObject activity, IDictionary? activityStats = default) + { + if (activity.GetTypeName() != "Elsa.Flowchart") + throw new ArgumentException("Activity must be an Elsa.Flowchart", nameof(activity)); + + Flowchart = activity; + ActivityStats = activityStats; + await Designer.LoadFlowchartAsync(activity, activityStats); + } + + /// + /// Updates the specified activity in the flowchart. + /// + /// The ID of the activity to update. + /// The activity to update. + /// Thrown if the designer is read-only. + public async Task UpdateActivityAsync(string id, JsonObject activity) + { + if (IsReadOnly) + throw new InvalidOperationException("Cannot update activity because the designer is read-only."); + + if (activity != Flowchart) + await Designer.UpdateActivityAsync(id, activity); + } + + /// + /// Updates the stats of the specified activity. + /// + /// The ID of the activity to update. + /// The stats to update. + public async Task UpdateActivityStatsAsync(string id, ActivityStats stats) => await Designer.UpdateActivityStatsAsync(id, stats); + + /// + /// Selects the specified activity in the flowchart. + /// + /// The ID of the activity to select. + public async Task SelectActivityAsync(string id) => await Designer.SelectActivityAsync(id); + + /// + /// Reads the root activity from the flowchart. + /// + /// The root activity. + public async Task ReadRootActivityAsync() => await Designer.ReadFlowchartAsync(); + + /// + /// Zooms the designer to fit the content. + /// + public async Task ZoomToFitAsync() => await Designer.ZoomToFitAsync(); + + /// + /// Centers the content of the designer. + /// + public async Task CenterContentAsync() => await Designer.CenterContentAsync(); + + /// + /// Auto layouts the flowchart. + /// + public async Task AutoLayoutAsync() => await Designer.AutoLayoutAsync(Flowchart, ActivityStats); + + private async Task AddNewActivityAsync(ActivityDescriptor activityDescriptor, double x, double y) + { + var activities = Flowchart.GetActivities().ToList(); + var newActivityId = IdentityGenerator.GenerateId(); + + var newActivity = new JsonObject(new Dictionary + { + ["id"] = newActivityId, + ["nodeId"] = $"{Flowchart.GetNodeId()}:{newActivityId}", + ["name"] = ActivityNameGenerator.GenerateNextName(activities, activityDescriptor), + ["type"] = activityDescriptor.TypeName, + ["version"] = activityDescriptor.Version, + }); + + newActivity.SetDesignerMetadata(new ActivityDesignerMetadata + { + Position = new Position(x, y) + }); + + // Copy constructor values from the activity descriptor. + foreach (var property in activityDescriptor.ConstructionProperties) + { + var valueNode = JsonSerializer.SerializeToNode(property.Value); + var propertyName = property.Key.Camelize(); + newActivity.SetProperty(valueNode, propertyName); + } + + // If the activity is a trigger, and it's the first trigger on the flowchart, set the trigger property to true. + if (activityDescriptor.Kind == ActivityKind.Trigger && activities.All(activity => activity.GetCanStartWorkflow() != true)) + newActivity.SetCanStartWorkflow(true); + + await Designer.AddActivityAsync(newActivity); + + if (ActivitySelected.HasDelegate) + await ActivitySelected.InvokeAsync(newActivity); + } + + private void OnDragOver(DragEventArgs e) + { + if (DragDropManager.Payload is not ActivityDescriptor) + { + e.DataTransfer.DropEffect = "none"; + return; + } + + e.DataTransfer.DropEffect = "move"; + } + + private async Task OnDrop(DragEventArgs e) + { + if (DragDropManager.Payload is not ActivityDescriptor activityDescriptor) + return; + + var x = e.PageX; + var y = e.PageY; + + await AddNewActivityAsync(activityDescriptor, x, y); + } + + private async Task OnCanvasSelected() + { + if (ActivitySelected.HasDelegate) + await ActivitySelected.InvokeAsync(Flowchart); + } + + private async Task OnZoomToFitClick() => await Designer.ZoomToFitAsync(); + private async Task OnCenterContentClick() => await Designer.CenterContentAsync(); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesigner.cs b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesigner.cs new file mode 100644 index 0000000..f3aba71 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesigner.cs @@ -0,0 +1,115 @@ +using System.Text.Json.Nodes; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.UI.Contexts; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using MudBlazor; + +namespace Elsa.Studio.Workflows.DiagramDesigners.Flowcharts; + +/// +/// A diagram designer that displays a flowchart. +/// +public class FlowchartDiagramDesigner(ILocalizer localizer) : IDiagramDesignerToolboxProvider +{ + private FlowchartDesignerWrapper? _designerWrapper; + private readonly Guid _id = Guid.NewGuid(); + + /// + public async Task LoadRootActivityAsync(JsonObject activity, IDictionary? activityStatsMap) + { + await InvokeDesignerActionAsync(x => x.LoadFlowchartAsync(activity, activityStatsMap)); + } + + /// + public async Task UpdateActivityAsync(string id, JsonObject activity) + { + await InvokeDesignerActionAsync(x => x.UpdateActivityAsync(id, activity)); + } + + /// + public async Task UpdateActivityStatsAsync(string id, ActivityStats stats) + { + await InvokeDesignerActionAsync(x => x.UpdateActivityStatsAsync(id, stats)); + } + + /// + public async Task SelectActivityAsync(string id) + { + await InvokeDesignerActionAsync(x => x.SelectActivityAsync(id)); + } + + /// + public async Task ReadRootActivityAsync() + { + return await _designerWrapper!.ReadRootActivityAsync(); + } + + /// + public RenderFragment DisplayDesigner(DisplayContext context) + { + var flowchart = context.Activity; + var sequence = 0; + + return builder => + { + builder.OpenComponent(sequence++); + builder.SetKey(_id); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.Flowchart), flowchart); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.IsReadOnly), context.IsReadOnly); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.ActivityStats), context.ActivityStats); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.ActivitySelected), context.ActivitySelectedCallback); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.ActivityUpdated), context.ActivityUpdated); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.ActivityEmbeddedPortSelected), context.ActivityEmbeddedPortSelectedCallback); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.ActivityDoubleClick), context.ActivityDoubleClickCallback); + builder.AddAttribute(sequence++, nameof(FlowchartDesignerWrapper.GraphUpdated), context.GraphUpdatedCallback); + builder.AddComponentReferenceCapture(sequence++, @ref => _designerWrapper = (FlowchartDesignerWrapper)@ref); + + builder.CloseComponent(); + }; + } + + /// + public IEnumerable GetToolboxItems(bool isReadonly) + { + yield return DisplayToolboxItem(localizer["Zoom to fit"], Icons.Material.Outlined.FitScreen, localizer["Zoom to fit the screen"], OnZoomToFitClicked); + yield return DisplayToolboxItem(localizer["Center"], Icons.Material.Filled.FilterCenterFocus, localizer["Center"], OnCenterClicked); + + if (!isReadonly) + { + yield return DisplayToolboxItem(localizer["Auto layout"], Icons.Material.Outlined.AutoAwesomeMosaic, localizer["Auto layout"], OnAutoLayoutClicked); + } + } + + private RenderFragment DisplayToolboxItem(string title, string icon, string description, Func onClick) + { + return builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(MudTooltip.Text), description); + builder.AddAttribute(2, nameof(MudTooltip.ChildContent), (RenderFragment)(childBuilder => + { + childBuilder.OpenComponent(0); + childBuilder.AddAttribute(1, nameof(MudIconButton.Icon), icon); + childBuilder.AddAttribute(2, "title", title); + childBuilder.AddAttribute(3, nameof(MudIconButton.OnClick), EventCallback.Factory.Create(this, onClick)); + childBuilder.CloseComponent(); + })); + + builder.CloseComponent(); + }; + } + + private async Task InvokeDesignerActionAsync(Func action) + { + if (_designerWrapper != null) await action(_designerWrapper); + } + + private Task OnZoomToFitClicked() => _designerWrapper != null ? _designerWrapper.ZoomToFitAsync() : Task.CompletedTask; + private Task OnCenterClicked() => _designerWrapper != null ? _designerWrapper!.CenterContentAsync() : Task.CompletedTask; + private Task OnAutoLayoutClicked() => _designerWrapper != null ? _designerWrapper!.AutoLayoutAsync() : Task.CompletedTask; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesignerProvider.cs b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesignerProvider.cs new file mode 100644 index 0000000..69d1ffd --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/DiagramDesigners/Flowcharts/FlowchartDiagramDesignerProvider.cs @@ -0,0 +1,24 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.UI.Contracts; +using JetBrains.Annotations; + +namespace Elsa.Studio.Workflows.DiagramDesigners.Flowcharts; + +/// +/// A diagram designer provider for the Flowchart designer. +/// +[UsedImplicitly] +public class FlowchartDiagramDesignerProvider(ILocalizer localizer) : IDiagramDesignerProvider +{ + /// + public double Priority => 0; + + /// + public bool GetSupportsActivity(JsonObject activity) => activity.GetTypeName() == "Elsa.Flowchart"; + + /// + public IDiagramDesigner GetEditor() => new FlowchartDiagramDesigner(localizer); +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Elsa.Studio.Workflows.csproj b/src/modules/Elsa.Studio.Workflows/Elsa.Studio.Workflows.csproj new file mode 100644 index 0000000..58b6353 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Elsa.Studio.Workflows.csproj @@ -0,0 +1,25 @@ + + + + Adds workflow management to the studio. + elsa studio module + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Elsa.Studio.Workflows/Extensions/ActivityExecutionRecordExtensions.cs b/src/modules/Elsa.Studio.Workflows/Extensions/ActivityExecutionRecordExtensions.cs new file mode 100644 index 0000000..79ee9d7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Extensions/ActivityExecutionRecordExtensions.cs @@ -0,0 +1,18 @@ +using Elsa.Api.Client.Resources.ActivityExecutions.Models; + +namespace Elsa.Studio.Workflows.Extensions; + +/// +/// Provides extension methods for . +/// +public static class ActivityExecutionRecordExtensions +{ + /// + /// Determines if the specified activity execution record is fused. + /// + public static bool IsFused(this ActivityExecutionRecord record) + { + // TODO: with blueberry, consider introducing a new property to ActivityExecutionRecord to indicate whether the record has all details or not. + return record.ActivityState != null || record.Outputs != null || record.Exception != null || record.Payload != null || record.Properties.Count > 0; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Extensions/HubConnectionExtensions.cs b/src/modules/Elsa.Studio.Workflows/Extensions/HubConnectionExtensions.cs new file mode 100644 index 0000000..a460bbc --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Extensions/HubConnectionExtensions.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.SignalR.Client; + +namespace Elsa.Studio.Workflows.Extensions +{ + public static class HubConnectionExtensions + { + public static IHubConnectionBuilder WithUrl(this IHubConnectionBuilder builder, string url, IHttpMessageHandlerFactory clientFactory) + { + return builder.WithUrl(url, options => + { + options.HttpMessageHandlerFactory = _ => clientFactory.CreateHandler(); + }); + } + } +} diff --git a/src/modules/Elsa.Studio.Workflows/Extensions/ServiceCollectionExtensions.cs b/src/modules/Elsa.Studio.Workflows/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..cc9b7a7 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,54 @@ +using Elsa.Studio.ActivityPortProviders.Extensions; +using Elsa.Studio.Contracts; +using Elsa.Studio.DomInterop.Extensions; +using Elsa.Studio.Extensions; +using Elsa.Studio.UIHints.Extensions; +using Elsa.Studio.Workflows.Contracts; +using Elsa.Studio.Workflows.Designer.Extensions; +using Elsa.Studio.Workflows.DiagramDesigners.Fallback; +using Elsa.Studio.Workflows.DiagramDesigners.Flowcharts; +using Elsa.Studio.Workflows.Handlers; +using Elsa.Studio.Workflows.Menu; +using Elsa.Studio.Workflows.Services; +using Elsa.Studio.Workflows.Widgets; +using Microsoft.Extensions.DependencyInjection; +using MudBlazor.Services; + + +namespace Elsa.Studio.Workflows.Extensions; + +/// +/// Contains extension methods for the interface. +/// +public static class ServiceCollectionExtensions +{ + /// + /// Adds the workflows module. + /// + public static IServiceCollection AddWorkflowsModule(this IServiceCollection services) + { + services + .AddScoped() + .AddScoped() + .AddScoped() + .AddDefaultUIHintHandlers() + .AddDefaultActivityPortProviders() + .AddWorkflowsCore() + .AddWorkflowsDesigner() + .AddDomInterop() + .AddClipboardInterop() + .AddDownloadInterop() + ; + + services + .AddDiagramDesignerProvider() + .AddDiagramDesignerProvider(); + + services.AddNotificationHandler(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + return services; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Extensions/WorkflowDefinitionExtensions.cs b/src/modules/Elsa.Studio.Workflows/Extensions/WorkflowDefinitionExtensions.cs new file mode 100644 index 0000000..f6d1649 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Extensions/WorkflowDefinitionExtensions.cs @@ -0,0 +1,17 @@ +using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; + +namespace Elsa.Studio.Workflows.Extensions; + +/// Provides extension methods for the WorkflowDefinition class. +public static class WorkflowDefinitionExtensions +{ + /// + /// Determines whether the specified workflow definition is read-only. + /// + /// The workflow definition to check. + /// true if the workflow definition is read-only; otherwise, false. + public static bool GetIsReadOnly(this WorkflowDefinition? workflowDefinition) + { + return workflowDefinition != null && (workflowDefinition.IsLatest == false || (workflowDefinition.Links?.Count(l => l.Rel == "publish") ?? 0) == 0); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Feature.cs b/src/modules/Elsa.Studio.Workflows/Feature.cs new file mode 100644 index 0000000..24befd8 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Feature.cs @@ -0,0 +1,10 @@ +using Elsa.Studio.Abstractions; + +namespace Elsa.Studio.Workflows; + +/// +/// +/// +public class Feature : FeatureBase +{ +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/FodyWeavers.xml b/src/modules/Elsa.Studio.Workflows/FodyWeavers.xml new file mode 100644 index 0000000..00e1d9a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/FodyWeavers.xsd b/src/modules/Elsa.Studio.Workflows/FodyWeavers.xsd new file mode 100644 index 0000000..3f3946e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Handlers/RefreshActivityRegistry.cs b/src/modules/Elsa.Studio.Workflows/Handlers/RefreshActivityRegistry.cs new file mode 100644 index 0000000..3554878 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Handlers/RefreshActivityRegistry.cs @@ -0,0 +1,40 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Notifications; +using JetBrains.Annotations; + +namespace Elsa.Studio.Workflows.Handlers; + +/// A handler that refreshes the activity registry when a workflow definition is deleted, published or retracted. +[UsedImplicitly] +public class RefreshActivityRegistry : INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler, + INotificationHandler +{ + private readonly IActivityRegistry _activityRegistry; + + /// + /// Initializes a new instance of the class. + /// + public RefreshActivityRegistry(IActivityRegistry activityRegistry) + { + _activityRegistry = activityRegistry; + } + + async Task INotificationHandler.HandleAsync(WorkflowDefinitionDeleted notification, CancellationToken cancellationToken) => await RefreshActivityRegistryAsync(cancellationToken); + async Task INotificationHandler.HandleAsync(WorkflowDefinitionPublished notification, CancellationToken cancellationToken) => await RefreshActivityRegistryAsync(cancellationToken); + async Task INotificationHandler.HandleAsync(WorkflowDefinitionRetracted notification, CancellationToken cancellationToken) => await RefreshActivityRegistryAsync(cancellationToken); + async Task INotificationHandler.HandleAsync(BulkWorkflowDefinitionsDeleted notification, CancellationToken cancellationToken) => await RefreshActivityRegistryAsync(cancellationToken); + async Task INotificationHandler.HandleAsync(BulkWorkflowDefinitionVersionsDeleted notification, CancellationToken cancellationToken) => await RefreshActivityRegistryAsync(cancellationToken); + async Task INotificationHandler.HandleAsync(BulkWorkflowDefinitionsPublished notification, CancellationToken cancellationToken) => await RefreshActivityRegistryAsync(cancellationToken); + async Task INotificationHandler.HandleAsync(BulkWorkflowDefinitionsRetracted notification, CancellationToken cancellationToken) => await RefreshActivityRegistryAsync(cancellationToken); + + private async Task RefreshActivityRegistryAsync(CancellationToken cancellationToken = default) + { + await _activityRegistry.RefreshAsync(cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Menu/WorkflowsMenu.cs b/src/modules/Elsa.Studio.Workflows/Menu/WorkflowsMenu.cs new file mode 100644 index 0000000..1813405 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Menu/WorkflowsMenu.cs @@ -0,0 +1,38 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Models; +using Elsa.Studio.Workflows.Services; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Menu; + +public class WorkflowsMenu(ILocalizer localizer) : IMenuProvider +{ + public ValueTask> GetMenuItemsAsync(CancellationToken cancellationToken = default) + { + var menuItems = new List + { + new() + { + Icon = Icons.Material.Outlined.Schema, + Text = localizer["Workflows"], + GroupName = MenuItemGroups.General.Name, + SubMenuItems = + { + new MenuItem() + { + Text = localizer["Definitions"], + Href = "workflows/definitions" + }, + new MenuItem() + { + Text = localizer["Instances"], + Href = "workflows/instances" + }, + } + } + }; + + return new ValueTask>(menuItems); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Models/DragDropManager.cs b/src/modules/Elsa.Studio.Workflows/Models/DragDropManager.cs new file mode 100644 index 0000000..68bce79 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Models/DragDropManager.cs @@ -0,0 +1,12 @@ +namespace Elsa.Studio.Workflows.Models; + +/// +/// A manager for drag and drop operations. +/// +public class DragDropManager +{ + /// + /// A payload value associated with the element being dragged. + /// + public object? Payload { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Models/PagedResult.cs b/src/modules/Elsa.Studio.Workflows/Models/PagedResult.cs new file mode 100644 index 0000000..1f9c616 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Models/PagedResult.cs @@ -0,0 +1,3 @@ +namespace Elsa.Studio.Workflows.Models; + +public record PagedResult(ICollection Items, long TotalCount); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Models/WorkflowInstanceObserverContext.cs b/src/modules/Elsa.Studio.Workflows/Models/WorkflowInstanceObserverContext.cs new file mode 100644 index 0000000..f9c9e16 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Models/WorkflowInstanceObserverContext.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.Models; + +public class WorkflowInstanceObserverContext +{ + public string WorkflowInstanceId { get; set; } = default!; + public JsonObject? ContainerActivity { get; set; } + public CancellationToken CancellationToken { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Models/WorkflowMetadataModel.cs b/src/modules/Elsa.Studio.Workflows/Models/WorkflowMetadataModel.cs new file mode 100644 index 0000000..ae9f898 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Models/WorkflowMetadataModel.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; + +namespace Elsa.Studio.Workflows.Models; + +/// +/// Represents the metadata of a workflow. +/// +public class WorkflowMetadataModel +{ + /// + /// Gets or sets the ID of the workflow definition. + /// + public string? DefinitionId { get; set; } + + /// + /// Gets or sets the name of the workflow. + /// + [Required] public string? Name { get; set; } + + /// + /// Gets or sets the description of the workflow. + /// + public string? Description { get; set; } = default!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/Edit/Index.razor b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/Edit/Index.razor new file mode 100644 index 0000000..d46c3fe --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/Edit/Index.razor @@ -0,0 +1,18 @@ +@page "/workflows/definitions/{definitionId}/edit" +@using Microsoft.Extensions.Localization +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +@Localizer["Workflow definitions Editor"] + + + +@code +{ + /// + /// The ID of the workflow definition to edit. + /// + [Parameter] + public string DefinitionId { get; set; } = default!; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/List/Index.razor b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/List/Index.razor new file mode 100644 index 0000000..f79e2cc --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowDefinitions/List/Index.razor @@ -0,0 +1,17 @@ +@page "/workflows/definitions" +@inherits StudioComponentBase +@using Elsa.Studio.Workflows.Services +@inject ILocalizer Localizer + +@Localizer["Workflow definitions Editor"] + + +@code { + + [Inject] NavigationManager NavigationManager { get; set; } = default!; + + private void OnWorkflowDefinitionEdit(string definitionId) + { + NavigationManager.NavigateTo($"workflows/definitions/{definitionId}/edit"); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/List/Index.razor b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/List/Index.razor new file mode 100644 index 0000000..c91e9e6 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/List/Index.razor @@ -0,0 +1,16 @@ +@page "/workflows/instances" +@inherits StudioComponentBase + +Workflow instances + + +@code { + + [Inject] NavigationManager NavigationManager { get; set; } = default!; + + private void OnViewWorkflowInstance(string instanceId) + { + NavigationManager.NavigateTo($"workflows/instances/{instanceId}/view"); + } + +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/View/Index.razor b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/View/Index.razor new file mode 100644 index 0000000..9c497f0 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Pages/WorkflowInstances/View/Index.razor @@ -0,0 +1,13 @@ +@page "/workflows/instances/{id}/view" +@inherits StudioComponentBase + +Workflow instance + + +@code +{ + /// + /// The ID of the workflow instance to view. + /// + [Parameter] public string Id { get; set; } = default!; +} diff --git a/src/modules/Elsa.Studio.Workflows/Services/DisconnectedWorkflowInstanceObserver.cs b/src/modules/Elsa.Studio.Workflows/Services/DisconnectedWorkflowInstanceObserver.cs new file mode 100644 index 0000000..a5dfbf4 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Services/DisconnectedWorkflowInstanceObserver.cs @@ -0,0 +1,20 @@ +using Elsa.Api.Client.RealTime.Messages; +using Elsa.Studio.Workflows.Contracts; + +namespace Elsa.Studio.Workflows.Services; + +/// An implementation of that does nothing. +public class DisconnectedWorkflowInstanceObserver : IWorkflowInstanceObserver +{ + public string? Name { get; set; } + + /// + public event Func WorkflowJournalUpdated = default!; + + /// + public event Func ActivityExecutionLogUpdated = default!; + + /// + public event Func WorkflowInstanceUpdated = default!; + ValueTask IAsyncDisposable.DisposeAsync() => ValueTask.CompletedTask; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Services/PollingWorkflowInstanceObserver.cs b/src/modules/Elsa.Studio.Workflows/Services/PollingWorkflowInstanceObserver.cs new file mode 100644 index 0000000..8a0aad8 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Services/PollingWorkflowInstanceObserver.cs @@ -0,0 +1,102 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.RealTime.Messages; +using Elsa.Api.Client.Resources.ActivityExecutions.Contracts; +using Elsa.Api.Client.Resources.ActivityExecutions.Models; +using Elsa.Api.Client.Resources.ActivityExecutions.Requests; +using Elsa.Api.Client.Resources.WorkflowInstances.Contracts; +using Elsa.Api.Client.Resources.WorkflowInstances.Enums; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Contracts; +using Elsa.Studio.Workflows.Models; + +namespace Elsa.Studio.Workflows.Services; + +/// Observes a workflow instance by periodically polling for updates and raising corresponding events. +public class PollingWorkflowInstanceObserver : IWorkflowInstanceObserver +{ + private readonly IWorkflowInstancesApi _workflowInstancesApi; + private readonly IActivityExecutionsApi _activityExecutionsApi; + private readonly string _workflowInstanceId; + private readonly JsonObject? _containerActivity; + private readonly TimeSpan _pollingInterval = TimeSpan.FromSeconds(5); + private DateTimeOffset _lastUpdateAt = DateTimeOffset.MinValue; + private bool _checkForUpdates = true; + + /// Observes a workflow instance by periodically polling for updates and raising corresponding events. + public PollingWorkflowInstanceObserver( + WorkflowInstanceObserverContext context, + IWorkflowInstancesApi workflowInstancesApi, + IActivityExecutionsApi activityExecutionsApi) + { + _workflowInstancesApi = workflowInstancesApi; + _activityExecutionsApi = activityExecutionsApi; + _workflowInstanceId = context.WorkflowInstanceId; + _containerActivity = context.ContainerActivity; + + _ = Task.Run(GetRecentExecutionRecordsAsync); + } + + /// + public event Func WorkflowJournalUpdated = default!; + + /// + public event Func ActivityExecutionLogUpdated = default!; + + /// + public event Func WorkflowInstanceUpdated = default!; + + private async Task GetRecentExecutionRecordsAsync() + { + while (_checkForUpdates) + { + try + { + var response = await _workflowInstancesApi.GetExecutionStateAsync(_workflowInstanceId); + var lastUpdateAt = response.UpdatedAt; + + if (_lastUpdateAt < lastUpdateAt) + { + _lastUpdateAt = lastUpdateAt; + if (WorkflowJournalUpdated != null!) await WorkflowJournalUpdated(new WorkflowExecutionLogUpdatedMessage()); + if (ActivityExecutionLogUpdated != null && _containerActivity != null) + { + var activityExecutionStats = await GetActivityExecutionStatsAsync(_containerActivity); + await ActivityExecutionLogUpdated(new ActivityExecutionLogUpdatedMessage(activityExecutionStats)); + } + + if (WorkflowInstanceUpdated != null!) await WorkflowInstanceUpdated(new WorkflowInstanceUpdatedMessage(_workflowInstanceId)); + } + + if (response.Status == WorkflowStatus.Finished) + _checkForUpdates = false; + } + catch (ObjectDisposedException) + { + _checkForUpdates = false; + break; + } + + await Task.Delay(_pollingInterval); + } + } + + private async Task> GetActivityExecutionStatsAsync(JsonObject container) + { + var activityNodeIds = container.GetActivities().Select(x => x.GetNodeId()).ToList(); + var request = new GetActivityExecutionReportRequest + { + WorkflowInstanceId = _workflowInstanceId, + ActivityNodeIds = activityNodeIds, + }; + var report = await _activityExecutionsApi.GetReportAsync(request); + return report.Stats; + } + + /// + public ValueTask DisposeAsync() + { + _checkForUpdates = false; + return ValueTask.CompletedTask; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Services/SignalRWorkflowInstanceObserver.cs b/src/modules/Elsa.Studio.Workflows/Services/SignalRWorkflowInstanceObserver.cs new file mode 100644 index 0000000..5ac109a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Services/SignalRWorkflowInstanceObserver.cs @@ -0,0 +1,51 @@ +using Elsa.Api.Client.RealTime.Messages; +using Elsa.Studio.Workflows.Contracts; +using Microsoft.AspNetCore.SignalR.Client; + +namespace Elsa.Studio.Workflows.Services; + +/// A wrapper around a SignalR connection that receives notifications about workflow instance updates. +public class SignalRWorkflowInstanceObserver : IWorkflowInstanceObserver +{ + private readonly HubConnection _connection; + + /// A wrapper around a SignalR connection that receives notifications about workflow instance updates. + public SignalRWorkflowInstanceObserver(HubConnection connection) + { + _connection = connection; + + connection.On("ActivityExecutionLogUpdatedAsync", async (ActivityExecutionLogUpdatedMessage message) => await OnActivityExecutionLogUpdatedAsync(message)); + connection.On("WorkflowExecutionLogUpdatedAsync", async (WorkflowExecutionLogUpdatedMessage message) => await OnWorkflowJournalUpdatedAsync(message)); + connection.On("WorkflowInstanceUpdatedAsync", async (WorkflowInstanceUpdatedMessage message) => await OnWorkflowInstanceUpdatedAsync(message)); + } + + /// + public event Func WorkflowJournalUpdated = default!; + + /// + public event Func ActivityExecutionLogUpdated = default!; + + /// + public event Func WorkflowInstanceUpdated = default!; + + private async Task OnWorkflowJournalUpdatedAsync(WorkflowExecutionLogUpdatedMessage arg) + { + if (WorkflowJournalUpdated != null!) await WorkflowJournalUpdated(arg); + } + + private async Task OnActivityExecutionLogUpdatedAsync(ActivityExecutionLogUpdatedMessage arg) + { + if (ActivityExecutionLogUpdated != null!) await ActivityExecutionLogUpdated(arg); + } + + private async Task OnWorkflowInstanceUpdatedAsync(WorkflowInstanceUpdatedMessage arg) + { + if (WorkflowInstanceUpdated != null!) await WorkflowInstanceUpdated(arg); + } + + async ValueTask IAsyncDisposable.DisposeAsync() + { + await _connection.StopAsync(); + await _connection.DisposeAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Services/WorkflowInstanceObserverFactory.cs b/src/modules/Elsa.Studio.Workflows/Services/WorkflowInstanceObserverFactory.cs new file mode 100644 index 0000000..4f0c49e --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Services/WorkflowInstanceObserverFactory.cs @@ -0,0 +1,74 @@ +using System.Net; +using Elsa.Api.Client.Resources.ActivityExecutions.Contracts; +using Elsa.Api.Client.Resources.WorkflowInstances.Contracts; +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Contracts; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Workflows.Models; +using Microsoft.AspNetCore.SignalR.Client; +using Microsoft.Extensions.Logging; + +namespace Elsa.Studio.Workflows.Services; + +/// +public class WorkflowInstanceObserverFactory( + IBackendApiClientProvider backendApiClientProvider, + IRemoteFeatureProvider remoteFeatureProvider, + IHttpMessageHandlerFactory httpMessageHandlerFactory, + ILogger logger) : IWorkflowInstanceObserverFactory +{ + /// + public Task CreateAsync(string workflowInstanceId) + { + var context = new WorkflowInstanceObserverContext + { + WorkflowInstanceId = workflowInstanceId + }; + + return CreateAsync(context); + } + + /// + public async Task CreateAsync(WorkflowInstanceObserverContext context) + { + var cancellationToken = context.CancellationToken; + var workflowInstancesApi = await backendApiClientProvider.GetApiAsync(cancellationToken); + var activityExecutionsApi = await backendApiClientProvider.GetApiAsync(cancellationToken); + var workflowInstanceId = context.WorkflowInstanceId; + + // Only establish a SignalR connection if that feature is enabled. + if (!await remoteFeatureProvider.IsEnabledAsync("Elsa.RealTimeWorkflowUpdates", cancellationToken)) + { + // Fall back to regular polling. + return new PollingWorkflowInstanceObserver( + context, + workflowInstancesApi, + activityExecutionsApi); + } + + // Set-up the SignalR connection. + var baseUrl = backendApiClientProvider.Url; + var hubUrl = new Uri(baseUrl, "hubs/workflow-instance").ToString(); + var connection = new HubConnectionBuilder() + .WithUrl(hubUrl, httpMessageHandlerFactory) + .Build(); + + var observer = new SignalRWorkflowInstanceObserver(connection); + + try + { + await connection.StartAsync(cancellationToken); + } + catch (HttpRequestException e) when (e.StatusCode == HttpStatusCode.NotFound) + { + logger.LogWarning("The workflow instance observer hub was not found, but the RealTimeWorkflows feature was enabled. Please make sure to call `app.UseWorkflowsSignalRHubs()` from the workflow server to install the required SignalR middleware component. Falling back to polling observer"); + return new PollingWorkflowInstanceObserver( + context, + workflowInstancesApi, + activityExecutionsApi); + } + + await connection.SendAsync("ObserveInstanceAsync", workflowInstanceId, cancellationToken: cancellationToken); + return observer; + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Shared/Args/DesignerPathChangedArgs.cs b/src/modules/Elsa.Studio.Workflows/Shared/Args/DesignerPathChangedArgs.cs new file mode 100644 index 0000000..9ded831 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Shared/Args/DesignerPathChangedArgs.cs @@ -0,0 +1,6 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.Shared.Args; + +/// Represents the event arguments when the designer path changes. +public record DesignerPathChangedArgs(JsonObject ParentActivity, JsonObject ContainerActivity); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor b/src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor new file mode 100644 index 0000000..5545b2f --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor @@ -0,0 +1,38 @@ +@using Elsa.Studio.Workflows.UI.Contracts +@inherits StudioComponentBase + + + @{ + if (_diagramDesigner is IDiagramDesignerToolboxProvider toolboxProvider) + { + foreach (var toolboxComponent in toolboxProvider.GetToolboxItems(IsReadOnly)) + { + @toolboxComponent + } + } + } + + @CustomToolbarItems + + + +
+ + + + @if (context.Icon != null) + { + + } + @context.Text + + + + +
+ +
+
+
+
+@DisplayDesigner() \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor.cs b/src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor.cs new file mode 100644 index 0000000..3ecb19a --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Shared/Components/DiagramDesignerWrapper.razor.cs @@ -0,0 +1,539 @@ +using System.Text.Json.Nodes; +using Elsa.Api.Client.Extensions; +using Elsa.Api.Client.Shared.Models; +using Elsa.Studio.Workflows.Domain.Contexts; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Domain.Extensions; +using Elsa.Studio.Workflows.Domain.Models; +using Elsa.Studio.Workflows.Extensions; +using Elsa.Studio.Workflows.Models; +using Elsa.Studio.Workflows.Shared.Args; +using Elsa.Studio.Workflows.UI.Args; +using Elsa.Studio.Workflows.UI.Contexts; +using Elsa.Studio.Workflows.UI.Contracts; +using Elsa.Studio.Workflows.UI.Models; +using Humanizer; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Elsa.Studio.Workflows.Shared.Components; + +/// A wrapper around the diagram designer that provides a breadcrumb and a toolbar. +public partial class DiagramDesignerWrapper +{ + private IDiagramDesigner? _diagramDesigner; + private Stack _pathSegments = new(); + private JsonObject? _currentContainerActivity; + private List _breadcrumbItems = new(); + private IDictionary _activityStats = new Dictionary(); + private ActivityGraph _activityGraph = null!; + private IDictionary _indexedActivityNodes = new Dictionary(); + + /// The workflow definition version ID. + [Parameter] public string WorkflowDefinitionVersionId { get; set; } = null!; + + /// The root activity to display. + [Parameter] public JsonObject Activity { get; set; } = null!; + + /// Whether the designer is read-only. + [Parameter] public bool IsReadOnly { get; set; } + + /// The workflow instance ID, if any. + [Parameter] public string? WorkflowInstanceId { get; set; } + + /// A custom toolbar to display. + [Parameter] public RenderFragment? CustomToolbarItems { get; set; } + + /// Whether the designer is progressing. + [Parameter] public bool IsProgressing { get; set; } + + /// An event raised when an activity is selected. + [Parameter] public EventCallback ActivitySelected { get; set; } + + /// An event raised when an embedded port is selected. + [Parameter] public EventCallback GraphUpdated { get; set; } + + [Parameter] public EventCallback ActivityUpdated { get; set; } + + /// An event raised when the path changes. + [Parameter] public EventCallback PathChanged { get; set; } + + [Inject] private IDiagramDesignerService DiagramDesignerService { get; set; } = null!; + [Inject] private IActivityDisplaySettingsRegistry ActivityDisplaySettingsRegistry { get; set; } = null!; + [Inject] private IActivityPortService ActivityPortService { get; set; } = null!; + [Inject] private IActivityRegistry ActivityRegistry { get; set; } = null!; + [Inject] private IIdentityGenerator IdentityGenerator { get; set; } = null!; + [Inject] private IActivityExecutionService ActivityExecutionService { get; set; } = null!; + [Inject] private IActivityVisitor ActivityVisitor { get; set; } = null!; + [Inject] private IWorkflowDefinitionService WorkflowDefinitionService { get; set; } = null!; + [Inject] private ISnackbar Snackbar { get; set; } = null!; + + private ActivityPathSegment? CurrentPathSegment => _pathSegments.TryPeek(out var segment) ? segment : null; + + /// Selects the activity with the specified ID. + /// The ID of the activity ID select. + public async Task SelectActivityByActivityIdAsync(string activityId) + { + var containerActivity = GetCurrentContainerActivity(); + var activities = containerActivity.GetActivities(); + var activityToSelect = activities.FirstOrDefault(x => x.GetId() == activityId); + + await SelectActivityAsync(activityToSelect); + } + + /// Selects the activity with the specified node ID. + /// The ID of the activity node to select. + public async Task SelectActivityAsync(string nodeId) + { + var containerActivity = GetCurrentContainerActivityOrRoot(); + var activities = containerActivity.GetActivities(); + var activityToSelect = activities.FirstOrDefault(x => x.GetNodeId() == nodeId); + + await SelectActivityAsync(activityToSelect, nodeId); + } + + private async Task SelectActivityAsync(JsonObject? activityToSelect, string? nodeId = null) + { + if (activityToSelect != null) + { + await _diagramDesigner!.SelectActivityAsync(activityToSelect.GetId()); + return; + } + + if (nodeId == null) + return; + + // Load the selected node path from the backend. + var pathSegmentsResponse = await WorkflowDefinitionService.GetPathSegmentsAsync(WorkflowDefinitionVersionId, nodeId); + + if (pathSegmentsResponse == null) + return; + + await IndexActivityNodes(pathSegmentsResponse.Container.Activity); + + activityToSelect = pathSegmentsResponse.ChildNode.Activity; + var pathSegments = pathSegmentsResponse.PathSegments.ToList(); + StateHasChanged(); + + // Reassign the current path. + await UpdatePathSegmentsAsync(segments => + { + segments.Clear(); + + foreach (var segment in pathSegments) + segments.Push(segment); + }); + + // Display the new segment. + _currentContainerActivity = null; + await DisplayCurrentSegmentAsync(); + + // Select the activity. + await _diagramDesigner!.SelectActivityAsync(activityToSelect.GetId()); + } + + /// Updates the stats of the specified activity. + /// The ID of the activity to update. + /// The stats to update. + public async Task UpdateActivityStatsAsync(string activityId, ActivityStats stats) + { + await _diagramDesigner!.UpdateActivityStatsAsync(activityId, stats); + } + + /// Reads the activity from the designer. + public async Task ReadActivityAsync() + { + return await _diagramDesigner!.ReadRootActivityAsync(); + } + + /// Gets the root activity graph. + public Task GetActivityGraphAsync() + { + return Task.FromResult(_activityGraph); + } + + /// Gets the root activity. + public Task GetActivityAsync() + { + var rootActivity = _activityGraph.Activity; + return Task.FromResult(rootActivity); + } + + /// Loads the specified activity into the designer. + /// The activity to load. + public async Task LoadActivityAsync(JsonObject activity) + { + Activity = activity; + _diagramDesigner = DiagramDesignerService.GetDiagramDesigner(activity); + _activityGraph = await ActivityVisitor.VisitAndCreateGraphAsync(activity); + await IndexActivityNodes(_activityGraph.Activity); + await UpdatePathSegmentsAsync(segments => segments.Clear()); + await UpdateBreadcrumbItemsAsync(); + StateHasChanged(); + } + + /// Updates the specified activity in the designer. + /// The ID of the activity to update. + /// The activity to update. + public async Task UpdateActivityAsync(string activityId, JsonObject activity) + { + var currentContainer = GetCurrentContainerActivityOrRoot(); + + if (currentContainer == activity) + { + if (GraphUpdated.HasDelegate) + await GraphUpdated.InvokeAsync(); + + return; + } + + await _diagramDesigner!.UpdateActivityAsync(activityId, activity); + } + + /// The current container activity or the root activity of the graph. + public JsonObject GetCurrentContainerActivityOrRoot() + { + var activity = GetCurrentContainerActivity(); + return _currentContainerActivity = activity ?? Activity; + } + + private async Task GetCurrentContainerActivityOrRootAsync() + { + var activity = GetCurrentContainerActivity(); + + if (activity == null) + { + var lastSegment = _pathSegments.First(); + var parentNodeId = lastSegment.ActivityNodeId; + var selectedActivityGraph = await WorkflowDefinitionService.FindSubgraphAsync(WorkflowDefinitionVersionId, parentNodeId); + var propName = lastSegment.PortName.Camelize(); + var selectedPortActivity = (JsonObject?)selectedActivityGraph!.Activity[propName]; + activity = selectedPortActivity; + _currentContainerActivity = activity; + await IndexActivityNodes(selectedActivityGraph.Activity); + } + + return activity ?? Activity; + } + + private async Task IndexActivityNodes(JsonObject activity) + { + var visitedNode = await ActivityVisitor.VisitAsync(activity); + var nodes = visitedNode.Flatten(); + foreach (var node in nodes) _indexedActivityNodes[node.NodeId] = node; + } + + private JsonObject? GetCurrentContainerActivity() + { + if (_currentContainerActivity != null) + return _currentContainerActivity; + + var lastSegment = _pathSegments.FirstOrDefault(); + + if (lastSegment == null) + { + _currentContainerActivity = Activity; + return _currentContainerActivity; + } + + var nodeId = lastSegment.ActivityNodeId; + var node = _indexedActivityNodes.TryGetValue(nodeId, out var activityNode) ? activityNode : null; + + if (node is null) + return null; + + var activity = node.Activity; + var port = lastSegment.PortName; + var embeddedActivity = GetEmbeddedActivity(activity, port); + + if (embeddedActivity?.GetTypeName() == "Elsa.Workflow") + embeddedActivity = embeddedActivity.GetRoot(); + + return embeddedActivity ?? Activity; + } + + /// The parent activity of the current activity being loaded in the designer. + public JsonObject GetParentActivity() + { + var lastSegment = _pathSegments.FirstOrDefault(); + var nodeId = lastSegment?.ActivityNodeId; + var node = nodeId != null ? _indexedActivityNodes.TryGetValue(nodeId, out var activityNode) ? activityNode : null : null; + return node?.Activity ?? Activity; + } + + /// + protected override async Task OnInitializedAsync() + { + await ActivityRegistry.EnsureLoadedAsync(); + await LoadActivityAsync(Activity); + } + + /// Updates the current path. + /// A delegate that manipulates the path + private async Task UpdatePathSegmentsAsync(Action> action) + { + action(_pathSegments); + _currentContainerActivity = null; + + if (PathChanged.HasDelegate) + { + var parentActivity = GetParentActivity(); + var currentContainerActivity = GetCurrentContainerActivityOrRoot(); + await PathChanged.InvokeAsync(new(parentActivity, currentContainerActivity)); + } + } + + private JsonObject? GetEmbeddedActivity(JsonObject activity, string portName) + { + var activityTypeName = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var activityDescriptor = ActivityRegistry.Find(activityTypeName, activityVersion)!; + var portProviderContext = new PortProviderContext(activityDescriptor, activity); + var portProvider = ActivityPortService.GetProvider(portProviderContext); + var activityInPort = portProvider.ResolvePort(portName, portProviderContext); + + return activityInPort; + } + + private async Task UpdateBreadcrumbItemsAsync() + { + _breadcrumbItems = (await GetBreadcrumbItems()).ToList(); + await RefreshActivityStatsAsync(); + StateHasChanged(); + } + + private async Task RefreshActivityStatsAsync() + { + if (WorkflowInstanceId != null) + { + var currentContainerActivity = GetCurrentContainerActivityOrRoot(); + var report = await ActivityExecutionService.GetReportAsync(WorkflowInstanceId, currentContainerActivity); + _activityStats = report.Stats.ToDictionary(x => x.ActivityNodeId, x => new ActivityStats + { + Faulted = x.IsFaulted, + Blocked = x.IsBlocked, + Completed = x.CompletedCount, + Started = x.StartedCount, + Uncompleted = x.UncompletedCount, + Metadata = x.Metadata + }); + } + } + + private async Task> GetBreadcrumbItems() + { + var breadcrumbItems = new List(); + + if (_pathSegments.Any()) + breadcrumbItems.Add(new("Root", "#_root_", false, Icons.Material.Outlined.Home)); + + var nodeLookup = _indexedActivityNodes; + var firstSegment = _pathSegments.FirstOrDefault(); + + foreach (var segment in _pathSegments.Reverse()) + { + var activityNodeId = segment.ActivityNodeId; + + if (!nodeLookup.TryGetValue(activityNodeId, out var activityNode)) + { + activityNode = await WorkflowDefinitionService.FindSubgraphAsync(WorkflowDefinitionVersionId, activityNodeId); + } + + if (activityNode == null) + continue; + + var activity = activityNode.Activity; + var activityTypeName = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var activityDescriptor = ActivityRegistry.Find(activityTypeName, activityVersion)!; + var portProviderContext = new PortProviderContext(activityDescriptor, activity); + var portProvider = ActivityPortService.GetProvider(portProviderContext); + var ports = portProvider.GetPorts(portProviderContext); + var embeddedPort = ports.First(x => x.Name == segment.PortName); + var displaySettings = ActivityDisplaySettingsRegistry.GetSettings(activityTypeName); + var disabled = segment == firstSegment; + var activityDisplayText = activity.GetName() ?? activityDescriptor.DisplayName; + var breadcrumbDisplayText = $"{activityDisplayText}: {embeddedPort.DisplayName}"; + var activityBreadcrumbItem = new BreadcrumbItem(breadcrumbDisplayText, $"#{activity.GetId()}", disabled, displaySettings.Icon); + + breadcrumbItems.Add(activityBreadcrumbItem); + } + + return breadcrumbItems; + } + + private async Task DisplayCurrentSegmentAsync() + { + var currentContainerActivity = await GetCurrentContainerActivityOrRootAsync(); + + if (_diagramDesigner == null) + return; + + await _diagramDesigner.LoadRootActivityAsync(currentContainerActivity, _activityStats); + await UpdateBreadcrumbItemsAsync(); + } + + private RenderFragment? DisplayDesigner() + { + return _diagramDesigner?.DisplayDesigner(new( + GetCurrentContainerActivityOrRoot(), + ActivitySelected, + EventCallback.Factory.Create(this, OnActivityUpdated), + EventCallback.Factory.Create(this, OnActivityEmbeddedPortSelected), + EventCallback.Factory.Create(this, OnActivityDoubleClick), + EventCallback.Factory.Create(this, OnGraphUpdated), + IsReadOnly, + _activityStats)); + } + + private async Task OnActivityDoubleClick(JsonObject activity) + { + if (!IsReadOnly) + return; + + // If the activity is a workflow definition activity, then open the workflow definition editor. + if (activity.GetWorkflowDefinitionId() != null) + { + await OnActivityEmbeddedPortSelected(new(activity, "Root")); + } + } + + private async Task OnActivityUpdated(JsonObject activity) + { + if (ActivityUpdated.HasDelegate) + await ActivityUpdated.InvokeAsync(activity); + } + + private async Task OnActivityEmbeddedPortSelected(ActivityEmbeddedPortSelectedArgs args) + { + var nodes = _indexedActivityNodes; + var selectedActivity = args.Activity; + var activity = nodes.TryGetValue(selectedActivity.GetNodeId(), out var selectedActivityNode) ? selectedActivityNode.Activity : null; + + if (activity is null) + return; + + var portName = args.PortName; + var activityTypeName = activity.GetTypeName(); + var activityVersion = activity.GetVersion(); + var activityDescriptor = ActivityRegistry.Find(activityTypeName, activityVersion)!; + var portProviderContext = new PortProviderContext(activityDescriptor, activity); + var portProvider = ActivityPortService.GetProvider(portProviderContext); + var embeddedActivity = portProvider.ResolvePort(portName, portProviderContext); + + if (embeddedActivity == null) + { + // Lazy load. + if (activityDescriptor.CustomProperties.ContainsKey("WorkflowDefinitionVersionId")) + { + var parentNodeId = activity.GetNodeId(); + var selectedActivityGraph = await WorkflowDefinitionService.FindSubgraphAsync(WorkflowDefinitionVersionId, parentNodeId) ?? throw new InvalidOperationException($"Could not find selected activity graph for {parentNodeId}"); + var propName = portName.Camelize(); + var selectedPortActivity = (JsonObject)selectedActivityGraph.Activity[propName]!; + embeddedActivity = selectedPortActivity; + portProvider.AssignPort(args.PortName, embeddedActivity, new(activityDescriptor, activity)); + await IndexActivityNodes(selectedActivityGraph.Activity); + } + } + + if (embeddedActivity != null) + { + var embeddedActivityTypeName = embeddedActivity.GetTypeName(); + + // If the embedded activity has no designer support, then open it in the activity properties editor by raising the ActivitySelected event. + if (embeddedActivityTypeName != "Elsa.Flowchart" && embeddedActivityTypeName != "Elsa.Workflow") + { + if (ActivitySelected.HasDelegate) + await ActivitySelected.InvokeAsync(embeddedActivity); + return; + } + + // If the embedded activity type is a flowchart or workflow, we can display it in the designer. + } + else + { + if (!IsReadOnly) + { + var embeddedActivityId = IdentityGenerator.GenerateId(); + // Create a flowchart and embed it into the activity. + embeddedActivity = new(new Dictionary + { + ["id"] = embeddedActivityId, + ["nodeId"] = $"{activity.GetNodeId()}:{embeddedActivityId}", + ["type"] = "Elsa.Flowchart", + ["version"] = 1, + ["name"] = "Flowchart1", + }); + + portProvider.AssignPort(args.PortName, embeddedActivity, new(activityDescriptor, activity)); + + // Update the graph in the designer. + await _diagramDesigner!.UpdateActivityAsync(activity.GetId(), activity); + } + else + { + return; + } + } + + // Create a new path segment of the container activity and push it onto the stack. + var segment = new ActivityPathSegment(activity.GetNodeId(), activity.GetId(), activity.GetTypeName(), args.PortName); + + await UpdatePathSegmentsAsync(segments => segments.Push(segment)); + await DisplayCurrentSegmentAsync(); + } + + private async Task OnGraphUpdated() + { + var embeddedActivity = await _diagramDesigner!.ReadRootActivityAsync(); + var currentSegment = CurrentPathSegment; + + if (currentSegment == null) // Root activity was updated. + { + _activityGraph = await ActivityVisitor.VisitAndCreateGraphAsync(embeddedActivity); + await IndexActivityNodes(_activityGraph.Activity); + } + else + { + var currentActivityNode = _activityGraph.ActivityNodeLookup[currentSegment.ActivityNodeId]; + var currentActivity = currentActivityNode.Activity; + var portName = currentSegment.PortName; + var activityTypeName = currentActivity.GetTypeName(); + var activityVersion = currentActivity.GetVersion(); + var activityDescriptor = ActivityRegistry.Find(activityTypeName, activityVersion)!; + var portProviderContext = new PortProviderContext(activityDescriptor, currentActivity); + var portProvider = ActivityPortService.GetProvider(portProviderContext); + + portProvider.AssignPort(portName, embeddedActivity, portProviderContext); + await _activityGraph.IndexAsync(); + await IndexActivityNodes(_activityGraph.Activity); + } + + if (GraphUpdated.HasDelegate) + await GraphUpdated.InvokeAsync(); + } + + private async Task OnBreadcrumbItemClicked(BreadcrumbItem item) + { + if (item.Href == "#_root_") + { + await UpdatePathSegmentsAsync(segments => segments.Clear()); + await DisplayCurrentSegmentAsync(); + return; + } + + var activityId = item.Href![1..]; + + await UpdatePathSegmentsAsync(segments => + { + while (segments.TryPeek(out var segment)) + if (segment.ActivityId == activityId) + break; + else + segments.Pop(); + }); + + _currentContainerActivity = null; + await DisplayCurrentSegmentAsync(); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Shared/Components/GraphSegment.cs b/src/modules/Elsa.Studio.Workflows/Shared/Components/GraphSegment.cs new file mode 100644 index 0000000..86bdba1 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Shared/Components/GraphSegment.cs @@ -0,0 +1,5 @@ +using System.Text.Json.Nodes; + +namespace Elsa.Studio.Workflows.Shared.Components; + +public record GraphSegment(JsonObject Activity, string PortName, JsonObject? EmbeddedActivity = default); \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Validators/WorkflowPropertiesModelValidator.cs b/src/modules/Elsa.Studio.Workflows/Validators/WorkflowPropertiesModelValidator.cs new file mode 100644 index 0000000..2cc1940 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Validators/WorkflowPropertiesModelValidator.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Localization; +using Elsa.Studio.Workflows.Domain.Contracts; +using Elsa.Studio.Workflows.Models; +using FluentValidation; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; + +namespace Elsa.Studio.Workflows.Validators; + +/// +/// A validator for instances. +/// +public class WorkflowPropertiesModelValidator : AbstractValidator +{ + + public WorkflowPropertiesModelValidator(IWorkflowDefinitionService workflowDefinitionService, ILocalizer localizer) + { + RuleFor(x => x.Name).NotEmpty().WithMessage(localizer["Please enter a name for the workflow."]); + + RuleFor(x => x.Name) + .MustAsync((context, name, cancellationToken) => workflowDefinitionService.GetIsNameUniqueAsync(name!, context.DefinitionId, cancellationToken)) + .WithMessage(localizer["A workflow with this name already exists."]); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionInfoWidget.cs b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionInfoWidget.cs new file mode 100644 index 0000000..11e65cb --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionInfoWidget.cs @@ -0,0 +1,24 @@ +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties.Sections.Info; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Widgets; + +/// +/// A widget that renders the workflow definition info. +/// +public class WorkflowDefinitionInfoWidget : WorkflowDefinitionPropertiesWidgetBase +{ + /// + public override double Order => 30; + + /// + public override Func, RenderFragment> Render => attributes => + { + return builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(Info.WorkflowDefinition), attributes["WorkflowDefinition"]); + builder.CloseComponent(); + }; + }; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionMetadataWidget.cs b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionMetadataWidget.cs new file mode 100644 index 0000000..adc3e67 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionMetadataWidget.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties.Sections.Metadata; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Widgets; + +/// +/// A widget that renders the workflow definition metadata. +/// +public class WorkflowDefinitionMetadataWidget : WorkflowDefinitionPropertiesWidgetBase +{ + /// + public override double Order => 10; + + /// + public override Func, RenderFragment> Render => attributes => + { + return builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(Metadata.WorkflowDefinition), attributes["WorkflowDefinition"]); + builder.AddAttribute(2, nameof(Metadata.WorkflowDefinitionUpdated), attributes["WorkflowDefinitionUpdated"]); + builder.CloseComponent(); + }; + }; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionPropertiesWidgetBase.cs b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionPropertiesWidgetBase.cs new file mode 100644 index 0000000..e457fbf --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionPropertiesWidgetBase.cs @@ -0,0 +1,20 @@ +using Elsa.Studio.Contracts; +using Elsa.Studio.Workflows.Constants; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Widgets; + +/// +/// A widget that renders the workflow definition info. +/// +public abstract class WorkflowDefinitionPropertiesWidgetBase : IWidget +{ + /// + public string Zone => ZoneNames.WorkflowDefinitionProperties; + + /// + public virtual double Order => 0; + + /// + public abstract Func, RenderFragment> Render { get; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionSettingsWidget.cs b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionSettingsWidget.cs new file mode 100644 index 0000000..f4a6468 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/Widgets/WorkflowDefinitionSettingsWidget.cs @@ -0,0 +1,25 @@ +using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties.Sections.Settings; +using Microsoft.AspNetCore.Components; + +namespace Elsa.Studio.Workflows.Widgets; + +/// +/// A widget that renders the workflow definition settings. +/// +public class WorkflowDefinitionSettingsWidget : WorkflowDefinitionPropertiesWidgetBase +{ + /// + public override double Order => 20; + + /// + public override Func, RenderFragment> Render => attributes => + { + return builder => + { + builder.OpenComponent(0); + builder.AddAttribute(1, nameof(Settings.WorkflowDefinition), attributes["WorkflowDefinition"]); + builder.AddAttribute(2, nameof(Settings.WorkflowDefinitionUpdated), attributes["WorkflowDefinitionUpdated"]); + builder.CloseComponent(); + }; + }; +} \ No newline at end of file diff --git a/src/modules/Elsa.Studio.Workflows/_Imports.razor b/src/modules/Elsa.Studio.Workflows/_Imports.razor new file mode 100644 index 0000000..075b312 --- /dev/null +++ b/src/modules/Elsa.Studio.Workflows/_Imports.razor @@ -0,0 +1,25 @@ +@using System.ComponentModel.DataAnnotations +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.Forms +@using Blazored.FluentValidation +@using Elsa.Studio.Localization +@using Elsa.Studio.Components +@using Elsa.Studio.Workflows.Components +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components +@using Elsa.Studio.Workflows.Components.WorkflowInstanceViewer +@using Elsa.Studio.Workflows.Components.WorkflowInstanceViewer.Components +@using Elsa.Studio.Workflows.Components.WorkflowDefinitionList +@using Elsa.Studio.Workflows.Components.WorkflowInstanceList +@using Elsa.Studio.Workflows.Constants +@using Elsa.Studio.Workflows.Designer.Components +@using Elsa.Studio.Workflows.Shared.Components +@using Elsa.Studio.Localization.Time.Components +@using Humanizer +@using MudBlazor +@using MudExtensions +@using Radzen +@using Radzen.Blazor +@attribute [Authorize] \ No newline at end of file diff --git a/src/wrappers/.gitignore b/src/wrappers/.gitignore new file mode 100644 index 0000000..18d5e87 --- /dev/null +++ b/src/wrappers/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +public/ \ No newline at end of file diff --git a/src/wrappers/lerna.json b/src/wrappers/lerna.json new file mode 100644 index 0000000..f6604bd --- /dev/null +++ b/src/wrappers/lerna.json @@ -0,0 +1,4 @@ +{ + "$schema": "node_modules/lerna/schemas/lerna-schema.json", + "version": "0.0.0" +} diff --git a/src/wrappers/package-lock.json b/src/wrappers/package-lock.json new file mode 100644 index 0000000..fcd10cb --- /dev/null +++ b/src/wrappers/package-lock.json @@ -0,0 +1,14173 @@ +{ + "name": "root", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "root", + "workspaces": [ + "wrappers/*" + ], + "devDependencies": { + "lerna": "^8.2.1" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", + "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@elsa-workflows/elsa-studio-wasm": { + "version": "3.4.0", + "resolved": "https://f.feedz.io/elsa-workflows/elsa-3/npm/%40elsa-workflows%2felsa-studio-wasm/3.4.0/download", + "integrity": "sha512-DvUyZ1tUkD+oi3UuG7cDEBUrZwvA7lQHUdpknFPT3OJFkzwrj1tiePaR+p5nRad1Dh7yWwZL8XxrsCjECGLhOg==", + "license": "MIT" + }, + "node_modules/@elsa-workflows/elsa-studio-wasm-react": { + "resolved": "wrappers/react-wrapper", + "link": true + }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", + "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", + "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", + "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", + "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.5.0.tgz", + "integrity": "sha512-qYDdL7fPwLRI+bJNurVcis+tNgJmvWjH4YTBGXTA8xMuxFrnAz6E5o35iyzyKbq5J5Lr8mJGfrR5GXl+WGwhgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lerna/create": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.2.2.tgz", + "integrity": "sha512-1yn1MvWn2Yz0SFgTTQnef2m1YedF7KwqLLVIOrGkgQrkVHzsveAIk1A1RcRa2yyUh+siKI1YcJ7lUZIEt+qQ3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@npmcli/arborist": "7.5.4", + "@npmcli/package-json": "5.2.0", + "@npmcli/run-script": "8.1.0", + "@nx/devkit": ">=17.1.2 < 21", + "@octokit/plugin-enterprise-rest": "6.0.1", + "@octokit/rest": "20.1.2", + "aproba": "2.0.0", + "byte-size": "8.1.1", + "chalk": "4.1.0", + "clone-deep": "4.0.1", + "cmd-shim": "6.0.3", + "color-support": "1.1.3", + "columnify": "1.6.0", + "console-control-strings": "^1.1.0", + "conventional-changelog-core": "5.0.1", + "conventional-recommended-bump": "7.0.1", + "cosmiconfig": "9.0.0", + "dedent": "1.5.3", + "execa": "5.0.0", + "fs-extra": "^11.2.0", + "get-stream": "6.0.0", + "git-url-parse": "14.0.0", + "glob-parent": "6.0.2", + "globby": "11.1.0", + "graceful-fs": "4.2.11", + "has-unicode": "2.0.1", + "ini": "^1.3.8", + "init-package-json": "6.0.3", + "inquirer": "^8.2.4", + "is-ci": "3.0.1", + "is-stream": "2.0.0", + "js-yaml": "4.1.0", + "libnpmpublish": "9.0.9", + "load-json-file": "6.2.0", + "lodash": "^4.17.21", + "make-dir": "4.0.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "node-fetch": "2.6.7", + "npm-package-arg": "11.0.2", + "npm-packlist": "8.0.2", + "npm-registry-fetch": "^17.1.0", + "nx": ">=17.1.2 < 21", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-queue": "6.6.2", + "p-reduce": "^2.1.0", + "pacote": "^18.0.6", + "pify": "5.0.0", + "read-cmd-shim": "4.0.0", + "resolve-from": "5.0.0", + "rimraf": "^4.4.1", + "semver": "^7.3.4", + "set-blocking": "^2.0.0", + "signal-exit": "3.0.7", + "slash": "^3.0.0", + "ssri": "^10.0.6", + "string-width": "^4.2.3", + "strong-log-transformer": "2.1.0", + "tar": "6.2.1", + "temp-dir": "1.0.0", + "upath": "2.0.1", + "uuid": "^10.0.0", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "5.0.1", + "wide-align": "1.1.5", + "write-file-atomic": "5.0.1", + "write-pkg": "4.0.0", + "yargs": "17.7.2", + "yargs-parser": "21.1.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@lerna/create/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, + "license": "MIT", + "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/@lerna/create/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lerna/create/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@lerna/create/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/create/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/create/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/@lerna/create/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/create/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/create/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", + "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/arborist": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz", + "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.1", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.1", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.4", + "cacache": "^18.0.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.2", + "json-parse-even-better-errors": "^3.0.2", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^7.2.1", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.1", + "npm-registry-fetch": "^17.0.1", + "pacote": "^18.0.6", + "parse-conflict-json": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.6", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/arborist/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/arborist/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", + "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", + "dev": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/query": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", + "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/devkit": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.2.tgz", + "integrity": "sha512-rr9p2/tZDQivIpuBUpZaFBK6bZ+b5SAjZk75V4tbCUqGW3+5OPuVvBPm+X+7PYwUF6rwSpewxkjWNeGskfCe+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/devkit/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/devkit/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", + "integrity": "sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz", + "integrity": "sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz", + "integrity": "sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz", + "integrity": "sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz", + "integrity": "sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz", + "integrity": "sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz", + "integrity": "sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz", + "integrity": "sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz", + "integrity": "sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz", + "integrity": "sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz", + "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.4.4-cjs.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", + "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.7.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", + "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.3.2-cjs.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", + "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.8.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5" + } + }, + "node_modules/@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", + "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^5.0.2", + "@octokit/plugin-paginate-rest": "11.4.4-cjs.2", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "13.3.2-cjs.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", + "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", + "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", + "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", + "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", + "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", + "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", + "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", + "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", + "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", + "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", + "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", + "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", + "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", + "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", + "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", + "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", + "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", + "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", + "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", + "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", + "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", + "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/addon-actions": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.6.14.tgz", + "integrity": "sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-actions/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.6.14.tgz", + "integrity": "sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-controls": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.6.14.tgz", + "integrity": "sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "dequal": "^2.0.2", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.6.14.tgz", + "integrity": "sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.6.14", + "@storybook/csf-plugin": "8.6.14", + "@storybook/react-dom-shim": "8.6.14", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.6.14.tgz", + "integrity": "sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/addon-actions": "8.6.14", + "@storybook/addon-backgrounds": "8.6.14", + "@storybook/addon-controls": "8.6.14", + "@storybook/addon-docs": "8.6.14", + "@storybook/addon-highlight": "8.6.14", + "@storybook/addon-measure": "8.6.14", + "@storybook/addon-outline": "8.6.14", + "@storybook/addon-toolbars": "8.6.14", + "@storybook/addon-viewport": "8.6.14", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-highlight": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.6.14.tgz", + "integrity": "sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.6.14.tgz", + "integrity": "sha512-8VmElhm2XOjh22l/dO4UmXxNOolGhNiSpBcls2pqWSraVh4a670EyYBZsHpkXqfNHo2YgKyZN3C91+9zfH79qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.6.14", + "@storybook/test": "8.6.14", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-links": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.6.14.tgz", + "integrity": "sha512-DRlXHIyZzOruAZkxmXfVgTF+4d6K27pFcH4cUsm3KT1AXuZbr23lb5iZHpUZoG6lmU85Sru4xCEgewSTXBIe1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.14" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-measure": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.6.14.tgz", + "integrity": "sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-onboarding": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-8.6.14.tgz", + "integrity": "sha512-bHdHiGJFigVcSzMIsNLHY5IODZHr+nKwyz5/QOZLMkLcGH2IaUbOJfm4RyGOaTTPsUtAKbdsVXNEG3Otf+qO9A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-outline": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.6.14.tgz", + "integrity": "sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.6.14.tgz", + "integrity": "sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.6.14.tgz", + "integrity": "sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/blocks": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.6.14.tgz", + "integrity": "sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/icons": "^1.2.12", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^8.6.14" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-vite": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.6.14.tgz", + "integrity": "sha512-ajWYhy32ksBWxwWHrjwZzyC0Ii5ZTeu5lsqA95Q/EQBB0P5qWlHWGM3AVyv82Mz/ND03ebGy123uVwgf6olnYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "8.6.14", + "browser-assert": "^1.2.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@storybook/components": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.6.14.tgz", + "integrity": "sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/core": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.6.14.tgz", + "integrity": "sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/theming": "8.6.14", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", + "esbuild-register": "^3.5.0", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@storybook/core/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/csf": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.13.tgz", + "integrity": "sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.6.14.tgz", + "integrity": "sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.4.0.tgz", + "integrity": "sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" + } + }, + "node_modules/@storybook/instrumenter": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.6.14.tgz", + "integrity": "sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@vitest/utils": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/manager-api": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.6.14.tgz", + "integrity": "sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/preview-api": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.6.14.tgz", + "integrity": "sha512-2GhcCd4dNMrnD7eooEfvbfL4I83qAqEyO0CO7JQAmIO6Rxb9BsOLLI/GD5HkvQB73ArTJ+PT50rfaO820IExOQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/react": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.6.14.tgz", + "integrity": "sha512-BOepx5bBFwl/CPI+F+LnmMmsG1wQYmrX/UQXgUbHQUU9Tj7E2ndTnNbpIuSLc8IrM03ru+DfwSg1Co3cxWtT+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/components": "8.6.14", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "8.6.14", + "@storybook/preview-api": "8.6.14", + "@storybook/react-dom-shim": "8.6.14", + "@storybook/theming": "8.6.14" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/test": "8.6.14", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.14", + "typescript": ">= 4.2.x" + }, + "peerDependenciesMeta": { + "@storybook/test": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.6.14.tgz", + "integrity": "sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/react-vite": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.6.14.tgz", + "integrity": "sha512-FZU0xMPxa4/TO87FgcWwappOxLBHZV5HSRK5K+2bJD7rFJAoNorbHvB4Q1zvIAk7eCMjkr2GPCPHx9PRB9vJFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "0.5.0", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "8.6.14", + "@storybook/react": "8.6.14", + "find-up": "^5.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^7.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/test": "8.6.14", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.14", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "@storybook/test": { + "optional": true + } + } + }, + "node_modules/@storybook/test": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.6.14.tgz", + "integrity": "sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.6.14", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/testing-library": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@storybook/testing-library/-/testing-library-0.2.2.tgz", + "integrity": "sha512-L8sXFJUHmrlyU2BsWWZGuAjv39Jl1uAqUHdxmN42JY15M4+XCMjGlArdCCjDe1wpTSW6USYISA9axjZojgtvnw==", + "deprecated": "In Storybook 8, this package functionality has been integrated to a new package called @storybook/test, which uses Vitest APIs for an improved experience. When upgrading to Storybook 8 with 'npx storybook@latest upgrade', you will get prompted and will get an automigration for the new package. Please migrate when you can.", + "dev": true, + "license": "MIT", + "dependencies": { + "@testing-library/dom": "^9.0.0", + "@testing-library/user-event": "^14.4.0", + "ts-dedent": "^2.2.0" + } + }, + "node_modules/@storybook/testing-library/node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@storybook/testing-library/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@storybook/theming": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.6.14.tgz", + "integrity": "sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz", + "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.1.tgz", + "integrity": "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.34.1", + "@typescript-eslint/types": "^8.34.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz", + "integrity": "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz", + "integrity": "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz", + "integrity": "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz", + "integrity": "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.34.1", + "@typescript-eslint/tsconfig-utils": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/visitor-keys": "8.34.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.1.tgz", + "integrity": "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.34.1", + "@typescript-eslint/types": "8.34.1", + "@typescript-eslint/typescript-estree": "8.34.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.34.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz", + "integrity": "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.34.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.2.tgz", + "integrity": "sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.11", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + } + }, + "node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bin-links": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", + "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-assert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/byte-size": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", + "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "license": "MIT", + "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/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "license": "MIT", + "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/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cmd-shim": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", + "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/columnify/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true, + "license": "ISC" + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz", + "integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^6.0.0", + "conventional-commits-parser": "^4.0.0", + "dateformat": "^3.0.3", + "get-pkg-repo": "^4.2.1", + "git-raw-commits": "^3.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^5.0.0", + "normalize-package-data": "^3.0.3", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz", + "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", + "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^3.0.0", + "dateformat": "^3.0.3", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^8.1.2", + "semver": "^7.0.0", + "split": "^1.0.1" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", + "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-commits-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", + "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.3.5", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz", + "integrity": "sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^3.0.0", + "conventional-commits-filter": "^3.0.0", + "conventional-commits-parser": "^4.0.0", + "git-raw-commits": "^3.0.0", + "git-semver-tags": "^5.0.0", + "meow": "^8.1.2" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.171", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/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==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", + "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.1", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.29.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "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/eslint-plugin-storybook": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.12.0.tgz", + "integrity": "sha512-Lg5I0+npTgiYgZ4KSvGWGDFZi3eOCNJPaWX0c9rTEEXC5wvooOClsP9ZtbI4hhFKyKgYR877KiJxbRTSJq9gWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.1.11", + "@typescript-eslint/utils": "^8.8.1", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "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==", + "dev": true, + "license": "BSD-2-Clause", + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "license": "MIT", + "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/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", + "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/front-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/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, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/get-pkg-repo/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/get-pkg-repo/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-pkg-repo/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-pkg-repo/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-pkg-repo/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-pkg-repo/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, + "license": "MIT", + "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/get-pkg-repo/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-pkg-repo/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, + "license": "MIT", + "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/get-pkg-repo/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/git-raw-commits": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", + "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dargs": "^7.0.0", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-remote-origin-url/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-semver-tags": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz", + "integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^8.1.2", + "semver": "^7.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", + "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "license": "BSD", + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "license": "MIT", + "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": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/init-package-json": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz", + "integrity": "sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^5.0.0", + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^3.0.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/init-package-json/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/inquirer/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "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": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "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==", + "dev": true, + "license": "MIT", + "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": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "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, + "license": "MIT", + "engines": { + "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": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ssh": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", + "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lerna": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.2.2.tgz", + "integrity": "sha512-GkqBELTG4k7rfzAwRok2pKBvhNo046Hfwcj7TuhDah3q58/BBBAqvIFLfqEI5fglnNOs6maMSn6/MWjccQE55A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lerna/create": "8.2.2", + "@npmcli/arborist": "7.5.4", + "@npmcli/package-json": "5.2.0", + "@npmcli/run-script": "8.1.0", + "@nx/devkit": ">=17.1.2 < 21", + "@octokit/plugin-enterprise-rest": "6.0.1", + "@octokit/rest": "20.1.2", + "aproba": "2.0.0", + "byte-size": "8.1.1", + "chalk": "4.1.0", + "clone-deep": "4.0.1", + "cmd-shim": "6.0.3", + "color-support": "1.1.3", + "columnify": "1.6.0", + "console-control-strings": "^1.1.0", + "conventional-changelog-angular": "7.0.0", + "conventional-changelog-core": "5.0.1", + "conventional-recommended-bump": "7.0.1", + "cosmiconfig": "9.0.0", + "dedent": "1.5.3", + "envinfo": "7.13.0", + "execa": "5.0.0", + "fs-extra": "^11.2.0", + "get-port": "5.1.1", + "get-stream": "6.0.0", + "git-url-parse": "14.0.0", + "glob-parent": "6.0.2", + "globby": "11.1.0", + "graceful-fs": "4.2.11", + "has-unicode": "2.0.1", + "import-local": "3.1.0", + "ini": "^1.3.8", + "init-package-json": "6.0.3", + "inquirer": "^8.2.4", + "is-ci": "3.0.1", + "is-stream": "2.0.0", + "jest-diff": ">=29.4.3 < 30", + "js-yaml": "4.1.0", + "libnpmaccess": "8.0.6", + "libnpmpublish": "9.0.9", + "load-json-file": "6.2.0", + "lodash": "^4.17.21", + "make-dir": "4.0.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "node-fetch": "2.6.7", + "npm-package-arg": "11.0.2", + "npm-packlist": "8.0.2", + "npm-registry-fetch": "^17.1.0", + "nx": ">=17.1.2 < 21", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-pipe": "3.1.0", + "p-queue": "6.6.2", + "p-reduce": "2.1.0", + "p-waterfall": "2.1.1", + "pacote": "^18.0.6", + "pify": "5.0.0", + "read-cmd-shim": "4.0.0", + "resolve-from": "5.0.0", + "rimraf": "^4.4.1", + "semver": "^7.3.8", + "set-blocking": "^2.0.0", + "signal-exit": "3.0.7", + "slash": "3.0.0", + "ssri": "^10.0.6", + "string-width": "^4.2.3", + "strong-log-transformer": "2.1.0", + "tar": "6.2.1", + "temp-dir": "1.0.0", + "typescript": ">=3 < 6", + "upath": "2.0.1", + "uuid": "^10.0.0", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "5.0.1", + "wide-align": "1.1.5", + "write-file-atomic": "5.0.1", + "write-pkg": "4.0.0", + "yargs": "17.7.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "lerna": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/lerna/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, + "license": "MIT", + "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/lerna/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/lerna/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/lerna/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lerna/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lerna/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/lerna/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lerna/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lerna/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libnpmaccess": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz", + "integrity": "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/libnpmpublish": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz", + "integrity": "sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==", + "dev": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.1", + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1", + "proc-log": "^4.2.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.6" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/ci-info": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/libnpmpublish/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/load-json-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/load-json-file/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, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true, + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/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, + "license": "MIT", + "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/meow/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/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, + "license": "ISC" + }, + "node_modules/meow/node_modules/read-pkg/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, + "license": "BSD-2-Clause", + "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/meow/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/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==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/meow/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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", + "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.2.tgz", + "integrity": "sha512-mDKpbH3vEpUFDx0rrLh+tTqLq1PYU8KiD/R7OVZGd1FxQxghx2HOl32MiqNsfPcw6AvKlXhslbwIESV+N55FLQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.8.3", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "20.8.2", + "@nx/nx-darwin-x64": "20.8.2", + "@nx/nx-freebsd-x64": "20.8.2", + "@nx/nx-linux-arm-gnueabihf": "20.8.2", + "@nx/nx-linux-arm64-gnu": "20.8.2", + "@nx/nx-linux-arm64-musl": "20.8.2", + "@nx/nx-linux-x64-gnu": "20.8.2", + "@nx/nx-linux-x64-musl": "20.8.2", + "@nx/nx-win32-arm64-msvc": "20.8.2", + "@nx/nx-win32-x64-msvc": "20.8.2" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/nx/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "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.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "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.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", + "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-waterfall": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", + "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-reduce": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pacote": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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-json/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-json/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/proggy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", + "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", + "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promzard": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz", + "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "read": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-docgen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.1.tgz", + "integrity": "sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", + "integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", + "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==", + "dev": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "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-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.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": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "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": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "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": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "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": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/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, + "license": "ISC" + }, + "node_modules/read-pkg/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": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "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/read-pkg/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, + "license": "BSD-2-Clause", + "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/read-pkg/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "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, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", + "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.44.0", + "@rollup/rollup-android-arm64": "4.44.0", + "@rollup/rollup-darwin-arm64": "4.44.0", + "@rollup/rollup-darwin-x64": "4.44.0", + "@rollup/rollup-freebsd-arm64": "4.44.0", + "@rollup/rollup-freebsd-x64": "4.44.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", + "@rollup/rollup-linux-arm-musleabihf": "4.44.0", + "@rollup/rollup-linux-arm64-gnu": "4.44.0", + "@rollup/rollup-linux-arm64-musl": "4.44.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-musl": "4.44.0", + "@rollup/rollup-linux-s390x-gnu": "4.44.0", + "@rollup/rollup-linux-x64-gnu": "4.44.0", + "@rollup/rollup-linux-x64-musl": "4.44.0", + "@rollup/rollup-win32-arm64-msvc": "4.44.0", + "@rollup/rollup-win32-ia32-msvc": "4.44.0", + "@rollup/rollup-win32-x64-msvc": "4.44.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz", + "integrity": "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "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, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/storybook": { + "version": "8.6.14", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.6.14.tgz", + "integrity": "sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core": "8.6.14" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "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==", + "dev": true, + "license": "MIT", + "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-cjs/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "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": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "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, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/wide-align/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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, + "license": "MIT", + "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-cjs/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-json-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.15", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/write-json-file/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==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-json-file/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/write-pkg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sort-keys": "^2.0.0", + "type-fest": "^0.4.1", + "write-json-file": "^3.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/write-pkg/node_modules/type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "dev": true, + "license": "MIT", + "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/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "wrappers/react-wrapper": { + "name": "@elsa-workflows/elsa-studio-wasm-react", + "version": "0.0.0", + "hasInstallScript": true, + "dependencies": { + "@elsa-workflows/elsa-studio-wasm": "^3.4.0-rc1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "uuid": "^11.1.0" + }, + "devDependencies": { + "@storybook/addon-essentials": "^8.6.11", + "@storybook/addon-interactions": "^8.6.11", + "@storybook/addon-links": "^8.6.11", + "@storybook/addon-onboarding": "^8.6.11", + "@storybook/blocks": "^8.6.11", + "@storybook/react": "^8.6.11", + "@storybook/react-vite": "^8.6.11", + "@storybook/testing-library": "^0.2.2", + "@types/react": "^19.0.12", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.23.0", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "eslint-plugin-storybook": "^0.12.0", + "prop-types": "^15.8.1", + "storybook": "^8.6.11", + "vite": "^6.2.4" + } + } + } +} diff --git a/src/wrappers/package.json b/src/wrappers/package.json new file mode 100644 index 0000000..ca349a8 --- /dev/null +++ b/src/wrappers/package.json @@ -0,0 +1,12 @@ +{ + "name": "root", + "private": true, + "workspaces": [ + "wrappers/*" + ], + "dependencies": { + }, + "devDependencies": { + "lerna": "^8.2.1" + } +} diff --git a/src/wrappers/wrappers/react-wrapper/.eslintrc.cjs b/src/wrappers/wrappers/react-wrapper/.eslintrc.cjs new file mode 100644 index 0000000..c1104af --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/.eslintrc.cjs @@ -0,0 +1,24 @@ +module.exports = { + root: true, + env: { + browser: true, + es2020: true + }, + extends: ['eslint:recommended', 'plugin:react/recommended', 'plugin:react/jsx-runtime', 'plugin:react-hooks/recommended', 'plugin:storybook/recommended'], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module' + }, + settings: { + react: { + version: '18.2' + } + }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': ['warn', { + allowConstantExport: true + }] + } +}; \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/.gitignore b/src/wrappers/wrappers/react-wrapper/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/wrappers/wrappers/react-wrapper/.storybook/main.js b/src/wrappers/wrappers/react-wrapper/.storybook/main.js new file mode 100644 index 0000000..7164f8d --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/.storybook/main.js @@ -0,0 +1,30 @@ +import { join, dirname } from "path"; +import { StorybookConfig } from '@storybook/react-vite'; + +/** + * This function is used to resolve the absolute path of a package. + * It is needed in projects that use Yarn PnP or are set up within a monorepo. + */ +function getAbsolutePath(value) { + return dirname(require.resolve(join(value, "package.json"))); +} + +/** @type { import('@storybook/react-vite').StorybookConfig } */ +const config = { + stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + addons: [ + getAbsolutePath("@storybook/addon-links"), + getAbsolutePath("@storybook/addon-essentials"), + getAbsolutePath("@storybook/addon-onboarding"), + getAbsolutePath("@storybook/addon-interactions"), + ], + framework: { + name: getAbsolutePath("@storybook/react-vite"), + options: {}, + }, + docs: { + autodocs: "tag", + }, + staticDirs: ['../public'], //👈 Configures the static asset folder in Storybook +}; +export default config; diff --git a/src/wrappers/wrappers/react-wrapper/.storybook/preview-body.html b/src/wrappers/wrappers/react-wrapper/.storybook/preview-body.html new file mode 100644 index 0000000..97c350d --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/.storybook/preview-body.html @@ -0,0 +1,9 @@ +
+ + + + + + + + \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/.storybook/preview-head.html b/src/wrappers/wrappers/react-wrapper/.storybook/preview-head.html new file mode 100644 index 0000000..ecc4f39 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/.storybook/preview-head.html @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/.storybook/preview.js b/src/wrappers/wrappers/react-wrapper/.storybook/preview.js new file mode 100644 index 0000000..3f537aa --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/.storybook/preview.js @@ -0,0 +1,14 @@ +/** @type { import('@storybook/react').Preview } */ +const preview = { + parameters: { + actions: { argTypesRegex: "^on[A-Z].*" }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/, + }, + }, + } +}; + +export default preview; diff --git a/src/wrappers/wrappers/react-wrapper/README.md b/src/wrappers/wrappers/react-wrapper/README.md new file mode 100644 index 0000000..ae8ad1d --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/README.md @@ -0,0 +1,3 @@ +# Elsa Studio React Wrapper + +This package contains a React wrapper for Elsa Studio, a webassembly application for building workflows. \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/package.json b/src/wrappers/wrappers/react-wrapper/package.json new file mode 100644 index 0000000..84f6538 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/package.json @@ -0,0 +1,53 @@ +{ + "name": "@elsa-workflows/elsa-studio-wasm-react", + "version": "0.0.0", + "type": "module", + "files": [ + "dist" + ], + "main": "./dist/elsa-studio-wasm-react.umd.cjs", + "module": "./dist/elsa-studio-wasm-react.js", + "exports": { + ".": { + "import": "./dist/elsa-studio-wasm-react.js", + "require": "./dist/elsa-studio-wasm-react.umd.cjs" + } + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build", + "postinstall": "npm run copy:elsa-studio-wasm", + "copy:elsa-studio-wasm": "cp -r ../../node_modules/@elsa-workflows/elsa-studio-wasm/_content public/ && cp -r ../../node_modules/@elsa-workflows/elsa-studio-wasm/_framework public/ && cp -r ../../node_modules/@elsa-workflows/elsa-studio-wasm/appsettings.json public/" + }, + "dependencies": { + "@elsa-workflows/elsa-studio-wasm": "^3.4.0-rc1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "uuid": "^11.1.0" + }, + "devDependencies": { + "@storybook/addon-essentials": "^8.6.11", + "@storybook/addon-interactions": "^8.6.11", + "@storybook/addon-links": "^8.6.11", + "@storybook/addon-onboarding": "^8.6.11", + "@storybook/blocks": "^8.6.11", + "@storybook/react": "^8.6.11", + "@storybook/react-vite": "^8.6.11", + "@storybook/testing-library": "^0.2.2", + "@types/react": "^19.0.12", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.23.0", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "eslint-plugin-storybook": "^0.12.0", + "prop-types": "^15.8.1", + "storybook": "^8.6.11", + "vite": "^6.2.4" + } +} diff --git a/src/wrappers/wrappers/react-wrapper/src/components/BackendProvider/BackendProvider.jsx b/src/wrappers/wrappers/react-wrapper/src/components/BackendProvider/BackendProvider.jsx new file mode 100644 index 0000000..db7a320 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/components/BackendProvider/BackendProvider.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {v4 as uuid} from 'uuid'; + + +/** + * Primary UI component for user interaction + */ +export const BackendProvider = ({ remoteEndpoint, ...props }) => { + const id = uuid(); + return React.createElement('elsa-backend-provider', { + ...props, + id: id, + "remote-endpoint": remoteEndpoint, + "api-key": props.apiKey, + "access-token": props.accessToken + }); +}; + +BackendProvider.propTypes = { + /** + * The remote backend URL. + */ + remoteEndpoint: PropTypes.string, + /** + * The API Key, if any. + */ + apiKey: PropTypes.string, + /** + * The access token, if any. + */ + accessToken: PropTypes.string, +}; + +BackendProvider.defaultProps = { + remoteEndpoint: null, + apiKey: null, + accessToken: null, +}; diff --git a/src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.jsx b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.jsx new file mode 100644 index 0000000..43f8978 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.jsx @@ -0,0 +1,40 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {v4 as uuid} from 'uuid'; +import {RemoteArgs} from "../../remote-args.js"; + + +/** + * Primary UI component for user interaction + */ +export const WorkflowDefinitionEditor = ({ definitionId, remoteEndpoint, apiKey, ...props }) => { + const id = uuid(); + return React.createElement('elsa-workflow-definition-editor', { ...props, id: id, "definition-id": definitionId, "remote-endpoint": remoteEndpoint, "api-key": apiKey }); +}; + +WorkflowDefinitionEditor.propTypes = { + /** + * The workflow definition ID. + */ + definitionId: PropTypes.string, + /** + * The remote backend URL. + */ + remoteEndpoint: PropTypes.string, + /** + * The API Key, if any. + */ + apiKey: PropTypes.string, + /** + * The access token, if any. + */ + accessToken: PropTypes.string, +}; + +WorkflowDefinitionEditor.defaultProps = { + definitionId: null, + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey, + accessToken: null, + +}; diff --git a/src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionList/WorkflowDefinitionList.jsx b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionList/WorkflowDefinitionList.jsx new file mode 100644 index 0000000..63ad6f1 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowDefinitionList/WorkflowDefinitionList.jsx @@ -0,0 +1,46 @@ +import React, {useEffect} from 'react'; +import PropTypes from 'prop-types'; +import {v4 as uuid} from 'uuid'; +import {RemoteArgs} from "../../remote-args.js"; + +/** + * Primary UI component for user interaction + */ +export const WorkflowDefinitionList = (props) => { + const id = uuid(); + const { remoteEndpoint, apiKey } = props; + + useEffect(() => { + let element = document.getElementById(id); + element.editWorkflowDefinition = (definitionId) => { + props.onEditWorkflowDefinition(definitionId); + }; + }, [id, props]); // Dependency array includes what the effect depends on to run. + + return React.createElement('elsa-workflow-definition-list', { ...props, id: id, "remote-endpoint": remoteEndpoint, "api-key": apiKey }); +} + +WorkflowDefinitionList.propTypes = { + /** + * The remote backend URL. + */ + remoteEndpoint: PropTypes.string, + /** + * The API Key, if any. + */ + apiKey: PropTypes.string, + /** + * The access token, if any. + */ + accessToken: PropTypes.string, + /** + * The callback invoked when a workflow definition is edited. + */ + onEditWorkflowDefinition: PropTypes.func, +}; + +WorkflowDefinitionList.defaultProps = { + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey, + accessToken: null +}; diff --git a/src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceList/WorkflowInstanceList.jsx b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceList/WorkflowInstanceList.jsx new file mode 100644 index 0000000..e3f7f32 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceList/WorkflowInstanceList.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {v4 as uuid} from 'uuid'; +import {RemoteArgs} from "../../remote-args.js"; + +/** + * Primary UI component for user interaction + */ +export const WorkflowInstanceList = ({ remoteEndpoint, apiKey, ...props }) => { + const id = uuid(); + return React.createElement('elsa-workflow-instance-list', { ...props, id: id, "remote-endpoint": remoteEndpoint, "api-key": apiKey }); +}; + +WorkflowInstanceList.propTypes = { + /** + * The remote backend URL. + */ + remoteEndpoint: PropTypes.string, + /** + * The API Key, if any. + */ + apiKey: PropTypes.string, + /** + * The access token, if any. + */ + accessToken: PropTypes.string, +}; + +WorkflowInstanceList.defaultProps = { + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey, + accessToken: null, + +}; diff --git a/src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceViewer/WorkflowInstanceViewer.jsx b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceViewer/WorkflowInstanceViewer.jsx new file mode 100644 index 0000000..899215b --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/components/WorkflowInstanceViewer/WorkflowInstanceViewer.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {v4 as uuid} from 'uuid'; +import {RemoteArgs} from "../../remote-args.js"; + +/** + * Primary UI component for user interaction + */ +export const WorkflowInstanceViewer = ({ instanceId, remoteEndpoint, apiKey, ...props }) => { + const id = uuid(); + return React.createElement('elsa-workflow-instance-viewer', { ...props, id: id, "instance-id": instanceId, "remote-endpoint": remoteEndpoint, "api-key": apiKey }); +}; + +WorkflowInstanceViewer.propTypes = { + /** + * The workflow definition ID. + */ + instanceId: PropTypes.string, + /** + * The remote backend URL. + */ + remoteEndpoint: PropTypes.string, + /** + * The API Key, if any. + */ + apiKey: PropTypes.string, + /** + * The access token, if any. + */ + accessToken: PropTypes.string, +}; + +WorkflowInstanceViewer.defaultProps = { + instanceId: null, + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey, + accessToken: null, + +}; diff --git a/src/wrappers/wrappers/react-wrapper/src/main.js b/src/wrappers/wrappers/react-wrapper/src/main.js new file mode 100644 index 0000000..0e61003 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/main.js @@ -0,0 +1,6 @@ +import {BackendProvider} from "./components/BackendProvider/BackendProvider.jsx"; +import {WorkflowDefinitionEditor} from "./components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.jsx"; +import {WorkflowInstanceViewer} from "./components/WorkflowInstanceViewer/WorkflowInstanceViewer.jsx"; +import {WorkflowDefinitionList} from "./components/WorkflowDefinitionList/WorkflowDefinitionList.jsx"; + +export {BackendProvider, WorkflowDefinitionEditor, WorkflowInstanceViewer, WorkflowDefinitionList}; \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/src/remote-args.js b/src/wrappers/wrappers/react-wrapper/src/remote-args.js new file mode 100644 index 0000000..73cb45c --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/remote-args.js @@ -0,0 +1,4 @@ +export const RemoteArgs = { + remoteEndpoint: "https://localhost:5001/elsa/api", + apiKey: "48587230567A646D394B435A6277734A-4802fa49-e91e-45e8-b00f-b5492377e20b", +} \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/Configure.mdx b/src/wrappers/wrappers/react-wrapper/src/stories/Configure.mdx new file mode 100644 index 0000000..a50fcea --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/stories/Configure.mdx @@ -0,0 +1,364 @@ +import { Meta } from "@storybook/blocks"; + +import Github from "./assets/github.svg"; +import Discord from "./assets/discord.svg"; +import Youtube from "./assets/youtube.svg"; +import Tutorials from "./assets/tutorials.svg"; +import Styling from "./assets/styling.png"; +import Context from "./assets/context.png"; +import Assets from "./assets/assets.png"; +import Docs from "./assets/docs.png"; +import Share from "./assets/share.png"; +import FigmaPlugin from "./assets/figma-plugin.png"; +import Testing from "./assets/testing.png"; +import Accessibility from "./assets/accessibility.png"; +import Theming from "./assets/theming.png"; +import AddonLibrary from "./assets/addon-library.png"; + +export const RightArrow = () => + + + + + +
+
+ # Configure your project + + Because Storybook works separately from your app, you'll need to configure it for your specific stack and setup. Below, explore guides for configuring Storybook with popular frameworks and tools. If you get stuck, learn how you can ask for help from our community. +
+
+
+ A wall of logos representing different styling technologies +

Add styling and CSS

+

Like with web applications, there are many ways to include CSS within Storybook. Learn more about setting up styling within Storybook.

+ Learn more +
+
+ An abstraction representing the composition of data for a component +

Provide context and mocking

+

Often when a story doesn't render, it's because your component is expecting a specific environment or context (like a theme provider) to be available.

+ Learn more +
+
+ A representation of typography and image assets +
+

Load assets and resources

+

To link static files (like fonts) to your projects and stories, use the + `staticDirs` configuration option to specify folders to load when + starting Storybook.

+ Learn more +
+
+
+
+
+
+ # Do more with Storybook + + Now that you know the basics, let's explore other parts of Storybook that will improve your experience. This list is just to get you started. You can customise Storybook in many ways to fit your needs. +
+ +
+
+
+ A screenshot showing the autodocs tag being set, pointing a docs page being generated +

Autodocs

+

Auto-generate living, + interactive reference documentation from your components and stories.

+ Learn more +
+
+ A browser window showing a Storybook being published to a chromatic.com URL +

Publish to Chromatic

+

Publish your Storybook to review and collaborate with your entire team.

+ Learn more +
+
+ Windows showing the Storybook plugin in Figma +

Figma Plugin

+

Embed your stories into Figma to cross-reference the design and live + implementation in one place.

+ Learn more +
+
+ Screenshot of tests passing and failing +

Testing

+

Use stories to test a component in all its variations, no matter how + complex.

+ Learn more +
+
+ Screenshot of accessibility tests passing and failing +

Accessibility

+

Automatically test your components for a11y issues as you develop.

+ Learn more +
+
+ Screenshot of Storybook in light and dark mode +

Theming

+

Theme Storybook's UI to personalize it to your project.

+ Learn more +
+
+
+
+
+
+

Addons

+

Integrate your tools with Storybook to connect workflows.

+ Discover all addons +
+
+ Integrate your tools with Storybook to connect workflows. +
+
+ +
+
+ Github logo + Join our contributors building the future of UI development. + + Star on GitHub +
+
+ Discord logo +
+ Get support and chat with frontend developers. + + Join Discord server +
+
+
+ Youtube logo +
+ Watch tutorials, feature previews and interviews. + + Watch on YouTube +
+
+
+ A book +

Follow guided walkthroughs on for key workflows.

+ + Discover tutorials +
+
+ + diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionEditor.stories.js b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionEditor.stories.js new file mode 100644 index 0000000..f6e53b4 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionEditor.stories.js @@ -0,0 +1,21 @@ +import {WorkflowDefinitionEditor} from "../components/WorkflowDefinitionEditor/WorkflowDefinitionEditor.jsx"; +import {RemoteArgs} from "../remote-args.js"; + +export default { + title: "Workflows/WorkflowDefinitionEditor", + component: WorkflowDefinitionEditor, + parameters: { + layout: "centered" + }, + argTypes: { + definitionId: { control: "text" } + } +}; + +export const Default = { + args: { + definitionId: "57305c33e237893b", + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey + } +} \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionList.stories.js b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionList.stories.js new file mode 100644 index 0000000..657b610 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowDefinitionList.stories.js @@ -0,0 +1,20 @@ +import {WorkflowDefinitionList} from "../components/WorkflowDefinitionList/WorkflowDefinitionList.jsx"; +import {RemoteArgs} from "../remote-args.js"; + +export default { + title: "Workflows/WorkflowDefinitionList", + component: WorkflowDefinitionList, + parameters: { + layout: "centered" + }, + argTypes: { + definitionId: { control: "text" } + } +}; + +export const Default = { + args: { + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey + } +} \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceList.stories.js b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceList.stories.js new file mode 100644 index 0000000..2eb8ee4 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceList.stories.js @@ -0,0 +1,20 @@ +import {WorkflowInstanceList} from "../components/WorkflowInstanceList/WorkflowInstanceList.jsx"; +import {RemoteArgs} from "../remote-args.js"; + +export default { + title: "Workflows/WorkflowInstanceList", + component: WorkflowInstanceList, + parameters: { + layout: "centered" + }, + argTypes: { + definitionId: { control: "text" } + } +}; + +export const Default = { + args: { + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey + } +} \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceViewer.stories.js b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceViewer.stories.js new file mode 100644 index 0000000..a5a7c32 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/stories/WorkflowInstanceViewer.stories.js @@ -0,0 +1,21 @@ +import { WorkflowInstanceViewer} from "../components/WorkflowInstanceViewer/WorkflowInstanceViewer.jsx"; +import {RemoteArgs} from "../remote-args.js"; + +export default { + title: "Workflows/WorkflowInstanceViewer", + component: WorkflowInstanceViewer, + parameters: { + layout: "centered" + }, + argTypes: { + definitionId: { control: "text" } + } +}; + +export const Default = { + args: { + instanceId: "f14afe24a2e6f7b1", + remoteEndpoint: RemoteArgs.remoteEndpoint, + apiKey: RemoteArgs.apiKey + } +} \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/accessibility.png b/src/wrappers/wrappers/react-wrapper/src/stories/assets/accessibility.png new file mode 100644 index 0000000000000000000000000000000000000000..6ffe6feabdc17f715771b69fd7f33ec2c57e7c30 GIT binary patch literal 42336 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

V}AC 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 literal 0 HcmV?d00001 diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/accessibility.svg b/src/wrappers/wrappers/react-wrapper/src/stories/assets/accessibility.svg new file mode 100644 index 0000000..a328883 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/stories/assets/accessibility.svg @@ -0,0 +1,5 @@ + + Accessibility + + + \ No newline at end of file diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/addon-library.png b/src/wrappers/wrappers/react-wrapper/src/stories/assets/addon-library.png new file mode 100644 index 0000000000000000000000000000000000000000..95deb38a88de416671e20ebc28dcd397d6910331 GIT binary patch literal 467366 zcmY(pWmp?s)HMtgDJ}^PEgqy$oZ#*dBv8CiifeEvP~4?JC>q?oSkYp^OL2<3Lvbip z;NyOt_p|vk*U33ES$mze_MYralqN(GABPGD1qB6PSxHVC1%(8Lf`UEw^2PHf)^0V7 zC@3#bG}UzEpNErsw;Q#}zkk#YE&j33oH^|^Lk{&lH4%PQ3E|}vx9E_dW8&V(%VcAh zni!trNf;+20xph?pJd2@zAXQq+knq5-F5T56V8ko&mNSJG5*<3P`N#3S3X_%^n5(u zAH<=%bo97)^FTpCfnIh%&%iKW^K{v+{8)`bM$O3_`t;N(#`(&ZgM;Hue48Al^7Wj~ zPa$yNTs}Zh@=4HP%p&7y3^iRwLsV3BIN?b*T~Td&Z}V7EY3XGkDGpM+j`s{dV0K@;FN>bu025@kbl~*-ww1qejk0yBOozi z`gcU@K^pUEdgCdrwS4aDG6whK1UC}ptwZ1A=½zy!j8k^D_+Xmby+9Nl|wWphp z$Bl3OLrp_7YqzhxG6c^|-@wH7 zf2jS2D*sL6<7)I*9qN5r`(i%)Gtb~D%Su9TXi$2v>-yq?-|E3(c?Q?oAaNbv!;j zX?pyedKjL4EJ2!=KG{0jEN(Bx>GQMGNqUS?-`&ytmw z-GU!7k;l`J`X@rTdg7^B^s(BP{OM0tQCWFR!(w27U)L*I$Bd_TnR0k$;YP@pQm2~M z2*z9o+yqyST4jr3`S^_Pr?_9Aoj4W0amo2@Zpxa3RTqU^RG%frMU@Z|h^yNA)IU{> z?4$;DYr{uYV92i~Y5x+oT6}}XI%n-&rYl1D=R>NTJSsVCB^}I#rRYbU74P)Qg!Q3TrKBLGmadh@tMy`|u!Vkq|97g|mE+tWMk`W>cujxp zJZto|yEX)h^6*Ic`0#N3_@Muo@Hp{KZz1MgO5zHh2Ei=GO{e@@4qNoXcgDVs&pT5|* zshT}3ZkRNa(0Jc}G~1!}@R@|>q&dp7gOv61LS5zdZ$a1W(PqDVVj)|K%ymwV`mX%@ zsDX^NHr8Dk!9LZEOy{u*PTLql5tlrEFWah-cY4%@t1z7PJ3$Uo0r?)RtmbcpWiGk~ zj%{(LVnestm!VEe3%BoTaLGGv-?_K?x&GD*AKo<9|2Tha9i{ zZwZ~0Ge0Yjz7$$!VP@asP2DUZPikXvh7z)$GAt#lGNd_I0QnQ$)1Vmd8R9R`-szjB zE;vr!g+pw93-zee$`EZcRS#~jkMBNK@lCnthOCJh5IY?Z1=~=@WZF48>N+IDISeUw zGO?Y`ONSCuzu)wWDD2J7Y`fWC4DR1=_U{j=XK8n77(o4nKNtIUCdOO)D-(#F1x~>; zMVN!ensyyI(9{>d#Q30URBp1zT@F>@1)%2&Hgv25!mk{^Gk%bR7+a3_c^&od-RBMH zzjzQ+ZpH?=ZVYb}YxYTu3?TEfHk8 z%GzG0hxW21|%B zfv}&gS4l(vN49`KkQnQ~(X46ue3IC@eJ5>`kg%#LY-Z}qJ@i`^?h=RAx0eK-9aSVF zGRhv^si@#VWn(&Ad9bkc0*2^+o@wdO@&=63ft&(k>RD`K4TuEFKLgjd{?5BDuLg>1 zX#daTiZOhjVQ@>AeCGEAr0e47*G4L^hbGCS78I~C)qVL#%j{wFNK$3j+GEcVw$#h9 zui8DrYU$>Ge;qc>nB|3XsZ5?v@6VQd@#~ajxa^R44kR4)vKDVKkh)0{Q@a?~{eN{{ za9WJY$(}&MH9U|>=y*6>bX;^s$12w@9YOax7sz)^MTGv%p?iGuKhr7Ft?ON42vHQE z%2{c)i58pD#hm>iPjGdJ)~A1->hn_#BjUVZeHoi^B@_mOZ+6$18oW$Ay6O^Y(VN*Xhv1sse9Pqie`Aq1 z+h_c9<4>sJ+V*juxS>*ndNr9i<;i;A6zlk*mfGeW?f;9WJffRIRY`qL=)K&7#83Es zLoNWcp$?9MXFLCBaqHL;-1vOS36_pw`-fa1J^YUULJN%wr!-u9_E%C78=d>!8fRt@ z%8G#Hn9vq=>lH^GaBn)m!7$86M0}F0s9#LvS_LkWR1z+rgY)(zUiTuO7|juoz;_g7 z)x+P6v0s*oT|ztXCKib;&RrX>seM+=+p+IQ0rGwQ_9AZSQr*%Hk$t7k;)Di{fSOiJ zf^`o8nrd3uiI9N#8ou(;zfCgNO<8$z{n&o+LbDsHoiso8J~GR>$^1)uM65GA+~rez ziR@W1lL^Jq?E;N$iN+?nKVZ_~n#^A$aVm;1@FV4-$ne_s=Z1lK)O z$(1gwdWP@c6z=-kca_SeQAsSS&l0=A9js<-s$e7!Ho8Aj|8)qc^*fhf{z{(XEkoT{ zxu~P;Fq*i)^an(ybtnxbsCE4)d85p50bm(sZJwohy+B(+_F6e*jnFwm$?x6f%L;p0 zv}wfT&BVEpT15U-fu0f4eNQ;-<^c1|HOYkGf)nGn3qi>%JqY$YP;q9vl~P%N+WHp0 zz*y#yv*odKj%PT!pR3BZJF1@+z_)etDdyKk(f6GR(IaBgKP1D}| ze}?uT&BobqrUrJo@tL;!*E#s`Gg;+~m;)z!rJk(#6VCo>snJW8mSQaekd!i2$-(pi zi+ss6^ENrwZQ-VG{X^BrgQGPoPaL!{t~Xa5lxDX7YFC0xp!;A^votUM{oYNW?jnFO1xNPZS%T0483WDCTYW|mQI4Xt=tvlS=w$F72Xi_5zyPK{e?^b#Xq4Hv8w9-aFFw^a4{)T*9lTpK6?almje z_M8r2Oa3E_AY)H{ueaWNizF3u{@(eurPDylBwgA=0M72;C~hAHz=I@@J{Zm0y)3T} zY~>9(IH)95qRymW(>l-2c*>ZZk$`Z)tbBW2kWvol29V^8d-r_DyCg!kI6POxMJ6jt zo1A0vf9yKvt5OSF3Xk|YA=tYNEsvzDa zSqDk`OR4H+b7uP~IqZo!mcu4t$4Pld> zSTteE#BRyg>Z!yBHUC_sX z;!*L0(H~tS#Miq;ilZKRvzlvIMKu5VLi>+sQ?xu%x^0Q;R1sWn3hWX)(Z1tB>Jv;h z8nAIw#$%Zz#XRE$pQx4iI(y4L=W7gWgE?7=!*uS{&s7l)0UT}t^?3hLc3`GytVx_~ zl6Pr`1L~HcZPQyFfg7iFv5DHHk_uq^1*-v|+Ree;EdxBNPhiY(%+ZD^dYAIH(J8sX zTUu;0Kvr-CWyEMA+qC>2Y~G0e_G_L1@JE6ro*Z~ceVXds<}lPb;OMI*%rN*53Fsc< zbjcL8P52ug#3#{Y!`ZB)eg8Z-)VGiv&;V3W;#R7yH4quFo#Xz5 zX>CbMu)s3nD#sSB3J*SbVw@KX0kj6rS@gLDoydlPVEnl4f4}$Lr11ZvkeKhU5CB}( zg_TO|5ojna|L^C7ww#U$OguksNfqYYn28DiTPm)cs1L(6<;Pq_Sz*EAJGqx%o<5u` zxGZ7@@1b#_v7)0gD{Zo4B+7(QHKF2tv)*P`AI-Jj0@|V#p5yz)EHRwYZ$vJL;jcRN z5*DU6?u5|`->-vEYyToMg^~qWGtM$taAvAR%+oClnoIo-sLSj!PqAMY7j`GH5uA95 zRrY<|+BOfBC{66@Y*h7TgmdeHek8;w{4gIU zx>=la{{xqmb=TB=EYB#6$!2G|*762pOMZ?hMVI*mc6n7LH)6cH#A{4jF6=QAB+=p; z24E>*6epzh(3JByNsG#nCMKOrPLxo?AMywHuocfAlh<@J-`-?3b_!{-t~oSo(;P-= z|5Xxpb3#N5BSj|~xzXJQ>1n<|CW~W(qunlTSh24aoD>+3RVJ)`8<1FTIQ=l5Sg?k!-iQxhr}Q8r0!ov-n&fvu&^ZuImU?q9fANw|*qJ9P z`|ND?PP=eIQ-R4tDv3QwrHF!8nEASyU1qSV_p4G?C?GWXCF{1fn*aK5mr9zz7t7;( z2V~~q-^Vz0XU_cJj|N#!m&u;_`sTp-T)qLs`_($efFWTYOLwNL1Si2prt8Uzf@5Dg zUkmP5B?-9}2O&gESBH&P#R{rN5Ur#(DQXOqA|ty~oR&F6yN7>2Oe1JskCoP={CaBA z!51_O1&}P%e#~?^d|-QG;eU0#I9O)nVUe3WWcp%W20_vv7+`Km98Ay2uOk*DqN1gO zNCXWrt1(5rQ_;bQkCE3`yfnh1T(_d~=i1<4*J6iqilQ$DVXU z{dTK+ahfRcGh|(IE)Ah3mF1G%Hu8UVLc8TjLe?EM&dlchcRQ3GEV*e=J!OLJ3?Rh( zUh;{lv^X{EbC$?hDF+-@-c`$wt-xj-)@zL4ReuNFe7NM=attGm`;^s+BZi--D$6`Y zZzC$GVGd%FHsvA42w=S=;8M`hr$JSTTFT@Vb{~1)9n1cTgaA6&4%Z;V(tTgxMEU!J zNPGAgO?!rj#PbmKAUE9MSRc;^Wz->27I(9KkWG@S^aE`f%TTlah32OlkJ*A{ic?s0 z=6{e!{|7SB^f!rgh){}s-TE27eZgUp#+^jIqJBiwX{-qKOFMmd8n*Qt%whcgaH|y3 z`QtA<-y{G0j7 z?v;41rgu=h`HPDMP6Qc)&3eE6&6~1KzOk(yPDBH70}Q^QH7++`KUDe?@v+8n1Km?O zPjkt}{P6bpZAYL>>(+zMl#t8$Rn_>_QGJ0@k8Nf5-+dRs^0^7Y`v+K)*d|$V7dD9R zr5(y514XJ7uP|pk ze9~vx)xwRylz}TxnRI$e8}8A18;=ycL6&Wj4;ynrdl8P3oOro^GvAmt0>@prOqP>0`LxG)e?JNEbGSAl1~1!MfQf~Kn~y$x5t zutB1lZum8iq-ImA-$ir}&PU$Gr}3^)JzlKTqI~L=ml&%2Fvf^36`~L;gH@L2@RzSU z1rA#`PK6~ADE}#7QYKR-p>KhlgDK{na|>Yd?|_X+j;1pjjnMnRr~Ha_t6D#BAYiClpRwN(}KBLzKeR*>Ot#^*5>3n|NsU zEcy_&VSXwB=o zt2ZBkki*>20bj+a>h(rCQ~kpi)fm)JVVjK+ew?@~#k#0fR7NIlgA?Bh(PDoozC4pw zky;YgBmYpYz0l@=%fzqc8OoBYqmniv(`5!V-ehAix^}3i5ys&8|6RGg0 zt-hen{rkfs>)ZM$xh-SF=|@tcl7hyyPuyJFZA=fTgR1Sc2Z=;5hF7di>2g9qXjGcW zU=B@HVR$)Gaex7x*?VTs(xV`RVPZ?#1`O}Z!>C(-M^=QOAP@pepu+Rs zd&neUC_x?{mr#3XKNZ1_M!zYYB~;RW|wd@FXI2i&d%=ine7GVf4*{u94h%zgLl+)I-XH z^TfOGJg{h+u~P;*VL*hmGG%seJhOr(P@BUrQuAw)qHz&f9GOyKNK#=p+f$<8Gzuv8 z1)UrlMKpSjjHHa%1j$!A<9rS-Ke~a}#UJZQA}R6nbzxC1SP%k)0xK5e9cl7ql-ybr zsarvWUQv^W9xGVGXNny<5e#dvoxDKEUf(D$P`~p;gqcRzxKE_lM8ohob{o#(8 z7Cf)3Nup;_e$I*=Cueht@>l%K?4kWs=**nRB@k16t@khEI+WoiiES$xQ_HxS+V-+w zY)xF_&1pP}d~=>;nvU^)4{qiD4{r6HdVhlFuZhznKvc4`D$k`Xw0%4->dDpA;Hd{a zCg+GE7T_k3u~4?)l91*7MPL89Edo%z>zakGv@*t5b&-^Rxtc9BE|~{AG+@eSP)Lg2 zU`Cg4#q|_nb@>9)^W>zOSmSt6X3WHXnCF6C=y^00ft$ zVcFb4p<3o04K-0KMh#Jxlg1HpM+6`&NWs_tiGP@ptXR#50!qgE$wO_O#}|rfbP(+c z&NI82ji1;rCyIfBbstZRr2hl9t}D{S>G8`a6b&D{L%UWKF{&!9tdq#L`!PR0okYn3 zzHt_b`HOMqYf;m@3#Qir0SMK858&1gB@p*+qnun5OrlU8VSEjoa?l?Jej@41<`!V- zJDlpa{5dh0wap^t1r~-;HPL_#bTzduHjh%%>gNkw_oZi1OCG5oT zFC7hnD+|Nw%1_zj#@G3CyQ5av)PF3kTj)zGTc|UXhqBm_7HF4i(?!~9jQJSK?9349 zwd*&0sAPdLbTG*BGOoWHrqihXlY znXJYcakjd>)5EM(?-5As-H4D1Y%BzX+6&x*_jvEQ&WnS%l*IQsmuL#YgQStw*If_M zLQ+VRM3F^ph-Ts;|ir=vuny{RP*%7X@lSt-rPluGdG6G*P zRURZiSmEld#K$yp8cX(rr%XPEM`HMv&>H9^OYRUw-o7yQi+IF7YC~ z#{X>CK9%$Wl=;6xlj3R~Iw!O1`gQyAH<$4l;|niv->K!LV|{mgYxT^&B4sZdg8k{b z>i@*IN>t>%=iVhHQq5tmk!$w9%FZX<5sai{E5w zx-@pIn$%c5X;ti-$YzIoi9gfJ_CL;cZ%_aSe?-fyrP_=SB?trJ>v@5-png#$>Z!a@ zvRMMRDI)*JLs%Kmkx>zW2tdxwuaOf1P#ca4TKb1`xwuF;xJ0Jw2RO#Xe|P^^RPc~Q zdXag#3=PDX#rTs?>+2|47F+(F%~q*07IJ{|H^u;B3c^pD@)M#gawH~}EL>V0B3IQ@ zA;fsN2(r|sw!=&V=hpOre4O( zy0M{Wt68_ulUA0C)pn1JQjH#fVR|9t`PH&b48;s#6~f6Ub%J zfam`=DSise0cE}?LyvzHRsirdBt?f;h$46+4EkvgRJ21Rm0!?B)xcZ#3S-$sFMYCoEmwp4A8=s5k=i*v>p zT5|I+EC`E$=i2nQVxjse0q4>wc}g4=!{i?Y1mBb+Vup-XwY>y!REAGzk#9pIsd*I8 zFXgE4uX3#4l27q`w$D}wP&ElG$^qGIRfo?wKYTL(3FxFL z?&ia;Qhp6}nzwnq$Kf&a$%_v_`Wk1d6K`qV zT>(dh!6H~o-#S70{*Gbqmdr_Qq+-oB4_6V}v| z$L47b(H&^_vs=IpBTo0~&%{Z=7!CEA2tla&&?y9PiU$-`w`Pqd3z%HDv^{57_5V$3 zG|JK=v~w5rTZ$AhE}0V~###lyhDEttEzsZ2K~G|JN7xqRd^cc8Wj$@*!C&X6Ly$v?^5JsXEakuT5mHtS3UsgH zaK>g8j7_(ZUQ1!>rZ!P{%0$dP{8FM)^1;1y46d*ey9y#JOGzN+$IolbesV$vXrPVW zbvA4BB%__Oaf~Sa*v2I+f%26NTE$3)!CG^kIlU{a>vA}YJ?Z4*DPo__TPHP zC}56F?c+mG!7UYo33lgBpgK`OO5hY<|g~oH{YWGA+Sy_sqF@XuAT8PMe+=E^W{=cA= zqs;24WRT~K5r9HW+wS#V0uV8ZF}pKwD%7WVRLmv%x9*L9z0y4fg54(*^M|92Rwqu@ zCrk&(x>D9L+6B)yKl~$hCseR-`CtOO4GX;*qcTCcoeEMZ;w4auFxbYC7jncK?Wxn8 zymxL$DXE=0tk)B?TB^~HT|vCTjjsD;N7rg+(-|n!W=v~eOmZJ6R^%!=9U`Q%UkC=Y z7Md~Cf4b z0}uJyImC3YZ#DdV3BF=>I@n%x%bzkH6&M^i8dO>1rKHiw7WW5dzd z@&eagMZR&w4y24n35B~LpzNfJy|Np(MzCjbe5{yZa($Mv0mj-^IfHCcCU0zpvv#S zzMkcIyc~T%c_-i%(BdWi2;pR*pkN+0lI;Z0l$T|j6sq;|=fuC*mklV0H{xnd`Li_{ zpMIktmj0JurtKgR7S7mYyRU5F1$Q?qRRtj-ZHi6VV#SXvho9{Fhb!H{c}ou%A%K1J zB0mS4kiHyP;i%;iHjJbhyP-^LM<)c)jtVKr>tg`{)g4@0LK66wo{dky`_NUtw&ErU0~F~+K7nSXv^<5f`HjCM4wsvWk&Y#GsqT$ockF-RwFWD|8>3pGQRDg; zS`Ujh9)#u}Hq2eghT1aR!OW%~6)y$muMA$mT#c$zJv67_mNMzA>IFpWCrgvTb)A4b8~A^DOp%mQTU`P69X*eE-8uA3 zQ8F*vNPtLDE`_N7*qfx0yB942U=uwUDOck?A3erK zPL-3KH<31e_8y;rD-s!5L+j`bb&HMQ&u4lApcvK03lng5RmCwJ{8h-*4XplJ?Q!4O zK}oVUqKVn%eEZsQDGm~pY3Q3}EU_o%@9nK>a%5?@?rQrbe%k-L1ZuQOjimEMr63xJ zh{=@+wQjALG?+rk(ynXdPrZs~B;TA&GPQ6BJR_6&_ZCcLyMMz zJf@ZWCJLki+l*GrxlC-zhla3p%^)n*MNrjbU3eh$oXt~h@pT1m*N{KPnhu93KBPDZ zFvY-6WG$VD9G=(or#!q0O=9-&DdvJR_l{>;Rv~S@Qm0_pnNnHNW6F0qlp0plgK2F; zV~ieHa9#1ZxV^HuUQ@<`x1G+L1k=|@s1OXH z+DG2b7tF4%GwZ;%vifWk&;~nRY?nQ2&nO)`FXP793_(-pkNdNSi3^!89Z%lZM}lz$ zWl;=y(fYJ%G61iSyUEIHa^B(iGUp-HQg0E0%0k_CLWW+X^dH2RxP|H8z9(pt;m82T zz+ajf@Q}7OWS~N1vGxbP4?GvI+nyN8mBjAds~+u&spZImU=dp(7QXjg|>~ez;51Xp+5y}Vv>(Ad@AVe{TO2wLT-1FbMR+%;~d9q&6Td!?r zf|3XTJ);k@MkDmqqwVF+vjMAN8P%h%(__9N-ke$KyCsKJV4KCQtxV+p-%i_zCJh{% zrF3w`j zpLVWgum+QnGNfZ1PI1Abh%w{m9l^5}_t+S32_z=$82Q#L)ls%xZf4Yu9s){+p@wUL zYdCDZYZ6;_fi4H6owHt*$15l@ENpt&&dYWfzHnh(uo?6- zEvmaYs<5uJ>jD&Bo-3?n+Fgh)UUuG2cEM7#(k_-xDtnHjxnb3^ghzY{KrYZ$R zJevuPeEpxPYLX5A2Ug)Y_9%;=x278OlW*xtXsnHiniQ^M2zJbD*41w+F-^s%Ap8$>X-G2(q~LO8FtlRThCH<2N54!IGR(d<`t|37{x>zH< z$JPEgrF9^Ho*Z(lE`?BK-a!E2l&27w!YXocI@|eI}Tk z9%jP&bHa_VYFI>WZ*D6%JnAC+#RV>?%)Of3d5v#hX3mwh~XA_&uR(oEOshzE|%?< zkC=+RntlcK^2{xGKl)6IE_Gv-P&5Y(+gH;-wx0n?}RfT@R zI=L)jr*g*bvpnta^pprfu%yO%2^F%FAncxo4?*Z)i{lkg;N~4Wud3Nhom_lYJos1B z;I_bX$a<1-&wCu&u2q^}`Ly3Nj-o<4 z0%rn+^1e>y7kFSqz^QLDNyOQb2cAPt;$s_WxVm|q3Gg_bf`R?Ki14K}PQL%)7H{mb ztrt0};qnaxwD@UK?CS$%smKU_WZ{1ONM%x}ukFL5`Yf!D(K`Rk> z4gV~I&^*S977yYLQx+bkgLFXzMV|Mof!;)TlL(d%6Rx^{`8Bps!(Cw_?XOXx(_PDv z7yo$)o9o>SfGJX+%rYV=1eSWsn|1L}h+&iz?sfoE&X~^ol7ci-L5&w_MREHkIIF2< zq{X}nyh&gkx{-?R`zQ)rpr}*60|I?jvwYjj^mk6lz&^@zOTU$2EF0=Z$n;lVYN$vD z7D@TVTh0hw13U!C!Qz*ygRjA~5|uvcS)0NLo#E4kj|ayDO0(k3|B+FSzIHJ`-Z^Fj_jH%SWhucy z9@wEn9`6_rq~Q4ytW)Sm(vn|uFyNIw8d=3v_+^W+*$5YGFpt6zxdRIk;R_ClO{(dL zX?4l5OisP29HkwLKdvrb=}Z z;XcV^8Oc5{Ju5(Js@;6Z{(xq5{nC}YRI-?Wiz88RDSg+diT&vQ?a?i&8`OsqD(62+ z{BBlft-+HQ5X2%6NJdIDO#h=>NDj{KJkE4n)ovmd7uf>B7*vqC*r)P8Ep70qwxYP4E75Z@oKoju4_);t#j97`ZfVAUU8UGncQuJhT?{|DIEI8nN zbu>m`kQs&g+5N7K?!R6SN~yePOb0AY)oQ0DDk~yo+${>V8AXyh--<%ye&cT7``xzL zWefz7pq|<$9GNEg%l&n4S>SPwUsGdIt=NAq>5QeqK@3~sHDQ8l{a?x}zgJ++O-_Z9 z+ZZ^6eb=jdpO!D(_@ab?pk$+vCHXr`VDUCd&jF+ltn8mS%*G~d8=>9M%>;38{)$wV zpPqS6r(U@e_>I{A83rfxQeE+{UR-7_$Z)Hnes6hprlO^*%q#VYQD z27(d=+mx;$wzXcf@E6gRKNz zhp4Jj1dWKa6@wgt*jNeBmBVN9SW0YKQ^L^p{@1w9_(pVk7*)EmZfKT%)Sk+JDQ=(eI1+0j$e82SJ)#5!S@2+szznL z5d?GcN4;zLDHs8zH^}NLQ&^LW>bWY5j@D)FPAs@tc2inra+z}WP&(j0N{0)dRh(Z| zzO>xY%+FNU`ZH5b48}ka>_L@_LiVvzmSb9lu=R5bz-Y0(zXe+;#SAsHvV{Q-nrTd4 zizfXt#skLyzMJqCR-Njcq#?YYmRNmsrf492x%e~?6&SdWH1Au%Zvu?> z8KoEK$;$r1>E6wW#_RRp|GEMrClPSy7rRTBDoq{GlEmfHfZCFn>7JtNtx+1`Bf1k$+foKShAH z2PFp|wCxyR?3p}EDr<7|4)W+ggu9E9a~|w*|TTpJzxULqoKT! z(2*1(Uh*6kTMF8{q;H}H$TBzf=zMNnV3y$!Zdkolt13Z>0k_c+kH;6xPs<)Vx4%s~ zJ=J{RW>B2NRFSt-3YHvi5L@?{)qpHtvJg*(f;vi$fWo)ft}?u!7D6EYUXM+-U&=v3UQyi&+KyA}7ijkUFvFOEvRUV}e8?fp zE|?4(fk1XA5%PVhAcNMAKCy51xsQrAm)tC5@)>SJOZ1o{0=kO zNH!GIyNEHEHq4LdRvJi^2zmo5BPELiNv3fG|5V;!dlL*_a-(z9M0Ly}&bV~{@bVZF z+AM?xa}~>VDt=*b-TGW-Mf-do0V39u;46Xdtz>D$9yU zb?pcF;qyV$<#ixA0>2E(hCKXIcF#S27|u7=blloF3!OYKrgdiA(19pyOxvtorv7mA z`bzb(0Q~$T@e%(lEO#*2Ebm)xVbfWVAv;<0$!L$ADD`^J5s>Y4;9D+?=P+2`A^L1dkGV4u?En8x4-{TPU98vgSx z=7E)8O?s7PF2Mu)@{N0^v{;1Nu~3?TgfS{Ro38!2$}%)`$Y)drTV3mDEOxf4DSm)S z7L~`HpW+?QmLF9%vMlN6eu9+h9&26hP=`EVZ%9xR+En|UL^ZRn$Y)4(VT<)*LH}K4 z#b(ECWNqQ`1T%>^L$w%G({ zD=2ho?^PNWjbuA>+vBcR+D@5$zx+_}RsCyS4p?@SVTgpAf|ILAl#YX3ntg$@8d}Lw zg^wVRvw*22^+~!R2QUzy9SqmDNH19Q5!D~tICFsBnPeI1X$OmWu#5GyRa+ElA7PC z7xB-i9=P|1)(UQU3G7D@j;@FPI)RnvBi<~de;^rQd)>tO!K+Rc&58Yeupnvgkl(v@ z)FsbpN=PRI^1i0bx2ndRc<5OLxw9y{2i#^mcM1bJa5e&rcut>seQRj@Xvt zbR-4(X*cw4q2BMjqQJ`WUr8!dT+~pzpI<_SAF+9aixws27P)`;Q%Q&*c#~9$9s{s9 z?%MYm{p6|Hkp$}8m(ZW`XmEhDM93WUeHL~jwE8+^pa1~+PHlHM&e?=nof3d9Ih^=(CVak9t~E6LX3;ERzR&!|ak79>%{#bJ z9E%STcKyGY`s%+X|2JGp8U#jnkM0-)QIL?>LxZ58gp>lKB$SeFrC|>!IYvnePEe#9 zVF-f628gssDxjWyzUTaK{(vi4N9oPN7R})0Os=0xl;qtTiry87Uf_1-oZ31}>O==rnJan+FxTPSOL#3-B3J!1O6V>L$;QWJmL&-$ve1^PA$l z4G0U#F|Q9J6P^Lj?r3$NEroc7)?8Q1h)#1edPHyB-%))xJF~c)Zr!XJ0{ishcqDMZ= ziN5t$@TKY;G8)&VMh^&)LK}IeY=Z|~16KcTRn#@q%*7Vj&icX}- zd}S>3YFRLoKer0fyO$8;u6kq9El2I`&M;wpmV^vEzXCk+pBB(D{1TtJN-cH`y9M#y zQixZg;{K}uh3mIzyr5RLs0&vR3(gX1N~a><<#W-@ZWL)^qea&ZKI5t1SMu-C_m}IH z8Xnu#@1J%Yfc_pZIc*ZK>mi$7=-#@)f(lB-RY&785yUa?&5>IZD56SYGsZWmldL4? zZIb>!AZqRDXlYA1Ge%i#w(UR@}~9{S|>~N57W(zGZYT zH}?@r-R@sE1~U%j6Mv-S?de~n+xzY_+%JU&#yr;)0lihG!??a7bT0@8jYWm3-I^G1 z2GFev(6>@D86Gp+8yy{TIayd$rL__5GH4&sfb|%ejLL4MF~oOV@=!t#VTzY5P3D00 zdeD7mmLd|Gb;*vbv4+*C^qG8uN*M)IWNB4J3Ln%Vc&#t*_K+W(4BIzi=(k3H@r?>t z>W3k^x1y@+pJ9>F*`k_tnz`i9zeohDN@A|K@?#kjq*8&p}-P zqd~PayuX7(O^~t&;xW@0&EgixE>S3X4V^mGY=ilL$1)T2(AaRYYRtP!vt719qE4uG znFMr|6PDwe;YJ`kXG1MXv=#BeZ{HxUUeagNuL#kNksc;NS4Tsj@?MygzgckYF@dGN zPbR{G$TDtc06TB=wj_|$I4NvJEO?i@ha|V5(s<#Gis8Ju7(LS!mN_yci$lG58Xs0F}Mdt9Lj=GFa6kR8~o=#@c}2u z?0qDehXa+_e9_0@N57wV?IAwA`=A;2PNI!?lYj$>;|_*9j1%I@UF9$$GdDNNCiK~Y zNFApI2-DTFyJ`Lzs(D6HlWfTF!(+VH(pxdX7byN~5 z-P>VesQ&ZY&nmvkUJ%LM#ww8QaOalC88PldO1Wa8^mN36&G0TM^rC>eB~ZUOjS(Gi zeaZt3!Ahz*QFh;+8Z2Q=R9JZS9rM0->j6t?Nym?1)9$Si9ZDcFKl?x(1Fr+?H9@yD z90mB-Q?MITNrEPcflLVt^k7~Y8fiF|??7nEOV!rEeTAEAV+SP0+wdS5*8_+95UH($ z1%+ryb&dI}I}aUt4&1z0dx`@tb6y+{TPNZQ;fzqDk}_$Gay2x%2=3hCQk=GW=Chpj zM$F)D|EcPhT`F%hv;RU?2qgo^J-}J4!Bb#c_z>CtA{F-e{ZGkWjETknQiuz?t`dJL zWRLAAH_i8OPzqBN@q3*v&~kQU#`FxPf!?~-n_PdBM2bGZa{ILi-^T#jK#LTUFISzV zE$IR3fUIit=30$4>#ZcC=OQvoko?bz&I70e52ku($t&j~RL1G~7LGmgJkd ztr4*%85T|gt^UJ_rXf0Sr?lHWWPnrXI;jOk#iwd(tM*qr7IyTX!z_!h=cXivPLe2r z-Yn3g5#9lDl|Jc<{@CTqQ&ri$ca6$1iuUUi(3yl-bv7%@I4he($Uj`)77`o0Wl5qM z+~eMlW$PyfNX(_6hspG7_9yMwWZZ06#1*pt;lW^B_#5~1`c;81e@x_9Y|aMI=$T+i zT4V|>%tA>W+d7vUQ!$@)IfZz7CH-`FkgYM7F0jYZ%So0&J^78+`!jl|v*jw~rPd?< zvZv5S&?V%jSQV=*C&*gAXmb7zmGW5{gMTz@sXMI5!6)QVe+A5dT5NahI1N&O(P1QD zCx(zHW;=cIINR(y7b%EM^)HIH`tIHIN{$mR8p`Z&dBuO_<&NY2hYPO<-d7(S4qeY} zr|V=l@C=<}gf@z+Z07oz>>!nbFi2RTtUwc6uzP1TBGh3i%OB#IeFMmY`B>Xu|A*7# z;*RXagMS}x^Z&MON+J*$a^r4IUI1q^i%1Ddy?4Ulv^x1a(|4sIPMY0)>I6xLUD6L zEW}d7(OaE)rOzz^_hOyYvvR*nvWndZ?}l7$hGT=I&ifiIhx0kD6oJ5Bot8lg;siTc zJTbjmzH~f;3*(QU79Zx+M}Dn{L;6T3Srx(pNT7X05ygCBBIeau+U;kgK%djoYkbtD z!@tcqvXrFab3&`%cG2{DKDps=z=%F)N7FYFR~au6{qFv_Y2RN%{vz3_3S^NqNsXNZnDL(FrVHbg%~Rw6Z#du zrN_%kM6b8eQuF%{UQ(DHfa6c+mQFLL1d?p+XBDp`B{bYF-B&mE7DT6H!5KIw-VKTy zO{Js!nS;GH=6u(6-D4H2!rS{@GE!K1j1oF)d|$qZ`0jU?BmT+ZjWlNg;M=>w^fFvG zq4ic-jHoTd!RBl8EfU2{4etuA$m0pGRlA1XzZb z6v6kZd6MsONYvkT)yowDJ8F+4|CCS`60Db2Tcub~2h9Sf%KzRl>>!)P#UFY#BU1Ct zO+s+Tk2|}8N_*rbKa3|_nsyP!JRvlZ8?SNAYuZk9oTios3NXxwU zGP3JkMN_``K{Nr$c%+t{KlU>Of#HX&{SZ+;|jiXFAM%+K;;Y;i_%#;xSCbithlRmkXJso$^{H3E^g*=<5?ldfRv`p z)SIPj&sT$NT=mp-haqQE(|ZUfGXX;*$6ED$v!KBzqG0Q_~UD10~6<8asK7LQ}I(*A1~q(`iv+*jvn+X z`cWMF>e`c|t!n$F4~5+EPe+IEuiBPeIBpkB4*>GZLFoE!npa69L$_9iU0)ebAqvv_ zDW$883n14@-J4fKp;hL!6oB<(%Euz`@C?g&7SdHE@D7>evAM-}OUB4Jh);bY-TM79 z8wFT)zF0LGq355B8(iB!@u{U9OyxnbF#s!_xg;crMQ-k^-_JO zO^y%hANiM6X^wf_a0Xf<0e!T5zO-6Ytvp84;DLwnBZwjFV-v;onKDnLsjR%YTSqL6 z87jP6K@fSQWN0Qbo19=UcOdh4nzq}^thr&e2)j>$_PB`a^j=Z(vtL{%3hrEqj|+Rr zkp?MIn@+m7+RLZ_69!}o6-?4eIDYR_`Xb@0&*+2T4&Ea1%GZ`ZASN}t0a)gDy+)@u zoeH0!Qrv$gR6VfnP*oQC=(U`9^2R;Sd1XNtZRH`oowcrio)0Gno%W6>foJND{xI-X zJ2@Ya8V>QX_P`tj2yqn1((X9 zZ|41pRwY$_aiegIhk#HMUVK0PF%M_ooBbAkYXW$aA z74-NycSZ_aU|sZsP7$h4T~Y4*Le`mExKbgtE5>i)0G1kUrG8e8+VMHh$C82X{c5_m z-nI(rpeBv4XD9a4y#6ZGO#@#bN3W#t!DQ9DC5i39%{5bkjv?#EJri)^7h>`g24G}U z4f-OgjSaxBuOVFo*De+=cvJ~-vDT#dGB(Wv;-dwR!uZr0l$)WlJ;TCK7r>T(zbZom zGvW_AW{0KZ5gL?Sp| zPcpvltYGXgFwz;(L&FqCn(T(Y=sl;L+oNF%jvVPf^Jujk^ED(L{d5l`6XUnj63X3} zui8d#Z}JBR`cy<=q`QX?#3g%7?%IYl#v$x#!oiY!s$-&q_jZaLZTW&6Ep}Ap84a-z z2ZLWSH*tW1;&$N~xPfo|FW-LT8&B2SS&M{~Prt-CGNNzf;{^15qfNCLp>eUUbqd!I zDNZpJrVrV(2r4W8{XnB){!G_ujOO*zso2?n?-_PzNr9dlt?(`y`^QgWaLYwQTkDT1 zr2oi5`ktLi@PAttvP}cS6CpECqamSI?_#o>`FOEoL4s3ZQB(3*8bi}Mj?))?#ZP0U z$F^3VICKqspnk%<=78zNkf`35p@v%);`~}~&I&JJ7}E?eQOZ~@!9dNb>1PvDF3%G* z3vWJv9atUE=SJfQZt1}=wryIZZgh5tQ859b0E-U;8)^feY3{vZEB-HPI%06mEXignB92-&>_yvWW*~l!dkdx?@T>KW7hJ4afXze0?GfT$1 zsAtTYBHnCI;I3IwZ}J<=yL%2`z+8&vccjv68Bss@)4GD%Pl);fCl05yI*nxX=iboj z2m6ykP0XZ@s+jfQISzkDLPyT}^4D^HC)_3o(0pGeP^j|ZDVAr#@f33z(UNkpIDQTI zuT`F?XLFH-o)>Rg2UX#s;NTd~VG44)q<8pss&F;tsL$!U`oiA}wL0`9 zHIl`(Hv4O9T+N5ZGVD;a)wM+2ql$-l6Ib5HQT&{jV1FRgfdHQ*T9JqArHU=jMB*tV zjr2|3I|^jqQ7`JX1!-N`aGovq(?gR;ytkqWgu8Qu{S=Kt9X4*h;?PgPt<3W2+@l^p zs0uU|hgCh8gjDIcg$f4f*0AVZ24; z-yX;Xh%0F&6v2C(QZicqocY|oS#6r?9*Y(I&D(K2ONI`o0Ys8o)m2%7FmC2g44Wjb z5_}F96BFd`@Z$SAF(=*0OIk^aF1=SJUOal*c{{JxXz}=GLDqY{qXP-;YRxj_RR`|^ z$n0;6c%uMXEydt*p_EU^8(e~1%wuj}lQ^N7Oalio0rU|@!S|80mW-(ER)u6`uA-rq zTxT;)jSLGW>5R-8JaQrX5)(`gBvY&JQX|Rygz*(ySaQj?t;v|n7~F=zRgkuy9xP$Z zs}GHatTPW*42n&0?Iw!93;Nx+mHxJE>o|E7zUyBu!2kWk;yShN&-A^=urPOxVla#j zgJ617hY}z>Y37%JffaZpOOYY$gb|8)xaLox8hmx21Uq}W((c^Y5$a191KJFG*{_zt ze_Xhd11G1|JX=Lo@c}fUyZHYY!~Xg(&g{6`3sVHM{ma zz9~-qk|2S+`&oEQacJ$olng9jv6<^ltA-omSZR68#S?Nh(9@KOL(ZW*Ky%~zQ|4|- zUX2(A=bkjXoaE6$YIwf1Ydgne^4l5>Vl(ON&4q-Q{4Mn*fl|Pjk<)3nsN`R98MFeJMf$Fld6O6P@vm z2g7cM`%CM^VLaoG0K1}4?=WxO+?K#!@j`;z%J0A0y+)fgF|hxop9}BuZ$x3a-&D92 zs6q+=gDf1MBMv(?;dtvwLQbZ&{TtC2Ic?YUb5?WW6K}I6M&@HF*J+VOqC2GEslvUF zjh#Juw4GZthUz*LDFv&Zi!?ra{QLO4k1Io4G)a(a3RH1NHU2x>d;p2mGZ{>k(A|Ck zADzUn-=4zC${Mhv$=6I9D5Un8y_@+IGiuwEKNsnWyS z6l8hR$0JgMYN>$0embxSk6li)5v^?LGCYGCg-1=o8FR=WZ5Mi{G6+F?jU(7=@hs?KW1-5CqjXt|{1wXm?u)$m^e@4o1qFiTBrqoQY$kv4O=O@^iv1|2BD zHz5qLh?Qe-`!lkNnl!a6*escw*O1N0k5l6A4w-G601 z{P8B{zOTQ&R;~ffE$Sx@x3q3un(@ndf+Xk~0)J-b-lZ}~}>^oX3m zhYvscDh6YVuxFaH4${BBf6c0eDK3_iKq1=1=-d(3T8XwQVAE);pg^)&=`0!jaQO<+ z&%WKc!H5~{+YzD9UIQ!1vvkL z8;YWdt_)>HtAD$w89Y*0KhUzj%o#>ThC&c&H(om(%*N$P%^K&gCxIksdVvtn9PEun zR-U$LP5RLpqnlQftm#N&N>Gi%gC3R+)tq}u$^(E!}hV?&P7YLNUd3#ln(m6KXqQ-98*L0P;`gF1G<>qDULr90Ws{7Ej1};a+OG z*NYoK9|T*fL7CM)5-2b!@S`V%#q>}&DBGs2(#~i`mv7F+k&k4o9EHf|;Ug6ULmscS zN!5%A4Jfw}4f?jJGTRF?eltt5Qqf7u4KKW2Dd$lbic|Fo3X93!r0=-~4tV{lE@?2D zLU>o*uBFWB%Mf3HEWJ{8Riq6xPO}>{TFptzP4Z!$bO6H>ta>b>?^QD*94$?)7GC*! z2MjxeN5!F*FR>;8W`WaIqbJ)p7PwA@b3Vr?I!gh!p#fBY-<1q0E+nl(ffil&RtCvq zYGu+Zd{XXi&kOaJ6g9!yuPHS=89`c$*9BBFVdP*^^-z^?pm|p4+?0I3ws=-_W1XX| z=X7D8N$!SZFvJ0LDD;A~cC`cs>1%*9sjY&c*+gr1Ew}$|FOB8@_|lfq^TU0Ymg#I)#?yJ1Mn))XX7YJc0=t6_ zM7Kr&N!!BTbgGXJnzF+OH9kQeobS|1)AAxt2fj0+dE30#5p1M@aZx)J)kOyN%_T}d zGT$D0>gePKWV)~THP7ce$@@*}QgBLtY&!Ri2;sfx7kN;z;PnT@C*r@N6v&@biF_KT zSu6O}IQ6TXc)AUUYx|VZ+8J1XM*ywS*2tgvkO&b15- z?0JELcY72d)0*|R{JJyaAq2+OkGdoS?n|(=Ouhd6QCRO=Umho2A=*`Xaa8GeHI0XC zPpYYRnD%Rdf3~?1bar-6d-}ak0?zmFd_?+)9-58_azT8k+W(UgJF8~$=l2_xw*#UH zSI^D6_+3js{(`Gj59}~fp4@I_+R|mmQ``{0l77JmDy>y1a1Wwb?aLa)iI#1A7IrC? zLZM#!Vs{)hMb?sgK6-6SS>0b zk_=rInr+yf9Gh`lDV*>-&A;Pbl|xYGKi1cesx!)obLyX6+io!X8$7OvrI(ufaAN`M z!BPJt$aCD=YY&SU5^?YNJX46(0$eWKe0#E8%&_U>unn4vgt=5Y>#cT1>3mffnAj~T zBh~8_r3ZE_?6YI(n0Za<3vP#41+9mU-RxB!F64Klt04oA^~7;Un_ujLsy-n`P{K_I z2+dYThhi8LsZ8ru=5Q3x9SZSmrIE1U-TwS6xFkETUcyV0#20BU!q?n+VqdJXzT`g* zPj^~NmCKC%ue1*5?-88oc*B z@>R`pT-f8qK5X;Dr?>bxKF6Q#SIrM0u?zlFpI-^?z4a-ddFf{YG0830AQh2&_YMy$ z3?V68G~Q>2zK*dn$i#)+nW^6oW&hj{mhqW3(w8sj&6WgnchEpg(5l&k5HWjUgE zX>EcQmfX2H`H7c>_4{Z&Ec8kgjN+VBmdsPo6>3~niU49k^mnBv!!bZKcld=l6a!bs zs#v97uu)&1wpw9XWPQlR791w=_biH{xbcWJa!ZsZgkNCpQOTgU%NsbkjVkd(06o<1 znUy1+Rc3+_i50Qrd!bIs`QQLXSVm*t(h&X59Zqz>Q=zMY&ojHXE*d3%Q-dV;smEcQ zQR_N~d|}Kg9hn|O70L2TWW8b0XT&F&BX}8s`UnfV$KrErB+yYNbOg^Q72*Px8Qk|= zw9)+M*A9yfB3WVs^i?03*1Vm}kICNc81eK!WP!!&ABfN9@S3{gE0%{A3D(hB&`G{| zL3BCvN2qEwE0RUvPnGD!%jtzy(IlSEd3kUrdhgy!J1FA}uXv zj8@pwfKGyh0U~ol%1M>6*Gsv4m=~zuCP&-C+Yh^GNP&u-<`0q@GhRxW*^hsy()e`A z>>MdY{Rd8B_tv{c1)^Htu&euXlm3aD@jA?O@%b0YFPQ}|hG7gpMhimsiL)TeM5}P6 z8<@IzL_l7)DQYG&1Dx=wL$u@&^j;8f7|atqHeD&|y(~g%uG8l+>_NRd4~5LUQf@jb zj0SAx)t?<`N*<QyW0;;p#Juu{}1-tR&b5N@;^gw zzrT=1I$*SsSky#4oY?q79$t!UJ6#Ofuq5{IT{5Gx;C-;%6S}a1*h_Li|4`g78gjF+ zHHP29)>d$FRXI@LnEFolGp?E+b&5Q_((=)`J}!XMIok63Z(E#>q1mB&e}$hjLP^*%XrLZf@ysr7rv%lR4>J`!zd8BIZy+9a zIjuRB{|qka#(d34ws>c<=vCn^^Wb|*a7oT&FwWwfVrHR~*Y9agIPPu5KAK3Y72I2* zER6+m!bmkGmxJd2+}{e}x#Lb+RMLTw~%3C?> zdJ(I4VF)pY*NZ6r-K1qZKum!;^+bQKb`w>|f6fdNP z0vhk1akIxJ)q%>1&5z9gTzXXj*;+uZFY*M3d>HXC;@43UOsEE|VgjD^OO|kYqbja& zMs0QB$brjs4TD=X@fVvLcl|Gg%Xk_$<`TP@eI34<0Ha-(_gzP za4nLyKl(DWr>kOrkO++c?kyV?v8`zyN0KRw;8ue?DS$e=(TjMkF`f6MXqT{Tv+gZr z$bFa2zBdwczx>9&X{wl<0)&O#f*zQ&Sx4hJ8jtEVD&Ax4yj3k8@&s~>jzbaO0Ld)V ze>kJn1S2<}S6Nt{y;`fOZJ`3UGYZ@ls?RR|;1-BatExW(7boZ44=QmuI&U%Cad!p? zT$&s?l1G^FzRt$SO7LAp&uBP+8;sCV-M8iRq(H4sTQsDDrIJ<0)GY@v_$00h(+7Vs z5DZ38uP&O(6mQYZ;cpzM`_#Xd&c}IPRdI~GIX<(hQWUDYW*_&d6A9B_$o?nE!E0@V zmSYwXPy7B#^yDt~Nx1`-LOp`BJ@1FCIyTH$r(CTL@KV;Ulpp5WJKg*gxgyjsAe)Ay z0P<_Dg1%LOwZ!GMdylUGczs_g6Eu(rbkisT-!66eHv}i6tv+@RL-BfI?v#F+G2~Na zWR^+-8oAGMXO;ufG3*hcj3s09% zNunQ=)B&0dSdF`?Tegkh(l*v%>#+<>o6uq5wiXS*JAY zR{s+U@K*ll`G3TUBt@5nWvh1&k3DpQLa3yNca2Ln1q(Hr)YP>9hPt};DxjDPxUfVQ z`w$7^%CPgegA#n}dZKf7hwq@b~S+^mQlWvZFnb zFR_-{=BzI>osq)k`W^@3hcKgeI?zkR9mU7ostJO?qq=Fk=>9FydW?un0!?`K6mBL4 zVhX%Su&b``=cvr@!4Jm1v0L61OY-t#U_|%fkAoY!CEL^_la4d6#&VWqSF)|94MKRJ zogAl+Et0Z%kXTMw?bGh9vLXi`e8m-5)4*ZX=fF1=opm;!$8y9rw%^(irhXTC zz!dQFjW45yYzGUq^E@v4r=U|#|AQv%`=Dj(<(bo&pmEb+52v%BIcvN0r9g$X$+NEW zo)QAZ#xX8>GB`{LoV~Muu6Zb9w;%uIAmwkwogmi3Y}x~+u%r|l`qUKCf%~NR7qR`4 zck$LP`Mq07FRZpMtB&snJLg}25b{`!AO6t`YrI64`(EunOLkhzW?OY+ck(ADw?Tzw z`Ikbd4adp~KLpR6*lyI9wK%T0qM?=JLU#n}tCd7}3Rf?=I(NO3NmUH1p|UUI#~Ce26P6?APQB>ybAT`XxtRRvC9= zc>S{G4n0S=m($NB_JV|Gf9mqe^E&NbOY_L}+$xXgM`aBlAI>1`Fw&nma{8^cGQzAJ zZsPkW`F98O2jmUyEx5IA=1@Ht+vr4|!W3WW^8BrO=z<)1o*hY^3F&Lkc&9lPDI-a( zrAT>jcHiFJZ6G*3{_mPE^ws@3tbhLGV6ruG zv`@_LOlvo-ka$1*`frN?>?2+!7*=@x=D}3x!)@O;2~+L)bTE4@od*xMQ?4Hw8+l(L zJMHegc2Q?eJnp0t;GF^Q$3R}Vv%9m&E_^^%;=s=ii1ht?Eu|OfseN1bA3s)KqPiYX zk4ELq=u~9V;XZ`%9##33!O74C1$1ua>|}Bw!ExD4AREu_$Cyw^80g8(+PgAilZwM2 zo@XyK+VWi#eOfQVmhYY_W_fa4PY+9jQiC^8^yF6!qetTneKrY~%JIc%V%q^%XUaW} zu6|8meXt!2!<=fG`21i7EOn`NMX9#50+qiRNGz#{4}Ze3F{x-MMv(^wkONdxOx|hw zf1`0truB-*@belGB$mN;{aT-q!yR_~I`T)afB-J=)t_?B9D?EbR-zjAI6bVO=@A1?;C0I8u^-Yp00M$yqeJ z&e`<7<=-U1U=WXBuu1a|?X1Z#2&o$wt|(mg{d0YK+-AFq5&F6lQveI54Ygv3fvgpN z2_5xA?t7;`*Mq6fkM}8>_n~C?q0C|Raq2!&6G5_?-s=_DfZMehBoMCGO#YF=l(Ho^ z!fgA>#QC`+h2p&C^~}Ql{eJaZ?cra-<=aS(i9X9DBVJ(I^1N$LwTGs{sGaG%D2jlb zcCE;D>=QkKtByN7@>RkT!~C^HqjxAdkf_u)(7iQbqmFO=Hn%c^%RG8RZ0V0$Q?3s| zuF_tCr6;P#lY_gQ!~0KHOD07^gg!l?b_?$MwA8oo@qW8jAf;K1CdeE6=3-pu(XY&} zOc1e3+4fo{oOnd^M=$f8Suy)cAf`mnd;9$(2CDaR5M;P+^v1BuE!AM=6-G#lH2FXR z6&+~2fFknxU8M7JPE6&*ScACH^MGr7CHDCl>2>s6xoT+&3lU4{Hrsd4wxoh5WIXEy zyOTq$_+lVDPb&Hm?pBU8I$7qTDNo9h@d)xT@XM;`->OOM!c2uzSen%vivXCDunOeu zz2sLe9S{DgDab`SClfBB2zsK9ip5{P@t~AMf zEUj=QN}?&YH(Azc_wUHU1S7go;`VQH;9)Qo@WhUa9Ka())L~77$*(vcHvC`IC}3@< zVHm3*vU#1GVK(GiK>lwU^+oZOS4HouZ*MV#C%7!w7TRnhrM@9`SG9i(+$y9+RrD9uv^!b2_hrtS-t(75SeM7gN&~O-8h;ES zW2`K_(E;!utJLV&&J7pY5}&FrG1@^5lN8c2#w#}^$A?HP46$rT?#R;jnBHMU>P|>u zmOpz0J(OZ5|kp3v9rrSIr6PlsISAg&W4;# zJ67D)$nAt0gxAe$hZ7RWtGb8cTwfPLznYLhF_qZ~3;l%S+_NnBZ7>e{;=7T6{_Pn+ zb&{%%^BxTpjaqrZgWT5pI3j@D9-3JoLw~g+Qc&%u@Cq|fCQAnBFO+-G{i6z7)o~_4 z|8~D4QbS(rS}cCLk6{eWD8xc;Q6K77Adffd zqC(z(M6SBFV_@L|W0>=wHY#q?lvXhsNE>eTi%9=E^O^_D*JKsMA75ku5hszM{eME`xdW7D{J&qMB|Nqugs4|FO?REpBI)}EYdZb z{OTDA)K#Lkr+aw9zN34B7qlo-9{j{?n3~;1N3%@z6oH1PYvVep#{{N zb!38_VRLoK;`N69D{As-sLo!R!Y>;=k4R(`j_YzlV3L_ucYc^$&0qe#(EibAweV1E zv%4_uWV>Q?`5}? z8byiIfWGsy3FQxE?mm89T}}-(qzz}>u)q5WX%*n}{xq8(Kr%WZAA3wg9W#7mg%W9nlse3>cCyaV(45UAy z)`K`QF&^24kN^)AsV!SmJ2T@;&apSQ^2BLX+?fo&GPmPCF`~UZVaYJd7d~DLOLcA4 z#0%N8#b3xAb_oXJ$Shyeo;#=N81Ig;dQrZ0e__42OYtT(O!ga%;CD;o-dImCp-H;UkUD*s0vKPiyHCh>1Z75;&blxLmy=}c-m^}^{DPQu7WXs;qCifw{ zX7)T;PK;FfXNMD;fx)nTi;hEb@W3MY3a}+8`knEcdOA@c7LZqfkP_Sd|41i9f_|Cp zFUg5t7w3#JRSOmg$R$_=7}{#y{GJ|Vmg#z;K;U&SDyB-zo@&19%idrHy^XnNQ@n4( zLAUYaq#Z`wJ0ezbZ)fkY&7FTE1v2G@i>V&8Z@coaLyeHr--TX2<>vOCb@P1~4 z+2`LEId@qVAOn~Z?pz`Y)g?zSY@u5snGiFMC@Uuflo48rKsiQOM;ySI-JVgy>`8bW z?;p+eDT8^+MHQ2W>^@#YMqBn@b#{@u50<8HPBH`E=U1w0t$co=OsV6)ZKcJ+>+vyH zRG1@r=hh1dGig1!hWME=_gOaBo+HsK{`&{ ze&=iZQ%f=-M$I2C!oe@XZFNT3@aj3PpzV^is&|HlKSTzTe+aCnnQSAI`7A;O)%*~h z75i!BLxppmy)UA(r2{Na#WhlThXdVVx<&Urrr!k#tKDrNzs@yf7W(K>H_+wbk%-e} zZO|e^e}3eSh{5gE0^MG&tbfHdgRviUx`!19B!B%^`yq&jgoDGd(b3uQuVIn_a~Z!U zbvsjQuWgqPSqRu)yR+F>n7UmHZ%m^g+gr59 zcdn;ex!#_&zLSU>w`IsNaA3Q*c(W;-^V0vC!+q6Y`M(9~R1pc$#H>28R-xj(PH~A0 zMVkJL+}z#yk{Nr8qE%Gs!pdf#@p|Cm^ZQUY*l>xd$@YK_XvwYHi5ch~=5LhMq*!zr zMfRkQ{s4fCnT9v~aiZ(huLqM4djc1O5I<@v{j(Qds`Hes>lyuXRp4rm<$vf2yDoL& z6>o0YE|Zj;=SH5OD_J<*^_V7tHW6p}Cak_1G7}dk&bv-)yn{5lrx@60M)<8uZaCll z4UES5{*QM{kKAQrtl)wJ!+#KGgKkLOqxaJP)o~90)p11VL_GP2Xs>!*j-t0Js7DLQ~38tfV1Sp2UD{tm93sGR0?wIwNSKnQ+l3KjcR za{5Hl%GJSAU2c`aq3>L_Mjc6ZyX-)0Kh>vphAnsHXQg@oZo2I~KQxUM7A#wiK!rUD z-SC_KdgKH<$x}=%>2ji6{Ykg?pU01< zPHPft3JuRWbuP)Z5dBONo6+G-Dz}C!(M(7>hd4KgR_pDcH63Bkxj3|i99GXAcvj^2D-xvSc@0>3#oKU`gx)icJKURlle5t+i zT^44-w^kTgw=q?9>&05dp}J1HV`8=uy_tN)FtWzZEwtveg%so`8-LZi*+!&qw!`b3 zZ*NG1{rx|*@5t0_?u1|c4$`?#`on!ESFUz^shL&qQM^~Y5g1){7&9qKGbSF z24eTJG%4falQ3RyC;@n^t#$%M;*W^{tmU)|) z9in9&M$Mj6L&ucS(NA@y!j^Yy4@e!(G$5Ue=QetgM0-V=0(4IiM*rG{*1Wqi!s+mC zol4#R$tyqKK#u&G94!8Jf zaWeB-d-DFr?jCtziw#!R-wV2sx2}MvWrtFN$OV(hIw9owg+3edoF&>*j~zNCPKxG@ zxLZke2#Z$f#sJ@fT&Vyse>_7#yZUvaYc_Kbf-Y@{qY`JE(UsiNSG?Rrj{ej#Q@Tf) z@GvPm6tw;;UQ)CF7`wDj&`rRW!{MMe6IaRhhB7HA0}EgNNtw)_Q&+{vp%;EjTw=qs zjD;MEXaBQJgREilf7a`jBu_lx5Dx|9#Z;*P{#jwf?qV-)ISX#~9;PD{3TEJ}#Xk%h zT_OfKTIiui28Sr6<-XPHo4R6;VLxHsN?2}bWZ6O!&h*NjT`CC_2F{NCjf5LH%2TOJ zKF=l*)j#sj~nL4cK$H{$Di@$kM*vARsTbzs0NBuA_chdt>oI)k8EI| z+maBzBGX@L?|(e`>A80idMrg;*eU=E#)D=S4Fw2&Wt$T94VW>6R<#xJ64T>6IOuvj zSY@1`Ml}7@hgT{x`~%2AH(Y)27_vrRf9dehIBUr~p2(KAaHrdhA5jvLcM!z_0tlt7 ztkJKpnUGQ&$ZbciBK^yP~&-q(y)ViN(aac38(`eOD(ofeBf((RBF}x9;CO zMJRc@jrViNci#AB6p6#GtH=B!@%XmLL<;2{V8ea(n5pM2B>=`9I~)GG&Eqb~xDO9+ z(q+%sC*tnVF6s>>i-0%s^g^XA5N?4zJh+jBGrUXLBGMfCNDANjzu>V_zt$4j?e)Er z66O=B;vEZVrNLLE_}BFO-`LrVl;(d|!jnyDD9d-Msbf@;e?c>%i#ppg642{?nEHd6 zfzj;s-2^M=L|i$dQoGISbLEp3$Z~}U&~Y`k=k_m%Tw zH_fxe;j49c|7PCd{53bqFF8omqUhMxmsRog`0P!~#SmWZiT0$XyS_<({o$aw_6CiA zfHKHFn_y>aHmAmjZhx9RbF$GDUh`2h9su;RA5DAN4Q{yE&5?;Q1NRYvCXBhgW#h<$JwhxqBAr{a~jz*!_QXX z2hcirqE!&P@#!0R)0crNfrR_s$K5obgHuo8jv= zQV;aQ@$vC~Asc?Y-q;oD6h_O$9xqmZS9JO7a6$t zc6*Gm)2Q^iGJXaESR?BTd$$Gxe1gjVb`Lif(Ue_xCK^3~4W-rnUc%f8eVDOsj4&fK z1~}XA`g8iZ)@sT3Y)6!~bZ>UdoDxmc>=r@bp5Y`JvPitMXSHxctCYZ*8hH6K1GFocq z{|_X<4Z;iH&8fWuru+O2C`)XY`o!1Oe&;EYqxV0?2l6|@cGbF#{@rM}N*s1~kit|f zQz5fv*JntSAZymSM8Qp3piQ4xo++mV>EnWthzl$7&&^b&g5oqGk`K09}~ovpENRS zf(jt{5XRQ0A>RA|3QN8QRDEp}CpsaTxU9>nH1#I=`kbe z59;=U)7Gw2w+{D$3ZXgOlB#z<)5G>ayUpNNrT+F{h;!OmIDd_}Y?^n37IPqjA6h3f%Eh z0=HSYO1!Ux*yOIX+gA#g|78Y*9&U@PI!Sifq$IIUf08B#O9XQQCM`oKNu(58y|xeT zKk=XJDjgtHnBQI%{kQX46B+I;#^uD-rGO-RMYu{3p}PezP0)B_4j#I6}~00DbaVq#~){qnnp_wUjfUr{qo4p;p7)tvqG+0E8!_VzF+SwTjGj}!?EZ8+&a@FbPR1Ns)mF45UXlA}J{#pu|u?YNID1 zWuwpi{+|Et-{*DiIp=fEJAiH8Ja!ZBCGT4J2IuRM{r3=DN4ztC^zxMi^lE>1EhLTj zD~OpbkZ;coB1B81tY!zRaivtp(J zvDz;e7b-{%mG_`O0d1t)JqOfoS%^Dk-rYV{@)Kt3_{=G~MY;G_8z>9Y)0^;jE`bV0 z87}y`qjL7Am5*^nsO}3BjqGt9+#Mg0Z`F4{{{9l|^uBC|RaXA%7Nzu~W%!sGGqs+;8jQ@~nG% z{J8-@AJD6%7xsu`*uHhoTgFNm_=Th5;7%T$re9K|7A@#Xt$uWbfA@Ll`q9S~f3LMy zQ!&(^7Z`dBvRW?V(c_t061HbERw?d(Qlqu}@nD?nso{5@po>S2-29NNAq#3dSa&-r zq;WBHgw}fIebbMx&lNDz%GYpuRM_Ebzy#x6`*yIO^-)2!`4jVQ)i+4ftOP<=CXFe& zZe?@ICfpW!(Z-^zz`IVV+Ynd!HK3Lc;3&5+VPdoKS4gPOZewcYl9Vl*C)& zkX0V8cwZWILjO#Baz{GOe2*k3XB1(dd1VO9$li{?JI( z%ljE!WRn`8eH1(Ghr^j$G{6eF^s1J6-FcoehqQ?IcXq$%n90Ib=jxfx9o}x$5p8dw)mDD#>qSP``Yf^mmc)>+rgMLuJrU!!M08QZg;6&#fm1~ zOtWvVcFJlq3QpB_i|t9iqfHDj$KSonLY1bhGuF zBfe&vU#mf}0=(qAAMJl95IG0hd6iQS(AyI947Yi%YBJu!@Kd%aFV5gYClTCI@xYV~ z$Qxg*ny6EI9n>yjSZat$k$*J_}7|!devnkBnDd-EBahLUC)e_ze z)0WnQ{<-h)gN;rc%TrEDfzfc?jZ#*7!_R#*n+Fe1g*Hl+aLbnA-)x*O)(Lw7Z3uhk zCsIU!xEq&a=6E`!z$EG-#!H^6I}rZlHGPu`MXJISXB@mO8fZ*-N`_5BpZQZ@%H^id z{F9^s?zLRKTFI0DYT83Rhu=5ev7Cr~;6Yx?qlaCNul?*(wtC~rTUMA58;`YSczA`c z1)3)`pUz?G(Oar-L=@V4gn~2ACkR%CUm4Y>(7z+kA1M#L{gg1HXauC!)2QZ_P<+uD zy(|6r$Ga$n=+m9aqJl|v^EKn$g2`$1<35D~mNI<%`|lAvZSKE@13s9d6)$7gKD)19 zsL6p=z-zO#i;Ew}1;h*H_LC!YZypgU-sGrZ_%8y7rr2b_YQAAkr&#;V{Mzky>qSkZ zC=a3IJ{KThup_v%JH10;EhfieA9i;3JwUU}LT4Q1Gn*Qsgu+5XY6J_bWkCdo@`&%q z5)Ib!lQrF~qB=qVcj%K}RSu4|%S|u;V7VjJ&FwvwGVcmFjUlEgETmDMRqua?fO{Vr% zA0@oYxMwZsY%W#Fu@q2yF1NpTN}++aPtOh8Hna8?iryiHKpfJ@Ei=dRan7IsfdGlwJV}&LIy{tDTkL{1 z9IlNSJv^sq0_tK9>=)$KFl_af^>IZA^ox15@FIgX*U5Oe>g**|Vy>t8>PZp~cLK*` z^>%^pE)DvX+!Q}G$|66>j#}(JxMOtWrBy9UR1?2;!|wl687ivE}fWV@T+U%`@2_EY8n5SI}MCKc^5R!1;DNe^u$@)NBO*p zgNRANo?YXyv~*UdydT-tQ(I8Z)GXj4;FSzPlxssZu{`oHj3DpGn@Whd>MWn7pTZxL z7Exb#Cf~Dea%_wzO3e9$e#7Hu!k-c$pt}{ei2mYI^8c}8D)&=MC{cgBnCyKm43vhk zx8!?pknGmaZ##3fxw?R@Y)Nq?_0Y1R{=6yDFi-(=;8pAYgbn8_E7k}fxt*pWu?*fP z9m~dzPce^fAtZRs+F|TW&<_D)K8oq^!0d%9D)?H@?ta|he(tr*>H|OG9r?Oi_0$u4 zzM`{QUTWY0KeQ`i!H_u#6)MxJjB-c_yt0h*rB(-^R9X;a9^7K}?b zCBR->-|}Q!!?achm zZw?o$l+wV$jDSDl`hMXwMSAX3*v`_*qmP>6)jfgkYRE?+v^<^a@0mE>LwY(K)J8Mw zJ%4z*FWGF7@jQ?l#^W4|ZSn$_8pvRxb7vQkn$WA*$lz!Ppq>miMzT!uaV7+aDA zYA|m|`HZISGko}3dHq@i1Jd}1NJetx$d5#ooVzQ}C+2<({$zmiXe5kKuRXk7R%z6A z?s-Z|+^@8)BR*ov&|`NAPrT{;kBtjxSa)USmd8d}f1nK%N`P|`a_e6QeW?sjpJ#j2 z;bsq~_T0*g^pLzDoDLd-DR{sOd|a`)vTXh3TV;kUO+ejG)@2;CDm?ZIFNG+olk0y8 zxZk0fsiGtYLAY&LU7OI=F$OW+O@k?NdgiMOZ#OGt|0&qT(q@?9@1x8xA~L)`&COzG z4R31d5LLx)`@Fd&-8^W3+i(G133Bf;+iVnxiG1A^LZx8x>2{d0>b4BUJp@tEa{e!1Q&;cIeM3g4W$ zae-Syc#k~%`4?5soak2x`Mz#1;e$ni15uEl00B8{jam+U&^FigDTuut_w;7N$Z{py z%T>9Cgl5`OX*#5XA1GOp!9QvqL~t@+J*R;(Y2Qt8q6V(kR}32K7G(|3igiAS1b=B8 zzFghgaMQ!wNW;SiSNPVBe=TxBFkn({ozC>_U!GQx0cMWpH*fkruX-2764GGt`tgXw zr^h!flu$#F*HdAsW4`HvtkU-9Vt>Y*tPG*{_y5$v2ncSO5=af%R=GO|6VmMyZY|>+ zagU>%2I`6Ug%lW+sGXa=EUT=sl54`6Pw;$qhWGQ>AC}6n}tZ4cdTv11I&l zuHCPygc8x#d=%OWvhyfDiBuF)ooq ztu{e((;WmiR5=2n>iltzGu-~u^wN44N?ZcrP(YQPE@UL3O>4JT3-Qvnb9CdYDm z1Un{~b&Hm*3_r^8{k(io>Hrl479F0iDtz{k!l87_brB5l6g#s2&-7iNP056 zbV{Ix%iWRrkNI3g)i+!sf>9Z{w~(a=J8X{U7FAHw0Y!D5d$7k?e z*Ic6sUTA@^^Sxt-b>5L#l#4?LOzOx=13`-r$=LQE;a3Ye5Rvl6;SdIZBLEpp2}34A z&MG<4X#GSqmy?or6V`uLfpb(TK9agW8j#1_pO|jGW=9s1^Ni_5W%S>t62w3LQ zqH=9W!sV5(gDN>DXU4?PxtgTjI1NjS(Y0fPE0TTfnA@hZVY_1R} z8Nkl{<~UO`S@sId(g00WvX%J2iWx~rLC8)ADWLAQBz${xy}7!w!_`@kzpEA7oO33qDE$`pP3oj9-^w8nuydz4?3?NIdtl1m*E6MrBHtW2XAzP zzRxQqm;KR1umZl^P+;HW=C1Fmhhvu4FZ@-9S}a@ ziZVP#X$B4!wqi239z*Uy#sr@V5E1`?YUxO4RQRdv&`zQ|ml%h!dT%Q6*#!Rl zx7~sAm8_1Hy82$GO`BJS5GHJ&d0K0U!B>(3Q2wd4um>XV%N4(1(iDgG?sr*o&~{!m z6pr-i-Kn=mxSC6L?2C)%f9WLW>l}7AK2+h3WFO-a)NmU4o*_Dw9Ugo zee<>SypRp+fn7DE$$dm*$=b}Nz?O^HayJcM%u_0rvht%x?jx(@0As*70i97ZZvZPe zUNPg`7=2l})rxnTNpX&{EM8#3a&gUE{mN=J?5PD5BO2nxoODrPzsgk%nP0rJf?*V+ zYsLe~H;txb(2!EA7QzWA3Yqfr*YB4lCfnNI75d{FR9QlEQf>V_{q*@><PJ!Kp@l z2W(IRhet6~{b#jW3;}g@Hc85hQDsKX68T?JdMm8Dthqzq^!BbkJJqe_xo%Bh_ii?N zFFJ|v`}O&A*zwvbV`$jJ-Ypg1iH1?%hkyQvk^tJKxy*o_H&GgOA1P#%_hEB%c~CR6 zNjge_%AdKC6uOX57GJbcP5+`wR!{uvSzHan!;5mYMfL9LBd#HH4;nWW+{H+zI-TmF z_gIlgqHm=`;6kMW-c-J#xFegJ-^Iv4jE#Nxr{aN`mZ|gW`(^L^47i;%5X5l}-GO-c z&xrAOxMtZ+8UMHA%)xSyLyzXm=Dzb^`+}|f-@Wn_25D==#p+XkFieRJ(}sC@jPsSBu&DI(jwh zl_p=jEs`Zi5X41*8)WfASIB^a>jcMyJ-Z0ZkEU00u{Ycm9>7{(OdUKN{zORz)sf~7 z9KM=MDQMzHvrz|oS9wT(*KYc?-e5Z^RZ&Mgr>Y)A`n*5!uB=HZTzXg$NG(!)& zux+;*13NJvLQ?CCBGSYM!QHGhG5KEzJ)aZ}e6s>IW;g^0TMP)dmt;*snRb8YjkxfM z{^skU!XU5m>qI7n3Z8@TunHG$L%j7F?$3|+IhBmQBTZ>(r-28S2n+%J4rWamu+ z$BTlBZayJjkjB?eUPXZCCkyXpEZv3&E#~d(UIvWUmbvOroxfTSch7`WSqzaBA9?@K zYjhH>m)_Iv7nhZE>6>On7~o8=<|kR|`D*U*Qj}3MKN1f)DG#M!A97{pudF%&FOJcy zZ}e%}!nqM_dK8{IRQ0Ea(?vvYR8Esw*spO@wLELdB@gBY$K&6lw|nbiHWK%$>w3KN ztz#d<(Q)V*@llbwd)7Z`pdYz*Twdyy)8W$Mty;NRxsP@b1e=?$xjItwZi%`9!Es{8 z*bHpgPfm9r8us3D z%l}4&ANDh_&(}X~`S<6ViZ5QCp_+WlxR2Yx2}3cZ&vYcg4;R*l$ob5qTeX3Wc1r!Y zbPYM~z0HH17>A>1&vphT>^pjo0FW=xS@)%1oj!cw5jk}B>W;}LeR5H5q*k*N+5I@p+??W0+!-dpC*c|6W9HpEmoXkpzA3+F2Rk}dm!^Z|78AJ{?{V8Eu& z-TKe(3oGTegIzhR?7Q+UMfca9RD4R8zqwtdTa-(6t#12GqxX}msw1^$x|5Epv_)_w zg2%3TIunM$OjrsURUt8f5Q>67Zs*ki&aVks2R~DbQT4jNQ(KUdEG&zWBm`gaB+ECY zLAq_7Z&oev9PGYIMctA)#*G!lVMfk~1P9 zS!(XwoG?_ZW1$FNrGtUnqYu=Xlz=F-=J$H6_xmB{;C15*a;)LN1@z;j6&dtaKu2P^ z&y(=EGj>(xe^2GuxiNH*f%N0~)_y9!vienz6tom3;@r9ZW?$OtE?YA#bobO^nBq9! zgI7C%Y!o7T8{w7$F~Kps^B@#2QK~vu2WxFWN0YoAs8Z0BFdft)&RH&!`wk1DC(Jbt z4H7IroS#eT7Il#EEh|dr(?8_qqqNK>trj=`tyWm8a=?^=3Zc8r*w^wRlB}A_UYLt8 zcQbqb`6A3=B}Xl{e=!rIjbUTtG!<=;@8%G;4SMit4P3iPu_^m-IqoZ^deVcU)Z)nWd31v!*tj-bYQFrU)+r?2tdj(Oa@-THM@1gnX%pTU%6~QY*&Rw6nVq;(_Nnk-KXSMxnzI_VR|JlV_&ZEg_(O(VtC`>^=F{h z3%t0mHWl>qaImHiC=~Bbl_EX^1@BLOTWGPo0EgZ<=LT;F_Y1Rl_SEX0cC_3?*3gdZ zh_9~N*|SU)=YY(;t1YY!EJM&w#cKmSNK@xtq~K*+aCh;%Kvt>m94`=wH(vMncu%dp zu1Zj#Tbx__&9zss$@#j1TY^xj>k6bOo`9Cm%0lW3Q;~V zlU;-1qRKp`j_25>|5TmgM<&gm-v>e}-0uk&P40&qVY9hqy`VZl;dl%vFiRQoaS@cw zFWF!V6`SO`eP?iz6qXvOlmp9CfCY32`pCv)|7HR`X`=t`dk?e&&mb_QJ(oa;%8Oc7 zd}4i_J}hs`LyjX`t|-3NIwo?H56I)12}ZpChBb@6(52`<@GP z5}$BSP~A?sOXx`aK#pIe&Q-n=x|AGAHB}xF7dCwtl`aj+o~Jr#w|z6JQf*$@BL@a9 zC}$99b*ocKBvC)(&=biCf=%7R8;RFM=)H$&%`yC+V-9@2d)P*2;o3B_U;*>R$XlTZ zEpOP;Ium1xzS1CGPv6JO6oBGzHrAkTA%=5O19fXhWOnihX_Wv3mD+&YO@r+6?B=|BqQ*brIv5kmAh8QgwL-w?Nu*h9Fo;$e-G5kR!Liuy$uT}A4Lac_*WFS8qcX&pDa8T0t^e45BZA^ zvh;z^1F3l}Q@IU@XKF9qGEY?E1C`1u11IcoX*;10KTuWKHVQnTQv#7!+7$~1U2dV= zn@F|f5nuYJoB3O-Uq8BLi=9RqD-`GStW}1A`hbyA8*DF~E+?I3!8otyXW-edMSIX-?YQ3jWJD5R|{yS zqqK4Jlc&p3(XX8oooocohZ3cNn?5UtSmIU zJC}+)GrQ?9ddbv1DEpkM_2#>GM^pCONojpCB7xQ7u+6A6_80R@n>k!1GOi96GaT}Y z8kj##DKcR))Ce-9jyqQM+bm*Mz|AVcS$w^Ww+iOk)01K6Oej=+ z89qr0m{G$TIaXWLkddL3nBiybf2AS$q3ep^KkyvY)bzE5ITX0kuWgiaDuTIWjlgXXY&Uk zQs_FZO6vRFD06^$9Tk2!)tlSonX@xB;{W>l%Wt{E3=*hYnPrb$1;cqSM#RtLF3=3( z7rlfi6O<49jw=U)D_Z>76|5*TqudmN+wzV|^I$3|1kJ8%#DLi&(^V{mt)P`|2WVA4 zn_kIvhbpTwX5RjMv;7*4TwG$}zn9it!Q+y3YRTFno211a2L91%s}Z^4n5AfFC~QJ} z3&ThX6}^^jFdBILAqRHzaxKjj#O@Vo9OmfStl4083;WjZFk#`Bv~j{bX-1Kdl)Y%A zr2K(tsjHBx{KK~G_dkEd^wKQSU;;l_z*A0`lu%S!Jp&elldGGd3~P!?hdOdT&qRzj zOe|H5s9ZkX?sxs^ByH~X*rdWJMH!W3NqHT1_;79~(lcS9+!I#YhoJ6X4xXPUf!<o0F&8BCR6*JU!r>2s5lH8hvijse$NGBOEwC zY0v7a&0*TwKL!)khM?L)+CTJ+0hl-Qec2-wUWpH}Q=84(pZqVN6QG9HkrIkTE6b(! zOCt7wJg~5#0S}hfb65Z%pmNC7BgOv2>Vt@7$(1#F1yJj{S|!PM`N{CaR0~eqs}(&n z@Vq2)kr7DW0Znd(_20o4WhfEyUQgUx63@J-)iDj0pBZ8sIKPw&0iSz6N9Ytgd`wsEwhb-@x#7%?5WS(sgJtqWk75fRn$2D+f5nYDY&BPh5m@gS}d_Isj+2%odeLE)r>zd6QbW+sCp6$>XC32fKek!Cl*Spxb*UvW%3xho7gb=52TW=IeH79JTqI7nOjov$E?M^Mer|t*~aRs1X?hraM)lY;!*OP&(R5=F= zLY@K=CJ0534|ieOu(7h~4yL+)32ry+Z*Q z`?E#_{-|?=-FChll(4atrAGLz{;JWridBn%!(+35ch)HS|N5oyFDfyu=d7fn>BeAf z#w0E1HwKt>np~>~RIge;a%4}B1{i4><%;pvh0}k?KX@4Z>ylv8PCRbZ7T~>iB^6#u z6-Mo{Mfp?3*~0;2_gb~Bnlc!MibH4zwWwa+!{vI_lLv6$P(;>1-gpqFKYssAF}Sar zn)C8=u|M(pa&2`JNyy1(rx%cot==lwOomFpq?!iJBRyn=_yH4SBw^*0jiQVr#ZoIP zN1+z4gImP*B*awW7NZjo$Klc4pa9`joRWw_R7^aY{e8pISw5&Yk83=+h)OfR#i2mx z=)GLnnVbyVLA0@A13p)r6mbfRkEF^9ej9bETk?j{8VynTP&)I99kKE>A>o>!d>d!L z_C+XF>|6DFp}OXL@7}61`RP81-_))erGD^tP@>g7_ie5F4WkGY88l|glN9*Z8g^4I zFc-;b>r*iDm$JlQzm0kbq*rhvmeM)$jl%SUxhyGIdIQf1RoKVWIu0Kagz~0!^!Hwl zv(l~=?qvH*B=M#}hc2usssssrXEQ$zilEKMW+12H$(FJFai5kv5LvLjc^2*R4;cZT zt(K~eIR~f!gXr505_j3HEp53sJW_6JEKc&{NAt&0`RtuaRl-KOj_E4WG^$3ye7?ARamX=6sLy(6&SjC1Aq=3+TRv75JXt zkf^-h!@(rhKl&QS^ElJD^pB|yjFI`tSG1o2a&zoK&2`Qv4$;SUekWO3-1d**hYxB& z#a?Bm-C%PH`o{p{3cNnURmozs&a+u!>AiM;A1gn13t zxXwz@`|gGCoZ|x>fH$D>ey*fhV_vWu?)VkN{_yWDFC=Tq0==pMESl|g4hifV-7teF2s?h_ZO%rV~+Mxx|7b%Zd-<%|0L zn8dV*;)|TujaM#Qi@<@eowiKQSX?oVk_AZ9+VIul+_g;^aDC!LZR^J(5v|iX} z-3Ya07FeN>Ef2~LoDvn0&={oRS~fsc?sCY~*1s6>^(s=kE{d@bb!^)>cuQO(HBnog zAJj-+SWMGgFSKYH+z)hFGTp_1;>`}vh^f|jWB?K@SqN}1(F_-Cc_z%L|q=`CaXQVO#L3Kv)eIxOaN1nd_#yLgM&-Z-3 zh-3qD07I^CAm*kUI@y0$c!g~Vv-VJM)Hf(Sbd#Qi3o~tl+WV}4InVP!-br&NhCfkT zT}jBNa+M!T4oQT2Am5H}h&UNrip@er51gT6C}JE@O-a&SexP^iwY5XGa+bC2i>NsG zHyW(wdRRN`;^UwMG$4PJkejU12=ZoN(aqXuA#>9?c`4#satw%V#LOBC;Lod>I@Rc( z4Wqsm>{ssGIp&Er)i6qK8jeTL;X7)k_P>wLvvswo(js!kJ!}t*5ir{OZCu4oqwlI^ z?pCtDaA)xk(ji#CW`M>zu2%uR&lFwn7_@F&biLP`G|w)h6~enRj_)voP zN&j^QsGncWd@=!$}=F60?#O*kT)jZ zsuZa)X571OqO@n2i4YYF{1G;1y02aJju)1cOaZk`$9>?2ZC4p?x4`TJhyQ3jl)CsY zU&k8${Js1w*Ux5I{bC@Y!q-@`uDpqY2^tcNj@+DXntG=`?Hs(a)08kJeHAo0tqm>1 zCo^D^oPqa$pCU?bX=*shV{jF<>+3kv@#A}31J{BW#D1?F20YlFtkn!_-sU4z-t7Eb z^)8m-ZDoEPKF)Xg?aw8Tl#xkA$Wmnr%r}Dpn=kb(%HNB{t@9A5Is=qYyI=1{?QP@{ zmCHaVUwL3s9D0)<^?Qol2W`~T1^mu;c>7wB^Lyl4M^qD3TY{GP`k1e4SQIV3PK9$ z_B)3cnbx$1@PYlaQ+#eBHkFO1C@kM~TWBGYYINIS+)@@U`*^{d5!@CMWqy(i*M!L>eZo_a;@_v52H@=NX_-ouEws~dCE^0Cp7nD3(D z^Ev$kfB#`fTrxD*J!i=LJNBW63 zGO|Y`Zq_cJH5#{(VMDB|pT(N5I%n55$&9Z^57_)pyL;UtaD#0!9;U=?dI7uPpT?~9 zm(wT`4&!=Q#zA$-sg=3ds`Tv5S)U-oEgNl)6wS_ZFKKZKf7;@!gq4ip7+Ai zRyw9!XibO!2X2N!^+t9MEp<9vujp^!;SK~}c~jeHHdlGlcm65K$rg{Xtt7F-`Nsp2 zJcid=KS7;P+;@)I(Xw&?*Lh7UY-3b?vylyP8Y{j=IB(5ViC(<8R^u0&twJoLjx(NW zsFC7@u>`o~>XlP6u>cleX?f?y0_0zPf*}4EWd)eM5atS(Y|atiJt0oyE!ulIRdq=u zrJ*Sc3q_E_AyrcFNRM<2gER60e}!8xm1B?B&{R9+Aa_I1n49KS%FD(DKESpf%-x&@ z%$}~~$^r_+u2IH2f#mMR*j=w<+RGerC^QBA>p)ro#`{-{@8%`uN50V1JW>vHD5|#e zWjl8i*3T`kjhRg!cN1FlW2_kQsUa&~maD7x5C$&DfDJ=m`t4<&bdVd*{}M}gE0#ST zUFN`0PU>!4JS3*yK}GE#$&bw!-UBfkD~TPt7=|vxe*uAEEn763J$4#>EncXYytBmdUd*3BC`8Ku3 z*JN|Wk7!|;0z7DDgFgEF6qiIt3Qg(a1)e2i6y4Deh>VZ!U1z}J@tVHB7U7g<(>v~oTS(dOe^3vaMrW(ViukkYR(d+Z*tkHI7VTqsly z(=rD4J-&~Q1 z=l+T9m;>g33Mw2__eo$Y(_ydRwt_GA>R>9xgM>3hSuF622Kvs3=#hmWJRGjMlwZwF zWHjX7&wYpYNWSr0`FX-$w-mT;#?7z7NsiV@F^oR@7Ah)31PYJs8B?h!bH}|agi4)G zZZ%BQtH+@=6!VG5Ve<~hV)dZ;VzXb3C((~vdV=3~d0j;=E};jE(>>*o`o+hfDo|zr zkK?{>mzI^m$xM|=Z*N~ul%WCTh|87}_w6jlIe*y96@e$#;jdJVI;*R(n{$GJVhJ&~ z&69K}ib@^pzaZ$~vRgep4<&rjqc>Zbmj8m)>v-ThNEWV7KviZBNP;88r`zBC`Pm*4tHKQ$B zn51TcuCjF2yNcO$b86ox4xt9<^g(kxf)4&BJxLfp*kej7NEY0?r|F9QQZQFWULf=V?bIQ#CFiS6G#QzBHFY_=G# zx}N7$rD)%tw;Y-8Q{H{5y7LLis~79JRsg*7dye1IdX#A-S2vPcRwH}7N)#_Le%HaY zZg`r8>ijRN$}E+tMTKh7i>vyeo7!^Fd42)CW&<4}_)MkND=1Y0_*BdUou?Q#sUR&J zpkroEuDEJ;yUp8KQHf!3<)iI@>TJ!T@ypmOwWQ>fzCdAigVXuBYaTi6%F8dBnGnmE z^up)lH&W$2U~^W<$~~V5m5<>Wm<^;*${gbW$-Qi@Qlt;;<9FokuE@MmJjEI7H@^z! z{Xx5&IZA0jj_DBP4d>P!57Cnggi_BzxTncCY5_n34nMuyjgvL`okEf%7w1$&(d2+`n}M{*WxXM z;}PgC_x=aO&r$taFJ^LAt^HFLE*4si*x24RP>)LNt`Ze95~mi-_uI=oR=3}RGw@RA zHD`IS;+ChWrGOLKH`alrfP@?RLP+|IX95J z-kh_JOZ7*dZ;@66$M!2i4%&mpuZ=JH3+|TLKFaB-^a-SDY$+y$ ztu?`enw7mb9}G^tB$#P^l%iQH0J{wVj}+Ip_rXd)^by!|r2h$)UY$QrEMSPYTZlGq z)o7@)=nWaX%+~G$*6szyzUwDhF6m-A1x$EvvirK3B^qCqy{*PCnFs3-kKXh6r$9oL zhLjb!fGDy*mFB7tXzl`1rK3J%!ru~?Aw6Y=-vP3_=PH#GI(BNju|>NoBek^;XU zazSwZd3cHqy)yhew=jtR=9vvCP$Z_3L#fUsk6}2cqppC`x__!avb_SmwDQRilkw7@ zZyA{+?1FH7RoxLr4}HFSe_a_yz^v;x9uWUE;f55dfT&|an{ycMDXP)L>W0I1s#koq z0zn>#>dzoj%7#>zw0*y~4GB(2x*?{D8`it+;o_M!6;5b*`v`$Y0zPn)K#w>x`+ zSx%M8usEaJ7~&D)v`b>tH_);;P-)ouX7A#DpycYks&%&CE%y-1P5;Hxs)d)O>c-ov z)Sk^XA*UuwQp9s};^Tlk9$5FGRo7^+8VU3baJe~oeJ$)Ay(aszqMvAogzrPVhdd2i zK$YE4X`I=M|9n;%roV&W;@!SfKe~R{TiuH@zW<6Um_Z+9m!R?s z=w0l;^;a_Uy06OEO=$}(-Od00{`{`mDbVtm9n~V~`Q4hiqiEL4CL(K0aMKvhukv1RTR3<1*l6oS$&+TpU-TB`=Vx@X*VdchHH}jr#m3< zWJuPlzPU{gqE`5E|Mx=4x4yQI;TkC_qr#j!Oyp3nduFSz>{{+^R32+#p;t-!2S2yh zjO_; zf-u=e$a|}57CpX#<}7ymZuPim>zM9u?8Ol(ca3uQ_Y>Q=;;kXI6C>N#1PXD~qpbFp z>NHhM-z_TDc^z_}lxppmn-haYFdaH=<5>8?$fKd!#PuLJFszLFhWpx~gmSX#2D*jiFC7|%f$KQqLEt^mYNgHnH6 zN}0*LA*5&MIS&IV=j5mT6UobQ#P4tC`07GK3hU5_s7=eOVem0|Odpj!W&$rlT_AD> z{{Zg5p0vn6WA}X~xq6ydCLi+_(^nccCLLNh;(ji1EcizM4O9z)c6{)Lk&cGMOY0 zrvRNGpqzkCQpr1{?!HSJyXS&Kl>U+HgFr6cNtNgD$ z=Po{Pend%Si@`aRisl@%z( z5a19Qr>3TWSpM`0_H{gE3E%OZjH%-zQ2`VMuTw+Je`4&6w|#YMaMEG>O>f_cV1`lb zbO!aHgcHYKv9u$vZyrXK!>RF*1c_PbH*-d_WC#fyw+W7MZi*U|>F7)qyg{~b7=fY! zedh)iK&X%13LYhepIQWvx{jiK7}%2|31|qyFZ^g(W$THzGOtWAIrb0AiUJWS;I?|6 zp#~yv_83(*wrpu&T&t$fTU_=)_Wm|Me#^p=S~RV;?oKlLLkWgvpQVmi**=R$Sd9w| zFL)XKryL6VG4LaTlGCI!%fRrM0(yADmkoEnc<`!_MEa>T2hGwpec-cdKW|vX+W4`; zWa{TVA2XT-&M*;h>;=MXP;#bG>C(4@qa|LiSMw&}5DHVsExm7PJ)ue{T1g`R08AmO zG#>rpBm&|8H)C--FcS6J{`2l^b+Kro@>2XlRN8G9nH03Bzi&iqo>q{XvyU||Z2urx zs95kQ@q3qmMHKPcyJ<5y>*mnzHWJ--~L zuetL*nsQF>9}{qh4-Mwjg%Pwxvrji`K~o@yDi>;gvCRjeZ^kp|5xTgrZ==UIs2|w0 z&o+bQz;sm=GdS7n2L-(S5NhX6){g|X{@VKnx2=}Y^P|x*O}ZZ8r0ghi63hh79WQIW z_)K}Y_DC-+hR_?K|IoEW^m3&q%=u(cB7G!v6*!Dzk5|BRCc1ayhYP|4|BZT0zzlfCi~b$&vwz7NY?m9B!!+h ztK;Zk9ZpTynkYJ75qEed`9tw4RRa8fp{6jYWD&2h`hde%m9p42v)SO5*49V(_qP%l zF!R@|-+7hlW<%IK5|594%FJg3JB+JRx&*?$OfX=q!uvr{PjH?-nDyNc2s>mXN2KXJ zpLDu2&IA=RGN^cpiD0{w{n;UADW)J${;`4q+Cy(DuZn(6-~$w_C9j5XphQmPD{Klx zrx@?PsA@s-Aky0U0t}#|ai*QTg6L62Uw)`6<*<2sJDYXVos@dxe<}N)hTk*7whe>) zT;8zN+-MFO^fg{ptsIc*h@ML2u1V&XZog=h+#1QR-&c>Z-in?AKm z;#6elE!*8cQ$D4gy@v0vKBDXOesY{4sR_?dTnH{}c#u}$G4uFdYFr_K4U57C5YJ;X z>pWrl>u%cW))v^AGJQZCe5nk!KKHUTgC*~0QvQ000UKYI?skFZ=wu!Q&tLKqe*Jrz zS{8y^f*D~lQq+TA*dF+>82y^p?|AJ^?UBUl@~1-E8u5E(j;1sLbYJ!!@H-zl3(hfO zWbgCx8pWXf!y^}Y0c&_Zms)f{Mv}wY=g*EVN1EMs$PK+fF?rhkTYEPU1U*DX%k>%W zKAD@FdNM+mypq7+_(-5b zc(w}BOSaC695rA4V+L(n7wB6?>L(*LMI*I4RkL;<{*R{f{-^r?|G&MRaO`Yxtn6_R z+1oLWm5{v>$2e9t;h5R$kbRJq6+$>DD|?2H%~4WBDfNB6KJUx-A9((7zuceq$9>+e z#l8NMM8F~Gx+F111_G;HnYgTa>Ie)9BbWEy{u5f(3XfX6Jb(UJdowz!nH@l-hzrTk zu^qQ^@S$zI_|SMS!{4fHI|7mJ1cvzUNGNAgHRY7>sW=Ibw`~#H5m9XAWzucKSMt~4 z_Luq6JXGO>`hC9NIktvG70xTU_$NBcLW;64YBfh&nH3C9Ob-6G8@3=4juNs0${VxSNh%eLMNS zM1%f`WDQiesRJU=p5p}7p@#BB-hmh?vU|PPm{a!SxA5Sqoa`MVe0>ReHc!e6)w{)( z6!$nXdioJ36EP@lJ`yP?9splWE{Sq~eJ+5mzz1%)X zKvak;FHVN6$ZiBZy2YHivdM^GY7_urTIFab8HrwKy<0YsHDZI6y{77_st~-8N_yb^ z{#d0TKxqSV_XFsi9DCqACu~9BCaNTWZel@4Otr=pedM*1(#z;jUl6*iGVJv{Hs{Sd zeO*|}%Jc7}u*&7&+^LTKmWHF?mAo1+>-m!4;MZLBO1=4aJ5aH3A1edx%?9A!zl+0d zg8tFxo_%{3+4ZNu-LrP=0xOuWIXV93U7sOmNeYx5#eOl&%JU|B=*b9Ytt~V_pL1oZ z$cqg$s)W9{yGGIHIlyH{t>iXC`)Fm**a*G+FS7jx^$a@qAy_9?u|NGM!mHsvo0?Cz zkxObXs06$#2MR78N&q9)f0);;J#Er;&`AHdZ5@moNq!s}n{(B}Mp!EB*XzH-76d}; z#g#Na%%xXkdSs>`IarVBM~%uH1I}L7t~=4+@zu7?WQqWk+awKwczq&&Jnw>b6-qE_ zIBTLdFs3lgUcPx$o$LGM@SW%!i6J;X{LBrIXx{`xk0F)l~#SpXu0# z7Q{r(>aq|dvwxF$pvdWCZUc^ITuUGXG2ItCx%!x!L$|Z|y117fy9d{8Sp=7mr&iSg zYCeF`UsM*-iV80*tD(TP%ZhVo1+GK)&7O{@HdM+ zVD!GWHCIPr-D$I>KW8Z{b6^Do=jPu2U zpIo)XvJ^>KY>r3r89H}w(CElref|2vzVGKKM1q;9f5}WvY!*10961n^2rk1llSSVG_HlR!%Kj!Ck(1$TLNFW~CxH@6+Z zTwr?HlvfKRd7DmZbaMu+*|UNh?4L4C0g|VM3TI^*pET)NQ11M;#T*S}=5a*hQo}Ll z5?So9n8FTbb893`zn7$Bu($W!w=q@mFMz4rakSFEa;4oQR7Tp0yzvgN=%q>%`x!MF z0thkRE(U9&F9n04DxOQlDROt8Jc~6p94@tepi)^taZ6W1;tg@K(DROrnj z>5T7b99!w2XPU?&`mPj**T>k-Ey3bzLa|uug zb1)B4Vj3{y>`oc88_e^R$IqCWl@8$&kOzCcuT_7m{CxWIi2$s7Y3PWgmyrW#p&!3b z^D$fbLA0rcVgvtm+t9?m?vpK+ZS49gFq^-Bun`M(2>dTBG%xKeM&p7OPG%JmZAYQ! z;m#^1oZP1lW(vE94Zy>jIOTKU)9}Wh%Rvs9k_Wu7h~FYB9#{1N9`s!>n6p+eO47E{ z_{-k=4U}(MZ1$ge)k64&sy#x0P+PP8nhh3f^~T=d$dm59qc7i{>sl%3>KjA294DDn zIk`b;?iEm@Jh&AbE$O&;k|BrWAFH=U_nDh8KwHa#H!}%69bT|g|0tX&zcp~eGE=YoIJmW73TEsZ7r0f^OllQv~83{uvaAu5{vPD$|6H2bIy&0 zbkIp;@`DZ< z8gwCaDEiJ~g>JFM*Lrd8IEMFizl5Sy$r>6){YJt6TwZ z+!6$d@^u_eaH)Hz<@mhzlXSzH0I2HzyDvrH3I;p z-goAs97-i#c<3nQCgEVmXl*7ze~*=#OhF}CL(RrSL+FAb%fOocmS8BOU)iFj1XCr6 zfshJmHb*sM?mQQI?Q7c1!0)NoU;EDam1RmGZ)Cn^7KM0(ul)cvjNIM!(Ek!d>nWhy zJ>h}0=sxm87k`m>1-TQTYLC6-_EX0D540&Aru1sQwVP&z9%~2ClmxBuqX`0R;(>JB zhQKD-nlqg4Lm<(_ zg`HsquiNM#4F{7G=$&iD3Ho>Z_?SY$tDi#hAw@YEAPkd4fz>$!=9$}%urNy^%uo0s zJM?(u*e-MdDbdb;8NVU%$fT>H0kv=*qu*XvS0apHU(HGVJOBZLE!C}%WQ4ig`~8mj z6w0-!CDo*b?oMt!s~n%>uU>(%(sBI^UlXi0vLf%%akKrzr%yFu^#?{0KGPXxXDI5( zAzYK^CyuAUublY7MGZ%0#B@i#=gA;;{k`Qf|bUkbp?GDvdIz zB{0%}(;M%5^Y`T1vs9ymN(udauuDEMk$>c)nH`C4Do3|zb38LKM)ngZ)0s*vnG+T? zAQyt7W0KI|Hngt9sBg>6x#JSnLNWX5+k-^_)9Nk5%B&OFDuj)wdCmpxa3g~Z^+8;p zfEO3ns<2K&6BMN*TM3oD^>;8{9r^i(u0MPB+}snf+qwD<;&;Uk_+cSS=lQyT?MA6_ zjQDFs8??pkrCHJDaNxNzTzUI3>>~8jOjQA4j=Q;;!tZRQr9D|wDYJ^YQ}t)`Fu$kF zn7k-VT7gZx5&_1X6XqdkHviOJjw7T{)#>r#9DNAYAsy~c)m&lAd9|lZ0SLkiQ-gW= z3Ua9J&TA=`LXDmI8!@_a0+HtoXZp8_|1%)V%HrLy1|PIgpmu4~PWtkzS;W)ay$G@WSFUrsP#Xhi3LA%#*W3SYTu(r zvz=s`NS_Fd)BbZ8z3o4|u-B^;=)85ufCzoI*IO4t^(k5jvUe;J^f^j-(uLKxtcqW$S?LniGcN^;Y0Gp@+yXV97)=IR~iVQlrKJc`kEx zI-xXq6+|Xtr@h@`F|z3e{%`9&P?htvVdBDr@&!R+aZ+j51eN+I$e1~lMCC$?*1WSg z92|IxphAIp7+!J36J&j%z(TX)(Ob7O8PtazZGmPM_z^ZQG5RfXgJd8`xMXxZ9UNw2 zKQ|ob@8`{3Jo`FBw`g8ixui$O^r;Im`3@B+c<)7TG zpNt3I7fxuTkZxM^oHI^qi+4wfU6%nz5~Df5SCz^Xw*A+v+oH_;kX|a)sEaSY3N_Dt2Me)@kf~@ilwuXG)k4!a0)>61My0v}0bb zHIELozK>wYWfYnc9uy+OKp8(wqQ6xeZ}-0lzkOc1&3H_eH_1j|Fyb@LA^$=Ci?OtK z6j@DfU_wrqq~lUv?SDocovDBG$lRC{NZ+~iAsT6QWv?Es*EBLA0a}FOZfdo_?YHJT zcLpi1JzmAILKQ!~*@!mO#GdnGvWT8*mE>m{Vy*9z!V(H)Gr*D~%ZN`BaX)q*)+Zo2H~;#sk@Yq(v$yr;%^B1vyXZ7 z$K8aOk7Xrl@f=wT!+7}2nFui~-2B%DA>?b82D(8W+P~ul=Lh-@`*@#^wG4r1Z&NdC z;-sA6IGK(!aAc1wqplLgM~48LU#r^2NE9L#8U2 zT%#*X9|XU{knti61oY1Tt>>;EdFoxz_2tPyRs}&Hxps`+jnEo&7 zq?HWq@L%NoBSg@<%Tb#;%XDsUaS_jfmsg8gGiGfbLg5c@hHE zX6Ni~y55+L_Y4NNiv??OcCbV5f;}r}_@`V9Viuf6P#SRySUxql4`Rn$feiNU#&om4 zboSZer`03v^V`b(Bv5sZmXW6s_ds8s6(}FLZts6JOUq@J8hyFUgB>rwTZ_~~syda$ zVVkZ`a)4un_Pg1nibdA50_L(zEaG45P!meRbydHt{6K_D_%#{Zb>>nyBmC21NkGn6Xgm|;{& zIH0b+-LcZ+3Ck$CYL#~4!qUHGF<@$!eZJJBB*!sWPgKg(^DEySIuz1z-1eDJ8@j*Z z{xlY>^6dp-&JHJob0ATirn5o(vsXOCkfK$J0#)WQ##jg;te*5Kx~Ur6QJ9GwniQL< zs$%?Rn~<1OpLAEn!ZFGJ^JX&K6~SJxRO+k9gUMwKbgXM`tvJ(w3Di(73*M`SJzrR7 zhJ76?2_*;-h96g076Lqx`%e`+y&r`BT6#l$!mG>P^l6~8*Jsorj|g)|8BYWavu@~s z_D@dG7q52!(YDAovd>=cRwRp}_2Q2kX}Lh)LSJgazg*thJg7dY|I7x-w`o$(Qa%eQq#;_PdmO-H;=wN8{&xKfLb?h&S4rnb zz}G5}R;WqoH(U(O&sSTqi|P%mp#@SU>sWG?lBJ!X`}`21Vp|cwg{7x#mTOMO6^p&8 z&;eP@vOv&v-mGJWGHn|-1w#c?Ay1zG(B`HVrp3T7q%dZk>YpWhOX={}zZp^z*gjAv zCHo5x3a?*jmI*D!On0o1bvz?V(<+t^b^Ix{dj0(qgr5gq906vg)Kibwt%tX{d zdyo<_)%=S9wiS;TgRO`h8h8FtKP{+F`bhd?B*c_c1n&)uDtM@8&ZL5I7tBjv=H|Iv zGZ7l#uSO@;c7IQ#X0Lf3+x;wm0>V6(975kQJ|;60eU2g#r*|LjK6Rtot6Bb7Gehd( zsNLLRwHDM4BL0Q(?S_a^UO(Y;%5=9 z;CLy0(VFBBMyq3#8C;mj=n*c=-R$WDSEbgew{U-japel*)g}~-7NPBhYpc2ag&{s5 z7}^xt9QUM7cC(ok`h(?5F$=Dm4uhwGeR_J_O8^rNZ~IccGqn9e`S`tr8IlNQXNoyY zc7e3HCq{p{W5t@n3Q*fSIAs+>i!Zp?w~Xxdyq}W2epPb&J=^jY3bCz63?CW_*2}(LU(E zTIY&U7Q5Bv$Ojw^aCha7;#^-j0W2@3Kxn_ZcQID@-~B-}0Y(oyr=Iw|*C}k!YZX8b z>VM+E-Qhb65);;|tH<(+QH2gW3nJE`pw3tAEI*$9ds=?Uhf8pCWpZFP7W4bSVX%|S zNYciiGM>|;rec8a1`$?8>asz>jr(WzrRGMR#)yD#zc(KetAFv4O?MKh0Bp)9&6618~^8z0*s4H zbDsv{9fF8qQK$x51UvLz6Rpc0cpho_pd>WUB>~(LxT3bj-TS*Zd>(__bji_qwTKOqTtIt0>2m>jcd5Zl@ufh7{AzfnFk}_J}Z-b6O?sig+ z&pIH9Qj>Le;kfjB%mPajDQs^y>n>{3M5l zjns-J_j<`}j;HkU-$WI;vMv00kBCDhu~A=JjO5FXFz#!hftw1ChaYS|Dm~K`_O~t_ zs|n(LFkHe3o8vmHwP0YMMg4Pf49s2>(#6Ss|Lz_6ild1}lni!BT`G!`H4@NdVnYXW zhc$bz-wJqpPh~?~-6P7XMKX>=09#Tb<>MK2jKbsUe3f0Me(o zY%e7Efj>K{0^nzqrUJt7HrtEOu;cdHf7@}T@pASh`-B*?$Fbm8#%YOM=HR`r3HVXP zjid+~iOj!y-#1G&+pB#QeUe=ILjj@&pM$2Yte%626qGZa-b%=(HWvvvFpB`dRU33%!mx&#`l91zFN@U6mit4C4K;kv_*jnQCsd#?H zewMWq;(957G>{D4r~4*lv_2w!p%ZgnYX#iN87|<1*}^}2Sp5rx{P@FQc?)<$HIhl~ zU-n_BUZ@fMc*XaUaLYS!!T3akuBy2Nf3qYi+n0=`w1=V@R_{dBvTQ~Fi@Y$?gR~Gt z?x~P|Ba;_gt^WBcm~iQn_KRP`d+}#uyT4gL!0K?RlTJ1>d%3nS2!a;86r9WbhKhu< znlxds3&-o{H_NdNub^v+^wx{}Y4N>Ut9Q_@gi#`%Vz%HVQOQY@fKW zp@?>FI+?1!hwIpK##M)h3f8!Kahuqp!`FNIE-l`^ZD&!g?Il9*NIhEDy8wNM)T;-yE#gc9T9XxR2=NW?Z>C7f7IHl|x*6{f(AG4hlozVz8y# z=q;)sxqb35o2&_T^q)YinVG`h_h-PFzDS9tZqd*dCHi`Te8_Fj!U41x(j52FT@7ih zX}CJ_1{DmQb0k62*faFAP$wKOFirlvbK@#MQHHw66O0SFp#lnxM{rO-*W9J5KrJ2(nfbdnN2W{r>;JV$V#Wen~RmKwK+5V z!)r3w;=b*-4tWj7z-{87qtTe#)n|x(iSrgCwZK#9XdASw902Fm zd8npQjHN83sAA0zP&(RGX-vd6wM$KdAoog}r9Sz+BppQ`Kxg-MwCv0*N|~-+UYls+1+;^Yx8sq{_<1fgE5G-gW-cv{FZf6T#^E`EI{m9utek&xC0G;oQV+;;4sYIRnh8*cDu{CJ27>Rx# zO&un#zX8X?t)*OhXe~PFP}> zw9o^<4Vl)o2lYuPo;{%0h6$U*Em3Za%eE~G@ESt}Z$_MM6~RPVJV21lwq8Bk#GG`L z&)++jf`*s$(3K8hE{=EZFJLQ$Utcd(+VZ3>#8>{;;5ArUR6$rSa>_tU)NqXX-=XQ< z%^(nDwb)l8lB{%~7&LQ8Pl)+B6{n!u34-9bNWu0$x{JMtVXiw)LJ5lOv7`0;Bja6+ z+oO-yZ`2jY)HE3{&a@7=R6ma-ctZVW)5T25?agjaW=lTv3N0MwcNt;-tiw+Cpq+V1 z|6!ywTH1kY0?1X*i|-3XKVLYJ@=qzsd6beAPmSsj@=k&g zU56&<=rrTFR)G&8-!|OmNFIH6bp6(_cKx z_KRm_ARoE7_>QcAoLzKs=~*o=*GY%0i*up*PV{q=BgU6i93hKPZ05r0dPi3v%hy}~hps#HoS!TWh|7>jGk?5|9s}_Cq z&DeqHfDC36kF9FFy<`kC0X{N~XiI#Xh}Dg9ESn83(j!{2Xfd2NNFs?izA3tR+DV1Z$ywOd+>_AUdTtoi|R(HWPv zIBbLo*(=`N>^0=nlO1+_q)!ZUglK2MA7Aur6Tp~*l@u;}UJ#(=sWyJ*7A$HPFT}!M zxF7hU!~WD?&X5s6MEfY7K8aImvIh^SK$DlurE@)LZLPyYkB8f!kCL3fGu&~noHm)_ z$FI&*cX?Zy7wCITI5IbvVQJ17VC@w&MljgU#f1F~`BFvj2gXHxlRHp@uHo`(k3smG z=@7RnxeYo^$eQf~lYznG!}8oq!#$|Kiv7}{K48=iz^J!%wDQ=|s-MZLtW=_&Covtr zD4nw-lTRy0$KF;=b#92a=OR%_bq3rB^b9mj$hF@wLKJXSb97K$G25I`iKk^ z-Sd~W)zA2yshFxVG~voTBAk2P@jd%j>*88&cmtJrt#G(O>D=-(qk>st&SxniI?|_L z>b(g*1J|N9$9(($#e_I#D{RlU#aQjQrCGrz(fzu*s*QRyB}|S4W+;#aW@t>flhDnGxPY^oM&cGECrbL75S}Te$H4Zt%h6&O5{g}tpC&E z%o-#s)m%V@or7}!0WoQl@POb2eg`q3Q~<5iXXm+VP+!`acy#tJ2kpFiM;#Ug!q8}C zGv70w?@BppBS&}nTMG%e;zw!)kNw9>B@owuPfHw9j^ytwi8YpRGqLw8)`tk$O zYxZyP_ZoHfMez|X*vw{4m*%>cU+9b0SnoN?dk@a>?7;~i3KQo)Z=>*SCWa3r(@kxIt*}*2H$&Fr1|Tu+2qIVMal_0 z<`~D%vh;gZdnXbR_yCU{CC}M!J0}GKK69DwUt(gRnuRTB*tw8g?%zJb4EfGwT z6EdU`;W6N!G_zDLd|i-=IkvIz*9mw6Mf&!kq*>N3qqLvwv&;1PYlbgnpmd${B7?q3 z`74|bMX4`Q*l`?~NJ1lLmaHy|j0_=O`<)k4(Jy@c^vhzrg1&h7=X8ekgb_jTA>-?* zMX!>a8TA6Ow#3`=5AeXfd}Fomt3v8NpXUpsH;zVwH zxRov6SJj?AJ8|%Swp6b=IPT>)-$NZVO_^r1!tw8OxGogXC6*H*wurPzTMhp~N&8PC z3GT#k?(8E@WRact4chPOuEk@mP2R_80WVXVP!>X-pzx#D4<2P%pm4T}TNqod zwpet+Z5_VQmEh);?F$UYrDffu_Gr{Ekttj>0Wk0M5!-W4w`MFukrBBcmo3 zQmvi}&FB>g|7=I(YTlflW*mWPiX9yyvkzrc3oa-KZN)>#}W?AWiPNs4=0KdK#@-%qLgymNBL%)Q)h+z3#3(5UxP&!{VE>%IV6qQnOSq=_IMPj z9`oV$9>QOH74gn~OGbPrhrKRTP&XEm1*VDP^8Xw)f0k69f>VNV zM{CAk+g_?=krY?Oy-A83|6wACNU?~6K1nl)%fC1}dx!lSOpgmv-r73;shz0MQhn+j z{$Azv_;Hw`d8|R8z+D(E8SJw|+eg=M=bgaTRHN#Ab(rqmeacX(u?N*7ejZC4#pUqo z%h*VD-8Zi?3gx6aooy3So759?OquEUQ@r_DiCyCb*%HdJkd&F@l@;f8Mo|SnBFo|P z!^Ft6SpA`kgh52_E_3)LZ>ZsmO~=23$5E!S&EZAp<;(b20I7Ga-D7Zk{`L|9hW)G- zMGi|+ww&PH*?VYq6<|~0O@uCNX`LK@;GEL+?}97{Aw z@ZOO}IHOhGca$#WrbdNR5C7Uso!!Az;~w$SA%E1CjkI*(JUFEMb%q=n*`BD^t5b*H0e|9!}Cw&xP2`on!J>JjwN&#}sfcf+u@0TlREK>8ga zsK#%~=5{E$)pqO?35`GtZ)~{iB;xzh@^s@#vL}6_qhA082(l)eS+A+cx%glHZ;t0z z*f3)_Y^Wy|4A7r4EjDLIHj+ZOO+(89>H$shDNzmOQGI5$+qcln#M+kp5L~T45k~vuf(_9oaDT4imM8&? zo1Dor0LY>8j#^3$kVikeuPqjrh@cNP$duPLmL2aSj=xNnl$5Lt*nHX%w$?5qX9!#u z>spq08y;=k2!Y zT%1kCm#Bc&a28y5oR+)itv+oKuoF6aEUS!upDT-DS^g5QV77#27mk`Ce0~ilL^GZ< znPDhj37oz!|{c8&uYtFLp=YRwZ@kNg`-bv65;&F52ZA(v2b+kg|B+`pT^Zb|1|RWOZt75j9!kh zAuJcC?x5EWFKl+a_m*#Dda5xww12BE7Cdr&L~A`7w($E#2y<{w4IqQBLgMkS4g>b< z|Jw{%e-&DCA&XJYvPW?CGXRp|c>%${%1XYN82U>l!bH!1EsNFO7UuC-n?kXI*8nNd z4|*PUrtbo$sS&ocF=&ud4)gnLTX@pnZIk<(@F=btLdag$Eu&k&A;v<~dPV;!#4D++ z*5nULxm0-UIA?2Y{x9G^cG7|>Oyfd%p4d)2iDIWKk1zj}uzOo|b>w6sNN4h4<Z_0o^t z?-Ec^qyJ1U7K!5JcVk3uA?7vEf5rrZ(#n(iwYw-VoRKHr48oeXOX0;eFG# zfpiOjE`8&j(4lFP$TY#{xiZ9|Iq)#@_=T4<%WSZ)pucP$(4lgmtxzIKC~`4-ttN_j zId%B3z3^{Jcb)ItFksDJNdATNEarO$VlNEH(2X&uxQxW&?s5IsGBxEGbxlBx)|Cih z835%SL`A?hZ~iV3zj1c>u2?vqf%nRU%Uam(;3B0jT$ppG^0~e~ zE`mN9`)N&!9z&|?pi|h^OFiSpp2zz^dA}kaua9mdJ^-cSGEz`~Y^TB>g~u%LW&W}h z!MP3_YjSps>Fg}ahQd8)q=fOSoUqE1Qv`!*b;FACm*6)T%%FK=-Vc8-(agkLon|kc*ND0gv8EYS!XY|s-9}G zX<*fD1|2w-6Y_m#)rnnTL<&qbl5p>Lq&+DDh#M5wP-V6GLK{Mi2No`*9#n{Q!o&>I6k#fjvf_iq`p?5yvK@XgA8} zVc$NpuVs{ngZUv3lb}@Fw%(KHEa-SGOpu_!q4K3L*neG*#yFWQWT7~wTyoV{x$N#A zBFwnzO0o8-_-8dya)c5}k4DfTn(&vN$0w4}6-fFQtiZ+<;o1(qR1g(feTYgANVTyEGs z#^q_mZuWbe&_Ld_+HR7o!OkE-FD zGgG40sPP7*XaJiS4?Cp0Ic_vpIB*QO4xM>xVE?Y$fYSlEb9WD|5`=!!K-yImYG#HKpZZY`bIkch!Mn4D97WcD_m!m@9H9j3w8Fga4s#(;~ zF{r_k&+AxMNmvCs!?F|*zHs8iFk$YlD$+}4JxYDxo8rXssofGFoxY-M?NHLB6(5?K zJ(DG^5lnb_Jx_s_JaoT&t2t^_|M8PhqxioSz5Ai{D<^krPLFgg$zfF1=F6VglD?mR zj0w2prYJo`It*Kis?H^wbrevCRNW}v+hc_y{-G9Z2KeN*7>4ouLi5zg{lO*#Pgbof z%aaz7R4k>GF|2F>kwZ`q`R%6cxiAr!Yq7s2m}bJtcW51(-J2I>Vc8@*W{F*4pz&Q0hN-F;uROU;Xgsz97PP97r*z@H`1lj zMcw2Fh*yl|o+g2xr@lG8AJA2_SgzZVVr)KNDeJ4a__=4s2(vYLYE6 zb$pfYi4r05?aoP6SmQ(Y2|}KxfW^yQI@|IV!#H5> zrsp$V@4>qrPnZu;*qtD_PG{ihzM}^+F{g^f(N{y!UVVpTV-H9#J{&%jiD71HaM{%g z*Dh57;nOnQe=oEJmG=O(zxAO8`LO#A_QM|O)Sj3Xrsctkj0e=IsP{1*!T!BOVBt<0 ziijRl6V(~JAi~Qcpr~KX{AN4N$O&dqrgMI_wD$PU1jD9QPI=S5UPY;`xx)D@B1ujP z6j0D&_?y>CKtf5Sr|@>RD-Y~;ftdc51Q@G(Gso;_QwD2RN7F>!6ISfpAb&f*EQ4-- zY;6B_s38_!eErnbzYSzW0+`F4pUl5U}l=P<1fx`d$i1-th#bS8Hm7TQCvk-=Di;+zWWpvpQhv;Gj zy1Dh8zTic{g5|+^6Pw1n4iH)couRVen)|xex2T1xbZ*o3KQ)>R1Oq2cbr41-Eb>Eu zC-`?6EFA=yk^x3MkofU&XG5iFK=3IR{3~oxM4o+V`1KD-NF&cX9({=I(L&bWBSF0| zI&w)b7B^ctcoKMNbUZO`kaI7aK&a9(H()Qgm1Tr{XnUZom)=Xm2OLmR);G@Ft-n*U zZo?rVH;4kyZDMB!&to+zsy|fUuQb3{XH~L8YmWbj_)oYY!i9@t4sicJ)t9m_2UZOP zC}^!G@EuZIYF=nzMPWlgP;z@Iqcq}4Sf6nX4egaO+NZ;P30o3J2l>GB_BeO3C%mEX zP5lRi!317w(3rHdAQIU-5iuY~P2Gu@?V&wWW&|(shAW;O`^O7mZa9RWW`*JN=eH2n7>C%HX(3ziJ z6Vhky%L@+zXI$N*aFT}!6i3T92E9}os+VsI1Mbq`z?Ygcjl0mcP&@zg3}8Sf zy-`O>EL%3G^a4t(VUL&p9E}&R^dm+2F*`4h4+NEet?$HX_}D;OBR~*7@x+yxsI5Cx z*b+6g#f^))`#5)bFjUwLi8I#zF}GFMAg-xsj|2onoI0i~y^YX?V0u9+I6TDt&^VAB z?ZbpTtqdZsnyp%{j>mS6AR6j4+poNP%>n4D^h2}=fIMs{Ay@oyZPqRPW`$4IE=h9A z;i8cLQuG%VZKI|fA!^jQp6qM;LrXz8l;+9)x1V3l0Nf9G&5$t7uk)=)z&FnO?-n%{B z5`^Kd3b@`7Juv$!H~%Aj2Qf^N^xz*KQxNoKX6skG61|og$LRfM z+7NyUpXLr;3IbH0tgEE1Vv9t3&2CAqQ-ZY-pPT5^Tb2 zfqK56H%>DHNdVZfWu4-veiS!dW@-Oy-rL+^bcZcgF?OL8MqHzn_;J+?p>zMM7;N6-ym6)J$}yB;TovaDshi&?bR&pycR#lw}j4tTJgKSuD^h=&U?_!eA#wh{?q-9js86^pC&j4*HN3lk)C^ zgQTOxIT_Nc0|W{B@Cd$gck2b{i*^{e*2?2IiH~bk=bOdpqX}%e(xxzG>`&A~>KYav z*dp!!B}3b(HsyADd3;-1o59)yXqu6F5u6rLgn0yv=$s&noxVy9%^cl$NN=uo1vhacLle;o;KG>Bz-Nc1MSl!+jr z$G;aTThwE~WBxlECQ(9_a5F^G{&H*Z$!n3H_~l#q{SoVD?i$B6YxQ(_`i1Vjf(wmTsh;`b};DbW^4& z>O^V&ZZCZ^^>T#t?%Bskfh&<51YFLg=^Fc$66XcN*8c^;X#}MnZ&v81I@T5oE>} z$@)4W5!|3;dkUE!vBwAWJ{&s;@^}218in}wsb@F(z?L320um&BTVDT-wN=Qa5WFqe zupfVr;j3}W&r0_$xyD@F%Nc~TB*~&ytgbcV`?-bEn$`z8D{dNbi(o}?qb(KO$Ej? zKlHK^DuM^L_Ycz73Sl*&9!ma0F(owgFsdi!$PZT>fAtZRoeMzGE^pBO^p+$%_N_hy z7971G^Bd(ZRc7^@bp^f}k^zu)KC0=b4k`8_U}YfIfizjGcUydcW-&5mAKl_PAgCJTZ(AVQ!o7I63{Ql{a&<6bEb z^7ZGe5#fc~bt>|5+Qp$ct}k8-ck6%ScjAS2mwsYvTbtT26h+ck75@b#Zn>c0Y? z@RD2@tbWFMaa`2k#vO?Q3Mqg5MAF))gol#%k7caf9~lFBi*{Dlkw8$1Sy&eogmG{V zJQ&py6!teIc*OooBEh9l+}$k{PY6&76bhuJ zIK?eU3&klA+=>?Z<-PaLe1BvnlVmc_?mn`=-E*FkWwl=I7LJyWVuFwca2g&(nVetf zh=%L3FPIr|(*&S_wWiA{ASeBIrCk#ZyB*WKbqn(K|6WVv!D`c4?*=|#E%`UjG5(mL z(bq0r+;F_cSs4RT;jnUJgW`dOIm};Xx7NxU*NL>4oQyEuK-*dwKw|>+2gQ%CYyOKU zRreTGf7{?s1?W3(beHG(iQ8Zkn<%808t5wK@m~SH2!{~_oMW+eadBCe3bi+Tw2%mb z3r??miRoRRcoEaP@}_^XlJT*~``~5`j`9%1hjgT)k1)!qJP$S1{M(hs39ipm!`hS) zN$*vitX?R5E90ysKJ9{-I|B~-;)uR`vvh_}#_2oP>@-tP`P?s@C1tn=Z`@EQJZY@d zp!~@>PE*nE2IA#PaPtVJ6Io{`?tu>M%RN`@CYX&x9(dSa%(O0Sm{$K0B0Ea1hBT`5 zxOv84jKZ1sMIUTja^6T4BZ8|@hllQ~t7p{nY zey@2N;L#?b9Mn)R5_q9C;-4M#Qxu?QBDu2B4&CEjX^4&aEWm5}LQ@irKzxt2y?I*6 z%8-L@-FQe>{97tEWV$C$&c7IgcSEm9Hcd03!qPe?Y#J%A!2bnDKUTUk=C| z2XT+a#t}hGSunr?Xz}c&B-KCopy&TgG*;|6w3|)mG>nX4?A%Vo-cAh-#t$*-bKl98 ze-~+XC4{_O(n~ z@;@bLI_wn8i6#IVn*hw=rI$Qo>-u7c#uf{+$O8-Z576|bCK)vG_5J#H!~NZ6 zaZ=a|GYd3ci)MZt8)a#*x2`>54|-W*A&f}+pc9&!lbxLYmO*yo^C%0*5odID4{L~j zTyj>mY&yy(-mru9h1Q~LgII8}>CZIlNqU;@nbDS$F{BiJc*Ph)F5U->iVf!#l%&?w zV;8zk!S9MIs^!k0co;D7{oI3&zhxA1#*sf6jbIdpnZloLF&!n2a4p45VwV=m)vOlf zjdTj4`OA?EpkT$a@|v6or53DCuY&B-b)Rh8CZ5(kUbIX!&s)SG9&BNQTJNd_u{Vk; z#(_XtVIuNNyj~}V?!;Ied+Ia ztR!S48MacmAe~pzAcA$#cfM>#HTfw3~Ew(u9t1K%e!sO!JR*?v&mwG%OjzYVBhBMIY+!avB)F{D>(V^dZ-4X4W9qj2T6SX<(L~CgV zjX$WiFF%UHRz1Rkrx;fTsI^_(F8xh8hIKRL>#;%1sU)jdH?bR7GL$_eUOmjhsk2Wt z=m*#BOIntl;u)?q_&4|XJ6hN$Mo>{k?wITTtw{P1qJ4B)J&;SxNszH={7ZJW|Bu}u z8Z{On3S@{v-aBe1quWLrzojYu{E4ZU-$uL8&6a+kA@%;jDROQjK%?eN4niy3@K(ql zRZU;&JM9)WJIH^iV{^*a4k1;f{;O`mXFYc`A<_~6#Let(5MK2~#ACwR^cj6d^*|z6 zrgI|})bAAYE@r+37?ws+t?MLN$125=!PEN#fV{J|N+Hcx6?>n(}N_$t2jH$_Q}Dr~8_)<|Pr+i{BL+q@g2|9WTR~EkO_J;=k!o>(6oGXI!r~&767CMj#eKeJ-w0+*J#5F%Ffl%a&W&Xnj)s zQ;4)WRW#r?yOvvY#Spg5sE-31H3G5i&8d(l1xB2m?4!%5vA->UeF_57=+={TO3FR# zmgAdYQ?mGC4j(7J!mw^`!?8y{&k{11Ecg9yYk4oh*i$ou#r!!T>j@lC`BS|_(E*N4 z*QNk1kwG;R62IuxbSXDOeI57aQk9cm>r!RGz_?nX@|>A;^>t(nmCh_Q zTdvqb5nmcBTYzU=ksA{*%+c_m%5q7k$}lvOv!vyuK1 zuYuEo;NKCMfQ?I@uf0hDb3G-byt*dDJxQ*~Y#TRujPZIj0dS?5hY(|iX}Ti0mEdBn zAh_S;ZfN*>?I(2ICYssPk>3gUbQ*IBerflVyc~$V{WaxyF8QIKKN2f%-ZQChaG7sC zm!`?bzhe%4xG8Qiw?Xvxu7fJSe!4EJ-!168{NFz*wZc=?f0YCv?E~=L#Om$+IQf9R z0?xmo!HmQw)^6N{KQ+|?5Hb~6eCpAl%F66=Q)3PeouuemP=%3>y1Is8A~~lzx+UTHSy&k=A3+EyoczE#&78;`AK*zDx*`hLC#WnD=0gzl zRsI208@u|o-R&X%*zEV||BSWNVR9@g5}u=Y5!3X6DboCfIV?WEJcLIlXF5a!&$-IM zzS?vDgPJ24IOtwDpxnqgS6(iR4Y0F&CtLVP47nnkH4=$L9?R>B0#(+gCO%*fp66nK zEA58AgR0f3%lcP3pg@j@knCDSwtOS5r#DHd571t>y>=_gFvrR@cEGKTFr&#GpR=rC zkujb1&6$42A=r0xU(N!wsJz~~Z?S|kB%uP@RzJWeLLI&jP0JrCSwd@seGc@kLO`wO zl4N=}OoO&<_BZpQkcU?uN>0Yzq`xpb23n8Mctn8NLb&9lV;TV8ysE@Den$T#NdyNX z&yW{JB!6RF4l{m2LZ?OH8MQ%BO|Vn;3X)}5EYbP|HwbR8R^0CdD(<(Ge^Q8$+T(r^ z)oOMks3!#g@BaY>SnRxAB!+|?p`~PWJYo=!7_iNYqM;?5Ik&aWSk8Vb0+Jx{YzU#; zI=d*FeDQLLJNb+LJ0-SkpC%#(&{kE{82pDhT~jL;H)t!LJ)77-P_rT!2A#=~vs78J zv)BK*!EN+B(7yrFn9u`XqV~#OBk95bi>uOzgx35jTJ%ZWrv@kUfV64m;csRJPGigs zEv7e2BODWuE%VRUsYQ9SIRfN{@d`DAvj2!0L+nBM%hf;_V2YF)n4*{`jer4!*ZS2 zO8Por#}K!%;Z}G5j%n-Ce>G^LXJpaV5>k#6Vqy?!a#4wx()bX_i^h#c_VbetPur*u zJ{KIs588^pzR#$&R3`IQ%xda~M~$Hx&kKi?5lw8N5U8AKgp1w0AHqmInYdogQ}8jp zm)`~WU}U$$3tGsJrrq?vV0g3=(tEdkL>-hh~ipsVA&wq((L)qtjufCkoA76C+u@=2bT3Q-fhu!FpgiOsN}#3j z_17AYs@}@F5<1O##sGZa;03hVi_JqtiY6c}*rc_eKOw%oF&zsa<3J#`A(g5Lb2ruG zoTC1nAbUojDMLXqlT+g@H9VdOWxj$|IVB*eQE+yBjL09<5i^C*jn{#~*f=<&RF!OB z%({&+GPRODat~DXOm1QqD0r*3LT*|vfsrQFpKV$Ett_~(AmZTca$RR1-$-Peiq$>= z*uBGKWpM>pJ=_4@uOMK3yN98BQonzH;rS+yebzsxvb#clVXUOJbkSj@Z*EvUBLP78 z_itP_Dzsaz4zX}m{RP{f_JA4AE&Z#ghKTd7&^4VuUrWvXclWC^zK;!)!g%<Cgz>&3q%d~@ar%DIess%M5n)I z+)SD=;6vn)@A!X$uqc2{VsO9eN*dpW>;w*FKZBlP{CIg#u^}2_KRQefIjztSzDV#(Mz%14}<81S2Z|Sh*RQWDDxMB_Ye8EFsR|r*PjXa#v`)_S`c1`pvA{E@3;9p^Pezp z)`xogtahj5jAd75=W4PMBk)pYfDvyKY>Vgux{OzhHEDX{Gx}w&t??KOFv8!U#uS#6 zF{?nGY_vv;rp4ZcO7VsTuaDqpa3DrxfNswJR``Bp%a4nm69W*q;PM*t@+FQg$mpQ!Iu+HZ3SNk!4H&qZDrcm#^wQxGIZ(Ais({O?4PJ8br-bw)R0Sh~-W%w0pp%~``}fH&&C8)F zQ!M@#yxGAR2CT6>O~Ato`oCuG`eZ1vfJ#G9bsaH`{DQE(j|-f<*i>Z}kaGGzGf**z zn%ii;BFi?3h(tp((n6@(L|9@>?nwblMU{lVIG^eN684i+Ium!V2{T=MWEqKzpE>|1 zqlbSaI@wzJ7h0CKu1Y*A?BQ6<Q z{w{ctFJIR4-7(cuA7Lj2A#E0apnf)F=?R(459$N2Z0L%9L?YqTm${n8Ni2X0gzrad zoGnj$Y79TeJIJlp;HSlEeUUQi*k_X;H*uv=)!09hGxi9(+0Y)l&SvaX#DdVpfX;2{ z+>=5HkeTE^9fh`I4|tpTMFlzwbU<*I7tiTdV{9(g-x^zpp7oK!-faVg^4D_F5y902 zpE@W@N?qlB3Z4hNayLwO!Qw$98l|jDUXvS+10-`0fjVDgVOj>#dco z+C#o6FGx*2k9ZF+etrdYf-A1$v{LT+Gk)%cKo9k=Ip3htKhD-Id#{eG$6Y+^ryqio z&GA6$nz5>km^=1&pQ*2AX=-f!GyFhC)CZ;7@ifFll`Qa)gwSM*4i9YcPL{ zxJeLgCZn`dTr{SRg+Itg-GE(oMCq5%$K&TR@uCDok@A9jIJvXGNL2gp(TeOs!zJS2 z^R}R&O@9HS)j7d+oD37>1FH7?Eu-}ujdpB&O#8r}g-lM8fpNNx&koikIs<~|0sqJn zkXJ(1C;xEt>awjV!dko^Ot(is@nzH()kX)TCS?syr5W`FqYR*b<}T_*)pMh$P*O5Z&xp2@LmidKutQ<=fPCTy1uQA%6iGc} zrqont!Q#B>2~yz+(1(Qhsq+eBJnnlaRjnhaqfru=M}+I0?Tqyo6BQ+)P4=?(xz~Zl$@%iapBLna@G~(towHGzZuJMNmNb{xpebVfg6%EL! zI^q6O5ODqzS2X|X0J>-L7Wti6a%8RC7Uh>)B71VhhJgczcw}YuPIK^Vy5*Z3Bj|hz zicN|}T&c*}SI=tG=&Fc$d3CgK{uJ#sLrww9*@CbGd2sd!!SKjT%Acy4z1xd``q0NP zNvnTY8ODA3EiytTALP(!SUMZ1o<6;tw^=u(v%?8i zzo#Vnu@`QP?ME(f%gKhUJK%Lr?A$$a=we^{roSHR&vRr>M^3MNz~A9G@EIQ}NzMr; zmlNBzo_HnfoR=VCUPl!#96p7<%2wDm@&!sQ^sB)9Yev4H8{X~DZkR;%qAuCB{}7|6 zLwO(<87^Gec6QJ9p#LvfrUo0*V>@k8_9>Q1+u*AMG;yk|&z*m>*$W7v{Vu&IG^`!9 zPUF}j$TU4Il6iTdKvHlhT3dYx*jBL-Y(4Du-6n?Bwjj30P%RUG|Ljd5;hPt9M?IRh%4+AWsT${(_BOgYLt zXhO2DCk2c82#2tjEvCENWUn+{>0RyflBLlOjNBiU`mcBEB#cS1>#a{mmsWq_eLi9a zago%2>6-B0U;uU^!UAX3{kdkSh%HEfc_nMzf9$=psm-2001Zj2J9+y*-L<9 zXxhjaDXyOhQpuE8aWh3It%H&fUe!NBZ(3k+yOGG_B_3$1Jh^9C;1t<%c42;BE7%G| z@qI-NRf-Ajf*Fm8>*d??q2??={Z+C^i0vVzOPCmgmIk+w_c29#mQn4R3%svS=$C>w z1UG?75hNI{vvNT3P%yDLj|`I#P+aGhZf)(=KE*SW(bU(NX6xZ1h6|vm{Vu z11i$oKZ`YYu8^;V400w^`~=v(n`XVsp4gb<`B-$MLh4%)^XTxx?ii+_ zL_sG%?r}u&4B$+rb{W-g5vN6BRl#`2yO)%t&IotKY)mg!j<9Od!mOz>D4Y^nnFVj!| zf#S1swpN~uIM<#lz z^O#`9k`dHZv+$}EHsHCP_wah|KNTf*@RGtpD&$+ZNWtPrcL^jtU#%{YyN@1=$pr)F zbW4p-7|xkR9<)_|roS}K1zR#Ag}JZzh7L@^Boa*a+~rnw>krqHgia4QOyQ@jhu zN`qt46U%%bXq8|AS@J`S6K-UgHR;U#D@@!IjZJ2l2IHdjF?6#8e5`;;Z!aZG;WD9G zrGAdg4bR_M<`NhMh|-9eQ7T)f;uLM40Ao^hnwKdv zF34LwS$5PiQ}Lc{q+=0-b)8^kOEDOVMN!on5v@`x+^K_pt+&tu*d<&p1jBS}%>SC~ z>(yf3KYOK=E=9-#2%w&(kT2{`8kA#a*^Yi5LD~iUZtvx{Uv2H{fzLLdSeGOFGs;}Pk2bc3 zoKGa#$%U4GH79MjK{MEyKg(F>17k@Z%QmXGvH>kZ5%PsgP5e6?24Zf(8R%ZQzY{K` z-WZ43JS#MXV;^CZJz_y8nY{KNM`a=A#`1VT%ezzDqtN!Wt!-O+&$<9G_!l)DFb_lQ zLnBznn-t)`=S=5C-ygd%286WkYZ<`DlJOzW+zks7<4r#+g{Dnccq!Y+SpVqpq|g(S zp}NM$+40It6yOD8b;?dAduaJf#6h`s0?5nMMAt(rQorf#>=URyrv0?>15WgB3&%!|=;(30(=;floI=W5Pw2}g zn3xxLd*^KYSUJafd zwQG(XZHZ4ZM9H-Q(3=}aBGEwlj6j|!+}xdXi1r}db<4=N6Vmuip>?$jy}^v$KmJ(L zfX1{#C-y&C32-KP)ZA7hc$p{?d?Pa|{|xsPSvD#Pd*7@<}I@v#% zqOE2f>>G_#<;vW0>BIEn_#m!E{!2~aN*`Ce{BBH>?Ky?WM!ILYe>Fl1YnY2z<88ilAbX^3JPuim zEM4uceL=Nr`NEc(CW{*jxv*KiOpX~qYHuZ62gBKZYO5>4Ngl5O(?xvdO28bgX2`{5$>hBay5kubbsV&Mm6^FRf+Yw%qMBt1V7dKp zGM-+DddZ#P{~zbJC@8pi#mqAcb3{#nTaj7KM-)HP!pP%KO&TwiG2P&XseJbFgwn6J zX}K!BE73jEHJlRnE7NA^&(ctaFF{@3(dpOiNDE!jx=4$xbW-Sd$_jv z2}4P;7FHw25=Gc7`x(O*j!n=Y)I+asf#(@tn7uuvvGG9|<{@Ro6Xj6Z@K%Jm@WR`L z3X_kOzx@z*`&q6gBBMQS5cI1-fD_Ik2#f`-!+tmD;pjt_&@z&g3=}Fpk~6fZAL(No z)yks+LC51zgOm5l4$n}Fuf;y)tW5lDy+2Ms9s0nX1|WAGzN9d-c@Qor?;S&Fel!Sw zt*dYV9dS&$xGQh2BWbT`&1l}QyDJN8`+p|^o_(in^aMb@b!`fd^4tVzj^rV_5904z|@-`sEJR?A%n|CzU0gx6CDBv-iVLs zxO@Wmve^aVqUx`P7|l4{f){l_oW@q1m6-(KIlko5ktET&7U8MwLjj9SOaZ{^<9e_~IL6lmY)W&28y9OQDv94NmO3t?E92`voVJV42CeSZKjhtk3O4 zoD#AS;ric4E9vs#p>x>&CHE&mZ00fr<`^&~njW|X4*;`nkC$IB_jNnXb0%(lzxw6! z!x>_uADxP|1nYB|{U|F(Qr_#{HTWZZ%(iKf+I zN_06h_oYO}Qnl5_(N8XzwS+E{@~YnugSHKcu~Uqne5n%D#k{Hciw+k2!F35^x&{zo zK}c3dEZ&K*B&!?ELF`JIC61|;g_!AuS;cv8Xkw+P4$UscnEu$tcIEt0x`JX@spn&c zqNlQ_^EKJp$*Rlrb|nTVTp-fqqYj8M#(sZ?3s1JpmV=P$6i2wxe$RMLRAl~&?3N8K z@y&SG=!%V*6c*h5Fi+F9won0zLQ*Fn8NOKrQDU_OMM`5SRLG2OQrp45ptt875uYF2 zWUNv=BCC^L=;^ohriy}QllgwgqZlGO8B+nZ$-k{{by!S*B#ZVq8Pojb9VmK-K2OH% z*7$X5(CGv6uDWhB`7Ei^#9&@@dDUzHsn2B9=oNH>IzGM!U0>S;IhniCE#)QHoOn&& zFO${J>oe)V1RhmZGqHew>bAL;aZN``a6s6H{d@(l5`89jCCw?+ejGQy>pG8YI|L&X ze67SyJ-C=bXYUUFK71w(AcFAHnZhDIdNFSqle`zix#=;Y1sH6P3B1yv%*PPz|Gqn1(4TPlQ&N|@^2jsv{MOer6%>s5ljP6+XDK%O@ z0gX8UJqXB-LPw{>39Y;pTzf-&V(f-~p!WeOaGfRL-+nMOX9K+?n| z(Kw`$3=%V+Vr)e5nH4r{mXp~p)dO{VWv@g$jon5(Q}oXBw$l3j3Zx%yU1LInmaNyp zgoK*;W^YJih0LVA-e*tpk>&$6v>okICZy3t*cJN&Wpf#$#SeCmW7%NaRFH*;B zB3C<|A&~x4>NF3r5#x!aeB-#Rys3y#~Iq~O|tUhjj-#wb#9}rnI0^f|= zEuiv{NvpmM|A7BZR^}OTB`-23P-vJZ>3VREZUtN1GHHSdI%i^a8Re8G1jF~RC^_F( znk0Xcq){Pqp%C?Xj%YTR&G+1cBI^6yF!Z0vpNz-qs@1qA((_LRdG&Qx@4Dr_1ZiDW z7jc>ozC1GD`Xfl`ykr;c%omW~ZJvtU>f1ou%m2UjVrjsc@_wXXrnXqp8D(?6Tw494 z{k@}DF{Qq}xF61+V8WAtl-1n^BjoC())sX!G zo>-WNm*3N4F47f^+0({62u>oFM7Ab|^4VXOQcXws+`bpY_t>_5>Fym#5}nc`Ol

    eh;b=yo@siZX=z?XCR;YkTUI^yZ6su)v*d#lcGAwu`rA-oyh8$fNpKhP~`3A z!$Q^2w>2!FRMmF12A+C`U81M&^q#bZ{S5f6ZI(ivPRCADvfI0A%(ogefhTfucGxBFBQ)4FA|q&e^sxA?R#Yb~N=Bu88$} zFZzj#FY5;Bm3fIxkhBjy-R4u!6%NP`&7AZX$~$$EQH_{aC~XMtmg4$;y_^!@8g0uB zn20jvrE_3?_pwnaroS*~qW8@(DR+ zZx|*e<*oYmy_jPdE=TuBf2#0%i8$1;{h00k?6POUScbEt_^&Rr$2+BFOfsP-@-4tj zV3c~@OT+wj5msZa6c@F+J_-h_?}Hqk)T>wrGgMS_-gMf)jVHj7qRh*^ei0^dKf$?% z1u3yt`Wc%c?)Lk>0kbcC%`x`@tUdsP&+{yT){5nG=7=MYcX>Y|e@35fUtNq1=!AU> zcTg!LOCl*0dLr@{d+AkVl@|MrY@~b*hpSA3y!Fei^uTAXZ;rtM=)c8zP zKxcPaqQ<>7C5VM16j_MjdXv@Ry;|rU92-(it?B^a zb+7v(K9_Ft_Yor}c3YRY(&PZni$w5hN(HY_MxW8 zQCLqEy3>V^oLkgApK|27dQ{-|!C}lGmx3?!qOXG(UjWdOI9#0Ih_`=*#W*)4ZA>=& z5mKFO=F|14z_b8w6QIT;esE~nkI0c|(U>TEX&%CaTFzOPeGaqbq>+dBj_>E7$M5!7 zS95qS`5(R3?e?yZ)PxYtEYuVs^{0yNd$dY<-38AIo ziq!mpuHGMC8+Bynp(FY11Tb6j>rPp{bYj*mEVemjcDZy#SB`5n%4Dh2mo4p;f3|x- z0z=_m&*3pj)WtCKKarOeU7KFyW6&>%vs8Iet?qx+6!V=0#{qw>r5-iHX=#H6{PG;8 zOpTB};&1bQV5Icvzh~D)+8~!HpY1f%DLb)nnK9*)m+@ZkF~s zoJoDd)Dms`xKl*NuQfz(@q^H(_-hQJeyLmNRTLP;#`|CkL`tvCcTL&#D=fzeT3W`ERiQK&iIxnvaybswpUI2gM@yM zHh=tmG=@80Qsd~4rcQ>1b_ME5w(%egrlEy$YLL$6TxTD_fPr$t{_jU=PV+redv7;Uc?t7CRbz)dwZ9mP$s7I8t}$RV_sTk0p1GBo`! zMc0cMfM8nssTZ&0HGY-de+zJ&)rXq2a7oF$x2Aj1-tDAkgWvS*WsJ8~Ah{J^j0% z&#YxJR8AocG>4CRu2|uWMHY}`%lXgjt*KIZwZOO9m)X`vzf9k<{x(ikz(08rO=-t7 zlu|44_PrQBwkETq-bx`wKr*~v%sce+xp*&ul$Gm6kw~zQa07$QN;7Wy$1hf25^E)v zNuXdX3GD^2`Cs$K6!7>M1=|h*06$A7}k7t8@VVBDcx@dY^Xl zQGG725P|n>zXy~>_0_Q42$|{Z94e8i5F>;Xp zlYQjAAV_B{kj6HzoZvtSm5}$S^jYc+Xv-RWqybHizqL+E zgk4FP6 zQXFZm>#s4LC`1_Hf}BOle_@`f3z}*-RemfMBN3>j0uOwm{)4fNU#0W7HfBOJsF2u) z^8WgdEz0EByXx2*J^acZw|m(DGYVQ$qrb}`a_psbZ)(;#c|a*XWjG+`PgJ!~HbCv+ z97rOBFT*7|L7v!5n>m&Cwu0bdG^g6~Xf3K|#G^5Ky5~FlGmt*Hm=EEoYaNI~bIRklPGWR@L&y?n9mx>8N7Ttjm5V&f7a&)D$tzugY$ReMm9*^57&f4F?^ zhE{)W14(dDg3Ri~FMf=aS^9pIU8mt=5vmY zlSL%9_g(!Esy^L&;~9m-`H+*S%0~k+?tZ30RG1D}XXP;$`Yd~+t^4=NTJmPDf%xAO zJ`iavj*Pr^s=QFY+x65)CD4f*I6)1ga?_3kM-G;&hK(|^4CDhDruhv&zW7tlozIZ? z;xkV0s_i&ECFLv_gQb~ORX6`vHLnHvC`e7wM*|H$OKsrL>u>SC(D_Ud_Oww)_j80- z%6(v%NxptB>dc}iAam-DE9^bVm*tzrrzO!yJs+%$L~ZxF%S@*EnYrh+Khh?pWWlYg z0(Yg?7U1H;;Pi2DGS^aTN1z3`4t>u17|5>+TbKOlBjJ|Vk-gvemtyK;%7@j$8`jbp{Z;cS0opW>efBb;s}Q+9m!SHX z{d0ccM!6icLl zXom>crXgA<|CFOC5xVq`~cqz~iDd(gsv3VNf^6&}yJnh`eEKo|T7xw*;;#f~Vwah0x zMd^;kujPqHU(6D`sI~7BEk+dAAE&|Ko(Fk0ygiLI11jXfyzK10w&z*d>HsGfq8_znCJ;=8qhDKcs39GXoa}iK8;e+4J3sc$Gc6FQ@B-CY z>w+B`nW`aS)qH<${lzH51mIq6aay%GUceA#@lB0nNqv^$T!Lr3rP1>aSf=N@yT6oT z2kcF=*5dKBYu{)G5J4%#cc3y(ohk==@u0q9*0*CK9x$5WV)w3R7PGOmP*vknOIEr5 zq*FK7ziQ>*a}6yLkiXql^j7J#|=$NaYu_0@M3a3U? z(G)lRqY(L!VvWeeL-~E*D?X6;km%g=J|GETad2GWqR)_5a)=-xC1=0zEbvoLrdo7y zRbJRo|Nhh3*E`~K+_;z_(SK!JpEtT}WG^<5Ga3uj`83~@U4L+dNL$8I?K{hV6|kRw zd-R$(DkU48E-65@B}b?0JwoAJ9sLW!-6JR3-9rcUZ;@j>Ge50S{p3UGyS2oy6}slH zl@LRVd+YOuBjf!2Sj5jE{mAqKY|7tSk+9ejhbN-fsK*@{fnzna>2!K8#m3aY00ut1+ukp?{)a3@-cO44kNTILZz&JJ&Ot}P*+ zFisuCROc4s2c^#2kS0k&BZ@9c@|s29G-(`g#q&FPQuU{Cjc~5+DJ49Lj>59`Ag7=u zdepZS5&%kHq~Ohfc>t_zUg<_XbG&TTMigJ89gGFKxCl%SLnnM)%a?84POY!*musFD zL?ZvncE)X8?$Y*YU{o3JAmi>JU-MVoRB#}dUxiX@sZ7QV)#+Mqsd)mOzc|z~AMXzH z=S%Pp;WZ_w#wdDMMZL~scgZTe75Ctc%lz0%KS6bL^=XUt?06%vo84&c>Eh{0fr(qF zOV|ahEiIvf90rJ%nU^_-tbI?|Fl2_s1|vn8V~1*6RVqrFYkSB<3E!Xsj%8-IkkBxa zOV?mzYd5ZX(54s!v}+h_a^&rH-L7k?^cDU}hD`A+D07P3W zUbEmeWNM%z;l@1Sg*?hsc0pvds=v~Wz-G;PzRjD}4gJ?mvw3NH3Pmx6pkDeP`L&*G z4f>2G$s}#H4k~$)SaF$?N;c$en7=OAtJYy_Odj@jpR#@xZvqjdUp2kAUi!~p$h?=5 zfdM&aIEw1&1InMm6||uQ_~>+d3cdQeVJbrtiNr`%r9-OXf`ddWH4CGJU38KQUo#XM z#FvAEP1GR7XvJR1D2wk{HwkjD8dK6TEb#1(mSMEU87Cy*=FqQwuU|y&BsLtwSz%O;lQ2@n^ zexZ(63S;kzCBWr3b*eiZ9RsDemE$~SsTe64rSadFXo>)0orBDRlF|uNSgiWcm>8!f zZg}jhB!b~JqDXs}{;Y)1CsZfc#KipJ95LP|qI_w}wc3srb=uT7Bwc)i`xx`21NB|c zk^QHZG6`valgiNTUGWYX#mVy7SLLQp9ccHMge|R6TFs&7`Kq+*(|1p%CzVYYG+6Yi z;+{1|d8%3)oPZ~<*t-O-mDG|U>^7hZ-e+~c#9A44+%7`&UeK0X?uFYwJzjIgcGll_ zbN;N^EI#*_xlDoBU zt%ozI8zX9N3ir$Ur%e^RinBzvqcM9pmbg-N{YVLPSUaIBJ-s$FxF7kdHT&mt5)DJH z;RJ<$n4G0Q>s!^pVsSCgc#rJH_T`HdIfLg)WUvh_#A;YX{l(+wM-N*^MP2Q;goE13 zqx)RHc^68BnuKQ_4|yg^L$aLnv!zp?s@XuswQ-5R)BmXu$#JYlF|YroFPyh)9Wrrw z2X8(2uyRz%vdyhz^q1gsl;9uMA0`_;mp4?%>8U<4R9Sot+rExe>f3cU%Gs}T<#!bh z=Lo4~GG51$%YP3ZpRI0m*KZEi2Ho>>cOG*HIt}i^L`zomzHo)d?Zx6%hAzo+lHBHo zOAZ^lCXlo?74g*kKla`-s;zHpAEme#Z;Q0J7l#Cw0wq8KB)GM>6bWt>+}$C;B}k#T zL-FFpTb$s*3)E;S|MdLMIq$t=+;Q(1@8`Qe>}2ebz1E!bnX7d_$sYm=GH@%>fIQRZu(TRRF|Zvv5-H55BsR1 zl|-Ul^bYQg7*#MNH;B;Y7>FKypStm3vWQeiM-+cl)^nA4C8K$lw;edj(5RSk26fc) z4~j8t(8{V1`OvmrkeWKIdw<2FJ7t&XQc!vTL)lM>#B4q2IrEBSik~>yp-UD=y4m)S zY%P=*#SVIq2gF?}Tj2yo=9xTyU}%s!T$)*mU1@x8mx}ZZ0G3(0_q<;Sc+;2$8)QFJrw@Nu7zpvz3S zHuye`EoXs7T)yN>A6p?Fo;E>@z6B?CHRK>%HH$-iOEgqyo$(#7Cf}0|-ia*4Mgm@u z92-)o*n=D8fSDcJ#;cClru+fS|9P|#GMt0Vx666iJu@0ZPgiU$$|KnzP9}zUCG?%C3d8o%Hx7+6{k*DQ0_9ti-0%>js zICYami&1&&LzxB{4f>b?2{4YwPISk;(NnR`T@NGDSCuT`9Q zRo2Hu0C}vXuKFDSv9I#mzs7d{}%A%0raEl+2?K&gZmF5$%EpX`iCRy-Wmw*fFIwaVt!-* zbEm$yE}yykdRFPU1(v=l*}=yKg@1E`{zC};@BF46{eo4AT0o4jOhTG?eL|5NZF~Ed z*td{yuTY_goC7+J;;w`C5{zo+4ufYIBW$snGeOhh{yjkEgOBQI4PdWlw%e5&XpNHQ z?L1R7k-?!IW9%^)HgU3x9d};*nY=>k*^T!4oA1ADo{et%e_XYMd>sYLUm{4Xh-%W^ zc(*Dx!e<9A{rBZe9biCl24EXwyHnfyGTlJJNj~N078IUoXYOCuH;(@qPjPviBsEzR z#;~oouju^a$BKCCKMJ(6viZ@4GPEkM6`hCIt1-#FZ5uLYwJl=);T$n#Og{=9*aw_^ zVd&B{jO~ilFWw7xn+>B1GFmn)o8nU+O+U`WP3uU?Oc!BpxVKa8#OQ7eXqbGs>NRqB zjZS%WtN%JDX?NrO_m5k@qVk7+?eq~wNlfi>HdhvZ^=&Mo8=&DhfjoTpVGkn{=s?{f zmNH)<#dWt_;M2;ILB1f`JMYY$UJr9~GUf)kHU7i~ke^|0wPG228U)Ofx10O1_cQGG z_>r%}pNrb6qv58tl(4yPyUEh`Nui1}G#hx_Y_Or6UTHGZImgNRhOaFGw2$ab6J9e| z!8HbI*hX+7$hA7_E#=YpLnhN4F`-!<4PbSfd$l%-?G{ASD5cHKdbJ_xA`-C zs^;(cEnn#2XmP7+v=NBi@2Zrp%r#WeMo+s`jze;`c8pn{ z;i|vyyjtZkbMAA9!9s0oSyyy&7sA6k^~JQ%Bkqia;3o8;W`YKntC3NanKn1qJ3f{t zMoS@NpQcZ03N~_EPC8Da$V!hoT6%7;0(sxRzWu{qFn%xY`={!|hr@RlS3Co5F&AxT znd2=zQFt*BM8SsTJzZ2IFgTH3bhYqwzH*4;s}ro?vv=Ei$5Zs~?6-=}la4Yh4$$v6 zC(hkH#!F7!Jyj4F{(P%524Owl4# z?#q3k=BB|<7!m1(=j1Zgu+c>Gx2x(~ONK&dYO(&y$hPa_a`34ySR}8DgPZ2@!v@5Sb#81i~ zsI#G4qv-magkOX6Kd)C3wt(Qdpt}JYbHGI0qCz)zk~Geb)d9O4mvSG|M5sV*rtVTa zic2n1egc&~<6{kSKR^MzWkxJ?VRX!zrCmG%hn)%37~QzP|d>x#TWkNauhnYkZ@+hQ zeyVj@wcky}lh@=T6IvpNDYclhskZE~`15jLdj|4~2(xo<<^uijK4%TJE+EGz%$1$< z=B>$3Mi)k_M$$p5eyMI4spq{qFt($2lM9k;>0WayuOj1`l$U#F>LQoPmqT;d$`AEz ziugDMplkJx>}vW zsQ70*{ZbUv7e_&#%kQWhGJFzRveiAUl5=!1^V_meS>!5e0pqRhn2p2;n$1~^{OF3P z1LN7g)e2o5w1Bq?M`zlN#_4PSoKP@6*e2P%b(aEI$qA zaKZaF*gPqf5;h~hV9BH75Uc5D-t~g-xy9@O_X~?IZGd#(X(e$R-kJpAtq&-4^Bd=*j<$pH?gBk{pWOhA6M%TzkJxKIanK7P zPRrG750S6li0%*^dZfg4dBBsEN1V53p#PZSOS3%h}KH!O*A*^W725K-H(Yu;Mc ztm*tt+eY_vY&*J4*d@B-``%ps*N)NyX4-Z5V!}~QmZijAV2h1?*QPn(*)8uHk+D~; zSqUN;e#ni~kQS|F>aBe%yp0Yy5ia|S`jak@{Rl}X#x@dJi1^Q`*swuPuVr+J=hNId z&&aUh-b5)e>t&Bxd`BLZrTn-$dH4DhWSZdc9tUfY^`lISrE1K*GY) zg4lN?47P&Kjj~U>p024bQhX^lJ74W%SLBN<&d=0z;B4*Y4=a;Em^DP9I0AH0#c>QBsbSXB5TKT3iEkjRf#N_UfxpyI-5 zYkTxv-Ik7XSGZ@IQ*=(yi^J|ecOViXW?dd{SE&EqoO|M}0kq&o z9>lo%(BiMFl(#Fbg)i3NJ_>%e2HC_ruU@&MAptoDizUFaP2XATg+W|}y1&oc21=+g zvj5yu2Qs4I9s!=TJ`=ekZSx&U z%$9`*5EOU7D2I-#?>~;?Png0AKgA>dxx2|dP`MwY-cRxXHG0RLZO**VP36e&PE6+^ z7J~oFRHU#5k*c6t>TZ#Hhq=DE-RpEO7?1Wkm}5pYH zC+D37p$gn@ir$~U@jYVMcQz9GGIlpt^m}QhM4F_xIMo()8 zIOc{M!NT(m;o^(@?B1~C;e0xa_7)KiO~ph<(W*}gvGKcB_3xL<9?OhO`8XkStNZE9 zRcxt96h1D+4w84f zbB^^B;b=t?f6cyTSYJc>w;y3GAMU;%K9;! z5os^^eljafl>`KE8+27r*)_PSAGL5ZxFQ`lZRdt#2q9Ac{#qI1Wqly7JcWPj!dZu3 z;*`nJv>01@+&bXZI}3Tbrog%tl1%c>8|2VdcF$JF|LLG*xV&;##zl@R%rqpY|1OKq z3RRpG1iS)8d&l;ZR8%lYry(4m5j3)_f7Jx)I(Su_T50hIz)3fi^1v~)M29Y#NVf+2 z@#!XBrM+HkbQ9!|_dBkcK~5O++oCyl0~NoezrQ)q;MrSv=If zx5To@Y_0dE@_yB}l7-|(9_~XM@d#2BV+2f#2}KqhWw#3wvEVz}iewt8KM_p8h(nKYDW z9%8P@C+{k4j6!!{(LpUjcR-(XZ_2DI67hU!bcz{kLX`gvdUqO@r88w z2RfGCuHt!Y{3(*F~V`2yyGko3vhwgc|9l_=&2_( z`^4(eaZM4ang2t7E9%~xA7ep~7IxdGN!?KhgWBC#^U2#F&nMcH3-T@czy*FJuSdgO z9T`M0?yb}R*!DxFv0Noquz%_M*Vrp4wHfNWJOO<|vV&CPq>7v{>K!dzKbD_U&sQOf z_$)jNHLNE5lJe2pT$V{N8D^8{E*IxI9$^qDi=|wJQSuh#!(7pbVS2p*MeCoSucp!t z-_GgsipShDA~-4!U;67uTo7;aRz8nnn>H+>ECa5Z$lT7ilh8mQntpC%%kZIt14rs( zYa2Gd@_vFirD(nVy|Q+ddjzIsztd%s?6rimin)BE15GOA`AM)HXH4lOOXAadhf5 z<*F^1hjBRUa@P;tpSAN%_f_VOrvlZ8c=(Z3@>qL|-Hi}S%eMG8xY~o@NJ@y;)>JSh zZ=AxD?sNpGTA3{~gWxXJ0E&^iO;Eaj})u z9-(>2$;3Dk^C=~#>NCvXq}xX3Yn7$ZES*Z*s^7E3s5Hg}NlFtP2adA(Xe@8rP98#V zV6MI}x1&{-jn@6iL)!=Wu>=eAqhei?xgGoJW5C%Vb;s~tE5=)RIb5?!qW?aNcHqpC z>y%nnX`xHieO$NAN1m9vX8x6-04oD+{rwfVNo1=NlhF9NIv3nqSUfKZRKXLF_f`Jv#O z`3CkZO6B0AdC0*vMI2vdV#bW9U4W`zzQo0k$TJ5vq6TuE51uXqpEgS2V;6A7KcUlt z`Z*a1>C1w7W?&5kfWf>$i0$JVEYqt}q^|{*BA2z>5Zif4vT(Cq{s}I=UAXrsCM)~- z2uYbY zK0_%m7%H~oV&vfO2Whh2zdm$}%dt%~S7UKF$!+!*yshx`l?Sy`OdJ!qnvA6eyGbwN zACoh9Gb|PQ7j$HZ6GgpHUJ>W=afA}h?FgrIf_WwURB;vtiE)o*vdoHGE3A7R4>+zH6jCmyx5BY0XW3<#wo-6NR6S;X@ycv1UPs9~5ZEhqT?A2Tn!MQavQiGczE5kQ@OEu%%lQp6qvO zWHIIzxwAUg@^GDRf7KSP{}8m#-CxNVZhh{_?a$fSD=q!5JkeIJ#g)g6t8s);RL9{6 zQWcRsPSQ-A9Kb@Qi6)n%$t@_crObr9&V0ECIx;~jZe7N#evT;&JpF9;{8R_>ZIDY$ zfov2zD*=$KtPbnr%4kknRGE^Yl56fA%<8fnzy#Rrw51;rF<0nxVO@Sw=)HVDaz;c{ zdt*k#3w-m26=|WOxZ${NfoAX37NAm2o+Yx?g zQDi@Cl^W)ECTzDA9ziQI;7+GW9D2OQO--G$v!Ht8(`(=O^racYmwXxMLr2g=k#$1| zOiP;c_Dxy@jGp(~KdvSik*1AYj(i)uEP*%M-W=f80C!G<2fi1GqcETInOT*u3zgk2 zA8Uk++LK^~!o_ey{>nC_jm($LI!Vcnx~H^`FTQ)gxYxxtyZw&Z??X06si|DjMn7(; z&Q2Bw(s0UVB`a$!JSa|(FLg`ctWMfGvPqgl!TrsB)wq#C0VF|Cqv9JYk#6xkcxnWU z<*#4~bbp`CRDqIY)c0Iz?#Z-DeFTTY5VdGE`GMB=Zk6R=+<4zA<-;o}PNi^|Bo%s| z8~cx{$)*u16ZevSnTzkK9I~SM$(1T;;<{AJ%<2o4WiFladi#$P-4kdjg$#uZABtx) zCJg;ASntADV=vv^IvkEZ7he^tPQuxFhoY;3-q}2`C9b_k>Vq z2FFdwV9=p%Y9;;!@!Pi4RZ*MDZ*3E8oMw9^aW_I3v`$xno-N~I1R~1!A_c{APSmcCM*t~6C(bB>8KQnqxORdH0;RImj^y%>@ZA`pszi_^+ z{-upHZsI$wr;gzwL7j12mK}^Rnznx30e38cmAEh18Q)Jbe0fzgR8A`J-aClpR24^U zU1VludIKBZCgCc^T7O}?jrJ-U{d2vql7f^lud8g%FA7g>A5FII%!P2Jbw28puRqI<*cN?^xal8Y>#t=0ZGRT;fgmmxk;{#Y z6}RP34y|y~;8fL7p4Lo9;^?tEQ*M&6qQ_WX2~p{VGr`H+aQq8?e%@ePqOi38@cYr1 z!1b>EFO;XRZ!V?ix1zkQqvl+hA-{6qh&OTO%s_ibVR5XvlA!&uD#7Cvsn` z47P&i@z34E{|ieYv(5`QD1tUM&HCT45O*n9qtP)w`btc1qPmxB*ivEh{%whqi&rXu-Q;&P1V}p8gsk zws|xyxaF%{?sb@cvdTA%aA{3zW%Rsvd!}DHDwt_|cr=ZD^{uQx6m5s5eYlwFog#a^ zT)3#yi!x?{_v>N_d2TFs2zl58T!oHxj@SZa_3nrkoWQFxB}o4z<1a3AeRalRg+~L1P>YL{P`hTjEtp_Uj|}(ATh$NSNhd9; zdB6QU=i47bTP|rc9(km-_QQH^&MFcwj|EFeX$74yLn?ip&Z{xY$WPe>n^oAMxXg!een!m#2=5lEGY*%(J>(RR2a1-LupYMQcrenp1+|2OY$qA zd<~7lO4`S9s5CV?)64hAIubXrsnRLBN5hpfVjyqt$|+FWgGtnuLa(;%70E8z_k=ug z{;O&^b4yXOz8Jysfku?cG1Rsxo@k?QI$HNv*m(3J7#F0_o!a%Mb!2f(;w5?95Tez= zK^T2}e1ZVPp~~t8oP6K-0#5)5mC!cFSkJRBpLYA6)pfmGPah10)s*(>vjbT^D!VNs zs|Wr`E1}7VsuV2Vx@M+t5tj}jIvD@bNn&`#cNjp&ZljiEbgq&vs(kp_A zUSN)vII*=bLn2h30jck{yf@dyiPDdTn8?uCK&s|SB9~P ziw)Z`89q66O9~ei)da0^beWWMhBFh{D_nrA!;Q4V+GKoAUeMXj%c+8(Gik5yly~AD zZ6M8{icufG34Lm`+TQq_Gr-q2zzjJtbdIGlFU@ZXc(kmK=cRcw5)6CmSw@csCmmjI zdhRK@uVb?(@Sa_EYOy#J^O4E6 zC|i_DCT+&E7evMS6lACIL-5DGSI~1&ME>Mj9s*wgLDqSr@Ii)G7aZDS+A&zFEsVpP zce%cZ-z`(jkUo|@xN|EMmcGgEYKeFUka;nk5~XuQ4jke)GVQ}dF$sq@0O-LGLgeA1 z|H~iV1htQj74H*ijBzf#lG0RwKJDyW9PoKoLyj~ zp}*zmTZf-|Fs<1(zUN22?^=y+Qni}|cND^~WO-h|2*2!s$^}iZUT9pClk4mI-nx@g zsPfht@qd{zUf*1(A6R#r&(D=!KIRDP#^XN06HLfzPrPmW2l zh%_>&EZUV_4|wU+Fz#hDvzDQcV|l)CdlcJ_$avUc9B8>W$7Q>{d!1=QGxG*b>Q?0hB15nJn}-h?JXP^+4T8ak z1YEe8nJ7WgWapEh^k8@Vx>{?=?@&;K**85}*a~h#EpMuE* z?pZO6SpT5@2`+E8IHbzmE}u?GtLF3q<_wI|(Y86}nM)7d_~8L+beOuEq#wXz4QiW0 z2_Yc{WVat2dMZW4FRYPW{Di(BnLg<{@ zQX9v~(fq+!k-}2Dn=zn6MCK^#MM%S!6-yQfK~pip+vgQG4yEYvQ|wFn7TID}>Qc!} zpaQ!YGlL4gl(gN=C)P`XI{7=2G|fPheD9QcuYnerMz zL~qx6!AA?~UP9RLs~^iS9O=aj6U>qr-y0X-^j5QSt*TY#mEti{uEB+DmLHPhNK5O? z3X(jfv3SsTs!Hrdd*>kjN3mgcDy#z{EIh*2^*8xxSF}FEP@is1JD&)Vl^d^LJ@XPHp@5hIXt+XU)Fm3^?iC zbjM!66jqrb=)a-Y40V@Lkd~JI<=b)%?ACX1aCnyp)9E1WdoElL)XBw52Y4@^fnZ`6Tgy3d%ty-<~NJ{#@iTd!# z2ZxP^CsS9B?q5Bo&lJ0MHncysetdcCvlzJ9^s~89^9wtV5r`0}k|Iz84}rDqA`XRj zydQ_m?I=SKron&Ro$#-_J7e9QRU zjPnN$gikE5y#53HRPgI^U-p@AORJ8K;`cy+otoKg)yjNX9%%iyCgC!_9CG)`?D-*l z)+H)$UF4FyPrNC;(lO;p3RxO|W(cl5$T%mOA%{v_(-7?-${`AHS2ZG_8-OkpMTg`c zr^#>~gC#58xYvk9!Th77k)}0G9xMe4Vy!7e8%PkLkWFuAic zQB8OL9VP@2;r`V;h|^(zpvTvbhqWAV#xp?wf%mU|32XR1!*AJqg>&0x@Cz@O*}Aq&gqO>Q1BTQeYN8(6c^+aJNzOL z57IGDjXKW_SNOxe9R6I6tUo855A=CXBq{!!hOd)GddO3YBy6s;#lp&EOn4&B-+*0P zi}IbBd7dko z;zmI-p;rEzCjm}?xp#IUUR~;!1@iP`5}hpC@2*hyykGqCDsP!D0fRj()gkJAPH=#9 z7#vv7#Kg1CW>8J?jJ7Ptp2Niw&`%q|74x%gn$305K3Ix4j%Os8It51*;b&aHNjuF- zsxVA`5lv5FR5iIiA3i$zpCFr6_rbOA-)K6_#&$nzM*wXr-mg`RS5EdiUD}|Uwtm%4 z8KmAp>F#I>Xm8Tpbsvkt=H-k2RsDkBuMPc9uxy2uLM+!xkafjM+Skw~89mmRKnQ_g zSVvQ#n4eZXPguKSE3)VC8yz!&^iiUy|i{K&aZJy03ymhbb*9NHtFTl(S;6 zM#Q($tVa*=jfg8(xzDjp?4Ah+T1_TI=+ZHBkY--<4$MDkUVj2C^DZh|Dc*?v!vCa5 z8mZde&Bwp>pBxuKDK!0svbG${=eG7iCCxCdG%^JihwaIv`~i`;jylTtr>JOP*?B`R zz!54C068$j(9O;H9u^}yc{nz~GqCdPgWf!+Q6dybqFLmbo;&WZbwBup@)Mwf1?1Vd z(ZsyR6b5J5Zf@4Ea%OI{1U0;l&JHBV?W&BeX2Zzn%*yu6gmBN4KYb#~EHlBaeC^D5 zVM6k=o#94(ZSt^a)!P)hw70Th}v~@fv?_N5~z0?8=ho`M{N9 zyWf6n`=={M+a>(b$1V;EBKnGcSD!xg&IUa*B+n39u)b?TvoQJT6*J_6r3sc!r=%5R zaVQ9vdG^hvqa_Df3?=Oyy{9&HK@I%*Ms96p;1Cz?Im>K3!?i`1p*tQj_r9(2>jTAB2cKt_pc7i zLYv-u@cK9IUrr`!qhgV}Y;b2L_pxXg4&?UJZ%BNHDzccySrU#5Fet)&u*`F&0V=0o zD1lf;ymOu$`4g{(qew(mex?;@ewzbz5x=1|`qSD?N!GS)eAaGy~9?0#%K*j*3?~9S4hI4#s;5>NK z`;W*sr6_v01oB?Y{k*03SW0Ct0XI4B!~<&K|cN>20YY^M6L0h z-aCjI1)tyfd->KAP10gs{cn=2XnH7#n+gM$ba*r%2XF5j5F^D>VQks2O;m?!s$7&b zoVW+l|L8h~F5Um_0jyWkR_C5_hPh8wr7uV~OcGX?(oUB;EP|~i?ecXi!+KW*vV)DN z&67o#uLi{>jC%upEtT%GusO9!FzZ*1PV!^XTDRy!&%1K@Xe{+xtbyTtMp3k@paebn z7^DmdQm8Asdphp0Wr1L`$>fpYTfUpl@2;O@v5HXwn^XQ#Y+HiqLz(2mjT{K7)uD0e z!gnA2d8P3X3!pHZQ9fSa)0yQfEP$im!dg-94D~2^G}FFD|DqU3oZp;Em?d4ue{pE` zh88tjIiw(C4ULiR4y&TyheIE|vyrWLh~yL}l|>XAy$$mz&+vPu?jC zs}`2k5&GU05L_>}Vl5K`%zWqd)&EgVmp`5`F}5@ugI(DmdVB;?FgTFlC#ew4RVEC> zyatYaBR4oyif}zlov(-i`cMPq-CxSCnQrfc)JS`sN~TIH_!fGi2KhWQ-FqwZy7)LC zcYv{ElM6jPWkc+19Xq{ zJ!%4Xv2cw)+=zaXr?gBMRxqZ5G+tXOigqnp=9bwq4~iOCDwKlLueBGkIMX>ZO$;V4 zM>E`Aq3+-o%v$;pZD(~rpQLdv@Jq@7!~JEBi9yNbGt>xM?MOUg$9RFr&;h;?BX~+- zmQpFrr{{0rZ`=>~pOxDuq?W}58%!M|AZNF z#sGL*w(-_DV{d4GRkF3xO)Gegw^ps2kzSH>%1vAvIkFXgZ9!7B{q=bFlDbVtC*&P z#3-StN{nUS>v@n_$V7-oG&NFnkwEPcN6YhgA%>$`7lXf4r?LbAvj%I}>@t zYV!S~pAJ^P%QxTW)|dp}-RwRytd)_<`ZXT)CrFcJA;WP#?L(zkFQ$L(v%p%7y_p3L z1mT@+is%u}gT&2mUs-(;#`-B4(8A@hyJpPX5Dt=5;*sn?ImYEwYPae9OZB89R%iBF zwK&UHv5YjFBzSj4%7Ia|hOC#yw@1TZ?|Eg-XpgH5%rBJfmtB@;wt);oNGE34 z7aTly(n?deRBubeev2fnK6KN}`h4UBTJOO>J{mwGq&tRaDsZc74Fx&ZM9;EzpXH<$ zVpEMWUleVE%v9A8Bm6KZwTHwYZ3LT9tof{dSef2tHt>9$s)|GI(!-s_|3O#%lxGg@ z;+gBamo|h=IE%QbMvuobr==aII6N*|`VCqZ!~#@BG%J{1^_I|sa>0oW?+C#DB>)pD z8j>^LUhBzH`h8r4<5)|-&z%t^lH|V$pPhM8ssPO(MNGt}R30SD*zk(^se@Vu*3o@-l6Tc$e2wg`q`+o8Ea@>RC5rWKpBki~u?rlkJudsH zO0v!G)-gw(JqlJ-IqF+u%jlj~wII6bJ&w2nJH8Z#uP_x7eDa`4|UsDOHh^%IjuHB zMjWU2;83+6YDqDGyx-w6y zV}kxZOqDBPtenh|m|pU%ziaS;56#Ez$YO9pCbxC_+mz0waferiRTx@sa_SFbo-om+ zsb#`uEU7uVQ2iwD+ab17cBcRk*-=yK*}cYL^W(YV_blJrk7&-<`cr6q7$eH<4r;$X zE3g3BfeYtP7XyyYb9T;sw_MjkL2LxY`z zdGGKBAhjt`0!NgCK(+OgoxV&N`rjjk;f?#eG%EN#CXwa4fr~6(n7AL0#Dx23%4FKxH%Z8R)(z}*n+>q(l&ynZAiZQ{*lk8 zs*0VxEVS+epIYE19MnGCTx#t@3hYjjU%=3!aFDTI(a*wQxzkP?jbNXYMmb!FP9|ZI z=G9TkLUmk*W6VT;+p8li@#xZLC!V#@XCke_*_N&z+S5b#qx@`{Q|&1Q3DaFMs@R7r zUzjUJ_=al4iAAIGOAFu=23>vrHQ7%lhyfWEs4_#+Emu|c7oPonWmmegW}RiHAJ$3g zXW+mb!AAw!kx7rTg1r4Zo?#hh|6MW{G?@;6gkd&1}u`Wus+(nYGlXyFLl-OZj+c(`^zIK9MsQ&AMY8{S~2(ygO!!? zK3G))?{1Izpo~fw70ZMQ`ZO50v*Rbxwu$v&fCq)DSzeSp7l1FgKM|DL>g5YMk11k> zW+J#^J>($L`!p=hqLBJ^_@|eYJYVkLT=aXZ;t9{_O_UmcrM9IkD(UdLO7A$P$b5-e z5HzY6yu++Uo*nN9ej4^s4;gE&z>l}bo$JRGG8f}JC;vy3W&hR&@dsXT(3Dg~M#*zq zy9qyRN{#h-I5=nlVElmXi}dtbJd2d%P=6fc!-5NWWS#VtP1*t*wiV*vGfj_+&(=+l z><$5V$l3u!RUN><)iV@maktlrFKW#@8vzkYlj+Kl_c6mmsyDVl7mnSr4+%@;>NE?* z%#dWBfMm-D4XTad-6ZSb_pQ!_nM8Fhx*=yy1n-Hq@q^E>`W`S)>0Cv&8Vr; zG5;o@JglHJpc+(;q9mnsYZc-I2@zp%Z z+C#dI#tgiOO7k;1f%CVre+YD!ntl+K_Fyw|0MmcX0-1UY*}Vg?yeu!HMKJ>H4$DL( z0vtU^_cDchowS{OWv06YV9j$8!>exzA(zMHN5TY@Ii)*lNSG1J=DbVKVI<`Oi`1q5 z7u39RS}-=hdjiX@Fncc3wozwmo!_s&(tB~eDNv{*blG>htoieet6=__gANZtK9&Nx z*fRDN_tUh+f&DTM3k<7t9;qKt9*3?nxP4Q#p`0C&j{wodqDRZaay@<{2g99bN|@F( z1TK9;_Mf(m$6pEwQT zTgn6-eynD>xA$!YJy_(uxTcCXyG-RDEY&gDKJJ7u4^S=E9(Akg@PXolr_`Lq! z9m4;>3FkQTB#i&177L{O3;0ot{aryxaU1_{39%C}-wh@yzPJKom3v;|gKv$I(S3?# zfy4Lgry-#Pv4LtVknVO05WM*O*&$y2h32-tEV8T9ISSTJ-=0AZ8J>|S27xjfkG9xj z5KUV$I3P*4k>lF&k6Zc-n>+IEreYpdA+YkM63Q6mZWsTO=WYSG$W8Fn_qn2^_uDU} ztAva-dT>#1mJuCV;_N1IbC_nNf#jxym~@2O{Huitvxoxdr{Z9Kv?w$Uvap~?FJAPC zs8xiXmQ~%BC$-2ikhQ?O2eszDJ~l4VUZ^AS9l;E?eY!!W@BF0&G;Qf=o=`0R8S3zW zRyUI7t?im>3n1d9K1|t=i&-}wr^r}Y*}II{sI9i)BKU=jWyF``GcW>@O{ZR|r`OI5 zi6p;4b&{~iBY*O+~T!>_ItD*1TxXRKYNX@|#XQM%C#a5^+x1O2bpK}Msi|P=2Yq!2W&e~V_A%rcQx9*pnI#U75y`;2-&#b`U)eqU z>yo?hAxRwpZHVcttK%2a)uFwWORLP0=))C6ZiFn-IvBsDZ@iR|igcMaj>2by!d`_a z&3GvcP6l?659YEk>|(x(^>ml}Fqh~fUHSOn%9}an17DAE;=G}!I5j6v`d!dKkW7%< z708sIRr5#u=S0HU(Sto85KK4#8ghOtsD8LlPgjZIL}2;n(%2I|j@3P`se;}W#oL}2 zm!dW#0b0m5SM)?&9&MG$=~Pv-K>k=X4^+;_A`iR46hejGa#lLFBn7^mgj)U0wuoRJ zMn=yrR4rYvlbS#5eoyotvxr-_gkp*4M$v>@^;VZ13C?G4#f~)*77ct7j8%fs*H} zb{VbjrUvm@mqE@K4WdCrM#Fr*;yUGs0FAsRVb2ON98?AxY~?R|twVp?DM>n89xjzY zm&KAyJGL$lpmcY4_Ah?!_7ex21t1iV)5j1h)X`kei}sMYEH}$j?sQAf8XSYWzyxhb zHTJg*r|@gAk4Dj;uh?$|47BwVfGhkXCXIVp3wl1vX!v$e_S`Vih&r{KNLS$GSDwhr z-%i!@4?A1aK!qlevh^!e$e zz<`utK4XpbJE*5R1> zlW)P&p_L*|Eq2il>ApKP&wS{jKjqu1gBHcVqe@b&+n$Iz*wng!E{vjgcum?Cu;h=Z zCtA=G_{C`z3uM=D2bxqb=z&r1;7*kW6UI2>CEF99s~&|O?z2akzS?XmVX95;s5wyF z88}zQeLSIS z$jFA|A0J5fr-dYPG^fR)PGSc09i_gy8sjk9zcsW;%C!Drv}D#bFzO#%PR)b>k8W{F zM~FNHKY@@gh~tmkaI&Y1Mue!fB^oPDraOTQ7I{Kw$+h`P{Zswe@i<;y}TzXg9svf8ZJ;KD_iU{9=B1W7jKy# zA>w-dHqXbt1nC*cG|Id?p5O7@js7mu+_gd$PO$5z%i@Im5m_-5dH<1|b1>ER-3 zzJ0E)`pqZEoU=4HYA#3LNxWJnok$vKT~#cj8?6r}Efw0jm`>)d`uLEW8qSU=07*QR zv>42G)~Z+Us>>)Y@Z~0&A0m(*tOqW=BXUXARvS>;haWyDNx9Z{WKE0}zK+%dywbM2 zuP37)vIDkm$ggr{oE|)y&S;VCi}x2;+aLMWGPhkPVV&fNS@(CU>=E)w!?q4C**VF+_6oKx{Ctl5GtHhlIbHGnJ#2 z@F?0~l4V>Ey#!<5o+WaKy(|m*evGNg(~;V0jfiHA3j7M_JE8tf_49@`V+4M#P?C@d zlCH`}GAS_N1wW41T}Y)?m%QicLB8js$|xDX|HIN(_%+>sZ<7)d!swD7AzdS-dm~0j zDIl%D=o0B}M(;yNjZq4MgmfrF3>Y8{LmEX=5mBGr-{12GjMun!oqV6`9M|SNBMWQ_ zHNR>>Pm@diL!KL6HCdr0^}27T*uScc`86BUq3`?s5DuN|>4Gp*0kF#*gi650o7bZT zIgginB{DmG50eE9=m%d1gj{nF{C$zx2EW7m0FPsAYtM-UIZ|JT!?)5EULFE*iWPa^ zEyzKmp0naT7l-3@RHm&Cnauf*8yYCmy&J~c@?KSnL!uIuKW544w*GSoAL2Cb+Xb6B zouK~91wn|i(gDoi4(!2{F?mDB(EjvYxCHHI_rS9E$op}Ue3p`1I&|O{NXqP5mIk3Z z`Zud&{)`T;_G6_%t_F4y)#14;&Z&*e52wVUkV7CI@EzET=2F*{4ETZY?HONO+Pk#; z*Zf)UsJ;n7vyOlZX!M1jVz z{o{nB*L#jLC5KXuZ&p3<@(tmTkkva*gpA&907S@nA95dz2PXm6yWLy)qg2&y@&a~{ zNRA#{Iw^V?Pwi7~Fc)$9S|NS<6A`!+Sn^C+sHkTvy(G=th{z6`SYv8{v4-I)4NFB_$71`cALE|@5GVq_36OfUF9NCK$7iBh zWwS%;Zb9K@HkN6I?0)kv?}OJ&G)-EClf2db>=<*mLPLDd6?xnv)Q4>D5{~)NiJgt$ zYw62^saGZ*x`Du$Weu3lbvm7}+oUO_E|JB(7lOY}(_t+iiKxm-bk_}~-hjsL-L#Q4 z+UJH1E~v(QHk^cHR^A+*9CT5vkYUN!ju-3_9Fttor3I4o5aJnCTGFoz_0nJ7dev#j zcY~B)i-v3OHZRKwbw+sN*#@s;fGroEPSSa|k8n|NcL%iy6)s);)pq68 za=+dIkB|Tx*dq>hf&~hoCytwgAjqKiU(NkSFpkOi=*LczZ!jW*4&t{B@nnL5_M;P` z(iC?guRHE3gnVY?RT{xonA=K>V2k}$*;q&R^QL<;^GUBn0_D0}7^=$>k^bv$Z7CB} z*M*u}1*U5Soq2EuH6WM#Sp>%xo{aq*s^*u%gq&H7a>rkOC|6be`&r?N=h1R%s`t)u z<@op@>p%AEU5}c$o}NFy*wxw0B(sp`P)a~?B_vr1?hg^ZS&Lw7_A(+>Whj-WgHd-= zJ|gM^NkVBoT7q`*4wcwZ?_`Kbh`zc#aMRnx*MLsP{-&#PeFaUpRA$s zkJ@I?rCxL=PVxNJOxdRp%fzrBJu>u>6B-)k%G{Hm9n*X;=Qzz4H=8|7;N7|p9CH1g zO|9d00k>$cguW>_Q#kc3EQ229`a74(NZ2|iI5Exz&K30VZ(GKO+G^>PS5yz&ZQ=vFRt%DgNN}69nVbbZ|oQ)@N$8i%4A@ zuFe;rK6~96NDTh8=;g2}Wa;Ycb092C_ZOm~to$ulr7{+_dw#yPx3{60W>=+_h?9ex z7n93LDPX<@AiZ9(t;RmrL$c{{KFzugt@8eSwL{Hh<$qtY}=H(SpMiNsl;?`<2r22b-C%5Gc19>ug}8 z;aS5IjI`N{?}vmjuFon^gK_TJH!k2mbH9!B+p>1{RtiqBMPeym*ZNr=f}vtUKl4@I z9;fbm0}Q+Y&gC*rmP~x`TifsSy$ZgH`o|09PW>puzoKm#I~71!eNE6}k|NqeQlEQB znHh}RFyE~^+NTgGR*I{eBIw%|MyYy5m0Q;@++m#~82uAUaL_T=RDSt0!na^B_)(?O zd2;*M&X+@j$iJwg>Vu28i-l9%(=Hng$WWCi2fbNS)LvL6O)Dy@Z~kv!*YvMVq~PVI zeDpj45uDjw_GpU`7-m$-u|W)f?j=qU0lMs_tiW3f05AL}b+yfY#_!8%Z49 z=$hrFl_~NF7n^ZR_Gn&9Z{t@pBE_?hs6pyKA>hqXhi;xj->Gh6^{ywbL z?6y1JN`WA@^cRt~CNTnl0SB^;*JM9UsR+cWU2Nlld32<=gfFOO2SP^zawmJS+%xCy zBGI6o%^8By^VS$n-*ml`cz4T{V??RzzygLSIlD-fc)oyf_HY;DzxDW6l(ZOn znRD2|y-J~N;@26g;w#zGzl?Jauy+h11kwIHnSY1{P|0tRZ&d!YK9g~_t#F{Xn#=DU zdxG0_xL>yLp|{@8Q5`7i7ylA6_@dPYGAF`>KldNvCSNym!r9<*`o@%!2qh%xU2v3f zxg^;og1GgciJWRdF+wart9;b|J(fWR0tU87QLLJgcv@c31UFsBO{ z`JA#*PLLQCUOsC`^rqV2EqsSuIr%Z|a|m9(#Q!R_mWH8ay~m zsogHM>|Xs{8!yf0&qT?6Il^i!vx|NX&7_Bzn-^XnjO}4RhhG)TYJBXj_v2!Q!Qox4 zQKCbODFpw@p~nyWcpytkuQr<1E$UV?(sY+q_bNtZLGqP3-Ha%U{jyz^<;}VqX6OQ+Lt||So~?q)Z)=C0 zuHr%n#w-NfIED&{q2)->D`E#?dJva&d76JAUyA%H2N4c8Yr-YsWX06CS`qOjr3z)> zpmc5qgGpVizy&M+Z;Ma^j@$w7A{2Wx@*dwZSi5^LwP*Brb)ht(jD1g1{KpKZ$+Y`F zh4d=Kfu4E}ZwZrSLKZSuBel9C_2B`>v%!43Np;G2-bp!;p?*_YTOH-LQeD%jaUj<7 zPtD%TWQyHTW(kbRq|(K!zK*tv6XlSHdwBT^e0wot>w0-vBQs1PT?g`KGh9f=!dD3@`Xir{g1Hi=n3Glr5r<8FycxTtI{ZV(6T1_9D zC@QPJlG9?eFb{YbE>3D`xSpl{G26iN#k(&H>6&kt)$2YiB;{DGktx1Z2;k63!r5Xb zP`8x-3*AY4z#4)kKN0%LbhBjEc7;PtbS)W1GW%(qzii#tBek6oCVqckX1$L${elp} zN4_ZB{&~Yx zJZ7R@T}D2Z_=?)>$qEvLkx@;D?sh7m;9=;#y@=3A9&#&3&#D3}i3l*(GbF^I7X3YX5yB}oAt3=P?IW^~I__}NA6_C3a&u~RbOWM< z5VG)Le$4w?jj*1^ayXP?NgYnn*jW`gNsbs;;WR`V&dg@p*Q2!g}; z`Tl10JwnDS<-AEonC@4^FVtsWxW;SA>g@29%g5%r+U+)k=oQ2xv^NUa16d)zj@R4U z6G8tj0J!^dq!t;hkPrCLCz#5r?9T7MStMFb*o4UMbn7~iJ1U*q{~ID4Ub2{b2lecTZr&&RCoz)Y$cXB1?(EzX z=x83JokdRU1I96W)*>WRDcU_QJ6vZZksG<;u~3;}3D|A&x5nSh*n4oR zSFcL>jEy0G_N|Fx6r~d5|M<07kitX-3pN9!IszD%$&$ugg43r-;wQnbD&^uV^M(J1 zNyV-tB7Y21mWT^odxER5rFnPUcnkJsK$JWWZhtC#?BwGfLT(P}&t+e%S#{0KqFhaD z^HA~lyZ!L%1li9Mf9k24TK@w%D1SbaWz3gxuEO9%$0ptJ9|F(Yye5QG^!`%4ctj%E zK<0X%tu}GunA?&EnVl47Bh!%_Bagb3^Bm zKlBy~H6B|rGs95WE$DsA=ARlr|0(&u>{f$=^8Mk8~3Xa#%~n!bW*E0 zKzoju)>ayVxu9uIc*El0yaA2E_>SV|(a5Gf@$?~rq8s@Y#mE~sf%Tv(RC4#?e`Um`_RPcCnwJfUyfjgi37Y+GUq95lH;6WeY{xjQ(5O9iY&nuQOhz~@A%rl zCKFz{lbiQO!38#gvX73Q>1&y*Z?wrUC7qP=L3xg0Yjr-qM!S1=PUW{{=K{UfxOf*VEOpvMSHg+HCprxS}^yX z85Sg;fH=?uN8D|zPRlrOrP0@o?4mXTO8VC@jNb$S`|oTO8(N+u^54P^=aa@Id=7{p zA!h=$#x&05mqfJd6I*CUC#Q-3aHnpwzq`IA2-9MOb)G@Rzbol)Fp=SdrNrWY%IU#s z*?-pYp9+he8P^aeg3hUYco^hKx<1rtqXuMqtddqVaBfuVj~rH>Wmi}j22v<73eUpQ zd(j?WcrU_^&0-v%Y}YxxdXiix|B>u+XO>g(?Wj>~u|>|OxDIWB%&f;WV4+bCQJ)4O z#x!vd6xr!6YjWpt((RNDE(vl=Oimk&5zQC+3-meUl1qCHZYo{I4W`Viw23G*V&^Y_dN!(6%}`zQBT zpWs|(+2Y`o1mC4>a(1`Kxc#)gn)%6B8%A1QV645H*+*0)2igg%cxE z^YgrnFB`ACR;cbxNa+yq;RN34DmAM)4^$4&=k$SY!5P{QlQpCMG5tk!}l zB5;D4@Im9x$0l`%GL7}bH{OI2xrQMT*R@EfHcZnd(qbF}n#qPJekdy->Xi>T|y&Nu}Y8gxSa?I0j^;9by7KCuSv+Q8(DS< zVHT*rP&4G5I zg7fznp{>C;9^dNm_tE?p$A&8Al@VVi$Nq#c%H%ySX){qVl$s9E|LFF$%J4^o5vFrJ z^?7xweSWx9P)xZ2f0BR1Jsy}RC-Wrg2XC(ML*Rq#L@U93OnG2kHPk1+I(tUEvv1sj zm3NvB7&Tk+2L{FjGRDv+fvy?pn-G>?O8?ZsMVAaAuki|>d!abLnL^Cqcx{!Ut!4eG=Gw&um{6UG#eaL8hkURWjGj#sVnZk2f*s$&XJM)4Y@A$w|1z+g2bO<61fosmF)~}X z7wQR#y!7uD$l+!!;mu2+h%xmEYSCYH6SSikb@UxA{raw1*0AcTDU#=Cv+0dilAo_2$;nf0ji`i9TTji|vJq3@~ZK4S}iAh?yiWj*J<7*n2Qw!vL|)Ub;ph z0_$Ua*>gup6zD`lahw zf)ean8_o_C8DDDg=Br%J^9+&Y{@bRZG_0i&bFYQ?=u}S zpAOiG)gK;MLqt_U?(H6M0qv)fkjL8T95Cs^AVpLWh*HjZ*0zbL@y_e#X+|8|A;Pu~ zb37cnB%2)$gq0BXAOHM&^)#+rTL|#@ia!su66N|LZwq;Ep^BgVC7uyb&Fw~8J`(l8 z#POv3F{=J6_JABFAqe>C61!xMVd4mgXk5SUoLj!yb#*&Q+Y@4dRc`*F{k)Z8sn$G` zay?!tpR9U!pGE783LQv-o||)Q`uJ`V^?`fR5U9AJ4^dxhO7SOI{_(YtV>)zXUs{ZI zaAN=bd`+_E^iUlw z0BhNeZ?ONLDou8*b5366dAQuTgPv9<7?HUfh32;HY#a+CjF<|j-ZMTVxL}E@`qr+J zcE5OyctkrL^a^fnR^t=zN-|ZFwwVe4LWSNe!hbT@Z9>Xv>FJK(^zpghyWbERRrw5|8hvRDo6niqUBD->FSGq?_DOD&W}1SS5W*p=dCBe z1e*Y=fM!L*cJRXivhC5_5)N{&DYAHQJQ>|y)X}S#v7Pa;2WRBn?%6$Vw4YoDM5q#+ zW9#uCmRa8|_xU^};@mce>R=A>J7Bkaf6y#K~2h&qx@2*kSyy)y|>s6dR! z_7w=>{zgcCz!1TOUKxeo>#jfYHcteRhd9^k`7U3S(`q(RfmixXi1U!+9otZ@?jlZF zejqaiU(G9-{Q+ZbXo?QxqA6dgg;nA9_Y@-tv>M?<&~9|Fp_f1JP@_Lh zV|X6bFvCu=f?KmCe<`JEYPyR9&PCU!=tZX4&Kv~wPI@ofA|qP(uiq+1Ter|MLPtsY ziO7i2Z2mT(XGD_5kX7nV0=bPorbKU&pv{QdYtoHRHX1Zt(%|Naxcghfs^Tx>w^2S) z4UZJ?!E8|4MQguHq}j~}E!%ntlxX>`mygLb=rGi(i1i>NZq?Q0Ow zKBv!&O=tgM9j~jmbx5tUAhl**iV+(6WW;5*B6uM9yWFnn7ZG$+sWDH<_j_jB?c4q5 zcg#n;lX+lFv({;+AMjvTBmo)(0UBEaae(W+yw?^!v0e08Rb~p(8_Aya6&STZ2X%`l)e9ks5{9z}!_KPr6G26I_sjb0 z{5q1PV3s7`QBr<@PQaXW_v|ua0J9U{s|bRwRDl)v6Ex?4hEp-1X*LP$GYgm#U;LlOt+E#91 zhVfJfII0nW|IB|l=LTziB{Qj^93_8Klx6XN^HA{nI3g1=0xRR87KY8UuLv8^q1ve6 zrpF!vjpuZqJjiPi2etzK9FJ%^;aCK}Y9v<`BhgiO?VdRya>`iP5Yr5!(PKWp5A#b0;l*Dq<-k zkppr&$0g$14VbvEFaWFZ-ppR?XB?o~>T7H@N`xCrE# z$Y82^TTmfN^o2AP+Ab3EzN(7u4FZ#P5pJx??5^bYuVs`%Hmi_cH$HoP{+9fOz6dP_V zifT7LXcs@2{q*$sffASl2C=YEVvYl8qYrAKRWE$QrT^Ch5eEs;uUieq;fzs)ct33w z(0ikC9=<(*X|?z-j7h7WZ{fb3AmR}ultsD_V#e-Yw2TJC9JEuIgM`GU&2q*p&|{>a zDc1~V8AK??uU4Wn>BSVovAvDwT&%-Evv!(@G4Cc-i2;w0TVc11P>{%J=44t`XbSY; zcg7ca*BI^CZ#14a43g4C)%9S8galAHS4l4-Ru`jbwCaer%Jz!KmU6?=IU)V0lZ3qR zKSISnkYxkg+7^c^U#wV%P^YIH7`3_)caaTEUDm&1fZa7nBF2-YuSS4J_8T>hQtZ>I zzZ`y`ls_X>TIm$9&2v#lMn+*uuw-q9O#UO1Oaq%)8RM)omN^B0;JTlvkbqx2$PQLn z|L1n+L&p3pxejFbGWJ_x=}^0qY)<2CsV&VJJfRpOto59BHbGd7zLivkn>Wy@f5F#!zNZEY z-lb8Kr{mE#K7W+jQ4uj~xh3*$O~4@kLmqE>;nd7$A9Z4rUp~!Hj`OL(L ziD^95_FYo^2J4!2KmhZBc9SD(Jm>S9Fw*QUiPR9pKG}y6Ows4nWJP)3vri*{EEX7#8GO9+O)yhA<_EB;mR>x z9?yC`R?~ue{slnz9zAHM3MQNNm`%U6ifY9$BO>p*>vONwgzw2utEn_qTJFsDKVaQ( z%QI^=@_ikb82bHAT&r@a#KC|Pl>(d(R)VPgNK#zc(Kp3S3hmpr-eH(-#U^$ZYCW+V7@AI*64pUPD%*W~F3T5Enxiq+(RWHBJ z=>3Sc!%>PC1jP66s2~`LfSX)7ko{z$wLds{K~4e|6N$5T{LF!>GK}7I%v!|SUZ<)r z2r;h*4ALNB9^)H>qATMOx3Sx7Y!a1GS@j^DfYQ3P`CSq-;#x zRV-SY@bZS5-L&%C(A8gMiUnPH_nr5OLs0cpz>NpJJVRLC1U0ebphH32! zg<=SONJt?CBn!}C^yMgtp(Fx6sY-J`AKfSQRH$~I;ipNt)B6g;Qdg{!DO)U~1j@nH zx3z(~YfQ(a zV2_xrF7MfD5k^@Su|1@L>BCm;{I}jg6NM|=ssrgBLdfZ>4x?L zoeONq(FXC1XZ6OU=y~B=GBwS^-eoN4w=*a8?L^>mZE!INJ%N8R|X&Lb07Yxj1$r z*e?jcu^cB)|49b8IW^}*C0tDbVnFlxm-$Z-?%r#7_A9U3u$wN%6uNhpHFq) zK>Odn8D!NNi_^;0A_6yYMryfouiUaAjKE8A-k&GfUnP;AJf>Vr1Km?ulI8a9YsqGhNd!0TH^r z>**prW&}xQThUFKoi!$D&mbP(04BSw(s$;gR0jEFv-f1H(p=0lJ;`4#IvenaifLup zoY$aycz(akNRet=+IS%~qVqaAOWFHlIO^&qEB}OX*hZQF^ZcRZ=suHn2bbWjAN9=> z7*-{zPC{xCF^4EiAyyt&0fdWfmA+3|VFUl#aL|ABfy_N{8L)>)MS&uM+7(4NF?csN zWUH_Wjqgq-N{k#}i7z00yzK*qD;9Yd-P%0pAQ$7}pFh5jx%eESUrr7yVqVnjdzq#o zQ@z&m>J{VmY#|4v-;}_z{(B@R@Lf0FuZ{r*6e?7 z|8TGAG5eDfo5lkou;t#$TzJatY@v+VG=doX>O>W|E_}97NF^(!Rq&OXk|C$TopdwN zzAWn6FTw{Rp%2>bM$J*)Ev!n0cU0$LRhE^9Ev9O|=C@KC>Hbv`fF1EhORv|TT+lyI zelm`AdO96c5_HtDmRlt?BCR%-pum)xek*)x)t`?>DtzYmp0{_u4`f`Rx|}yI@}qj0 z5hwSAwd0kO4`EC+Fc1<#9-HkbHIJ`#2(?Yf95GXvKh$d3Bdi4S)N(me`S+!a*hDhP zk2?jvH69m?Rsl5DV^pW?3Q1tt9&c5!^IO1DHcJ@~Ji`=8Y^a>F0O&&T&8gywv? z4QeJPp7QQY3v86)mv>isB+woth3t?#i{dw%R^8GNp^yLZ?(|PrL|^b}2l|Y|DBFMJoD5i~nH19AAj|fzu7OpNl!R-S!oN_5R zJM(*qAHH`%YGB_DLb3)FY1}uH9Cue=Ys4vTqm7BtrtBdn_jc2GpS6>sFM-|}LZ-12 zLi%1An?$g43?H5F7!$XIAePP#c@ z>AVk)xW#W>l;7Kq>{?w}8^h1eZxD22bn?&kj6=R=olBQBgtgIuAN=xv7_s?Yx0Oud zR&|TVKi1FAVtyim;z(lHR|?|Olz~tAI&Y>}TnJQJn!0_I9Mkv(}d< zULJY2U0MzIheYX9kTfvcu+D(KQKM1OG&lzm{&U#5_S>5&d@u_WOWo&z{vRmS@7ITC zX5YCSHMkvb_@C`o|NcGrJw`R0{(b`eR%A>}#Qw~92J7JU3#>U>FzUegYF+U2pPg5VLRPCTqqxdUqiNv6R2Fj$phX+;_R6-{BmB|#^j z?B}wiXyUM*w%)P*H+P2iKOT^Rr$p1_4nlDy`8@mNPt|S2)~rZ3X0KXU-E!C0f>%R6 zM{jd3th~?g{bfzE5lr$(#9DVso3||C?pG5cuwA^>D3;nWL4FmI-bW|G*_Lbgdq41P zs#x^f22vO!3%IDnKeNY3PJS|+0BnZ!t-d|qY`>R~Ny#c@Pk}#4I*}}Pd2Ksk5Sa(A z^j{5+>mP2q-87Wp&Qt`)AcM8!UYK3fG|e@pjf%2>)LFyjX`_$|$|0M=chJ^Uv2YCq z;MKN*k01g9J?iK!go`P22UPyjiU~DdWhYS4Z{T9QI3+UXn6>FR=6vW+mr}*{_aDD` zL`YPusUYg|5gUm``6TF2UG_>}QF*cN-{+^SjnO(>R;@zgr4{C9HHE6;@S7F zXzMumGhY@K1keWS&x;pUftrU2`&O3B}~;WLe2<=oEYF0lHuE11Y=RJx3A6=lb{GPra{OY*_7`SCK$O~*XHwlH! zT%0StAEm#g4Y!#uFSGxNFhP|az|JG=X)`EHhhAWWm0y2_dbNOZo)^KJ$c98IQgE70 zlfInq@M8^(tHSZXW&r30x^#5kRAkCYY5gpaBuPUZq1v1_sQ-5gV@ybX|I1?u&j%lu zOpg4$y~E#A0+LDk+XO$ToF3fk@Yi8{pQ{6##sQmHD!kOp6nG5`y+FVTdyX0s;mn5+ zC+zvg5z3Ya5<)^1^2TY|q<|_c;^X`0+A2;?vG7QO1N`oK5T4>vOf}}mZVf^BM2QIm zxG%W!#7rYjkFV*_dhi=74x?0k?v+hY-P?-4vsd*1t5KsG2=D^ZqadRI#5!_VcO7%U zv_(^w^rg!_F@P^h>XLiYe=_H>9ZC(wE-ahk#%)K_61H~?)4wn{9+xOR)A18HPr7$| z8yXI%l_oT|5_mRWa_-prL-^c)5dV^O4vdL`(+2!3v%m2kqPoK}w8bw>o&Lx1kH$AL zkoP{2a`Gf)leKz+CH=lpfW2PrV%upHBSv@C69b>LWH&mPEc7?dZM>|P)>}%^kn(I2 zd`-f^JRS-GVvXhVv`po{=BD8i6rWu@Dtp*8Hk8H)!-RzKP3=>^X+GBj#OMj*a|rFI zvb#4VdY=Hsw#-p*0$TQzOb`9jF(>8iuwM_6n^1y!D|iZ}i~d$-nu|5SmsI2J|6atz zF^Qz2?mcI8UAg`2UBat~l~<`qABeZ*BP%(s6Q_%3e&@t#(shUwq>0)~gBLwSozc^qCktIrz*NXh_Y0$~9yq#8*)c)U!wOK{iI_ZV3$w`gu%e+=;?u zB&TZg=C4tZ1qevWOLJP>(n8Fkc&WO>#Db=zF5d5!xAr(GbT$6AT8=&pxZTFPmvdIm znTc2`M}AC5VW|z0w+K#zGY(;>QgDUwO8vHT_{6u~GLe^AvcXs9pOwDt*?wr{g1vjz zXQBSu*1E?!4mDQX_oY+c2_`|%j=M3GkwRK*iR`BdWlCCKZQ{Dapw=JFNH{SnbA12h z=7;EVB|5Nz5GU6Mp?9T(jlGgy@US=>0rk1PBF-Av}Ma*cFEH)MCvI?U)p_2hq->6VlLQjH7!h_ z#JVLt2VqPMQOL)id;E}2AS|Vk`0#}+B=YQ=65aWaQ4Ut@M#m(=o_d@1VE<-R+t9v5 z4~oP9If2m|+V^0=pd#)ih~b&n*Sb$ONh=q|o!*-mU-n;cBD4If+hHu=?p!2Z7kATB zdxbJ%L%6A&dU;le2KbSRNOy-lc+g<|sh(WovhMKnG9BPiY9TZ@{kXtLpi=pLy~F4x zyDi2BM-cm4zv4~;m9h8*mX#4N-2~{~Yu*y>)C=#f_m5^)@NxgmNQdTOhv^?T+&^LF zb#SEnRrQHTmYh>;zL^H>WNTD@ijou`rP2XKw}p{gmcu^d$^HyKBh#PpzP~44S{hyz z?kM}oXx%6MU?OnLii0>*Ze~5nBUWC!W_|^>e)9I^W7CHr<9McY z1W7xEyi20T`D9ul3BqR#U!eYXfAN40tOkSbPc9OgF-8SSV0R@wBJ{`4xz$*GDgtIV zA=Yl1uZg3O({9AVV3QVm8o=1yuj8Aw_+Tw8I)i?Qsu(#06&b~NVQ5M7->0IDAB1iT zSt>4EA1D1*irUUs`EyW@!q@tzvBR+l68e4C_V`gF>yQ<6(h78|O64mT`k6e~J)AEE z`FHvy9p;p9XW6G3_U|uz>FVR_q=e`ZI=#TimAcMbRlvM&)Z5J_|0wEENnkuF zLnf}=SQJ(!U^^Kr4SYqXq?87%r%?Da6?d_Q=N=dcjRjFF1M=|$ zLK$VV$;21I#;@{1e)sJhI7Q!Y^+0>h@kibzXN}y$sK{C`BRRF|7`kV2IJwofh)O13}mN zbbW%5Xr>tvdy?X>j-X~Q5Z+%z(FN}oBE_gSW;K&>i{hE)aSR7f%_C-?ihJpfPjvxYftpX`L@Nx*_a5*j0NKK-qnq@_>=&ScsOWBSOE`93Z+&a z675rP@($`XH{w>tn~(rU8f^H2#{sK%6(mltR$me7eQYeKtd!wER*4Ul5FMC<%O^rB zGvxaFQ{x&}DUmqJzD|+yP$TX+pAJ4rwkPLx$h$iMkkt!0;D%o^5*7mA?X7$D1ZJ~+ zjnHJ#+WKl~>!!r~kL#20-BAo$L3*nSLNlmxk>4voL@}#7WGRXLqRU$DOlA+)XEf6a zK|t&@1H&eg$+Y*+zWYwXVTVRlo{ckE2$PcAe1i`o{;^9 zBZSYy7hTuODDf2BjEKMHaXsb6`I34JJdg*SvV+46Dh;kk+<>@yLhzeU#A0#K?C_2A zsEV2bLUaoqMpXWbW0l%ST%iFAfJcqYDh5W4@Vb|o>A3th zaPd|EV`z^@mZqy2jkBXJ1SmNu(+K`yav)egi=2SHZ5EOdfGnCGovwJ(edAMHN?mbXLVp2^zvC7!$vPZ!j$}&BHunkx9}< z%%2yvdzlfkWy(EFoXiT#lVV=bh*D?+=Ojq4bu={&8nQaKkB5y)wPnqof#sSF9I^RA5dN8w~esp-=_77 zmSTi3_w7HPtD)MQ<=H5RNGF3Ws`gB;I5!c&M0g-sOQ&mB7dO|&)`C@{GY<=orhjr++=spW>`}E_-4~=MwF=aeq+dEkGcJ+JamY=h70Hq7#r@YTp z@ot2@tO5M0R1v?I?HV8c%;ZFo)jNAZOvux+LTp-NZtg<%l{Wlm1Uwv66r06oX;W}| z=Gk-N8RF=upDX29$#U@XOf#RHUbYiYC<&xL>=i8?T16f9)x0YZB9U`?)%lc<19GwD z-x%Ci@ws)L2&^Qh#sSHym}r^bU8I#_fh564kx%{qaFF|-iXTkgujRf48p2GKL1d<| z=@}dKJyugo--!^7x$Hc)j>VRIPNE8Z--fUl%rYdce)LZBszftXhGX8+;xofW@L=fC zwDI}gO`e+zsK!!2(o83F((eAY@#~IQkex9li9p|`2LvB5g4Z>O1(_PlMX|kpBXKbh+1}+$JKu6XA0v5~CQw_%>2HFzQR< zZiAKRE}UB#kmlHb)I0#NZH#?$)sM~PY+>Ssl?6$B^>`7JMkx5F06$)#E1x81Oa@`APgHF1gwy!R~HBO?;z|`_^p-KCJ${M#UhK@dFX+5 zsn0=8!y>Bp$q~I*LwKuAy=KYnpYzY{6bGrAkiTtmZ|Jr4 zr#|cFB)qRB=NY%O9M?7MBJIrF{c0eS;! zH4~lLk1fD5cX;kz%UNQ-GZC47g&8Dl)Tb})(;<9@40QvXIFf?*>gb5jE*=Uish=Jz zmis~J6v|=aSz=i)E*`|K9l3>`AGwMj^pX>7uOzkmk-W0q*RCwC=gx%oU3d5`ju3#6 z6h^A1YlC2RG}z+I`{E`G1mnap;$zZRI|qMUdg9T>VG0S~M>v@1&?ev4n;LQOL@Cix zqYkQ*l%#%9gM+n_G!KXoFY~B7Ap$Uf4}E&;A4F7e9gj+ejHe_l-b??EaD{!fxU75A z`xFa?ouB-H_P+J6a()3KFzX~uq#=Rc{q4k^Dw_m20WS$UG-(cQbg`P;|3An~B3A7O zZ_xs4@k-XJ6(1iFc!i@cMH3!hoZe^cEZ_Q`pht?X3@rFB2@nfMb}DIQI%W|5a1K|4 zTZ`!qKmhBi@80lt!m7V0BDBZ(h0I#LM-eHacP(;*YeEz85;NXf$Dv(1J) z&D+3r9*KpuL;{margP*gAAdlP#UejZ!D=eXNW0T-)^O$EBrZhW5JB*PBun=^3ndX* zdW*_&W^BmG{{UKURN1Uh9EKKOOgj^a86+^t0dM#f^<_`P>A-FoVN0 z%eFY9@1g36V$?ur;i1=OyhGp;N)dVLs@#Reg!$1|Xit5yd^}`C7yWWJk3ENeO&}k& z*BS&oO}?qj1uLQf^SmIoEVze+iP3N&;ayR6%L-#@Uk*)81cgE>Jt`L~-5{7cYv)4E z_DflySs|eBRtj={K=wBxj$^TkK4qHk#zoQ-J6S;1u4pS$MFkQFtnA|2q;}kN_(cz! zUXNnQfwiAv^|%8$;f7&RYQmPi6nK3KRhf`~EpD zK7X=UD#Xx<6!_#%7X#|o&Uko0=>Jr=Luk_%Y|V=QC7J8RAzMqM+7I1SOR~=8;gf!W z2ZeRck0&t`vB)Y=NtQfbHBf7YI|npGb&u@72P>%ICh;qwX4v_cqW%zlRjt+k$I`b4 zGW~!5yUV@Y36(f_7HAmdsj=b@@l2E zwYKMl)4Rd@+4K0?@8jco;doQ8_7dqA3o4IFB2G7uYKTzfvC@+ zc4_ZDt?m8lQ`B3KH;R7(zOO@vNzjckQOfY%JMDv4phRsmKP$E*jf5$R8KL@kiUAx1 zjWWAmdYY!#c+E}>1~4_F)zY>0q>qN`(PIsBTag)iSC5)&8J7P$E32xrHZSz)~uw}bH=66;2o?wo?02ZNd(Gh6;P%+J1e z?-Flcg38XpYfjj0-*MHaJjO=|r~eo=*G%yO9wG^dva9OsF?fxx&m%!8jx`qAD!_Ck zi56!2TR~}(ij^#8+s&X_l++IZ;N$@+^n&QN^5@f;x_^tWMw4w?F%*dTb5ZXwaKgfh zj$rBmUl6a9sUB9({GadS4!vtw<^egiC2b-o6~tKoaa01AqEU+wPH*==dry2t&|>%Fg^L^uEbC) zZRzQZb}KP#>T=lX{@v}6575xP2QyJCVv|>-f}j)>C#vxzE@+;bH+sga1Ax{sBxGUq zXCt+!$xomkOsFI9r%~d@Jw&Gd=l(7Qmpm7iA~}B!7yUQ8-qU6*Qs{)Od}~y+1j+5J2OqhO9!~*c!;ta z>I&Wx{$&G+<0Wk`@)j&;NupTSUh|(KSd8b!Gs0~ZN%BvRJ12S`>>Q4c1tgL%r_xzQ zdUGp>w0#av5i|-)7$A*b4tg-Pe8i@dtVjnCx(SEB8DZ>yW{;;G+l+42J9SP+I_2rDU`cNMliWLk9+F<9yfGX z&gja=Q<>kGuH-WU;y0rC(qioID@>bALkUzE9|M#eJX0_KbSfxm89wm@F(02WpR12+ zjMjo~I38$rAPcX0aU%K7R0&AoJSEQ1scHO8ZD5>zam%;{3&+HDvyH9Lk}nn}X{Ac+ zaT5O9QBCxq$;V7sQLcUAJM9~LSmaB}Fqc$D2#<77=TBIS1Ia^P_Jh`Hg~5HE_7iAd zI>NFJs1~ZvhbK=sgrMiJj^>31xREpPW~}0JRzsnVymBG_Y%5z%k?GZ+y&^?;_}OoS&W$A=Nem(k^iZ>R8GKu`l=ejzWY|d1dQd>VX>%w{|yltty@ogJzu0p;PFGff?Z^qKxq^dyt zqtSBjUZ-D3EHwIK`#?kI%M#x8c!iUYvFLRfhHd!S0Y)rd#FYgD0eMjEB;kddr9wh{ zKfGWoJDJJU%C@^D@xA3pJ9VB8So6DQGLg+N53fDqXU3Kkk$Q$loVQ6Ro_=ZQJz1qk z4=?A|Mc*Cnd<;wtfoU&?3I|(>qsUsjIx+lI|5?bD&s5U`86}%gl%n0d%(o|daFUjV zpk6y8BFv;#=lwv|)#z8kXiVupDApI{T>W!dKBZB~q=J$%PKNKBN685_1VM}AlMkEHPy2yoLkB2$<1NeEX?ekXIQ34#6hqMQoP)mHr|*A5j246c9>*nHsS`54B>gwY%ce&2mRfkcaZ zjTeExTQAD1Z>h5ro{G_0cqZ2)fLTrJmJemZS~JqPy|#w6r6SO@Pd~4RlbauBB-q}i z1RP8^Lv!Ta{tF#!lQ!mH(&XKR92qVwZ#uEKS~^Czy|Fn8;*j<*I0?Y8yx9EZ@lQRA z;X8N>jEP7N$Y4*wx(TaG369zWpU5dxPSsVU>9Vx8-Yrjfwc=+Qkie=9MIo8bE5e1-lceQzkcNhs4Os91lrB5*T? zTt1@l&qBkQzVu;yGF}Y{;ygLAK>tlf@UVbm`PNm9046xkHfc7xyGwk_RGo0;{A9rq z%FP$y6-FNZO`r#=nSf%UNcfaoTWoM#1j-f5?w94V5KgvItL>zP=(4?m{rGY<=e~p& zTtEuDOlMi(x_!PU>g7czAnT1dM4%z4R!KK|#BtwGUFgv5m=fi27nCQeU(#I+F1#=L zwB-HxoJOGWnbQX5JPLR&rGDhk(>2fgmJeJlDtkfdNf}<#2z`?G_!n*c+~t?3qYoKwbbxI?RupxB zqw%dwf2qzEjUl@!auG7=2twYSIimk*d|c)NAE*M|DwG|wWB-{$&DI_s?Hr{Wv)Qdz zztvz}#25Er+6eJ2wIskBq-@4^bh zUhIxZy@Yu;$hISk@gD` z$xa^?mN*jru-}y`Flv%^e^mo@QsD8AoX~F;iyt4(OwH$v_VqQ-9I0;f{nxTS6uN(L z=GUKqh06zJ8rXJYj{pmE3(FE~q{O-stFL4W+g7J+^lBl~!gzq`)VQ*JEcx)>(zx8_ zw^ho|iTf@kj9AYa60u$c4A)V zbUptX0GUDhCWj->TW-*e?{t6BP9u-aX49Dm{vBdv`OE)WJlaltGO`6J_<0x3KsW*F z@iV~h9ov~H>+o_+=CvrzbZ%wDS(y5W$9XN9K8tcqS^$3!Ofqu z&rD@lJ@1?=PzT+mUW)1pgT*R@VJ?9HHOYQ?+^3VUYev5^G|ULYn`%w+;(V}=b?)%Y zyCLg6)p^x{QsMDNd)3RId{Q~=qqk2Meal5JI}xd*4r1c{k+JMSxmyo{l*7>e>L75g zY--o6$K2Ub$Ojz&-E2R%zyn^~UPKKXfzfCtfNlKg#SzD`*X$sm$UxX$?!Fo5hk1-o z&^jj(Pb;Pa4zJ65wa-W=BCT`#pA0jCG|u%Z^Dqf zSv(!?V-E(+ovBrrr{c4-u5Kr6r_%vrW&v(Fki)|D3|x!wV;g70+0tDYHSCsl>Zsg}rO}Tj#C2|vrS?FLs zG0134`|@6Qb)_;W^+X6wQ^_oX5GVWVNa6-#eP0e%t4T3n|4{ zEd<&^Qb-`&Ajx!E?jPE}&qUsd5Nq?jeDS4o&jq{u6<)&3uGaY~P}8gkZ#-i^(zGF?{NNK{?OGS{9CP zg}B}g_Me-6a7S)X!H05hHu&e60Z&vkWF1{fS1T%SIs$3A{pXU~ zE{!0-`XM@l%_PV+U33KHr!nMy4NwxBHN>h9JopWdG4EW#&puXVAgB|`r^X}OdL(A% zD~hCgknB@??LpZTl(m_?1_BarS}I+_va^C0cn?&?IWCRYU-V-MJ<}lc1%O?)O;;O{ zpad+U4Q3VZ5u+yz?DZ7htLdTc5EwUh@En$c6-5=? zt;8)(LjLYT2hq$&oU0w0_*FBd=aJ+~Tw9?erO5>Yze=&OyA$Wz;EID!iEkGjRtblb z4<+l_yd-a>))tyAC%Zq|Km~6wCBHQ{iXO-mmIx=?Q250G`fxr<_l8{kT%TI!Tg9bD zy|5&RaGd@~^qu96F!YRoX4RTRwoLf&!^*~~OLtMu;^BNR^V)kEHyo3^~j z*0!)?*#{=2d#MPjF$3;8=TJxRR+#LB^&wkY+W86f6zWw2=YfzpY~JIq0x!@PdtXu` zz2cvWWLI2?CP%*c*_o)pkFDZ^Df(1FzszY{w#QdZcd(W1ytV3?OW&0oBCVmS?mKrV zPh_}3M|@?~XCe;TR4I4%?~GZ`EuaJFTOulc~i7b?Mwgj z!}r<+Rv%AKJ)dz|D zlITWHfj`m*UnbiJ!km^6kI zjMbs`yXCc00zTfoxHzS#11=?YVUWD-XuM&hJ(cq{FhS-&v3&W zBu5-im8NKFOnz9_x7`kGtw5?h^h*6Yd=TEz+Y&c`aeWI_sZ?E56}?0<6|n`)P{ z`JRn>r-x%tn%`;kLKFJd-o_?;mx&Vd@S~#0Q zEfg+X0-LG6$~0Bujs}VO71#AoFR2<6b4)k<+~Ets1;$k0s>tYx>U{V7)esYB@bgSZ z(&{AFd%Dv;P!!8*7-SvsxKFxK7kytH|JIml2&zcHZSmBaTuAkT6^hfEuXAN7^ZnW0 z$Nx)YES48+A_Z}0xIk~|T+d5b$$Da$km<4PW289OuI^MpvC2u`RDW7uokm6d|1ue9 zhQTa4G>*M;8uh}m$l1L6y!f-QG#LfOwvyYsrH@+8^_aB0+{yc$xCV@-1l&P!S!^Vr zEe^kk`avwst~zL7fZ@2OciFXbDG#LCde3L9qc7m%^65*@i? z7v56+45uQsX`F=jcDrK_1N*wX&D2lSHDF`N&mzTBYznMXG_a1Z7JM0$(7TGQlaj2FsZI+ebG}CfYi;1M?cWzKSqADz^5qbEqp#xCRcZl8=ZacPg7)>d>Ew9 zy}{cCJl@FWVHd8cLpSgB`cfCC;#!Het+e!)46w?xgq5*0*RA;rb03XuVl?`5e&gJy zrcHw1S2&Nw%6#@jV5sZ|dvj*{oZ4f#ixLw{(ysTNUw?Qgq?6xY`KDW zAHTa+rtII_%D(XO=DESwNX_18nFsTMI$YvR5Bkyl16Z}r0G9?tECfSio}5_6k8|bP z&EkL}2Cm5rcU5I)0SDa_45wgW)s$I*r?q_WoR+fn3+RYfL)`CbqU7^GvoHrdr<{t|^7zwZ zj;h6Iio;#^4PQ@eeu*P$uU^`o-+p5Kwh9j;TE8?`-kdm|RO?>SZ1iLYZN$YtNLVIa z$g1#T@LKp?b31<7@2Duua`ZY_6MrTk8n5O+A9zot2Uv>zV=DD#`uohVI)w(stm~{j z56Ye{vu6+8QTm?-9XXmg+DG0x z<`(DbTy;!C!Lg1+zn#Md_GxN0kQbD9~8qO~WfJCnC`Hb;M-MSyvCh^no` zXTv{jH->*|yvbq!C8Yn$;sOWfY#?SDHz-k%7YqSbpRy^g{pdg!!=0R>TKINubO-=Lq|Fx}o6-DU2-LU?TOZLOARs@W!xf+}-^Z9?2au z_vxMet~{=mb-m14@w#;&ql`2LmQN$CX#C1LpW*s5l&RO8Be#SgkK?mzeyf7V!O z6@0i=_BtE3(WDNIX7Ailo0%93y}Ng$+S8iz1gd%;?kzm$mtB0*#*7nU3>$sJ4T&_Z zg@F`zz}*pAWmZ=RU8| z0mAW0za^EZ8&{I;RA%|@GDM%yT6@$<7?|AE(Uv6p6)1lm8WE$+pP3!L@vE%3R71T< zzLiE*fR40KP^Yg9q#OTx^ZM77vFtuOH7+{VP(056aWlM5V#jFriT4ph!`=^r zmj!uWmfdGV`J ztAU&tH4mK4$k#^@H)wGu#6YZC)ui%ydYu3LX!5PLFf4q{TQml}^B+bGVCZv$CV}V_ z6hroq58Ef`JKj&Gx_^x8T()_Ro9OqZ8(@Olo1Ab@$8D4ZY0a+GDcy+Xql*N zcO0ga6Sjafy#vp=0-N(ggr60m)YQdw$6*}IzUaIa;aC~*K!DPja*OJ|jD7CF+{03+ z$v3CLIQ89hIa#+`-j{aww2xcURlBF?lHIt|Qk*gx3nJz?dqq0SiYP&M^I#_q=j? zp!}wZ1;n&qvd_zWV-Z5{W!+GB+3>g{?%?@lU@_=hT`42LtWH`<6P*sExU1_Vs;_Je zPBIs$)TbLFhA=n#JI^+@Z?ckUdfx&NN4NAir_OR}3c;J1iEL+dN@gQAst%$e0Kb&%$>0+nq~JA=15EkgOd=cYzmrf$Lm9 zD|oSvYNWXRBHrEhA2}o~R`BIK8TD zv-0EH`J%EsgaD=BQ>v$Hs42Y>$3+|C=j6L_iL|W;mZP^QHCEb`ni3QFFtTxDINv^N z)OJWc^1b}7_#i6}zLQ->j@dqyG|Qhv@K@B#PTD+k2G1=X-0Qyl@eBNcCGTWSoxB9$ zJGG+#wiv$&C)U>7jOS~%5|?{`ebm~MdQzp5ZPb|?cHb2LnJS%eN(W#zdctQWf^zyp zK57pooP;?!UxtbL$tDV>54&O>|TRK9Rc<$=5=w)`&$2(B(w$=@N_n_clnk?0(2(u)ZmQ0am^sOx1J`=sIo;r+UIwo1sA z`^5;l><4aAx-ef)Ic)sp#DmQ)`H_ILdW9QG3qCHvX;0UPQkeK*|I+0X;8`=@?9_VY zri)o$DA-g^!qNq9!rk7|0)0S1lx?`v_7Re`ql5GAWZ0jHspny2od@FrF?@>9mR7q} zwb5^F?~;z?n(Oxzy@zjQAli)GX5P2L>PS#uhs_Eq7vf~=<39QJp5Mx@Cu_b!XSKxr z30$?!*jJ8SVYBJXvv&zh!t~VSF}7ZHx&}{~6DZT&8dz8eNC` zY_4Eh7=gm2<9jxQlZ3gshc|e@=~pjuI^xQ(T~X|H=CS%;N2j=tIs+r9c?)O1YW}*4lSEIp`!g87| zag1{5j~>RPt3jG~W#Ba8HRbJ;DAE zS{EC-F>LFFg(`<&VL4lF8}dB1;MQ)mSBOh4hwRUN#+Gh>q^=@JM(deKDYe_s$veQ!C&XNJ6G|i$Ha{ z6bU&NM`u&;UhWp ziH4QzX1m4s?IQ)tV4F#FxbQRy|HWs>(X8KR7Q1TOJ++yAq4C=$M@sFDS?q5PwfW&S zU!6VKdEpI{C*ymTTw!D=aq2dR8h6-$vQH&Xe(ZAdA{Q9!a~|UxTxtJalo6D0V!&1{ z1YIg)fMXhLe?V|v0RteM*UXGaVAB35fIfHIQq56RyDj@N>f?5H7CZRGjuTvep%(D; zwg3Y>$C-=5M4=bB4qA``$X~y!<;H!yML=)&O^66SydOmjbz}rx*!7nw?4Cg>+8&j; z<|007*kAx@{~}o~2aLQJzgvC_mP3tPJMjXaI8Rsn$vUrpEB5?HRTYSj9_3%Osr^vn zWDL3^`*}C=pb(y}{j!~2w$3Sr6Sn#D-kyq~_ z9m?*fD0asU%U+!SRntZJuxcICMwG@w1N1s?R{KF}jZHLp)Sz&j_CL!AVz)kXZFD-` z?4{U*8aUq$BU^-DwPhsyG`3htmx{%Q0|`7n%>$zUa9n1mgA1JeoowBpqSSZfg674BlB5WM?FO6)Z9)>GDq=>qmT!v#cTn z9EJ_sE7CpR;*b;iRBx->-qQXdtrdAynrq%tI6fgja7bDn7`2J!YoCj}i+smr)>M`- ze?1|3Qt4*NkZun)J~`D7{ub{n|AFrXABWp(!`^Q)v!BgyaN^n3D?uDJoe)E;8*`@( zWf#L2v8l7r4^8sqRokR}p5QtC7vK)PyGjvI+l=XS@9^4M$kY4S35jt2vH?Nq=-wdfUHF}y$ZxNU3j@5!^ z>45#r`A&K-h06)YFpFO=J5Y-zud?Gei|#NGZj>?ub;g;F#5o1EAZHPZ(E;d8bsBqB z1Q_x=asv0fX$is_Hgt-wqaAKL(u3=Z%JiGkz%hD%bOfTZ7Q$m#E(m{Axx17f<&H

    wyQuQbqeDC?b4FVon9>0iW}N&#hIJCuHi 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

    dk-)duz~D_SQhJOz!_4iA-bxFdQMD2V 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%0D8UB5C69Q~b=MLW-x{a!p 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


    61#osMoUDN;g&I5i2>jx!~^YnweY`Mk-ISn1mks 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 + + + + + + + + + + + + + + diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/docs.png b/src/wrappers/wrappers/react-wrapper/src/stories/assets/docs.png new file mode 100644 index 0000000000000000000000000000000000000000..a749629df9ef3b4e20b86ab1a2482040df3ce8dd GIT binary patch literal 27875 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

    hxL-UTbgFOs%C>cNb?R-MvpJYh!+yR< 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 TCS{<%00000NkvXXu0mjfa^c^P literal 0 HcmV?d00001 diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/figma-plugin.png b/src/wrappers/wrappers/react-wrapper/src/stories/assets/figma-plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..8f79b08cdf28f568a9bfc9d2fee39bd85d4831e3 GIT binary patch literal 44246 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 isSD^m{OQ5>%G^J3Sw0|FW7|9c0000 + + diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/share.png b/src/wrappers/wrappers/react-wrapper/src/stories/assets/share.png new file mode 100644 index 0000000000000000000000000000000000000000..8097a370777a782bbe52082a338584d04e62e796 GIT binary patch literal 40767 zcmc#)Q2nf^*2nYlU3iQ7oM5MoL|0&N(a%$rLsi&8>hi5m(=Ql@3cZa9f zhv(M^XV(u85C6&k)&G^p$H)H@UO&D80Ko0j`_1Fq^}{Pj&d>VB#?}4ve~^{c)yu2v z`}>E(v+Ik?%bVNVjm@pqwY7)Gr^~yi+q?Vg>zlQ;^^4o5tLy8_n>z+Ju8W(8^XrGT z_4T#&jpK{k^NWkKtNYW-yXTkJr>Ez`)63Phb?2a%r{|ZY<>jOE>;3(M|Eyi#Kik{e z2S|qQA78w^y&s%ho}Hb)yuN*_5YElb?;W4-9-X~?d|cl>?w(#fy?(sBe?7l_eSiP_ zJ2*YOxcj$%baZn5`1<+y^mKf3YGdrdvF!1X3 z{@V5)2M5Rc&VEu_*4^WacVu#5VbT5bM@fC#>G_3`x%JBCztzp%(U~Q9c=&>X!kO9G zgTteW#`c0OKfW_W}4B6ariveOvLC zRa6a4%>JI;<&@XwS2iT9{Ob4rbRK^H%;;*QwsFBZ`3M=iH@`7gxoy%4&d0?Ax6Cx0BST4$Z&w&6n%dpW4Z* z7>CyFlGo+}PcN^?8JoeeiHU>Wy+=TBLgvFtsQbWDN-u!$+eS*W_V$m%SQ1+Fyn6R41*7Z8C!mtrisPgtP zu?*#j8nvE;%tfym;7ceVAj$d>Q}gWlV0k9D4{xr#G$379;py4Z4})pq5qD2_)wH{2 zU|Qe)t*Sl$@zoX_V)OOx^>nMAmTAVdem>usniDZ>>(Vphw5xtVDV|4hysLIVNf*ET zt?AjQL6%;16$Va&oc}%lnJDO9U}w*#OodT`Cg#uR@BjWQyDgnNTq2;ETyVkw^+1 z_mO2O3GbIqGU|9^BE>)P<6J(|3Bhwx(!P^!nxuCh<$QxO8H+qFiD;0#!h;8iqvE_c zI!%(BjO!R@PLkv5$T(fT0UHv6uCC0r-QTQu62SlN|M7VkPw*Fv9nvQ5{ve5`W)&ze z9wj9jiei2B+q?j}!B(gZ2-*;59p8Lcv#?F9Lf+z>| z6x!KSN*RI~M+IC#oYYD#QjJE6u%1c3$vS^{s#cr=;Jyz)i6^ix{9QH>J%UAnte1ZW z5+~5ZedNu&0%0531e0|0+7Mcf2P4WB-ju#<=k$4%kpHzG0-*O@g_fwlpQWOYz)p?E zhoX`BR+Re7c#@wCmD4&n(18T9z!)d_a3z@iH)6JresX~3d)@f7unpOsTH&}iHJDb# z0gVSSrv!@9?y`Z3fC7w^7*;5Da{ed~G!&C9Ro3@jG62@+(i-j;E+5b#fF!4fup?D4 zP+XFxFCG7(=!@kF2Dp_>LXMUDEk6PD+)SNeyo7`H(3Ng; z^r18j{Ru~am}Hi^gb~9@)j8SsS`I~cHizhXJwSzl3bt~j%|5@p-I)aBeCNNMpSbUF zj5BW5&=VuL)6qJx8Q)%cJOm|8$KFCgbjWV~3@kq(YNmI^#Sgd3x~Wt)E5M&0`z!qJ z^$XrDewj_Lq5ubZ7~mjZTTGn*&&7f}PbmcqmE>an5kmUP*|DK5ARm2w6zE$}qD*>F zf?YWF*ZJMcf2tgRGo$u|avpzLl%;aoGlGMw?P;kfgH)y@+9+w2v5x8x9Xo8K6=h;S zhcT1Zph$^f)Gzy}Y|PIf{jks&xL!FhFs0I80Y zLPa-j%JFn3rzQOza2Q*HGJO=J1(f@&~j6E!Ihg3Hv+-V0`C4 z=ri{3ULxk*<8)&Eo$gv~n(SMnG1r^Y8a0=$J#i_xuR^;mCDB=#(`w&LS)Ds|MXpiM zC6-n-e0Ap+eOK{1dsVMkz1djD?H0=$E~#+{fN1`b;EX1)d=%sa*bDxC6~BE5ZaMmS z)oQ=m=+FCZzxH1HRxi)Bt*d0LW%~q|wrse|W%TIQGQ3>g&(=*z$e@idkx-r5C=;-rWb_|BoKwWKu<#P9|Jn)4t8RN&`Q4Kgx}JWA71DR# z?X(>WwA{V^jRP_yDG@odS1-|?PoL48*vsv*VEtJIbLWYzqOF1!_26;TTF|i~p`bE3 z@W3L?ItR}!``x$`$;urZIUtfbJX0>QJ+-`}Ya?K} zRsinn{wGri>3MsGrw8Re^~0PPhV4qPB~XoTfgP&B~2M0Fm!ONnxyb$;&Mx@?A&~ z8XcCoI-lUscOUPS2~4C)n}o^K`non4Hd-&xei0F-ecb zwg`f24V$f8#3ioMZUqzGCWOgo%q@T;S|OUzyv;&{xzrZg53xPuYLUXHg~FVGhL`BwQ`t?B+&#p%aWopHN6JjL7h=F{BCzdE?{Xp~rx zswYQXMpmKw2Lyt$hsc^9ZS{h7R!vRTdG@T^^XDx$m z?Z_m8oFI;cxD(xTLG;Jl0PynFt>bkR9^~8}C6LA6`F8mHx6qYS?G!|$aMMI%iFZmRt zY*Ri>y$ceoMh&GZR+vJQfwi3iC9e{^`$+;WR}#t2vruL}>-CP)3XQ|&#+n&;b%a+S zUh8EwA{)%0CPZ6E))@g^#*mZKkYS-rEE3Aejb_NJ@3zEgO&vRdhFodbSlN$%xwrh8 z&%eF6^u(Sw>E3j3^_zTF?QF3Au@}FdSy@>WsC{U~&NC&-Z4D2RDfe&+(R`nDNK~4t z1|c5{HBvDrYYk4-9VzV|KCvnU&fFkPU4JbRogFMLgf3l~*U6m5kZX#l{BK#}weYvM z4siX~QkId?%Tpq7uPC4IU(QpMm+~E)7>(|UW78o+QkRrP3*pknje+S8!DVs8Ps|qA z*V%IACE^PJ_2tg&!uO{dqjM3jy`IlwG_`#-RnPFaIA_!Sue{+y0(LUVYV8%ZJVFaA zLK1&d=%#dB9GHxn8SRL*o0fCXwF7k{FCsxe!lV4$-^NXZ7l7=`oyo<=3j?S08FuZ_ zQFuLvs!wJ>YIyI5tq^_dTzTR8U+dtvl?VcLVw8lvycjGw^D;GNLNXXv$+2qMFtTQf#vaG;rDhUR8cTPbo^aXjnubU6Rfy#M#4&frBN-P`Z*;&Jv! z^6soX@1AAeK6{e?Yp%?wiTqm3v#u1Uu7^^l=nPiQB_yTWEj`cnDa}eR>PW#8-=fd~<6VvXg zgW(QO(C_(EKwt|`BQG7F!zQa7F=Ax4-T8B)>0_ zPEaCClMgkowByxSV0dX+cXo#^u*Pk66oO z@p95T+{F*BYzx7YIme+>^s%~D@ zcr(m6BEh_%^+{mQ^9c9sDT^-__11`GklIEE1tHiV^YKifyB>>kjLOeDSx!pl%~raZ*!n58`!#KVqbnZs7};j%6^HmHRDgDVA}&p!2t{c9K;;RgEg$7NChEPo0n zySvh}iYvb}MkK^%I>8;_ofMZyKYG%V!%vowz1f|jxT9+7Nl}jy7C6MO=rTx2p%Cjq zQTqk7=D8BY-?U)c$HCrZz18%-eQtcwdGj~FWpdA5Z!EGr2XG??jKlV(R=e3=?vtjy zPlenMuTs~WMv5>oc4QRH2nDyQWfu3~k56frwpzn2Y_7Lb4;jwD(PU`Tri!gJ4<47$ zOzNNA{zsNzBG*J{&!ze=A&R8bYBnlJ5XnSRY)}eTj^E^35ykkAVc?0?6FvZk@9eF- zW4OVOEh$wL{{T+g*F&JnzG8N(&!KEtu4x|7!(YsPw|u4Ka?uGs1uBcUr{J_oQrno} zA!z40GvZ=k6bf~Z-vWvt84j8a$guPv9*vN+m1V`CxRj~{r94*7UpLL(=XII)08vPT z@A~K1ZpCdk*1pB)=}WI>>7K#>3fN|7=U!lS{e5{;X;}s|@|ovUTf$YiGUq9=0J-&H8mE9`1N_5YPID0_kuF#8imH-W+0eY1GfT<9A(ymuJ-M3sIkk zl}2?Nj2pwAS-=@Y0OnP0--?R_)?-xU2#qW1UpQrT{aBLt1iqc@AU>Yv^tkBONRu+F zQ>LE+35vp6!Hp>%X`963z2!g_ngtA4(9(Rf=i+#kRW5V3(Wun0A!G}e@0&U=uRi+x zQQG5K?Y2KJW3aFuxUg+mT1QYF*XFv)>82|%S{UH+L@0{BN%1;ExI1P?`Mi`A#v+c& z4OvpleFx&}$8`5a*5RyaeHYD9UC%VB5jxmOY|=?Y-t^81ogq8Ys_~W}teh~+m?`d zaqtpK(84QHRB#VQp}j@GVj>m5#2A;+Sb3L17hE?6_|@S>SeUSgl=fXY>(^hc*B%o} zCjQ;2L3WGndL83Q5@A+PQIfWB5G?O<(n4GcFznun@VFq7xY``Vz5|=ISn1o6nf<@p zB_dKPb}Re~!14+`VI_5rAY`$#AtoA&;UkF|`$2&`3lT8(VdMUfX4SZJ$C5ojy`S9g z8}@a(K7|eH_K5b$KCDWJSG`B^1z5u5ertMC|3Rz&4g%1IJjaZ zQ~dm#4f4#WaDAE+2y$?+N|gd@fh27z zH?bpLl|0nTF147-gJa0TJ((1e%W9-m@9cZF`+UE;HSfx^xHDho+f%syocw!SLC@YX zsO=HB1MH3N!90iX|Kvz7@cm}Zu=KC!wtR?$=QoY~9O`_4G5<0TpTW8kM^VJIfN(4T z7e$!6P|rY+cIpNRaHz?LBR{o`5s_EzS#C5-Zi~m~O`a>VXmZplz3sWa=8x_XJO}VF z0fwu_^JRvL+Lst!+#sHxU4t|P5*ZT6kg%v0y~HOL6wqY4V3}H_(6^+7zKcq4#p+U0 z)L#}IF23zp%Axp{iYo=>!*4^TdbIs2Ge@$oMBW(5pZw7U3)f*TqQSjKvmo0>Cj4^# zy9I_5)j1~zq-J$UG8PE3Zx>2OFS5?fJ_95`l`6sFC&(wwEC(=4jAdbRaR z&(pFNLVCz7jJar{Z{_$T;ytCbYcR+!S!QaeR_~1{mW^<}0MPuis|_9-bV+}(3JT}_ zD6LzC>jzMmLs~wdPu0L}jAHcI@(70fF2GBETy=IQGLn+DaQqcI{&l<^@4|EBO^1ea ztIZAbJ~o-a%S>HBKtjccPB~7~T-S1@sJTrh6KyzO0r6G zkZ1bKAX&+d|K*>!#LrqLCg@Km+I6Iw$O$i(!cgH}!Gt9#dtSuIhJ%_Wis@VOFj_P< z7=fcknL}Gkce5Fu#Iq0za-{ti0amp`;a@$;YNwl^9zUod{9jM|fK zn-Dht-5Bm>59RSCEth2sI#2{&G6tT*7*&p|yb2kNj4sE_3X^CGK?27`<5f2_r0lf} ztHDo8HrUDLh#wIt4!Kw(GZF;UP40%t^N+G@aKFbRTaS)?&6GN2s%;*&f|6}RW-eDT(If1 zGcXfaba#t4C|99m?sxItiPX-yqh5dbzg=#_69GFa6An=zE(ZM%u&$|03VP zvhGx0uU@5&CCHY3J=dsYf_{5H_`%0wi?ClCHs#elL*5>|Hn5kz9D%rtK@R&7`lgh^ zFN=e%5w;mR;O$%ozrG?Z?#PaRS=zc-{bQJc93Q%zAUfQ`osEz1Co}iu*iD2qo0)T5 ziP#IuGx#3=v?TRwAHMkE@q@y7AmlZO{T$~L`Myf={u-{*9k)m5wfOF}Z^`Yh{uV!)4W zcf_9OGIIZdDK5{r@5RaH*^}yk45BFh`qWP@+cV9na=RP)`S(wT3(`qcwaE1_onBFy zz(3Aagp$)iH+IP5IA4?-%~wgEJULE9VHsAc#$cL`EMd@bN#4QsqzCLY+wVSZaqsLo z&2isB^&uh=!@x>}{8Hlu<^>_2#&i$6l|Bx0C^1vkz{vM(26<@y?U3@{PR`2;s|kN7 z+X$@evc^5WyVAjgdd=(PZnM%{gg#OFx?CkH9aQi3rFtu=Luy6+L(BBiJ;$ zxI&QVJp<}|_`wOSC<2F95Gq73RbF0mAOE(DPX@%;rh+!2e&21${Mui&e#FbQKDPfJ zy;uU6O}XY5c;oZq7LxNoU9W$b0g8^bl&6O-$++G{mdC;YyW%)6*VbMljK0vYTs?(W zte*Vf&piOS4QT_9VTkmS$CL0wg~!;yOstLs-3Wa81{6;X)bOE=eZt8&xdU5Qaj^XS zasCL7$iMhviBsU!ScF{}S7OP05b+TF@a|x@o$e6?Nq4+$D(8<1N6oQakA5r5M+0wd{|-qO9;i z3ivu$`et5{G$AlS_wJ?sE;s@OWlaBdTF(U3))z$ILVoUjkhbkXz>n^;Hb6GbTvUqu zE+CG7Q>st;AG2yoQob90I34tVKpgoW30lD6y&MCg%*7Nr=Dgf@0N;hIkfTHCP z_4W1M;do<~Jq%y%3q#ihN5QzT{Rh6h?aRciJTc};syn?G@s6MCorr*GTNFX*)Ho2s zWVpL_VofrYeIu%8%EXkTcrTr2kHQQ$VYE3lp#HK`OH)`p#yQ5IR@5b~udJO>{E_X- zNA+qLhB`-h+LX(gV0A8fS?CO_VBaKvniw9l2uY8* zwoE_#k5*~+52e>!AlH-sBkBWFQsO^rb2GoTr#-#x0tQcUfTmPjwPQRf z)Q?-646ZhKH+$G*J*eD2?2c-?CR4hsi|Nv;16AqTYrLMhc{Oyw2v#PhF3sY-TBleq zBF2y%>lNPS`Y^rMhC@jizy~wL2O$S?@3Pj}#rTC=bSPt?R@!r( z@>L}ndKByuTx5cJimG_O%3*erzM6fkmz9h`PZ6eX%hzm z2qV=3-__tFmXoJhG1LMn?_bNyS%|1+0B?UdZUYP8&Ch0VzRQE(aVgl>U85}3S;*eD zSNQc>2fMdQ_Odws%YY_Lx2dn;su)$*o&^czmDlaBxFgU!O*W9UChex9fzD@Bi=uX? zQwV~Fi2ZGIA!p@JRNekLFP^apkN~U2_7o+ogF%Nob^R}Li2ZNK?prkSc?TZh)6#9n0ZNsaAn_@F zj3a@6;l&F#BmdhDeZ52BIGR)rWsYGD-9jn7vt97r)lFaZA2Ae$hTeLj9Yyt4_s;q& zw|;CL!+54TUu==~7vlUyUE*WfmF8F60?oJOhWa03TD>nn7b3Jbeyc?um0ghHTEWY5 z1nn0qkD1&H@A3xQVAk&t0(V*oGeft3YWALF0MP5kH@{c^BVC-xK7=_YdP2?!tRN0 zZCV$k=h5BMKg01w7P`Noqi%kAckaKrikncir%rsE9i*-cbe(M4 z3*)PBJhYTDT6(Co->V0a>P!2a0aftR9OZcsL!&)!RGqx^KZUcv#he=lli6=PRn&Dt zi6kW+gG*h#;i*Zss(dMv!Yo1YRuzuLK@pE)N^d;>ci5@@K51^8c(XkZz^I$8ITB2|CnjLMq>Gy5G4UgLj(Efin%IRosr{nW1*M#z7_# zyZ=?e)5tpC>Yd2JM|E6SC{hFx4H6yBrI-TB-4fV0+Ajg}&PL*$!Gh!8uv#hJ4Wo2c zYlWRt$UG6b_c$n1LPdPwW_Uc{Cgid35R@!6d*Xdn+jGebrVQIH#Vkbib+?tHb8= zF_rGW!F+tk-eM=&Z0EN}K#d*2CL4!AHAR-A0X-lxuUd@(P5cvLtnoGqI8i^_kosgFLWz12GI$q z7Q*AydpE{Yi;Pwgt4`Jb+epdGkf(PO+^o#Vxw>mZr{&(rzU>l|w|dNphp^Us!AFx4 zCcEJxdId=~aSG$exctEpX;%AclX+DsOokvDGQo~S6$CZrngG~6q7vufW;EJ(8_bmR zqaPNTfQP`YN*<yf{^l8vV7#N5SW;LJ$fAS`ZT7hx&Rl7ow+o*IU+# z;cb^`8C}MxqedbOh@WA^@MU0gea(bAPfh-cAd7*Ai#-30Esi1%OX`FH!<`&MB4d75 zqKkn^6|GLYP5@ccC^yNb_U=%^f&%ZhvqO2|A)=m>eCmJVB{$Pa0jf*r{wqQ9%=1}4 zz_`!!;|^*SNcBqU1+H5H0PVgWYvmSxKD}*>q(PyH-f+Jqrd#(gn1FQ^?UA%ATy0mo zsgY(gMAJ~3=t;?1Mpq=Cb5H0jul$sNfX8^b@JF3_KO zw7TQQvwKwqcC3-st$k8<&1611HjQ&NJxX_8W_ngjl-3fsgl#4)ID_bjfZ}Uw3x+OU z6th1oIG3jHM=#IHN)y;Q9EQWXJJq`XK2Dn^VfUT*rk(9-joji2=69^{{_5RL`-=>p zMDn}s8%E^Of3s>ZYV7NDNW8k_aPzNwQx?AMUg_P6KlfpnsDwiai_Q}l3Ih!(mt-tD zgRoSgxNi&W(~#`$^11QqF&cf!}di4jIPuXc|97gLiY|uN=s39 zoo&+)#v9yTNI(*PO1Q#Fd` zxd@&Yhz`F8)pTTt@fh#?P1%iW-8*Yu&^?kzn8Iw=4{5uqivNae@t%|TJeLZ}jqip{ zgLeTOXMEUnzS-pHT9?Pl^XIHdhh%V&jLZMn4ty?C+t1Ff>>r0cxSJPd%$YP3!pqiX z_p;%3P517C3Wv0Ec~A99;GtW} z5UthbH)KDL&TG&A_Bdx2wpZzX5GwJ%_~as6sb_?iL4)(s0M=(mU{}hlmEL@3|2uyD zT8vByz_Q=@e*QoKSf=6IFA*%o7c7wo^#rN#-Dq$coy)wMUM>#NRa9Shp)6Sf)uaX2f)dg=D+Tf)g*r*eG^^r_X*wIz1g0)(||ZEk+g`O@Z|i z0zX}uKN{%q=MuqmKpWH>j#$nwoc>C$Syx;u-3lHI4D}VjtA&2lXa9Qd|8Hg40x!I^ zUVDQrwF+NJfAh}}H2`_>yzotFu=>dt9DHL4z!bcSQV25BzTb9QFbr-;o%R!AYpm5^ z3eI~P;8eLrGrs0TAv}Ld*X*nxK@@uiqdNw=``B+!!TH;_R;_&iM9Eq?7!|VKwq$4I z19P5BD=ny-0LA}Rnm2HS`jTzm8}819xgW_5=lg*Dg6lId5aE4GZccwP?ooYm;ci;+ zw0Dvo-5bBmh?#;f9D#F@8xz~B=qZ$4Qs>Un;MO8Lrguh-%-M(?MJ=gYkS+{`z>!sF zjvZ8IWcMHd=_w%Rf2sXdc%9v~{0PG+a%ZW)2-Rwi2<%k>0S*-vT!ZCFS_-|x*|!Na zQFV9KcLAxT)_S+y+`A`2cy7MAPbohLVTQ!Ni#vHq!8;Lxfs>I1fzf>vlQ+!;;4#|n zi4X82njEAAMKND4knf+R0!@Z@hInSw{VJ>HKSXw0X+rsoM~Odz<{%p^*)6zHKdOd< zh`qZi+bp!cPhp1qzzV=AbM9EJzU3GI0JS6JESOS4?ul3~b6RfqNyM{0yO~_+ngn9N zwnS_}N2LQw-zsL>jlh0asC0N24V=#SaQPFME#OW8A)j$Dxlk^z>CFv?&5PLl=hbT% zaP0(=BHfb$?A9-jjex)LO*qU|(!K zjx_Z=^Dn1iEIOsUQd;0o#D6HZZc|Q$F(@otZcGiBgN?gtB!JqH?|Be!53ShGgej+B z{;meq@=e$eK_tx6D%z^RdA6u@~iMLPA&Wd?>ft!}5XXYM#r20*!^?DzWHze!oBM+Nb)T zmo49z}lJ{CZcVg561WjY`yyXn^DMJ?=WDnZ#JQZom?qxmq) z((t1q%Tg3_!!0;okX;ivUY;wmVe zXulP@MH9K@L>nsjSd-pTPZOfCizWz63pGI)s}J!ecl!{&#DwvCX0O^U%4gzcu5B6k zE)H%DUwoJ6JW>`~KfMAWRgWNL47LJuQBD^=N@;0D_M%!ISD!m$OAiGXz~}puaLKtK zqCniw=7aA2IzE770o13O(470}MrJ<#h2?;+Ph=OyTiU82*L-8nCI`%QGh+Zee-u72 z5Ti!Q`~fY5p<*M+ixh{mQi^n7OdLtmf=>M`7)^A~V)A1#-Cq4ldRdZKK9V6`qX1DZ z4vH1NwZ==YI;ol2b`<^Vnfi@{=A6YFRb2?5${+x!m$g^bdx)o*<#;5oDw4}4r+ybk z_MBh<9DxiGnc*Dgb$vV@TcFq!>SysGxTgR1oiiX$IGw$o{{AW(i1BGQIxLSO=LgfR z!0x9`folJ1M2$OiZFEWMkA{}q(IgXU=cJseGZ2zAhhscU0eR*kDhBJV-%L)WZWudG zMDKBr@LjiQUXt1SeC(55E7R`hi}gHntWdJQua4;DC`8H*$8gj=@zUjvEZpgL4F;IU zZH}=kOe*)$I1st+qQ@Ms`yBn&JTOcQjj#D>YESTtFG-=lZp?xk4l^M82$L9C2~+^E z@?h^=n{J=Peeyyp%BO%C$ZyGC_cCCx4CD62DJnMz`xn`SMR$}>h$=SID-$v`4ZM#& z@a7m}zQ$wF5wtn=T;nmoCScZvm+AIk9DxZ18ah3vvsZfNL=ZDz?+XzjaOuVaIlZ|x zDBjscp^?Dm52S0WuwDeEAL?r7MxlGupBn`!idR^bhA3imX7Y zPrCh&{4g3B)*%P$f`E=CcbCzBM$7?FfoVf%6)n8htpeL@BE60asJuR<^Mgu&4W43?#Z7E2LG=q$&`|76sU#GKOs7 zhAEhmk*saoQG`!Hm$&cGSiXg$IUTRcZzA3w_57p~qkuGDos;` z3L7g~g=FBG>xk=S*p-KAwoTs5n^S6QI0RZ2i5vjyeK=`GsF4O2ag^}!XwPa0`y4#r z2!V3lOWMmz)otehPf(DzJ|P{_&G!x2?0OG(auq*>;jktajEsm5oAF&(M3Hs?-dq6w zT5Z+{JyqckeUL?$v|F2xyFl@{G^Zxc*HfhqLQzDCd5cjz@roNVT(sjAzn_UBG&1kk z;wa7=HBSKu@uwCjrSI6K3$KVrN4$S>&Ds1f0QLcVZpt(Dg#oxXyxxMGUs$n4f}q2B zIjQm_;vfZf7JZtJkO|5fLcW0s910IipE{eQD28LVVjnv8j|S~*-L!o4O)37q_*uD zO0sBUT9?mOB7_vr1xgpqXywd-5a1TS@^!ZRmFU$sb!h1OmfeIn>E+qfFqB74O=^fx zh#_QMXr%^6cZ;!Qg%Yi8Q-ta>%MhSP_gWy?XoKXomStQWkQ8_3VGaMMxV1Nr*XeN8Gbm4!7*S>k)Z6l_kzgU)vt&*@FUrK=`pE7$;o%;qj5&R!j2&n*vN%bu zb-U64b^VxW+MN}G4bq^)kSsZ|mvjJ4@`+l<-EQN+f6$gF^X%nXsgi?YaeK8+y{qpk zkjMp%mL_7DRu3dIfx2zwTBRCNDF(fsNE1JGS#w1wnfz5k{8OtV>AtLi5qpy>zDrLy zDCQSsyBxLK)V`PSk~za#$z{Yiyt?D064>rR_^D9f*S5fNDmj#l-#_Waqs?IxRiVjX z5f0qrXAHi=^$P!(i>1d7C&Sz2`GTE%Xr*eaniqcxHPV{L$TC#Gxz zB?_n{b`$6?^rA>ut4_~?1ha0OfOpZ9tHf0Bc`3;CGgmyX5fq%g@gF|K2xiB%MHKZ1 zBud};rM`94J0yaKl!=gYkXWi_c{)`7mI)liA_WjGOE(Q5;uqC! z-}QOUj@cr1#TU6D{nPBgyj|=rhmY5z@OTTrYUE;@Uk&8tCoLJQ5*SkfA_5Y+nN=>F zq|#v-z8SlzOJ0C5u~bLqN}UBRJX#=9`T!>9a!6x~qNi*=Ds^mMtIl9qvO8P~<0}t* zhpC*P8w9~*mVI}uWDAzjR4|5P)?xb>_nq{MTNVggL4O#$<_p(%K zGptti^}TX7_|`!V9M9q(Ti(p`+#O4~rF6aqNLMc`1^uG>E;Z{mSRjT`-56|9l3P4e zkzR?ZA-QxYBsN+JYsKr6ki3bc4zqLjf-x1_jNvrR5mV3uD&X{g*m+9E0+RpbGm=%Y zojVHS4O5_<+feYfj{N%$NMB^UehBBp=e%CJc4K+pu5{|}9B@K(RK&h&;0&wamb_oEg&< zw5wg<{!&)(X0_%&PEgO44Qy$hx^MHMT{Yy`6==9)F3 z7rF?&LVi+dfsN9hT__(SLcX$z!z%wSQk)_^*Tz;e=tRC*D85zFeQdRUEdIIt{5bhy zvtGyFS@*d6;{8^aou`NCeY4Bn{6=?Ave@dqWo09-sV>k-S;)0!<58G`hZ?!aw0X>f zo<8x>QBdq{kS`U$5Y5lm7)^NzlZj*4sZRT&B;zytB@Ejun0P_!rmBJ|Riz?nY?~hb z@LrF%O>uQ10LwZz!}+uu1h9y}#3TUeEe^uR^s4!RsaBoN(bA_$B`YCDq9V~mFT#M8 zmOGDh#KneQ!O<{b2?oP#-cnPlqRa_|#hXNcG>?>4$=|dl+PnNr*aa(3jJY6O;~%IP zQSYk9^Pve?wWMK%L32EH3m{Pau4)F115$gPrCmv2hVD_&MkQO&dt%|0?MMs;aiL6t z4~1NcK*brsK-a;!t}^*&QS<_)one0gn)-M}T+M@0nqBkN1ZQgM`I3Up8K3^T@$Ry{ zJF5N3h>ClejG0g0)@kMQfRgEA@E(m- z%u)*4TB_#UKTtH;Q-vS&+sqkEo;A?Y=A%hE+5G7ZLc@p`2gDs=3AR>2^C}O7O;lvk zyaxlBTVUKB1294GI_$0Idvc$I4Zl|}8S@S(DVQri@@eNDh;fPv3VA+W{u+i)L9Bq^ z4cvj0aN#2f{hAM^YLyDzxzc-rQaAywVS%VY$YctETJixXF5PA8q=TF+sD2~bY$QU& z-!W%0Ju$JDMKmXR2&C}lPreeRb676S3C$Z|R@J#czYTNmz zc)+SRxa7-7#Cqvq-UcI8Q@|sYW=i?WkYj_{N=UjRE`i?F;?%&Ri5XMETq~j-^6NM9dGQ6Z#;J~9y4n~sm%Q@A`H4B&WYu&O1L#?+i`!lNr)$|0`Z$5*oG2-!TYfw ziwwR+Lk6F$ibPmSvU1A6#nA!)jyy{adIV-U#Yz!k$H5B%7XZWa{$Gx%Y*?6A1FR{< zJ(i2gGwZEoXEVaxe0I*d#)+CEGsXQ9y2Kv^rL!kp<7Acw?)cip_2|ViF7~rA7ehGH zQJ_RJQRXo+=&BsYKzxdE0C}pCGsbHrA45(8y^O4=G2OK1*TUUM4i`s>&EUZ&>2#_tKLceIb{;X#~rJw%BeLUN(?iBv`deQr+E+PKA_rSh@FP&xrMuuZly3L0b zsUa=%ovN_Oyx#~54!Nq%g}MPZGt7vBs#stm9V$xJj*74x6A&hNt0gHtG&TWX6lq6^ z=FpJwOR{+62|Y{GOf*Osg2xvUG7{iShd>(iVLe?1Ij~@(X8BLTj$c!kUfC~Lh5b6r zoVVM@pf1LyoJ;?(XSV5^%|y#yQZKy#R6Utf0yxTnYY++1fQs`Jo$;hy4TKxnN=QOP z^W)72#rFiHes~GOonsR`{LMqj3}TWi!vqz1AU&lKtwkx3DJg>_Ppbk`8d6W`W4XoT z?-GE20f4G~r8Tura(p?3vg2$oshVy&c{zLj2z%#QRvtu))wFxdf zz_djMH9<*_v(jBl05V^^YsouKb&f-U2=j_OOt=MV%Eb$_Ija(S%%u|N#)owpqEvRs zH!-xuph5$}nv)*Ka=n6IDkwby%%=S3U`y&O$Ycqy|7;k$_yUG7)x*grIaYH9e%5$P z&$kLW*_Si>{ND1Z_X~{(J@2s#-iT6h#nvFVv1LXNF_O2di(7-fCS@z4iN*jH<(!yg z1P4t#JJtp4la1cmK&!-#-xP`n9pTC^B->}Lx6)>?(|%}6S9X)4l9DQoAz(wEE)NYo z%J^+^vZ_95v?>;hsavI@ktukw*UI4Fw*<&v&j&yA;AbQ}=&`wnH@?lA6EvN%DECr$zhI(j+&LvfYpx_^QcQ?Z$?+JLqizew0k7q$;*BLV=@1dc zyKEPds5G{^VVs7SJ)4MkAu6&|ta2vgu1_gab3@T0S{C|`438MMxuQWwNRv87BAXbj zVgaWGPe<*E8x0M?IISK|41JUhkzK@pgYpMa0$^`h{Bt&R?+XRY`BJx=iF?aHxT8C^ zOgHapc;{Sg;j?=q;P3aPkyx$xaa3WIJ7 zJ=%v6ehyhuvF^nU*5X8SEndpW`FQ{zZ&1^dvLwreRVrGv8LGT5;98me!%oqU|LVMZhjG&XQ1$=uW1K(v%31G{pJdTa$Kzygxzu*7H)TERU6|l7 z;N|yOb@bxZ#R>izT)Q^T*QXu%JdfY-VV1dIIgf`~j`>sBFBc~G$=(^PHW5W(_z@fp zL_{|Yh(w51h6`OKK}Z~(5aQCNAavc03x|^J5VCMnn80ji?;`~AEWU%U;D7%!O%sFU zrcHIOoZp$zNTy9;zW(=~bI-XRC?3S$pS@7-Dv#d!5>7ZDZI2b|&)Ei0)^Ni1+Cz0c zKNJtXzf$tNKo6(TchmCy$R017IGUiZtXxp^yih#2oIFwTyg-i;P8O-xL7(_uQ&Q?S zyTBnQwp44J*#UGlJw}Hw7^Z=h&URk0pbqfr%G#O`+FiSW*SJ(4FgAc7|fyxW? z%E=zdBY3#L_KxUz6f)}F{%1wc2gM)0hK~c459r-gsRO;*QOy<%(ehs2#96@Jcsy40 zs;_te^xgz2AJ8k)3mkERJLJ@X9<^!(*lKk{xSr1Ss;@Zy5QXmol|Sf}b+R>9$zr@& z+8*EodMCDCPa~W@2(A}>RP+KL(0jzwrqksFdt!S)52sBnuIL52Wb%gdQYGJ=P3CWo`i}J#M+s!jSW6IM#YS9~8%m zo;T=8l{(pz&Gm#lnd+5`Sz28*BvbS}kh-2n=pm1)(o*+@0gwk*>XKC8uCE{ zMb8`b5N5$Z^I^R%F_zUfLu|`pE$>)b;P!fFXAe|Wmkv1nL2uQUdpK0r^FTV_^anl3?3Gz{kSDzWi5^@J15VEM!gg-bneYv1FGE{*_JD<;@z+KTa$BlV9 z+7F;bmKc*{Mc}H*mHn7Y+-3IpfSu8nqC2A3iS7|SvL_Kv5f+ls^vayNEmDW;^*`%s z77yey*XzvEr7>oTf7z!yb$+&|0BD&m=f*7e0QMpQc4?Y{*$YR6Od3QPu)|#mKd77L zW=qNBZs=vneWAw!bxR)v>PpvxnlG*IS+#82_mkfET$fLKAh!r-l$+D?i5_JppSS^$ znfXX=PfflDugSC{mYFzG6qz(kOlfz;sYzWSpZ>1YOz()EnTlpJqIdA59)g^8IgZM8 zWJk6OU>Rm%(a>({azSg@t<=ndYb~7FTbR?;JEK!`;f7w8B%>Ab z{KmJ_=P%fS%oDfYo3HN~a}PTkOhvNdAeI8Qgx1Lt=} zZ;{>8Tu-+5lE3Tajf4;C@VQVX%GRi>AUQ8!n_{-pk~OT_eou^`f@<8 zFvY%8B1TI_n{Q3>V5hbLotfLD>MqQ}X=XQFQ&d^>$_<7jw{TOe_gwZmL3FeEnx-cK z&JfK2)%84(1A3X+o^S0Q(WUmTFin>>plReJ!?8!Zbq-+7M*KN18@w*RlK+j}<@U&eM zCtMqi!ps_66*f_^4|bzE36#Le|y+l)F} zv%vPkr^xGl(v*7j700(kZ+CvK*q|VC$}V)wa%;5fLhSPDw{L#&&(O2ZjpOHG&?9uX zi0P3(CKp&WMB77fvnjhR!1a!`Uhfxs=d+tc6ov6en5v1Ju4-Z^CQVUtlWweTtTje6 zD-uT&Gp+~-!HC3)vN498F%cp(!iEj9b5-mD7EKzS!Ho-7zJ=$0XD*i!8ZQ)O(D{lp z!)1zYex5Vu-(4CRSiKJ)W^p*Ld8oY*Z-%aIK_1%mFo!b?vn+!Q&^w$V%z|Hg%*=6mkFo|PBLCEHU2UV9H6;0c zdB=sKckSTX9MOaDz=sH@OzUxKfinv*d$FjjWFfOBx7Q29EXyDR^bW+qI3NcGbt#2i z%|^w{=%EO5#F~L2109Sys&Q1rED}AsVD#qcakACJMni~jqJC5D@P*t0{j9FWcfttg zQi#zrHz~XC-@&2VH3^v%6mGi}0S*nc%XQk^F(E|RI2~TuRTvh);lj|fVeYeYvwEP9 zUh+u~E3kWOZ1>pad09OY?Q9vJp_=7N_iOLy=*Mxtd*@EK@x5_mg)-0|-{k9!1^~f+ zUNB(K5g$I<6y!V<;!u1rXYWIqe(Q0$Al`#RBN3*rAHTTp;^4h-4j1Wg&NZ)hRtfZ- z<1nW;d|Kx9IJ39OW)BGlY`I{BUQeRd9}F6e?^lQFt*mtE)UZMs=+Bo=SHznU^yrUs z&5WYgg7uz$$&@{`{Xm5S*g(_YstAZ$jtHXH{|0(sPaZ%XOdpa9nES3moST~xyV&Ly z89lOk*J%Q-0ebzblk}DT=^=U(wFvY8fJU#3wjMKGd;I2g`6Ft1EE|WbDml%-)B>>!Id`-fPz3;T)g!=!7f42agjyLkP1ldf3#G?B3SK z^&9l8_jFeDdX4YLA$pUv2=t&gju4f1j9%sa``y3F-ofnbnGc94uapb#UWkvUL+@~| z)huWEM~W%b1=Mm7Ak5w+c%1a(#aZZC@9xuC(St(tCTTI~fq;*PvSh?o6HI1e53S_W zvo}-IdD$@-U^XK89VxX3f#i9Dnh;;V5AvzR!X4Naa_Z!&uI&bm@3AGJ;)dz~~b zM(d=!6+k(}TS*8(mhY{|gxj6?w9M#nj76PE=O8-4<3y`0CbMvWGbU>|<+I*>qv_KF zkFukcQ4J=c_i24pMJy$g$$E%hnhvp2=@}hGCbW7!EiHP(T)KYdd(L)`+tk-En1yr+ zjSHAZhA#Eh8xQYJgB}~b?op4;-UReq5Z6p5+le7K`;x)`9le-H>u8Hehv@mWtmwhq z;ia<+^r(j*r`%cZ9D#>c*{Ihhi}?_8D$@NM58!Z`q4#|SBKH&QeVc%u1g?|9Wj48< zutM~t_5|tkFYj|9dRj}1-Y~?eBQ98xHg639PVDf7-Suc=OP&s~it1^jIh=hDGB$d2 z^#fPq=tb8_^&vZMh#p%!XKxRrr37zHZ}G*o z)3QN*bxSrb+^1p|!x~O)_2^yyYq#6`F^*npjFznHHfb&4x^9+lsVCd*YHRqZo1(R9 zvTCJBSzgAq&FImGbib_wsC08NSsz(&lkH;FwMWqd_fk@hgaO>21X`cb`Qj zMDI`O=FPup^>8LJgx-T5gpGzSa+kVFsY~=^=K@W@ePxc`K;`uMe)P0zj72Ll89h7U zd&}ryEx{2QeoRct@9;R*!O~v>s0pxF)CoZu@-4ju6}L~r3b zJ$fv~o$6BOZB7V1ggDoL9_pu&S=d;m{q-I_cxr$i%$zT~&}&RauRi1;nVNteDC_L+ z<9%xM(;8#j9@@?nPPm=%tLp&jegZHm6g$oR4(y&r59`f{6$lY#IXa3xj&Byya6&WT zv)!dWf$mVeN#xp7tsIVHS7jch-1~ z(JR(dc7%Vm7WKX(!36T{ts3BDbQ88RYAxIX!ffD~Rp`|{vltNVNX~M~%vBtu`KI3P zBt&mzC2;8ZMj|O;G=$eOw5GO{MRoxpPGWCc1~^Tu9s(+?epj=n(DNy~@AnBcdVH18 z)-lWIDYr0M12znp3-o+`rmdqm%0#+Y$1i)B;?xQjc~(Z0B!6WKDpcr@E^LI=EQ{Bi zs#*Ni)8uce?VQ(0yrrzSjXHrxqGA?uICH;8@AlE?quud}r~Wv4knJL$4sbMjikIqW z;vmliLTt*KY#S5mo;vf4+Zos>R+6|WsY5eOc2~i2hYp>r6%=KJ1LO+N*x{52=7h5m zKI<)9r$-OeX`zsXheH57I!N?*b3Go4B%kzFccjBgr3KTL5u#8)m=oxIo+iu^KI=ijLl4kt{MhQ@IS-F}yvf(4 zO|G9t#}G9x$cMe{NB5o@TfP2@lzi~}#vbR%=xHZ$vcriFTbdwl-x(J$`rR(G!D|dT%tXC*Sl=LeJItba0aLDACoNwWyApc<5LrdJM2Vo^66~$gm9ke_n!;2Pzq}}7q2;_)D>~+@*HMEa5f!vWC(DQ zkX%3=S)9^(H)x}w$HwS2yzok6z!!sY^b$xFM65^_RDrna(0Zj*8A^+(8bc36!g?`H ze0v1TMa8a5sK-6(71|qpv~!%drBc|r5CF}qkW6RPK_QWc z7Xj$ahuDn9crXiZY` z{HjiZp=8sl7xFr#?t0%791RnBVZUC0G!OJZoz`j`%Qg^`_R7@#bmK?$pt*Q^RI!-y>`k>KEFtg3w3|zLN#D% z^@?!bIwI|ea=9Sh&SLd0-w8EuUAS;stH-?Y0V49aiVTq!*{in(i-$>ot1%)k7AJ@E z?p>q(^?)99tbERI{gWn=MN;)@GMRU6OUrKM^Z68iEHCS}ZW?kemd=zbVqKDL*={~R zI$jAW7A|haFc*oOO^jx_zIA`+(ZhQ$t*K_<4vvqGj*bU^W)7!a3shuszIukx zO01llaRly9_Rd~KYB-AGk1$R$q)C-xiU|Y*X{HKkCY5X{$P5fjWnrOgGlh0GTZom7 zAlPUnTWlo=Ya!a`6Zi&}zJceQo3Ps`J8@V4fqN!juJw<5|Mzo|xvpDndo5k+`+h2t z$)>Vo+PJXDaMGKzn58KCC`-z*NLY9B-~jY)diu1YBjGrS!N|iby}~=|>0#>G19QCl zwgnb&@~l^sh_IC4uBfWEUZaLHAoT7Al?o3>j-Dwz^e(WwsG$aU90sT+*(4`>h;Y*C zl?B*K*`!{rS6ArQqh9?9JvVxTIh+$tDyJ8 zHw_&mM{gv$p7Lov`=6~kvBi4uITy*CVV1s2wlMOVdbQpj!|Gi@-_IG>{KBoyTpz$zfjj}1UTL5jX;i`DMa)j1vGp5aK*BF8D8AvJkOZc19qhbPcLy-OZuDl z-0Fod?_4m2hhFDv#`qF>8a%B=J#HCNAz7~NdL;~BVMS!zY`NaaZ?_wiPrHJbSF=dLq1SJ*jP_GSSMbzC zq-n;27SOlgHfM!6^TGlxOqL}5`#1*_8Jt;W!KpOl_+)61-BYq^beE<--1=W(FUuaQ+z2)sPEf`{H zmQ8~Q=e9ZkksTF||PUSU#OBtW`E= zF$>sZgtK0akgtwJc4&=HPcf>xD13 zdZwVzi*VWTZXYYNr!GBwKp>Bo=HGIkGc)QK#0j%kfxW7BhjT1)^h_b4XS2wJTx1U! zKzwKbuKjE(QiilTyY+CPb)jmS<*EUCo?IA#96eJo==Iab%*;i)AUyeB=5lrm7r4%u z#nVNZFS%`jb!2IcYL;V1Zv^tr1yd;KMVHXiL+BZangy6xGChH}i3`no>|201jjU>_ zCT-U{M{f)oZuQRIe0cu(T#Eksq zw0rpiW09C$&;Z=W6%(*clH6?-MCJl-Ws!n-Vp4hi?J-Ejz2vT z+vd!ax{6uYF_eS6rKSN^DkNis^PyL>j6esYclP@2?BD2Q%E%wVn7tc zMG%6Q$R-;S*jqFZ$ki1b7DZw46bLzNa@ZXAkV~?c7;tXcoO7Bz&1t^I?kCuP{i|PI z_v*y%s2O{v|7!cXZ8Jld-_(0mud3Ffr_kt;JwC~xK!<|~sN-m|hSDqsn1k7K3WZ#e zsS7ZB%-KWz={g!Z$H9dth!f70CJ&R&2rl?SqG$apWRN0lIBJ9eue632vNU;8d>ZH> zzJSG^@v@XkQVj4go^VD$>fu~%^1xp7>>kkzw_nlXrYz~(gu%mF z4~>S{U=QTgwvU^K?_%^;U%H!R#mS4}oHGo1D7A@a(n2TW6r}S_K3wC6IcHW}Er=~R zS%{s6vQqcG!knQJ_HZ7@Zk8x0pw)X1^1i4p*CM9i=#eyEK%LGOvwaidkYfi7YDgVs zFTDvBxqZ4I;MMR#n=e$Kem9q!<)?l+R$wKQdrL*{a^p+uaV=U3hn^u$&+t$Or)jK5 z5Ve)M)I|byLZ5`x8BoWgQa~k6MD{9(E$pAX-s&YccShA%;WWxPyURlFapTMD(^{ky z5WT*MYarJZ`=z%?i_3&hlI%5kJc~okMsMohZ-Ya`9>}?8mI|qey ztiZ|^4tC_X<}4++aCf`$<#oOmDFsB2t2}G=AZz#Z4A2?w)XVAaBf~Q%^`{*ah$w)( zjKmfYRL5HH@KxyT9^hY45!0twVYQn+fbHAddqpqxm7i{kuGgZZfatCJJex^h`{tzG zyXmr*W_ST|z#nFt4s(X`CRH{g9?t#!=4%Q>>=p4pcQO&{)%1<3BWKYb&W{@_q1#A# zIfJ3MPAP(}l6r;E$w8^p9t`YtqTThR>U+WA9?oJ#(1S8k0T&a_SER}&M=^Nw3h*85 zE_SVVzOfpL)Q+-1=&dVrzS0nQ8u7GmoGdhba!{j(hm^q0N?;H8WuUxFIk(Z;GITM( zLbaMr#F|T-vXA8V=2v!9%`Pxi_I_hk6s6T(5cJk9e7=dN*-TB^G?LD1GTTfsUr2&` z@U?7mJBuv$SO8acPnY)h(O>UfNb+`K=gMNVJF0Fj%*}GQu`-I%YA+Ca{dH^po*kPO z#AjCv4{)&H>EJ4$OXt#3emc$SELiHn=&=%KrUnlu^7X=zcaVs+IQG(Ewok9VdsFps zEixi{vu$4AW-HjIyTL`vy_+6iDLiGu$wXN^P=%9wIFY5RdQot)i0;=Sqgm+Loze=LErjH&fvY>nL>TuS9K`aGyeu*oauQwOZWcxtv?AG2 zsLTbYI*MnTi&TF!+Fb~Gp8^1JvxL~gxjTwIEDKh)y0Z}U9z$(yzME3J<^23yxmiHH z+~^d?oq?V;aOUL=EO-k=xUoG`AAY(Z@0=@e{=-r({AMcRja61i`bN9B>Z^y^^5_;>ts2=sqBHxIeTl&^U7u4!Gd^tIw z$1R*BFP|?-Ob=FXJF|ayco-PHRJ_m&q#wI~eop;K-{q*fw}9Y607FHlOg8!DQqg-_ zi;7;hde*sum$|?PhLrkXq@%2!gFWtM(c;ru4N&+4e0j__+0Ge$mhF18i3#U#iGUha zH0Sdds5jpFZ7u0Fb=->Gt~OpPS3CYeUQD(es4x{JW+-P?}PJ zwyhq%$J3|D#?cD8J8VfS?4-7J~d=mk;#yO*^)Y4)=7T0Jloa>99T z&rb!!DZz@{8y(#}xnI5uo)q}cT151M)l4D-F7DJu#$Erx{StrH9ETAt} z$cmSxQlZ&nx07aV8`Y-+qPIKM7uPu(49>=hSkL-%2728|v$r$%TJL%zxSQqX{o4D> z4L^FYdhh>l^-iT@$_F`;Q@o#EOR)U*YjSaZ7CrK1WdrGuJLDnNH?vNiZVHV~n(U?0 z>@y@Gb?J8^4o)uiYPAe{siVSOS)h-cjjA^qi{mM(C;4yTjmiCVG$VPrZe?*csaR!TB3STsfGYUb06sa8W6q7Y036~n)N1&OIe@22J-`PyOYo$jezo|2tQrsYWYFu*LJ#^j(fjxJ z&rdk1(dcc_yM@`C1HG?)!f8o^Y|fCKZCV~})#;=gXXxXylcLpQk3B&zD^=esaB)^7 zx`5r&b;R|KgSuH#)zpO1%iEJ~uN@q{Zr(HO`qAShJDT`XK0kS<9Z#OvFW3{JXK!6H zdViFMGtkRa_vS?JF)(_R5514m&?Au_OrYS_hu&B2X0bC%m7&ls@T}$2^__{OV?_Q^ z{WQ*;G-C@nZlH$ptVo8{-j>v6IYw*CfD_I_HJR|M)$*M+W}(+9w|Sw{Dwo}u!Ige+(c_<>w6$^47{f%Dsh0Z} zXbhK%-e3QIHv_$5b$4c5Z*jo|jy`eA$&Hx6JA zkto`mGsQ&jZ*=)?Mu3Ai4#+P5$T3YOY?%`OknrEz&<`Gjrw(t$+XbQS@(X8n!r2Cg zP=0wvUq75C_HY2L=RL)MMQ6U?J+*gnBtjz z<0obdi?T-pD0^907{XbHhcm~Z9?C;VVV06q;pC2%`Z2Q9e+!7-gmYxzb6oUZ4lY=$ z#}BT`-9*l<=TUL(-pqKoA_;u z9=`xB6TN@``ffIQ&b$@LZbP8={^n8vIhB(S*NPtP8&Vp0nd`js8{UnPAHA|9*Uj=r z`H$}wW%U+b6zTT>)VX4uEJ@isokpu6 z2SVQkV8=b2m~hg?3GmQV7HhqrJr@rAYdxaW@tzD{fnIwOz5MgYOk~^B(YrF}b)LU9 zmU}IFGH$5`Q_$mCs|SzF65T9xvMgY&N2|Bu?G_^F;QXJ}^IJ2@cg+xI!s)t)lLvkA zg4V=MkR6VAe96_FNQ98?ihghsD!KI9sW8n_VI zx#GpkR*x2MVDI&!=Vf{-dQ_c$o8_QKC(A7K_`97Ky_=0y(pqF>(OdTwxb?>sERO!& zEXL%q=zCvL1aqmBq{-6JLhf*o9$#$cT&m!)wN--IYX+NePOeADTi%SysrryZ^w@wzdRj1Yw7r3z_QRgqmyO1aXo4kTAiq(lqu^&&t|22 zk@Hh%g65uT5qboDCS4uiNlcxMWwVg;|1>ou-= z^|0uH41(6ZGU(CsnU}XAM&x=-Ql_HUa-#wwquir(3h z(4&)OHhMeN`74rr*jOD!W*eCoy~#{ij=hDECMTqpQuT3~;$*OVx|@ZKEu|zGxMM(_ zZH7uUpcmM~xi>9msM~Iopo&>{?X$*%BIOc;h#OFrQDe}4VBBu{gtOIX zw_E(&-s?w?5rwn%S*zUkqo;rJ1Agwq#jp+BmxbO%`PbR#?Nu`Y(Tm26Gdely)7E-C zSaZgaIp@%v=uo7qJ-d<9k+8ZcJuU7{EsInsYM&uGT52apM~AvVEE*v9&pLa=%FVc>fQWI?<=;>h+g;XNz2*(L z3vm!Paq=w<@}!&kdX_z%*-5>)St*EzQ>P5rs-K|AO7Cl3f4*E%RV)3&B{ebsLL=O+h#1?qPNja{Y#Q}M2@`XoH zoGjAsWNW*L61bh87g3sp>|MS1`8SB(A7?>QWk;jg(|tuR5@s(-MsG5t?rWHCPyL=w z8~kIQtVqr@!a$>!WK^9Yb#7;2StOQ-sA0XgRjcnekB(;~4TVXjj;&t!EOkx)4`}rw zVfLbA^c1~`hC+UyinV?o$4lSbCDbvt$D0UW+D#b}^fs~7li&i9hBE9lL?_EuEwg`e z5*WQSs@AQJ5G7wt%|h?{&@~nu3N6(Xi&Jhn@4E>eg^%4=}m;kD;C8TaXq_nbFvhf`OHfqWE?HRpZ*l>xsa0BLRNwc#hlb;$!KRw z*t`u@AW!#1+C>y%nBwMsKz`eXZv&jAZcZ+rXa4vPaO!8-yXmYGmmgrkhfY42~9&wp=LH zGeeskSEu0>LQ z^vINsCpJ*q#0HMd!3`;h;Uja}=1ZgLcsa6v6Q(a;U?I*T$jeJey|#aBQ)R>WIjaXT zeDf)}QynEaTCmllZr*y*c^|=Lo)0}QeST-Aq0RpZq&HAX9Wm4r5zHFOBEToX1&uDK z*(;$Q*%sD>n4BuSfaoWBt^jN(1?Q|ZYwDcFKPsoLvkkJbXYxBhd^x>v3yeZJ%hj=%OU~3{p02lCY<4w9>MaZ;x*rEw3h{VJ1}|6 zLXWz;d@J~FucPQ+nMBXfq|Et)33g;Z;47t>LcS^y%#@Y=EbJ(YtRW#!*vmi?Qm<%% zh(i_w46pP~75{*WspLB z4@>oS-rhe(*x*e^&sX4Hd7tdtA=XpDrJ7qRyQUJ!{oCG=^^a zYR^bVbgBq;f}eI8T4#SRCr1w_W9mhQ7Fe8x<)@oRN3eRaR$VT7v6hFP?W{LhkIYvp z$y!D0-INSHzF_%i^U~tqWK|@I>SZ?>T95-1WlLM=c7mj#UlXxbT`_t_%balf?HiAF z%a~tDdrjt=f}FZGb;bz_#k=W9;c3a&!=zK#1AWZb+p5?0PmW{{XRK9MjGjkJ^l*AN zP^nRWDkcVUJU4^Q#ocX6toIwUY2?VEcGO`fG3Ip9-aIWqqq8s(NirE zJsUjdU?Lgap5S36)Zqyw3e4vi)WSty6EsQNdbh4Dh#UhXGV|X}Y^j2RndPYmMde-7W z)(ZM#4Ytp^3aE+cBYG*W_*ncFV-y1fe@s(nL>;978B|APFGDxWyI+1w#9DR5=&6>8 z9_5dy+cY8%gDL|id6OqbeAk1+;Z z^sKS7UQHf+G9McHz#HRw`i2Q77ker8au&k}!O=nwXC^QG7F-V}ws0OE#_0XW-qo|Z z4FtiT5FCRVS1PVJgRw!4E8#|N65Jab46Z}Kq*^)P$; z`Thul)1zV^&a#=xeHPK;73Lwjz_=b9oEU65;CY-Mze4pI zKv2)2mWLC(Dra}Eb6wz#q~_wpTS9yILH4xkyS#nYX(vLw4WkPqm^Wh5P*AT01oaFR zRnHtMw)q6=51&A-BByHCsmleYB<5%8B*4&Z+4!CFoR2#luP361!iC4{Pk1=rA3;4s zJ=Jr<#?|o=yZgTabi+c;la)^|=ybqWue|_iZq6fRNxj?k9yy#1AgHIPM?I^`a~*C! zO`tBX@NIUq%=}})5Dm`MX9=sry{Vm9Kt1gbaXO<)Jt`NPKm->Q6{)vyqrW}QcoVYNTsIvv`VJEZH2kkwL%ij6?yj@@6;cNikgL;N)!392im%ZPMAbREj zqI0Hrb1rpSCl0nuxtB(q8rD1DsyA}t!g(4YdaqX)obQh?I6W%PQa6b+F?1w!C*d1K zuk^pgSsq~BbI?#u5>Xc?%dpd{-UN*3NEYeSEg-08sO#bMAwBbL`dk-d-yBjG^#h8V zC2`nE2B3TJZ>pO`@>t{n^=`N4{a1K68$eJ`QIUGfZqsIZx>5zAh)QZ>!y>=axvr5w4c$f+F?TkD%WBBMi<;AoX;{!oOn2lQ%*As6Fd< z3owO+lE;;UhI&@ZLi6@HbCNn6vkaQVd4|FHyxxDuUGM!7)T;zikMg!GRPcis%E7Sa zvepD@svZM-D^L$FptCLWUPI~|xHtz|nIt%kRI~_EXv-W(~6wX2WzRP9ra=TxzkkWcwI-f7dX892Y=ldhlrz?TfTh!=%Slz7q zd)aMlGtEtWh~hDUdi77$kkqK}Qz;pu?g{xMeR_h2^BQ-(1`q~k9njz$$TF9xX`5$U z!I~(-*RAG&o~DrjFge$G?hla=Pv37jW@rc91M%SEyg>C{ao1}ALA@HVxSrkYyu6v+ zxp1%)kZom%Gc*r-5BZZ?y-wSa?ehWGJ*IG?4IqltPhxLQ&+G3~NPXeNbjf7? zKgF$y)#f)-_qbB^1f6z$&l1J_571ZvlV%%E~- zR_8x@*Xbti%`QRrK)$r6e{&~+J&o#}B!v^%Ea&^ILsNU2hn??av|b+4Irx24OQ-Xz9Gc?WiL@I z%@sGkvRDUd{CI+g6HDLaZQ{HIhV`I(gP5EnYlbA7B@)S6K&W07Sa5+_w@je6;GQxM z3y)@Ms-cN}9=E_*C(t~J>upoYB%XG_rRohQ073N!s?@{aYyjWBh3eHnsa$Zgn|*a` z`JiJ(V+!_xPY{km$DIcmw@}LU@&SOWh5pSWGdQP{gw&sp$l+`Pp?ZcIst59Yl0f~x ze?|AgI}#4>Ja0%lP|vZ2ECqWRl9xd~wte40_BiYW-KTF)j8YHPYXCt#q7LS4tmzdCs13L7STMAPgIZjn{cvhIaT(^kqeVdJGn_)q(~%d0AX-AzM}cF#^BhSOaFHSl9p zK?Lr&vh0v%Zv;Kmm^x~40zE8ua!g45%ex=?)bTn>-s+u%IBAH0Svb#T$r^cP>xiM9 z^xWVwU%b2Xj_6Ux>nC~i zPDGYS#$B}p?p--#4>YcBEW+k#5nNt?MR+)YUSGiL_oVLhSo)jirP-S>k!X z=)HGmpI_X;URLaaASjZ~L1o)`+bN2u(+Y*Hc@pnt`IjPk*1P0p_;Dk37DYGX2Pt+C zsXLPs*$v3vFqFU^(1TEjld%OUN5;XPq)-1LdNuYQZGl~y-t2-n?CjTVP%M&85VYhU ze01PRqNH_BUvKqPO`#{U)D<&+5H1wGnyaOf$!Q7HeOXji>Q1vF8Li%VxyBcUdQ+sb z0KAzjZTaR;(EBER&gzG0u#V&y-5$a!3f44zS*INe4?Ia0%sVZUN6*xVo5f}-SOT?0 z8cM)ynCFhf?o5rJo3qY}?_%?q!Z{4bqrv%T_*h~Kl0H4T5UYp!5XV|Q)8{IBNf5hn z-XUAD3Ray{Q47)Y1tOY|)n+NJUA+dG`$(bF%>sQ?uOyB;*|ZQ~S87BI$GX;u6ykh% zF0=I}aI;)UK{B9sq}BWMj{5Q|dN)Dxi+#&-yLjY`%RIn|DbMy<$VYizHmrMYtaW~< zas5fyhBwrHIFcu{?`VFBFf z1qza3=E8kCoOw|E()~>G?1reMK~Ze7WC<>^WE;#AXc_BGt0+t3WgWd@cbh~VK$%53 zfuq8u@|^`K{WY6BiG$6a#tywW&2s)Y(2I9PvXT4by?B|srqND+Xhpu)Nw!JjC|LyC z1h=mWy@H-O8 zuCTP_aUD+8uU0Q}=$Tn!FEpb6MMrsa>u{=}Q-91NsH3ONQ+Gp%y`E+6{YdRmv|NUF zH&(?#YL6!dl*p&{zXhAF%iqIyMdg?^YGsGhqt}G2Hp>H%?C(sVHgjiQ%~B*!#MOnc zL4y!~>~qrBGK9^O{wCsj6Uk)(dK0O`39EOn4rdl@JEl#rD35aiVxzvzw2B^W7Zl!s z-rQQqF)_gPeW7q;G}aqahByBcaGm09klTCGG%tTBL;F>bwAjt!(K9t-^_)AU5>~I4 z-UM;x*ysVXmim*5l~vflC~|G;l64^@#gkxU$%mrpTi=TrHj^i1sd z)zK^NfnI_Ty=qgTfw$6R={pC}i`^3$diGwT7xqJ$bY@$Oo}aI0Y9zQ&EBaTh&SK`y z5~#6pN9u&Vv#xeKb>2chgm5xOV2^eW)u%z;^g=Xy{#?*Ivcvh2`dkk#tn5O2ZS2YI zM=uK&C7*lH%gY<8g!5DSP4%aavwCU8>V?(5>c*a3I_;zL zYKvP%FHlsB9^6pek%yMu#OAdjg7wCfy~QJg3x*uu3(F_r2dWJplgfa8+vKfYBeLq# zvRTfiF-NJTbCL9)6R0^cR>SB$+CLr!0^SgH-_h|z0`&;|(aR!!7S7gtdhry&g_rjV zE|4G{p%p<`+Q57lclM!2dJt}l78+c@IE!EMgC2|HJ#sJ*$F;ISaOKu*rEwj-IO0dC zp%*R7_ZIF+%F$%RH`qQ}36bbTw@ZGk*MuyGv$mXGC4m~8?Mt90b?jo&=3xgAS$A6g zWU$A13%bacfcIoJnavPWzeX{@W31lC4<_btR@n=7>-8>REIh{WsR(xYe)QM^igR8> zOKB0OMvulFwrR23{Y1dRN0bIk-f4k(&RDg0A3=b z4lm2~v$t>Zqo&Fpm@OO4Z{m1+OESXbCSKn%LYAaC-$@0Djb1Dk+G3L+Pb^;ZJYC0& zh@WS0cc_x>I^ObYY8^r}xQPpVwzqM~c=F@6RBW5OeVddw*bl89sqJ$Oq-nd*^H#43 znTOMAyxStqvNzQds3CK+^teC6Q4`4|uqS>N0Z-5yO7&?@QO7pD#8~eVZkB&lk&F?D zqeUBfv`E%rE!UkBlCM79fUNMlP`59En(A5tHC~k(xUL=xkdsp#>-F)1?c+*A%x6Io zCkg?MP!x%)%3fYvUDc<`Hm_tJDNMA3ZaoCnTT4*^q3dAzS9lurnX0**i<1 zrU;wH6nb3W>rAMF%^Skeg4cK$j?RaSsk8L7#Py~q{0M8;qGt1~&`qzE7T@&-s*Ny;rY&F~IiAqt}FN($Ir?0(Esg zONEa+${n?j*@HC1hf9VQ1_L@-5Z0s4C5Lk|daNBztfW4ZS?YeJp%ait&(x6Bb5&XD zb;;D|IremK0FpWi49cY>Pxr*?b<41xCQpw>PdM0{!RpOsh%R8PcUoPq|5M)0qG}L5 zc{$)Lz)&O4s8iA8QR>_jE6Ccn;%kAI1!4{-*Ok>|76=_qDU0OMYrnkJGc^)iuy}&) zEr(j^vkHKEsk_q8slj!SN4wYW!s@ZlDYf56G<=VRJ*mM7yLUN5`m{&y6y(usMz-dH zu~tP-H;XIiW|ti7;j}LS1_?2}SN2`XB0*25mq?%X3p$^Gywz()R+|NX zvUBiN7FV|t5thsO(}cYriPJQG&_L!cFmoFCoxAeWlhK5lA&u-3D-FH&9nMpbN6*y6 zSdUTwErHrp_A#ygyQx>sTi{98t!p_z{w604>0&2B9wO=!4)!h(R7Zh`>u0Y$dM6-{ zo~e;UvRVSQJMx6o)e@+AS(d;had^q4q>(YW!1bI%z{h2V&Sk7Oo#O9_taftkt=>t< zqxYS?vuAOqio*Cu2)mJKQcW@F1cn4cAk~m2(kPme3fZWZ}j%f8}^%fI~k~z)( z5jrbc;4@$d)Yy`xjxK1`dT9KffjvFx6_|HYsF$UZOtK494Y`N21M+MZQwtkT@)k2k z=o$&s0l}kTC+gl5qo>&{l0}xKM34P%VetxRJmWa$K`HbtVDv6MuGb0qhO;FRy#Siw z2Jsoxw=IFP0X)dF1Zwbijz!8YfLRWuJm)celU0+K$Qe%9-Ne8bt2=w=~v zaRRj^wNT-R7pMyfF62&wdZbTd3>k&ULSE1J!hMX8Iy1>MeY%n=^*i5i{{Q7xuMJsn z!DdYk5sv+dFNDo|~_o1Wr|Ca|BOl@p9 z&w`x`vJY0IUayQid9WE7;0vuGNMe@ZEj|{^If0}B?s$wgoU?f;sx~rS@A}#|oE?x` zy*6Ya_1MrgN1sI2j*DK`H_peSsv7Tbe}U8=6lI)Petn|Sa1smO(w`PD<1P9WKoygPY~z+Ru6&kZ(9m zEm%DpX4w=d6W~Z5feV(;(pf?RHE-k)VZGpI!H};RL+S%@a00yr_MDYesekC%EFF-$ zSz3}64N>5)iJsNz9XBHj&*W(Wbt=jV(|twIrfv z?T=#S%*JtTfxT$7PkKn8W+vI3xzl*DQr4|r7xb1Vl0|B(H;Z+D2-mTW zx+B%H9cEwa(;<#KNqO8Gj%1=Nz=Ke(H(*yJY&S9F>(X1`c0+Hu)oVwzde#AnZ0S4P ztxPs3wtAYqX$jPLOMQB(!}T(R(-k~OI|0(gxm;eZK6LcDAV;qqF{G{*&sYUs|ycpH91Zs%pFN4_iozVrx7G{HTf@`u62dDSp?27!XXKLfDNBGE zirg%HjV?ssCE5xwllBmKF{%?d%Yn?bTr8^+ecyrJ$By3rUyh!sr447Wag9W28|NJV zfR{oSCs6aVOmfbJJW1h{4JR%H7X&?QIWOU6x$q5V7v%MNEyyYtsHYV{R-ac(fAMsj zb3bh)P;1e zr*v^9Id_~a8UlI{T$~HIIICsJ@p{+3;p~DOJyUxdPI6``W7d2#PN0rBIWAUfDmOdg#3z9UgBgNAHv(deQJol4jV2&y56XQyM2wvrL`Y zETdeGdIfs{0zDa}J})J@0P>`0=pVaTcGFtni^FvnWs!8OGiMjKz|5%59R|L_2yDB zgiYrKD;NF~dekSv#d^9v#GtLe0YEW&HJ!T#deC7ytzIScggmn6iDah|(X+T76>mG^ zPT+*7fySF(0saF&X;gW7VpKvc}%C9Dqwnz2&!u9P4{Prq2>*+dVv zvv>}@hkMbX_X^6G~dqeBq|-)oEnKfRim{yxu~( z;BJ^c-8k!g6O-3Oui@{Y9Sf`&Jh$9K?j!U--5&mz-8e??@%Hw1r~k_5-7GK8_Bnbd z6|G)et!D|;dN%~41nOEedE#H;hlC$8C}qu1o)?nD$)O7q38_!;nlG0X{4CdZX7!A{ zh`c6xJHq+R@t0!t?wcD#{P;FP5APj*T*Tg7U0e{oCVNWW-#_a;OmA+*duh6w-s~VC zd5F*xa)D!v9=EW2`QfW{*1Pw!-pLg_oKQ4Up>Z=WOO!xO^zb@Ppw5znGrq*j5}E-H zK;L{YTg^vQb!Kwe@!HN2%+$u z9`|$yTG*j4MvwYy^lH82L^80q_8iWW%B}d`f8W%(lc8^xCV$sl@Pa5ig z{H)iK%)_aACV|>M#XXS{CQ#S?SyEYKcxD+};ErmmS7=k zr>Q-w*GQlyig5z;93xkPhv5@l~yHESfg)Ydg zUaYp}>-GO6ff_QKr%K`tXE^eueZfvz0j7Cfq^|TqrOa}c6zX!hT>?Gt!`T5jdZyOS zdX0#AoJ>aPGYJyE3dC$ONL-!b-NZ{`>Kw0E$V)31Fh?C;7HJ3wtGB&&tJeiNdM$~; z1tahLPZOwP-zHxo8a=+a5@p~nVQUu7I}wY=@p>#%A4sL_QknsJAI@&b(Tmj5XiMT{ z&v<|{S7FQoWcQS}lzmxf0nZsxPe)$kx8~Gmle)>Tl9T*^#1?yY!+3U z=ox0s4%AfW#=@15hc#IX3DkYShs7B_Ns+q5^>oWwm&%sXhqJ1r1#WeDaeeJ>mJZ0R zo~mW^h*>;2-Ao>DcGMH@xKIzLJi>5im^?UI*cE9gZ8%5tv`hvd573pM52J=IFYY{> zr2}&GOzoWY;;JEYZZ?!yU_noI!ku|pIOGfTNsW50Ih>(zVKOV{v-wiME31pkYe%mO za`ak~^=1j?&VqWPKLjrX)N3YP&^)2uH62 za;v9m4Lt)b?m!(B=u7mW078ly9sxT^-%Rs-e$Sot{lBC z$k9`^g`UA@n@v9B3L)Nf9X_bt%j5-X$0tl)o~7*jE;~-C84@?kY%YhrK~+^H3KwwL z^Lo85$kB_{(tJJKqM_;r9#MlL4<|(KX!PXKPqECHN|tlS35|z9Po}9etT(|qZ?eRM zJ+?*i1`+>%IeMm+te$x{&Gml`S$kA&EC%x!iiGY)9niQLUmECs4;mPo)RG;NlEEmfGai@jR*2%kju0bz0gYjfXtz$$UK) z?9GwGiHXjuiSZZQWN>n{<;v0PfZXb}p?I{Vh12I=ygGkUZl3tr~6?61rQB9NEgN*E>Nc)&VD%YWqBfVhBTyJw`M71 zvZdHO>^K({tRBvKf2%>nSKoaf^y4qRNUy)G>bZ{O=ygPKy&mtnFasEOAUpQCP;55M zh#mo?)dP93d6~r2hmt%^FAI)(GUN-}%>}$H%azQw?ER&F`b?<%>}%Y9clu1c2QuEN7&n3l)x(9f6AP6k+-qWyrz1&d(G*Ud=*%3>iDYmt zHrvf=b@w+KMEv~GSMvDiXSx6Q(-ZXGc@KK$^EW>2JyHJdJA8iORQ}f9nY%s_1##T_ z*5E-zB7(*0Za`GhqzY+PK{Nz}fJ6)t3lSAWtvm`lMeP(75y1ns@W8@CEfg%o%0~PX z?7dpQ^PN1$=PkOJh507gefj-7st@yaX5M!^>W!&F)Qi|tSp&6MvFI|8C(?2r1D=|{ z%PmQSK7c1e$kT%hZDcrM2B=nm+qWa?{d&WB`B}x#d%Wl?^txf8pqaYqPTnu1z8!V+ z##2NuF6Vu7WWmrg@S-zAp|Xw-Z#wBDlh+#hPpkQKoABi=ptnxirw{*zBiZFgzk%MB z^o*nTS&m*g^trA#-~6Uk7W{N;Y2vp)qXL&CdJ_hvqR#$JF$3g$uQj82&Mm;#7az_X zqbG|PM{+E^K4;;9nR1Uk9 zT?Y;fD=vT5`;W4yH-ChkzWc*9BDF73tj9B{+>+|HGi${GA6mv^)Lp^B^P@e?^v zYneewGhZa)NAaK@JEmDr*Smzhx@=P+Z8gPy>pJ9JCcowqDe#HWlIImLS0C(#Lh@i!ViNUhwDMG0hF*O z9=J$v;^YEzoU+^Ock;pZt=sqQ-u*9%3&iL*(MugYf7Tll#g1g=Nk#(WkY~O~yazGR zfjsTxR0QkQH8Z_D)kMgZ#c(AmS%yhaTDvPoh2&jkw5F8X1G&dB-R!(BsiI4;kgC2PD9ee*%0~!=Ty)jYT zNQO^vptd0=D$B9x7ZaG{R+IcK)NLo*r!$rpB*VFyUVy>=HkaZ89`%m=jw9K%+lzu? z^2k+JbiS7k8R5=jZ;6T>VZ)b|sOP0Oy0~9SFLm*|TfMHM=je@zzC_8poSN^hoS6l6iC6)mz95Ix1wE)GMx11?({~@v zvdGbkR9qvOMZ6fjk;204a5+;iF$Zdh6Bkg}Q&%J{FEncG-~@P*W@#hAx!ut#g&e&| z1#8rr7gY$rcj*29Mz&xPWTRA-7atAji7zm-8l4XG|PT77`mU)Sw)w)lL# za>x%26(I9wu~D)DphZAPuZEkzXV+i{I6AfvB41Y5{%KBJz+g)lL^PTWR`v4EI+(x9 zXv_T`^~xZRdIiXOID;>eIRH|M;CCMPEZ+isfgG} zNm860c}djU?dX+28@;4X6^Wh|(8DS^G!$5qmt|Q(j)nZ`8HR<~sMrAb*hoevz#8IS zo}-;b1}^mbgTa>l`+cfx3FLLXNX4~J<7EjK+kaMrA_r>T81Etn>MXIEItzPEqSvm8 z7hoUgpR|5HlvjAB)3&WnpJiPgde38C&pr*tSLWxVTlvhG!z%IjyJtSGA zvbP54={VUo*z0!0hV!s*I7=W$FH%80oYv4H7hL1PmQmCT6ta{qZx-|*S+J%K`Vu5K zIcJF7({!H}4^A8z8f*o69`#BfN6%EihEt=S`LXEIZt)OjE<+oq`rneg;6M!!Goepr zeM$Q!=%XQ7-e}W=6Q9mHbWb~aWssj-h*gL;3lup}8+m4V8!pVYaBaiALS;RxOTepR zqU`F7jb!wnZnV)##xX-cuP>7=_Z{~3>G7ARSt1qG&0>{3yJ)u4$P;lLI0SQ}h!-5F z7c9@{Nw%65b+k}RGfT6`rfl^bKm?!LUoHGx~;tlr1hx63EifioU=ut(WH>nZZLzpv?-oJ`@u>&=j zll^9Jpk`Z3#vf%;)f4||SOLNT7sUmnS)_jxo=EhEfI);m>y88w8mo}650w>#_lgRR~^T@Lw%vly*k zJbS|Q+A5M~{nD{L3uL=Z+k4uiAt)qSsg%t+E7*(q|8UBj;&7zW~V{;3bLlZ(_(7hn>itQ$~E{ zdTJ=ow+{x`aGrAX#$S$J5kk&suLYpM$L6d8>ESQnS9)N*Di*>kIBd5~G1{UBK zW}b)xE^aukSC>=jI%udSjbwQP+~x3y81%Pq`P*l`H+MhlYQ^=1yskIyTEBVmdw29D_wu7B}duDnZOQG-f+{UepSqHGXlf+9LR~+5g-J1AQ9}L zQ>-(9B%898ul-y0A31XPFx~*~)T!NjPyJi;V)lUE*{4sRZaa~}?0u!{ue4;1qxVlW eW6r!OWbPAv3;#aBzwMO(0000^;6Uj@IKw>9VH!iNJ)3+3phZ)qq{q$;SGv}$BUNkIvVLxDQOTS4v-E7ln^DQ zB))#<^A~((J~KNz`#kf^?EbJbyR#enOh=uZgq{Qo3yWL>0q9|2;Q&}z*my*^|Cqa^ zm7IUX^|Pl2s{i2WQo;S&|F^rff}7QXyY<4`e{ePbexvCAA6zRSXrG&M$d!?iA*AQ` zU_2P|?YY0d#|po{oGvPMRXiU@7COuSK>z$Yl-v_Ow%1nkYp4>P?&sm4ud1cl5jryH z)AhJ>Vl=bkOK|0CWL{fw@OIwLL|gQ)hI|8E^{a!^H`D?0@XJvpr?1E$}_duu7{ z8hlR|BkJ(vg0O;5UM}weqZ{+S1DNnmAHX3h%+3z8J>=OU@8As=)8yioch-?A4}5am zezKpnLDTVN0`;X@J}F$o>k?yqSGd=%mu{mKB&O}M%8Hdonie0urb>ma?5_KqlJ4x94s!@2{SZZXSlt?i-IXk^Egz@A8g&45BA|{XEoM( zH|-t!jdb~rbp2|||D2InTk<+aajn#0@^opt2~+>EIuTbb_G&$POLte}U-y&x>*?rY z{oQB)ZKj?-gV@lmMt#7-qCM0AlnjEG59YN<1{BEvrI2B3|NFlL&4~GSvSovUZy5hD z%MnK6cL#p)AN@3fZEl3kD4ET~24$!{iSeC*;JI|(EH?B$nDb27UYCn5k-$;hOY9rGlD9G2_&jfE;)uXk z4@QLZrvkqvS--pxP6B^1s}D-T+Cv$kTj1hvAHd@ytVXs$2EW$Y{FV2gvvR9mj0gUu z+xW|OukLnmSykvUXgG;GBW}H+B~4&B(R(+`I@)qq%jN_wxb#a1?L4)jXd0K(E7$50 z6CCn>un<3$;A@TsdpNe%>U5zYK#fr@4#DP)p_rhwF?DlsQ;gt8C-u(auwPJ26yr!f z5S0y5jNnCQDxQ&WrLyrXyyK!rcjv*-pcNjPu-Atj`UQKW09Ex6Zxpsq^psRl=uI}y zE4F(veV*2Q1TBvt`XYe~je>mtOQm5@gr(#Kj0ux%NVMl4;WA-kC%GiU^o)B%NN^-* z&ho3^Lr@>!a9h=1?(jq5PL6pYLx2N!5(pm~i$`3cWQ06hTsdR~1j*vzo1m~STw3hq z;snsFHo3Y9N}>~1K^^Y{C$UV2?U3ItFY6>>Nn9C}Df<%w{TgDJ)kP!!a!IrvAlfY_ zm3D>tb^fe^AbdI5A6nhZa4WlT(2CCXyxV{!Rgpmpc02Cm1WH>b5*zlej*S*psGyI@ z6SeP8Zh~5JogBP*nz!O4(ak`abET@2lX`L)l)UtBG_<-<=1we7fdAuKR~=W93&nlC z)ISlGqfkcm=K}{=?!L4q(5G$iQ8KqJC~nj_o_^r*!BYn{{GobWRQ?O7mTIuMz_4<2K*syGD8vL;0fOD-6yloTAH$XgO|*C)?2jas_9vnWku|Gs=t(M< zA`xK%N;P7GL@5$yE7)cZU2m|Nggtc#9u_aS9!4v4*;poz&jMzL7 zu`)YHUyF|}6hX1Vu%P}{vnrYqmQ|KK*Ba@Xr3MR`CQntV;;~_xN3oe|!0Ce*=+hR=WOLjcaR4&pL0mgDc&dPfD+ZW1=xh$JC>NN&%a=O&H9Fi!#ZI?xLaFc1`D z+p)s3RVkAX>h7x86!8*<`+ZBAwPS7YArU3e2k|)emVm|)1*nO9$)~C(!xl*kf}8vn zL{knsF)me+`LbO9%~Dd#W*bWgTd;e7!%hrqd2wlGB)sxlkJb?yAPl; zRbPsS?R8TqH@9yOPm-WWp#n#GNyYhL#><6zK{|yb%3;j%NXsQh8F9#`L+kz^YvC{7f zHO4>uYxwGbBF( zp}o^lgvCUK3mKL9hE1CTRU*tQ9$j2D^A6ZnaVm-4(&&r}KyDZYgPa@gOG!AkAdL-G zUJ=b))|6_?_tl8Z$6iV>7aw7~H99Ic`1pYJoT;*+CPuWO zIfF(E#MN@aYt0s+^>EcDua$zhj3w=Ep`qfgUy1!1`?$7Zl}#b&pF{ z`T(EV_kacLP?boNauJ+P=$d^v8raT~DB=E-X z!b^IL{pVKL<@hp0wNGRJrrJoDJg(!>`ZtU0$P&Du%N6eYx6CT7AxC{5ABq2c&~}i! zLuuLM{nSsikr)>Fh0K?`JU{=*X2(@n&mdFW(9EjF(5i+~pZ_OwmeBMDYDTTR7JCEK zRzmVxqTa#!8J4*+ilTR62Ecr0UtxHewf0GcA-l0HOSMQh*irQ}1+y6)}H?Ik$ZytL;>iiO9#TfNY)fj--s`vq0 z?NDZIEu)GM>?h~}K7zK;cXCOiK3+oR&j*O?Ogi(ME|`hgY7BT5LgfTSy(G+Ly=F9n z*ja0#DdS5+^v%dlErq0tG*{dA=R5HKhtq)6z43sZZ?HO4L zz@F^h%!|#=OU&rneEryI4eWh}6rvtfrtSDbA{@YyVh-)Ae`BA-r|OW|5*$8!+LaK+ zx2K}5r!f4(H30Ceil?v`c7#%TIMV*8Ngizji$$C17aX9fm!?JN%Z-R@7s>P<_Qn!R z%Xt)<{S>0n_t2F~MP$s7CB+?TtJYW!3c?Uw;-y?}QT@c&oJ~^cfqjsL)YghY{g3?% z(5NGQGeOEf&<~GNsQW>fUN}uI={0rD?A!&#b9gFhA}Ih$wTG|?=Uz^_1j7K*Sh&yp z24q2f~h+{fITUiQX~I~5zsrCeOadr6gesEoG5I^&PT`O1Hs(%YEkd#Hb>|wo>|(O7Po$fpFo!=`lc*5i*;`` zsxX4mOr=PCStD_Rs7|7iUzhrW%{lLrN7WtFThqqB@88%AWSRvO=Ki8kcyp}a#RPhA zk7Zh$`~~k6n6Je551*)>$u_1^8N2Q}*@#Isj>(cih=hQmf7r!F?5bH4_}1&@8vH6F?!q(yyRBG9)F>}H zA*jvjRe3P;Vq1stu@`_%KnCwW545qLcP}Iqck1?auy=X{eT&Y*&5k4g?$}PKuVLDn zVW{!~2&8$3A%5YdB)$Z2wodj^7aC!RyYaI>M3(=Wf(_fFL|pbY5(svlWgu~QEtLT1 zCk1X89kVKX9AZWvK!faZ|HmObzN)HJR5Ip-Uo+Nkal$S?u+g3YDK`P2wt>+(Z#IsR|v zw+6OMdS1gF(M%k-WloKP!qxUs?ktfhSt(Ua*t`Jq}^uu ziMM`eDajr=46fvFCX5VOwyNkv4#~5y5QQ!|zsW?esRUT=&Qo$OSwno((fImpr}+Pj zoibG`qANnL&bkG6MDCeynj~-`T4jUyzz9P$DmjLuSQ-+?sVZ!&=`)K;(6bIM(v1-NunU?2 z91&CpY@IV22#KKyHFem<&by16_?E}#mp{fCYITZi**BxOo?f%TwAR|(Y+FHIXNhs> z7lR|;+8RoFL+FA%6Zfy$-=4;gf-20T16dlOId zdUCY<9qifQJFGKUuzI|I=6dZ#N7kL|1jk6S02(uokZ^qRhH=xtvbQ4AmxK8nR2r%2 z3e4XcsyswkfBX(S_w;o1b`1FSrSzII_`frc(9Ua*E6nUX!eBd!OY0hDMieA7uuuxH zW0pAO<~cc(fW<2kFEy$r^6nQBR=EY0D5u}{$PV+rXX%9K=c)dLYnQB?5gu`L`zDHrwEklG~jN9d?!Y(#k+)$<*oA9q_b&BQure@5QFyzG$kY|| zg!_s?)}HcRy@%Vy@f2jK_~*=&1e<{ldTi{6W`Ma;@=id2&()p3T#e)AxZ(0*RY_1Q z>%%(=uhVS%G-o0Z>lx;winRLa}Az?t+Fz=;yTa_`J(lDg>Ml=sRvO+eqpws zG=1M!Sxd4ce5SplF+P)C!)bilSURIw-de9%Q$s(lua>F>QN3YK2y(NFq(AwuCv#^Z z^DwF;*r~qtWgtiit$cw_!v>$fYg%%2*#=FnQl21)?D|M8mW+4zYS-n<3_Yb%@n7ip z;G=Jey;t5Sl&RiYEiYzz%hfoG3ZA`i`g3$<_#&SHJ=c!~MEpK&BWQRi5D8&=IeKP1 z4OP)Hi8zYnrJsqt+Zjn9@lwPa7iOo*&&{4gV`7c$Nna$pvGJv8@YcU9+z1&YhH^+@ zA)6VHnS?MhPuGqTEV>L!qqn_NdT$eR=2C6HijYd`*DIj;R^G6XX*Z!o_b#GJSPqLC zJiOMIHDtemF0NQ;kBbdrKjku7k3^b*0a0r6Y_~&0d*>&T@)1s{XKm_K>MB;XDkUzW zyRNa3!!&VIx7jbc$U9YoPx=UNo?JK&Mh(Jt9+$({&Y6`8kUTsqH zbN+ZmGF*ndr(e5kAeLi69-fq^%kYzCVSwD#%87_sbg```26eO@^#tv7I5GTuAKl~{ zO9-Rp5a2?Tzs&No$_>ITSMoyF?GMupFpy!<%jd;lH^Ksks(~$P2`w>rTBKX z4);W#pQkI~mXrn3=;=2fRf(SVQPN%; zIihy!#m1>GSLtX^kMCCLWMo>F3C~IRXQrXkO2*QE+acxl6uO-@Bma@g&>0kd9{j*Y z3)+;Loz|wCqZFyE0q)Ju8t1YT4mRIDh9xY^OQvx%q)j6@W|RS;*|wnCcmED8X?@sv zZQ`O-WIctIA_3|Av%{tqe@(-r^^3CDsjZ7^vXl69QdYx|;qG=b;?dD&Dgi`=Q7ng# zUtZoGjqHe|n17@OV2GF(`|BQ-E#iX``yxQv+*ALWZbS=tQ;Vozg;Zw_!^a}7wck#z z1#WgwkQSzp9ZT2^VUKon^_m&~0T&b{em(jJBbgW|0M{ef*a7#X0mzEbOfMt|FcmiF zXB1~Bw@?y$%E}H=k|uC>A|mcPf7azVO4_%ud?)D)3}m6pE_F{$?ikP;zt$Ao7?fyH z$GWLo;of;_Nql%}!z49mhy+29ykd>w0|?N;s5%1OrE!~iB0;oRKB89aHZgW83?Dd^ z>7#kL@os?s^Sd3Pbc+A3ECSzM39*0ZUK2Hdqn9?AGU+4)yuQTlIwr3@b|t&Lx%;E# z<_6Emps%4op6pb7S^3kDw_&mI!H@&?`;})bm^5J5M^5oHK1 ze)OzJ9)2M%6C{`JL#1t~R+VtqT~|_WG2a7DZrd`c-v6WCJTX?my&|(DzkM?``ej=4 zb+qP(qtECNb+v(8cZ6AY3yO-TLSagG_cWtxl3cy@lbO|4^*5XLXF?^B*N;w>P~qe5 zS1+XVwu2e#zrQm{Y)*K@!-WTd1_HpM0)Pioe(}F^(Hix!{%`-os^ MsOkXq$~KYz50#aYqW}N^ literal 0 HcmV?d00001 diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/testing.png b/src/wrappers/wrappers/react-wrapper/src/stories/assets/testing.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ac39a0ced924068b7625735c9bccac7b17f45d GIT binary patch literal 49313 zcmbqYWm6nXvn5Ed0Kt863mQm*F0R2LI4r?~yDjeS3GVLhun^qcZE;vE*e((R+~@rb z_e)px>8dl`GiRixqtsO7aIh$_kdTmY6y&8fkdRQoNJz*S7%2ZCc<=2#{pZlDDSeaq z&)q#f-#t3pJ3jl*?i`)&9G-1&U;YQ~A6@*1Y#*HL9-X|tzW%v=xVX80ettf`zB{`@ zSoVtSAD_QUBb{BspPrsh{@lVYZVnF*udlC< JACFEikIt@6Pfrg{{#;&Oa(xoW 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�B6};G&Xp9}-Hnlio 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 + + + + + + + + + + + diff --git a/src/wrappers/wrappers/react-wrapper/src/stories/assets/youtube.svg b/src/wrappers/wrappers/react-wrapper/src/stories/assets/youtube.svg new file mode 100644 index 0000000..33a3a61 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/src/stories/assets/youtube.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/wrappers/wrappers/react-wrapper/vite.config.js b/src/wrappers/wrappers/react-wrapper/vite.config.js new file mode 100644 index 0000000..d8392c7 --- /dev/null +++ b/src/wrappers/wrappers/react-wrapper/vite.config.js @@ -0,0 +1,22 @@ +import { defineConfig } from 'vite' +import { resolve } from 'path' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + build: { + lib: { + // Could also be a dictionary or array of multiple entry points + entry: resolve(__dirname, 'src/main.js'), + name: 'Elsa Studio WASM React Wrapper', + // the proper extensions will be added + fileName: 'elsa-studio-wasm-react', + }, + rollupOptions: { + // make sure to externalize deps that shouldn't be bundled + // into your library + external: ['react'], + }, + }, +})