diff --git a/.editorconfig b/.editorconfig index 2b1a719c01..ecfa251206 100644 --- a/.editorconfig +++ b/.editorconfig @@ -206,3 +206,9 @@ dotnet_style_prefer_simplified_interpolation = true:suggestion # Spelling spelling_exclusion_path = .\exclusion.dic + +# Diagnostic configuration + +# CS8305: Type is for evaluation purposes only and is subject to change or removal in future updates. +dotnet_diagnostic.CS8305.severity = suggestion + diff --git a/.github/ISSUE_TEMPLATE/Feature_Request_Windows_Customization.yml b/.github/ISSUE_TEMPLATE/Feature_Request_Windows_Customization.yml new file mode 100644 index 0000000000..1a3b71a34e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Feature_Request_Windows_Customization.yml @@ -0,0 +1,71 @@ +name: "Suggest a new setting/feature within Windows Customization" +description: Suggest a new feature or improvement within Windows Customization (this does not mean you have to implement + it) +labels: +- Issue-Feature +- Area-Windows-Customization +body: +- id: minwindowsversion + type: input + attributes: + label: Minimum Supported Windows Version + placeholder: "10.0.23400.0" + description: What is the minimum version of Windows that should support this feature? + validations: + required: true + +- id: maxwindowsversion + type: input + attributes: + label: Maximum Supported Windows Version + placeholder: "10.0.23400.0" + description: Did this feature stop working on a specific version of Windows? If so, what version? If you are unsure please put "Unknown". + validations: + required: false + +- id: registrykeys + type: textarea + attributes: + label: Registry Keys + placeholder: What registry keys are needed to enable this feature? Please provide the full path and value. If not applicable, please enter "None". + validations: + required: true + +- id: ispublic + type: dropdown + attributes: + label: Is this feature publicly documented? + options: + - "Yes" + - "No" + description: Is this feature publicly documented? Is there a public API or documentation available? + validations: + required: true + +- id: publicdocumentation + type: textarea + attributes: + label: Public Documentation + placeholder: If there is public documentation for this feature, please provide the link here. If not applicable, please enter "None". + validations: + required: true + +- id: scenario + type: textarea + attributes: + label: Scenario + placeholder: How could this new feature be used? Feel free to provide examples. + validations: + required: true + +- id: supportinginfo + type: textarea + attributes: + label: Additional details + placeholder: Enter more info or links to give us more details. + validations: + required: false + +- type: markdown + attributes: + value: Please limit one request per issue. diff --git a/.github/workflows/DevHome-CI.yml b/.github/workflows/DevHome-CI.yml index f633cff6a2..3bc86b7f1c 100644 --- a/.github/workflows/DevHome-CI.yml +++ b/.github/workflows/DevHome-CI.yml @@ -67,21 +67,21 @@ jobs: - name: Build_DevSetupAgent_x86 if: ${{ matrix.platform != 'arm64' }} - run: cmd /c "$env:VSDevCmd" "&" msbuild /p:Configuration=${{ matrix.configuration }},Platform=x86 HyperVExtension\\DevSetupAgent.sln + run: cmd /c "$env:VSDevCmd" "&" msbuild /p:Configuration=${{ matrix.configuration }},Platform=x86 extensions\HyperVExtension\\DevSetupAgent.sln - name: Compress_DevSetupAgent_x86 if: ${{ matrix.platform != 'arm64' }} shell: pwsh - run: Compress-Archive -Force -Path HyperVExtension\src\DevSetupAgent\bin\x86\${{ matrix.configuration }}\net8.0-windows10.0.22621.0\win-x86\* -DestinationPath "HyperVExtension\src\DevSetupAgent\bin\x86\${{ matrix.configuration }}\DevSetupAgent_x86.zip" + run: Compress-Archive -Force -Path extensions\HyperVExtension\src\DevSetupAgent\bin\x86\${{ matrix.configuration }}\net8.0-windows10.0.22621.0\win-x86\* -DestinationPath "extensions\HyperVExtension\src\DevSetupAgent\bin\x86\${{ matrix.configuration }}\DevSetupAgent_x86.zip" - name: Build_DevSetupAgent_arm64 if: ${{ matrix.platform == 'arm64' }} - run: cmd /c "$env:VSDevCmd" "&" msbuild /p:Configuration=${{ matrix.configuration }},Platform=arm64 HyperVExtension\\DevSetupAgent.sln + run: cmd /c "$env:VSDevCmd" "&" msbuild /p:Configuration=${{ matrix.configuration }},Platform=arm64 extensions\HyperVExtension\\DevSetupAgent.sln - name: Compress_DevSetupAgent_arm64 if: ${{ matrix.platform == 'arm64' }} shell: pwsh - run: Compress-Archive -Force -Path HyperVExtension\src\DevSetupAgent\bin\arm64\${{ matrix.configuration }}\net8.0-windows10.0.22621.0\win-arm64\* -DestinationPath "HyperVExtension\src\DevSetupAgent\bin\arm64\${{ matrix.configuration }}\DevSetupAgent_arm64.zip" + run: Compress-Archive -Force -Path extensions\HyperVExtension\src\DevSetupAgent\bin\arm64\${{ matrix.configuration }}\net8.0-windows10.0.22621.0\win-arm64\* -DestinationPath "extensions\HyperVExtension\src\DevSetupAgent\bin\arm64\${{ matrix.configuration }}\DevSetupAgent_arm64.zip" - name: Build_DevHome run: cmd /c "$env:VSDevCmd" "&" msbuild /p:Configuration=${{ matrix.configuration }},Platform=${{ matrix.platform }} DevHome.sln diff --git a/Build.ps1 b/Build.ps1 index ba774a54a2..78f6de3eca 100644 --- a/Build.ps1 +++ b/Build.ps1 @@ -63,14 +63,14 @@ if (($BuildStep -ieq "all") -Or ($BuildStep -ieq "sdk")) { if (($BuildStep -ieq "all") -Or ($BuildStep -ieq "DevSetupAgent") -Or ($BuildStep -ieq "fullMsix")) { foreach ($configuration in $env:Build_Configuration.Split(",")) { - # We use x86 DevSetupAgent for x64 and x86 Dev Home build. Only need to build it once if we are building multiple platforms. + # We use x86 DevSetupAgent for x64 and x86 Dev Home build. Only need to build it once if we are building multiple platforms. $builtX86 = $false foreach ($platform in $env:Build_Platform.Split(",")) { - if ($Platform -ieq "arm64") { - HyperVExtension\BuildDevSetupAgentHelper.ps1 -Platform $Platform -Configuration $configuration -VersionOfSDK $env:sdk_version -SDKNugetSource $SDKNugetSource -AzureBuildingBranch $AzureBuildingBranch -IsAzurePipelineBuild $IsAzurePipelineBuild -BypassWarning + if ($platform -ieq "arm64") { + extensions\HyperVExtension\BuildDevSetupAgentHelper.ps1 -Platform $Platform -Configuration $configuration -VersionOfSDK $env:sdk_version -SDKNugetSource $SDKNugetSource -AzureBuildingBranch $AzureBuildingBranch -IsAzurePipelineBuild $IsAzurePipelineBuild -BypassWarning } elseif (-not $builtX86) { - HyperVExtension\BuildDevSetupAgentHelper.ps1 -Platform "x86" -Configuration $configuration -VersionOfSDK $env:sdk_version -SDKNugetSource $SDKNugetSource -AzureBuildingBranch $AzureBuildingBranch -IsAzurePipelineBuild $IsAzurePipelineBuild -BypassWarning + extensions\HyperVExtension\BuildDevSetupAgentHelper.ps1 -Platform "x86" -Configuration $configuration -VersionOfSDK $env:sdk_version -SDKNugetSource $SDKNugetSource -AzureBuildingBranch $AzureBuildingBranch -IsAzurePipelineBuild $IsAzurePipelineBuild -BypassWarning $builtX86 = $true } } @@ -133,7 +133,7 @@ Try { $appxmanifest.Root.Element($xIdentity).Attribute("Version").Value = $env:msix_version if (-not ([string]::IsNullOrEmpty($newPackageName))) { $appxmanifest.Root.Element($xIdentity).Attribute("Name").Value = $newPackageName - } + } if (-not ([string]::IsNullOrEmpty($newPackageDisplayName))) { $appxmanifest.Root.Element($xProperties).Element($xDisplayName).Value = $newPackageDisplayName } @@ -144,9 +144,6 @@ Try { if ($extension.Attribute("Category").Value -eq "windows.appExtension") { $appExtension = $extension.Element($uapAppExtension) switch ($appExtension.Attribute("Name").Value) { - "com.microsoft.devhome" { - $appExtension.Attribute("DisplayName").Value = $newAppDisplayNameResource - } "com.microsoft.windows.widgets" { $appExtension.Attribute("DisplayName").Value = $newWidgetProviderDisplayName } @@ -162,6 +159,7 @@ Try { foreach ($platform in $env:Build_Platform.Split(",")) { foreach ($configuration in $env:Build_Configuration.Split(",")) { $appxPackageDir = (Join-Path $env:Build_RootDirectory "AppxPackages\$configuration") + Write-Host "Building DevHome for EnvPlatform: $env:Build_Platform Platform: $platform Configuration: $configuration BundlePlatforms: $appxBundlePlatform Dir: $appxPackageDir Ring: $buildRing" $msbuildArgs = @( ("DevHome.sln"), ("/p:Platform="+$platform), @@ -181,6 +179,7 @@ Try { } & $msbuildPath $msbuildArgs + if (-not($IsAzurePipelineBuild) -And $isAdmin) { Invoke-SignPackage "$appxPackageDir\DevHome-$platform.msix" } @@ -198,9 +197,6 @@ Try { if ($extension.Attribute("Category").Value -eq "windows.appExtension") { $appExtension = $extension.Element($uapAppExtension) switch ($appExtension.Attribute("Name").Value) { - "com.microsoft.devhome" { - $appExtension.Attribute("DisplayName").Value = "ms-resource:AppDisplayNameDev" - } "com.microsoft.windows.widgets" { $appExtension.Attribute("DisplayName").Value = "ms-resource:WidgetProviderDisplayNameDev" } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bf20277fb7..3d828d890c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -112,6 +112,14 @@ Bugs and tasks are obviously the easiest to get started with, but don't feel afr Generally, we like to assign issues that generally belong to somebody's area of expertise to the team member that owns that area. This doesn't mean the community can't jump in -- they should reach out and have a chat with the assignee to see if it'd okay to take. If an issue was assigned more than a month ago, there's a good chance it's fair game to try yourself. +### Contributing to Windows Customization + +If you'd like to suggest a new feature/improvement to Windows Customization, **you must first file an issue with the provided `Windows Customization` [template](https://github.com/microsoft/devhome/issues/new?template=feature_request_windows_customization.yml)**. This will help us understand what you're looking for and why, and will help us ensure that the feature is something that we can support in the long run. For changes that rely on registry key behaviors that are undocumented, we will first have to review with internal stakeholders how to support the desired functionality and may not be able to support them in the long term. In these cases, we may have to modify your PR with a different approach after chatting with the internal teams. + +We will not accept or review PRs that add new features to Windows Customization without an associated issue that follows the `Windows Customization` template. + +For bug fixes, please still use the existing [bug template](https://github.com/microsoft/devhome/issues/new?template=Bug_Report.yml). If you are able to fix the bug, please indicate that in the issue and we'll be happy to review your PR. + ### To spec or not to spec Some issues/features may be quick and simple to describe and understand. For such scenarios, once a team member has agreed with your approach, skip ahead to the section headed "Fork, Branch, and Create your PR", below. @@ -178,7 +186,7 @@ Alternatively, ### Rules - **Follow the pattern of what you already see in the code.** -- [Coding style](style.md). +- [Coding style](./docs/style.md). - Try to package new ideas/components into libraries that have nicely defined interfaces. - Package new ideas into classes or refactor existing ideas into a class as you extend. - When adding new classes/methods/changing existing code: add new unit tests or update the existing tests. @@ -195,4 +203,4 @@ Once your code has been reviewed and approved by the requisite number of team me ## Thank you -Thank you in advance for your contribution! Now, [what's next on the list](https://github.com/microsoft/devhome/labels/Help%20Wanted)? 😜 \ No newline at end of file +Thank you in advance for your contribution! Now, [what's next on the list](https://github.com/microsoft/devhome/labels/Help%20Wanted)? 😜 diff --git a/DevHome.sln b/DevHome.sln index bb03d89b0a..dac61696af 100644 --- a/DevHome.sln +++ b/DevHome.sln @@ -92,37 +92,35 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Environments", "Environment EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.Environments", "tools\Environments\DevHome.Environments\DevHome.Environments.csproj", "{CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevEnvironmentProviders", "DevEnvironmentProviders", "{8296B318-2782-4A0E-97F1-C770411C779A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtensionServer", "extensions\HyperVExtension\src\HyperVExtensionServer\HyperVExtensionServer.csproj", "{0689521A-1686-46DB-81E1-3B84AA0EF1AC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtensionServer", "HyperVExtension\src\HyperVExtensionServer\HyperVExtensionServer.csproj", "{0689521A-1686-46DB-81E1-3B84AA0EF1AC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.Common", "HyperVExtension\src\HyperVExtension.Common\HyperVExtension.Common.csproj", "{A716481F-C1AF-4243-84F9-7B9399055E51}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.Common", "extensions\HyperVExtension\src\HyperVExtension.Common\HyperVExtension.Common.csproj", "{A716481F-C1AF-4243-84F9-7B9399055E51}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HyperVExtension", "HyperVExtension", "{0ADDE603-FBC0-415C-A88B-8A3F5A086FB8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension", "HyperVExtension\src\HyperVExtension\HyperVExtension.csproj", "{75976510-22B7-4910-96F2-3E1519C3FF35}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension", "extensions\HyperVExtension\src\HyperVExtension\HyperVExtension.csproj", "{75976510-22B7-4910-96F2-3E1519C3FF35}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.Telemetry", "HyperVExtension\src\Telemetry\HyperVExtension.Telemetry.csproj", "{D92BC45D-6D1B-4DE3-9303-4B3ED1971192}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.Telemetry", "extensions\HyperVExtension\src\Telemetry\HyperVExtension.Telemetry.csproj", "{D92BC45D-6D1B-4DE3-9303-4B3ED1971192}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{81AACED5-CFB5-47A6-AFD6-4625AADCFFA3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{3E3791DF-070D-4ADE-96E8-93D6FBD53953}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupAgent", "HyperVExtension\src\DevSetupAgent\DevSetupAgent.csproj", "{D8256951-EB23-45AA-8A0B-4573DF8E26F2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupAgent", "extensions\HyperVExtension\src\DevSetupAgent\DevSetupAgent.csproj", "{D8256951-EB23-45AA-8A0B-4573DF8E26F2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupEngine", "HyperVExtension\src\DevSetupEngine\DevSetupEngine.csproj", "{2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupEngine", "extensions\HyperVExtension\src\DevSetupEngine\DevSetupEngine.csproj", "{2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DevSetupEngineIdl", "HyperVExtension\src\DevSetupEngineIdl\DevSetupEngineIdl.vcxproj", "{D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DevSetupEngineIdl", "extensions\HyperVExtension\src\DevSetupEngineIdl\DevSetupEngineIdl.vcxproj", "{D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupEngineProjection", "HyperVExtension\src\DevSetupEngineProjection\DevSetupEngineProjection.csproj", "{AC872D0F-2F11-48C4-949C-2464EA1AC66F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupEngineProjection", "extensions\HyperVExtension\src\DevSetupEngineProjection\DevSetupEngineProjection.csproj", "{AC872D0F-2F11-48C4-949C-2464EA1AC66F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.UnitTest", "HyperVExtension\test\HyperVExtension\HyperVExtension.UnitTest.csproj", "{F9121D0A-BB3A-4010-A982-CD8B77F47AA2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.UnitTest", "extensions\HyperVExtension\test\HyperVExtension\HyperVExtension.UnitTest.csproj", "{F9121D0A-BB3A-4010-A982-CD8B77F47AA2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupEngine.Test", "HyperVExtension\test\DevSetupEngine.Test\DevSetupEngine.Test.csproj", "{F4095FD3-6A3F-490B-966D-E63059612EE6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupEngine.Test", "extensions\HyperVExtension\test\DevSetupEngine.Test\DevSetupEngine.Test.csproj", "{F4095FD3-6A3F-490B-966D-E63059612EE6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupAgent.Test", "HyperVExtension\test\DevSetupAgent.Test\DevSetupAgent.Test.csproj", "{0E05A442-BDC7-43D4-A000-F8C986826716}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupAgent.Test", "extensions\HyperVExtension\test\DevSetupAgent.Test\DevSetupAgent.Test.csproj", "{0E05A442-BDC7-43D4-A000-F8C986826716}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.HostGuestCommunication", "HyperVExtension\src\HyperVExtension.HostGuestCommunication\HyperVExtension.HostGuestCommunication.csproj", "{D759CD66-494C-4A00-8075-8B65A9891349}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HyperVExtension.HostGuestCommunication", "extensions\HyperVExtension\src\HyperVExtension.HostGuestCommunication\HyperVExtension.HostGuestCommunication.csproj", "{D759CD66-494C-4A00-8075-8B65A9891349}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Customization", "Customization", "{623998FD-B0A6-4980-95D5-A5072301CA10}" EndProject @@ -132,21 +130,28 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.Customization", "to {54082587-A435-423F-AE1B-01B906FFA7C5} = {54082587-A435-423F-AE1B-01B906FFA7C5} EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utilities", "Utilities", "{FAB6FAA7-ADF4-4B65-9831-0C819915E6E1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.Utilities", "tools\Utilities\src\DevHome.Utilities.csproj", "{19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.HostsFileEditor", "tools\Utilities\HostsUtility\DevHome.HostsFileEditor.csproj", "{1317314E-9BDD-4F1C-A76F-22121637A091}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.RegistryPreview", "tools\Utilities\RegPreviewUtility\DevHome.RegistryPreview.csproj", "{2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevHome.EnvironmentVariables", "tools\Utilities\EnvVariablesUtility\DevHome.EnvironmentVariables.csproj", "{5F9749BC-F34E-4F45-933F-61E0F3ED521F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DevHome.Telemetry.Native", "telemetry\DevHome.Telemetry.Native\DevHome.Telemetry.Native.vcxproj", "{8EB52F7D-D216-49FF-BF16-DE06E4695950}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU Debug|arm64 = Debug|arm64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU Release|arm64 = Release|arm64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|Any CPU.ActiveCfg = Debug|x64 - {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|Any CPU.Build.0 = Debug|x64 - {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|Any CPU.Deploy.0 = Debug|x64 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|arm64.ActiveCfg = Debug|arm64 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|arm64.Build.0 = Debug|arm64 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|arm64.Deploy.0 = Debug|arm64 @@ -156,9 +161,6 @@ Global {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|x86.ActiveCfg = Debug|x86 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|x86.Build.0 = Debug|x86 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Debug|x86.Deploy.0 = Debug|x86 - {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|Any CPU.ActiveCfg = Release|x64 - {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|Any CPU.Build.0 = Release|x64 - {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|Any CPU.Deploy.0 = Release|x64 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|arm64.ActiveCfg = Release|arm64 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|arm64.Build.0 = Release|arm64 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|arm64.Deploy.0 = Release|arm64 @@ -168,614 +170,534 @@ Global {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|x86.ActiveCfg = Release|x86 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|x86.Build.0 = Release|x86 {60E0FD98-5396-436D-BAB7-187A853A5DC6}.Release|x86.Deploy.0 = Release|x86 - {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|Any CPU.ActiveCfg = Debug|x64 - {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|Any CPU.Build.0 = Debug|x64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|arm64.ActiveCfg = Debug|arm64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|arm64.Build.0 = Debug|arm64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|x64.ActiveCfg = Debug|x64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|x64.Build.0 = Debug|x64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|x86.ActiveCfg = Debug|x86 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Debug|x86.Build.0 = Debug|x86 - {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|Any CPU.ActiveCfg = Release|x64 - {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|Any CPU.Build.0 = Release|x64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|arm64.ActiveCfg = Release|arm64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|arm64.Build.0 = Release|arm64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|x64.ActiveCfg = Release|x64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|x64.Build.0 = Release|x64 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|x86.ActiveCfg = Release|x86 {8BE0016E-5BBD-459E-A382-B1CE56E7CA5D}.Release|x86.Build.0 = Release|x86 - {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|Any CPU.ActiveCfg = Debug|x64 - {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|Any CPU.Build.0 = Debug|x64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|arm64.ActiveCfg = Debug|arm64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|arm64.Build.0 = Debug|arm64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|x64.ActiveCfg = Debug|x64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|x64.Build.0 = Debug|x64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|x86.ActiveCfg = Debug|x86 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Debug|x86.Build.0 = Debug|x86 - {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|Any CPU.ActiveCfg = Release|x64 - {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|Any CPU.Build.0 = Release|x64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|arm64.ActiveCfg = Release|arm64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|arm64.Build.0 = Release|arm64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|x64.ActiveCfg = Release|x64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|x64.Build.0 = Release|x64 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|x86.ActiveCfg = Release|x86 {3B409BF0-59D5-4AA3-8927-8E11476E6CEB}.Release|x86.Build.0 = Release|x86 - {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|Any CPU.ActiveCfg = Debug|x64 - {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|Any CPU.Build.0 = Debug|x64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|arm64.ActiveCfg = Debug|arm64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|arm64.Build.0 = Debug|arm64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|x64.ActiveCfg = Debug|x64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|x64.Build.0 = Debug|x64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|x86.ActiveCfg = Debug|x86 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Debug|x86.Build.0 = Debug|x86 - {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|Any CPU.ActiveCfg = Release|x64 - {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|Any CPU.Build.0 = Release|x64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|arm64.ActiveCfg = Release|arm64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|arm64.Build.0 = Release|arm64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|x64.ActiveCfg = Release|x64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|x64.Build.0 = Release|x64 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|x86.ActiveCfg = Release|x86 {E9F49E1C-C15D-4B87-92CA-9003C1C31DB5}.Release|x86.Build.0 = Release|x86 - {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|Any CPU.ActiveCfg = Debug|x64 - {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|Any CPU.Build.0 = Debug|x64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|arm64.ActiveCfg = Debug|arm64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|arm64.Build.0 = Debug|arm64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|x64.ActiveCfg = Debug|x64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|x64.Build.0 = Debug|x64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|x86.ActiveCfg = Debug|x86 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Debug|x86.Build.0 = Debug|x86 - {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|Any CPU.ActiveCfg = Release|x64 - {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|Any CPU.Build.0 = Release|x64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|arm64.ActiveCfg = Release|arm64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|arm64.Build.0 = Release|arm64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|x64.ActiveCfg = Release|x64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|x64.Build.0 = Release|x64 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|x86.ActiveCfg = Release|x86 {CD512D91-FDA6-4908-89D5-4106F090A7BE}.Release|x86.Build.0 = Release|x86 - {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|Any CPU.ActiveCfg = Debug|x64 - {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|Any CPU.Build.0 = Debug|x64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|arm64.ActiveCfg = Debug|arm64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|arm64.Build.0 = Debug|arm64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|x64.ActiveCfg = Debug|x64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|x64.Build.0 = Debug|x64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|x86.ActiveCfg = Debug|x86 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Debug|x86.Build.0 = Debug|x86 - {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|Any CPU.ActiveCfg = Release|x64 - {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|Any CPU.Build.0 = Release|x64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|arm64.ActiveCfg = Release|arm64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|arm64.Build.0 = Release|arm64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|x64.ActiveCfg = Release|x64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|x64.Build.0 = Release|x64 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|x86.ActiveCfg = Release|x86 {C45241F7-8B4A-44F2-A78B-AFB6288F55B9}.Release|x86.Build.0 = Release|x86 - {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|Any CPU.ActiveCfg = Debug|x64 - {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|Any CPU.Build.0 = Debug|x64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|arm64.ActiveCfg = Debug|arm64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|arm64.Build.0 = Debug|arm64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|x64.ActiveCfg = Debug|x64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|x64.Build.0 = Debug|x64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|x86.ActiveCfg = Debug|x86 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Debug|x86.Build.0 = Debug|x86 - {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|Any CPU.ActiveCfg = Release|x64 - {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|Any CPU.Build.0 = Release|x64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|arm64.ActiveCfg = Release|arm64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|arm64.Build.0 = Release|arm64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|x64.ActiveCfg = Release|x64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|x64.Build.0 = Release|x64 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|x86.ActiveCfg = Release|x86 {0901B260-1B88-4B99-A9F8-477ED0A74FBD}.Release|x86.Build.0 = Release|x86 - {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|Any CPU.ActiveCfg = Debug|x64 - {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|Any CPU.Build.0 = Debug|x64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|arm64.ActiveCfg = Debug|arm64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|arm64.Build.0 = Debug|arm64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|x64.ActiveCfg = Debug|x64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|x64.Build.0 = Debug|x64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|x86.ActiveCfg = Debug|x86 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Debug|x86.Build.0 = Debug|x86 - {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|Any CPU.ActiveCfg = Release|x64 - {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|Any CPU.Build.0 = Release|x64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|arm64.ActiveCfg = Release|arm64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|arm64.Build.0 = Release|arm64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|x64.ActiveCfg = Release|x64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|x64.Build.0 = Release|x64 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|x86.ActiveCfg = Release|x86 {9A62BDDC-F33E-4EBE-B407-533263A92511}.Release|x86.Build.0 = Release|x86 - {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|Any CPU.ActiveCfg = Debug|x64 - {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|Any CPU.Build.0 = Debug|x64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|arm64.ActiveCfg = Debug|arm64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|arm64.Build.0 = Debug|arm64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|x64.ActiveCfg = Debug|x64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|x64.Build.0 = Debug|x64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|x86.ActiveCfg = Debug|x86 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Debug|x86.Build.0 = Debug|x86 - {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|Any CPU.ActiveCfg = Release|x64 - {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|Any CPU.Build.0 = Release|x64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|arm64.ActiveCfg = Release|arm64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|arm64.Build.0 = Release|arm64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|x64.ActiveCfg = Release|x64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|x64.Build.0 = Release|x64 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|x86.ActiveCfg = Release|x86 {F65759A2-AF44-4211-9817-76E6D02F37D0}.Release|x86.Build.0 = Release|x86 - {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|Any CPU.ActiveCfg = Debug|x64 - {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|Any CPU.Build.0 = Debug|x64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|arm64.ActiveCfg = Debug|arm64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|arm64.Build.0 = Debug|arm64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|x64.ActiveCfg = Debug|x64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|x64.Build.0 = Debug|x64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|x86.ActiveCfg = Debug|x86 {54082587-A435-423F-AE1B-01B906FFA7C5}.Debug|x86.Build.0 = Debug|x86 - {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|Any CPU.ActiveCfg = Release|x64 - {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|Any CPU.Build.0 = Release|x64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|arm64.ActiveCfg = Release|arm64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|arm64.Build.0 = Release|arm64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|x64.ActiveCfg = Release|x64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|x64.Build.0 = Release|x64 {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|x86.ActiveCfg = Release|x86 {54082587-A435-423F-AE1B-01B906FFA7C5}.Release|x86.Build.0 = Release|x86 - {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|Any CPU.Build.0 = Debug|x64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|arm64.ActiveCfg = Debug|arm64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|arm64.Build.0 = Debug|arm64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|x64.ActiveCfg = Debug|x64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|x64.Build.0 = Debug|x64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|x86.ActiveCfg = Debug|x86 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Debug|x86.Build.0 = Debug|x86 - {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|Any CPU.ActiveCfg = Release|x64 - {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|Any CPU.Build.0 = Release|x64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|arm64.ActiveCfg = Release|arm64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|arm64.Build.0 = Release|arm64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|x64.ActiveCfg = Release|x64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|x64.Build.0 = Release|x64 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|x86.ActiveCfg = Release|x86 {D2303635-3DD9-4DCA-A38A-F5306D0BB8FE}.Release|x86.Build.0 = Release|x86 - {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|Any CPU.ActiveCfg = Debug|x64 - {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|Any CPU.Build.0 = Debug|x64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|arm64.ActiveCfg = Debug|arm64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|arm64.Build.0 = Debug|arm64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|x64.ActiveCfg = Debug|x64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|x64.Build.0 = Debug|x64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|x86.ActiveCfg = Debug|x86 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Debug|x86.Build.0 = Debug|x86 - {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|Any CPU.ActiveCfg = Release|x64 - {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|Any CPU.Build.0 = Release|x64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|arm64.ActiveCfg = Release|arm64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|arm64.Build.0 = Release|arm64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|x64.ActiveCfg = Release|x64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|x64.Build.0 = Release|x64 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|x86.ActiveCfg = Release|x86 {6254ADB1-B6FD-4D74-AF13-40C997919178}.Release|x86.Build.0 = Release|x86 - {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|Any CPU.ActiveCfg = Debug|x64 - {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|Any CPU.Build.0 = Debug|x64 {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|arm64.ActiveCfg = Debug|arm64 {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|arm64.Build.0 = Debug|arm64 {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|x64.ActiveCfg = Debug|x64 {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|x64.Build.0 = Debug|x64 {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|x86.ActiveCfg = Debug|x86 {72CE876A-7272-4460-92EB-845A45B743FB}.Debug|x86.Build.0 = Debug|x86 - {72CE876A-7272-4460-92EB-845A45B743FB}.Release|Any CPU.ActiveCfg = Release|x64 - {72CE876A-7272-4460-92EB-845A45B743FB}.Release|Any CPU.Build.0 = Release|x64 {72CE876A-7272-4460-92EB-845A45B743FB}.Release|arm64.ActiveCfg = Release|arm64 {72CE876A-7272-4460-92EB-845A45B743FB}.Release|arm64.Build.0 = Release|arm64 {72CE876A-7272-4460-92EB-845A45B743FB}.Release|x64.ActiveCfg = Release|x64 {72CE876A-7272-4460-92EB-845A45B743FB}.Release|x64.Build.0 = Release|x64 {72CE876A-7272-4460-92EB-845A45B743FB}.Release|x86.ActiveCfg = Release|x86 {72CE876A-7272-4460-92EB-845A45B743FB}.Release|x86.Build.0 = Release|x86 - {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|Any CPU.ActiveCfg = Debug|x64 - {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|Any CPU.Build.0 = Debug|x64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|arm64.ActiveCfg = Debug|ARM64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|arm64.Build.0 = Debug|ARM64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|x64.ActiveCfg = Debug|x64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|x64.Build.0 = Debug|x64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|x86.ActiveCfg = Debug|x86 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Debug|x86.Build.0 = Debug|x86 - {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|Any CPU.ActiveCfg = Release|x64 - {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|Any CPU.Build.0 = Release|x64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|arm64.ActiveCfg = Release|ARM64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|arm64.Build.0 = Release|ARM64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|x64.ActiveCfg = Release|x64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|x64.Build.0 = Release|x64 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|x86.ActiveCfg = Release|x86 {940FD524-1AC0-4BBA-BBBE-1E4F2E797508}.Release|x86.Build.0 = Release|x86 - {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|Any CPU.ActiveCfg = Debug|x64 - {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|Any CPU.Build.0 = Debug|x64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|arm64.ActiveCfg = Debug|ARM64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|arm64.Build.0 = Debug|ARM64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|x64.ActiveCfg = Debug|x64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|x64.Build.0 = Debug|x64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|x86.ActiveCfg = Debug|x86 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Debug|x86.Build.0 = Debug|x86 - {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|Any CPU.ActiveCfg = Release|x64 - {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|Any CPU.Build.0 = Release|x64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|arm64.ActiveCfg = Release|ARM64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|arm64.Build.0 = Release|ARM64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|x64.ActiveCfg = Release|x64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|x64.Build.0 = Release|x64 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|x86.ActiveCfg = Release|x86 {A7E5FD7B-B41A-4CAE-A45A-E686DFA8ACF1}.Release|x86.Build.0 = Release|x86 - {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|Any CPU.ActiveCfg = Debug|x64 - {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|Any CPU.Build.0 = Debug|x64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|arm64.ActiveCfg = Debug|ARM64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|arm64.Build.0 = Debug|ARM64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|x64.ActiveCfg = Debug|x64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|x64.Build.0 = Debug|x64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|x86.ActiveCfg = Debug|x86 {053AF75C-5CD8-497F-BA25-47435BD86047}.Debug|x86.Build.0 = Debug|x86 - {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|Any CPU.ActiveCfg = Release|x64 - {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|Any CPU.Build.0 = Release|x64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|arm64.ActiveCfg = Release|ARM64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|arm64.Build.0 = Release|ARM64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|x64.ActiveCfg = Release|x64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|x64.Build.0 = Release|x64 {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|x86.ActiveCfg = Release|x86 {053AF75C-5CD8-497F-BA25-47435BD86047}.Release|x86.Build.0 = Release|x86 - {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|Any CPU.ActiveCfg = Debug|x64 - {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|Any CPU.Build.0 = Debug|x64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|arm64.ActiveCfg = Debug|ARM64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|arm64.Build.0 = Debug|ARM64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|x64.ActiveCfg = Debug|x64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|x64.Build.0 = Debug|x64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|x86.ActiveCfg = Debug|x86 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Debug|x86.Build.0 = Debug|x86 - {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|Any CPU.ActiveCfg = Release|x64 - {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|Any CPU.Build.0 = Release|x64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|arm64.ActiveCfg = Release|ARM64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|arm64.Build.0 = Release|ARM64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|x64.ActiveCfg = Release|x64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|x64.Build.0 = Release|x64 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|x86.ActiveCfg = Release|x86 {0D879E08-99AA-4019-9D04-DEA9F7C7BFC1}.Release|x86.Build.0 = Release|x86 - {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|Any CPU.ActiveCfg = Debug|x64 - {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|Any CPU.Build.0 = Debug|x64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|arm64.ActiveCfg = Debug|arm64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|arm64.Build.0 = Debug|arm64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|x64.ActiveCfg = Debug|x64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|x64.Build.0 = Debug|x64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|x86.ActiveCfg = Debug|x86 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Debug|x86.Build.0 = Debug|x86 - {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|Any CPU.ActiveCfg = Release|x64 - {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|Any CPU.Build.0 = Release|x64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|arm64.ActiveCfg = Release|arm64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|arm64.Build.0 = Release|arm64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|x64.ActiveCfg = Release|x64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|x64.Build.0 = Release|x64 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|x86.ActiveCfg = Release|x86 {69F8B7DF-F52B-4B74-9A16-AB3241BB8912}.Release|x86.Build.0 = Release|x86 - {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|Any CPU.ActiveCfg = Debug|x64 - {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|Any CPU.Build.0 = Debug|x64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|arm64.ActiveCfg = Debug|arm64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|arm64.Build.0 = Debug|arm64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|x64.ActiveCfg = Debug|x64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|x64.Build.0 = Debug|x64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|x86.ActiveCfg = Debug|x86 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Debug|x86.Build.0 = Debug|x86 - {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|Any CPU.ActiveCfg = Release|x64 - {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|Any CPU.Build.0 = Release|x64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|arm64.ActiveCfg = Release|arm64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|arm64.Build.0 = Release|arm64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|x64.ActiveCfg = Release|x64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|x64.Build.0 = Release|x64 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|x86.ActiveCfg = Release|x86 {2F9AD5AF-EF3B-496A-8566-9E9539E3DF43}.Release|x86.Build.0 = Release|x86 - {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|Any CPU.ActiveCfg = Debug|x64 - {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|Any CPU.Build.0 = Debug|x64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|arm64.ActiveCfg = Debug|ARM64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|arm64.Build.0 = Debug|ARM64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|x64.ActiveCfg = Debug|x64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|x64.Build.0 = Debug|x64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|x86.ActiveCfg = Debug|Win32 {75945141-03AC-4C40-A586-16D463A0AC1B}.Debug|x86.Build.0 = Debug|Win32 - {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|Any CPU.ActiveCfg = Release|x64 - {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|Any CPU.Build.0 = Release|x64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|arm64.ActiveCfg = Release|ARM64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|arm64.Build.0 = Release|ARM64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|x64.ActiveCfg = Release|x64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|x64.Build.0 = Release|x64 {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|x86.ActiveCfg = Release|Win32 {75945141-03AC-4C40-A586-16D463A0AC1B}.Release|x86.Build.0 = Release|Win32 - {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|Any CPU.ActiveCfg = Debug|x64 - {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|Any CPU.Build.0 = Debug|x64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|arm64.ActiveCfg = Debug|ARM64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|arm64.Build.0 = Debug|ARM64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|x64.ActiveCfg = Debug|x64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|x64.Build.0 = Debug|x64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|x86.ActiveCfg = Debug|x86 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Debug|x86.Build.0 = Debug|x86 - {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|Any CPU.ActiveCfg = Release|x64 - {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|Any CPU.Build.0 = Release|x64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|arm64.ActiveCfg = Release|ARM64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|arm64.Build.0 = Release|ARM64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|x64.ActiveCfg = Release|x64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|x64.Build.0 = Release|x64 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|x86.ActiveCfg = Release|x86 {092AC740-DA01-4872-8E93-B9557DAD6BE5}.Release|x86.Build.0 = Release|x86 - {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|Any CPU.ActiveCfg = Debug|x64 - {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|Any CPU.Build.0 = Debug|x64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|arm64.ActiveCfg = Debug|ARM64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|arm64.Build.0 = Debug|ARM64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|x64.ActiveCfg = Debug|x64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|x64.Build.0 = Debug|x64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|x86.ActiveCfg = Debug|Win32 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Debug|x86.Build.0 = Debug|Win32 - {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|Any CPU.ActiveCfg = Release|x64 - {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|Any CPU.Build.0 = Release|x64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|arm64.ActiveCfg = Release|ARM64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|arm64.Build.0 = Release|ARM64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|x64.ActiveCfg = Release|x64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|x64.Build.0 = Release|x64 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|x86.ActiveCfg = Release|Win32 {80805B43-CE75-4C6E-92F8-F385C1039E53}.Release|x86.Build.0 = Release|Win32 - {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|Any CPU.ActiveCfg = Debug|x64 - {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|Any CPU.Build.0 = Debug|x64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|arm64.ActiveCfg = Debug|ARM64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|arm64.Build.0 = Debug|ARM64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|x64.ActiveCfg = Debug|x64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|x64.Build.0 = Debug|x64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|x86.ActiveCfg = Debug|Win32 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Debug|x86.Build.0 = Debug|Win32 - {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|Any CPU.ActiveCfg = Release|x64 - {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|Any CPU.Build.0 = Release|x64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|arm64.ActiveCfg = Release|ARM64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|arm64.Build.0 = Release|ARM64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|x64.ActiveCfg = Release|x64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|x64.Build.0 = Release|x64 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|x86.ActiveCfg = Release|Win32 {4B370E2F-FB1D-4887-90BF-3B72517485CE}.Release|x86.Build.0 = Release|Win32 - {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|Any CPU.ActiveCfg = Debug|x64 - {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|Any CPU.Build.0 = Debug|x64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|arm64.ActiveCfg = Debug|arm64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|arm64.Build.0 = Debug|arm64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|x64.ActiveCfg = Debug|x64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|x64.Build.0 = Debug|x64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|x86.ActiveCfg = Debug|x86 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Debug|x86.Build.0 = Debug|x86 - {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|Any CPU.ActiveCfg = Release|x64 - {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|Any CPU.Build.0 = Release|x64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|arm64.ActiveCfg = Release|arm64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|arm64.Build.0 = Release|arm64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|x64.ActiveCfg = Release|x64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|x64.Build.0 = Release|x64 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|x86.ActiveCfg = Release|x86 {1477F3EA-A9F6-4B4F-82F4-C2427F57EBEE}.Release|x86.Build.0 = Release|x86 - {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|Any CPU.ActiveCfg = Debug|x64 - {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|Any CPU.Build.0 = Debug|x64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|arm64.ActiveCfg = Debug|ARM64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|arm64.Build.0 = Debug|ARM64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x64.ActiveCfg = Debug|x64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x64.Build.0 = Debug|x64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x86.ActiveCfg = Debug|Win32 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x86.Build.0 = Debug|Win32 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|arm64.ActiveCfg = Release|ARM64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|arm64.Build.0 = Release|ARM64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x64.ActiveCfg = Release|x64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x64.Build.0 = Release|x64 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x86.ActiveCfg = Release|Win32 + {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x86.Build.0 = Release|Win32 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|arm64.ActiveCfg = Debug|ARM64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|arm64.Build.0 = Debug|ARM64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|x64.ActiveCfg = Debug|x64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|x64.Build.0 = Debug|x64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|x86.ActiveCfg = Debug|x86 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Debug|x86.Build.0 = Debug|x86 - {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|Any CPU.ActiveCfg = Release|x64 - {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|Any CPU.Build.0 = Release|x64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|arm64.ActiveCfg = Release|ARM64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|arm64.Build.0 = Release|ARM64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|x64.ActiveCfg = Release|x64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|x64.Build.0 = Release|x64 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|x86.ActiveCfg = Release|x86 {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0}.Release|x86.Build.0 = Release|x86 - {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|Any CPU.ActiveCfg = Debug|x64 - {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|Any CPU.Build.0 = Debug|x64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|arm64.ActiveCfg = Debug|ARM64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|arm64.Build.0 = Debug|ARM64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|x64.ActiveCfg = Debug|x64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|x64.Build.0 = Debug|x64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|x86.ActiveCfg = Debug|x86 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Debug|x86.Build.0 = Debug|x86 - {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|Any CPU.ActiveCfg = Release|x64 - {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|Any CPU.Build.0 = Release|x64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|arm64.ActiveCfg = Release|ARM64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|arm64.Build.0 = Release|ARM64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|x64.ActiveCfg = Release|x64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|x64.Build.0 = Release|x64 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|x86.ActiveCfg = Release|x86 {0689521A-1686-46DB-81E1-3B84AA0EF1AC}.Release|x86.Build.0 = Release|x86 - {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|Any CPU.ActiveCfg = Debug|x64 - {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|Any CPU.Build.0 = Debug|x64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|arm64.ActiveCfg = Debug|arm64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|arm64.Build.0 = Debug|arm64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|x64.ActiveCfg = Debug|x64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|x64.Build.0 = Debug|x64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|x86.ActiveCfg = Debug|x86 {A716481F-C1AF-4243-84F9-7B9399055E51}.Debug|x86.Build.0 = Debug|x86 - {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|Any CPU.ActiveCfg = Release|x64 - {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|Any CPU.Build.0 = Release|x64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|arm64.ActiveCfg = Release|arm64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|arm64.Build.0 = Release|arm64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|x64.ActiveCfg = Release|x64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|x64.Build.0 = Release|x64 {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|x86.ActiveCfg = Release|x86 {A716481F-C1AF-4243-84F9-7B9399055E51}.Release|x86.Build.0 = Release|x86 - {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|Any CPU.ActiveCfg = Debug|x64 - {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|Any CPU.Build.0 = Debug|x64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|arm64.ActiveCfg = Debug|ARM64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|arm64.Build.0 = Debug|ARM64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|x64.ActiveCfg = Debug|x64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|x64.Build.0 = Debug|x64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|x86.ActiveCfg = Debug|x86 {75976510-22B7-4910-96F2-3E1519C3FF35}.Debug|x86.Build.0 = Debug|x86 - {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|Any CPU.ActiveCfg = Release|x64 - {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|Any CPU.Build.0 = Release|x64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|arm64.ActiveCfg = Release|ARM64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|arm64.Build.0 = Release|ARM64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|x64.ActiveCfg = Release|x64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|x64.Build.0 = Release|x64 {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|x86.ActiveCfg = Release|x86 {75976510-22B7-4910-96F2-3E1519C3FF35}.Release|x86.Build.0 = Release|x86 - {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|Any CPU.Build.0 = Debug|x64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|arm64.ActiveCfg = Debug|arm64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|arm64.Build.0 = Debug|arm64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|x64.ActiveCfg = Debug|x64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|x64.Build.0 = Debug|x64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|x86.ActiveCfg = Debug|x86 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Debug|x86.Build.0 = Debug|x86 - {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|Any CPU.ActiveCfg = Release|x64 - {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|Any CPU.Build.0 = Release|x64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|arm64.ActiveCfg = Release|arm64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|arm64.Build.0 = Release|arm64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|x64.ActiveCfg = Release|x64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|x64.Build.0 = Release|x64 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|x86.ActiveCfg = Release|x86 {D92BC45D-6D1B-4DE3-9303-4B3ED1971192}.Release|x86.Build.0 = Release|x86 - {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|Any CPU.Build.0 = Debug|x64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|arm64.ActiveCfg = Debug|arm64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|arm64.Build.0 = Debug|arm64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|x64.ActiveCfg = Debug|x64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|x64.Build.0 = Debug|x64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|x86.ActiveCfg = Debug|x86 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Debug|x86.Build.0 = Debug|x86 - {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|Any CPU.ActiveCfg = Release|x64 - {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|Any CPU.Build.0 = Release|x64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|arm64.ActiveCfg = Release|arm64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|arm64.Build.0 = Release|arm64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|x64.ActiveCfg = Release|x64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|x64.Build.0 = Release|x64 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|x86.ActiveCfg = Release|x86 {D8256951-EB23-45AA-8A0B-4573DF8E26F2}.Release|x86.Build.0 = Release|x86 - {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|Any CPU.ActiveCfg = Debug|x64 - {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|Any CPU.Build.0 = Debug|x64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|arm64.ActiveCfg = Debug|arm64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|arm64.Build.0 = Debug|arm64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|x64.ActiveCfg = Debug|x64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|x64.Build.0 = Debug|x64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|x86.ActiveCfg = Debug|x86 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Debug|x86.Build.0 = Debug|x86 - {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|Any CPU.ActiveCfg = Release|x64 - {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|Any CPU.Build.0 = Release|x64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|arm64.ActiveCfg = Release|arm64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|arm64.Build.0 = Release|arm64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|x64.ActiveCfg = Release|x64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|x64.Build.0 = Release|x64 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|x86.ActiveCfg = Release|x86 {2C7522A3-DCE2-4ED0-889A-AD10F241EDF4}.Release|x86.Build.0 = Release|x86 - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|Any CPU.Build.0 = Debug|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|arm64.ActiveCfg = Debug|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|arm64.Build.0 = Debug|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x64.ActiveCfg = Debug|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x64.Build.0 = Debug|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x86.ActiveCfg = Debug|Win32 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x86.Build.0 = Debug|Win32 - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|Any CPU.ActiveCfg = Release|x64 - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|Any CPU.Build.0 = Release|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|arm64.ActiveCfg = Release|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|arm64.Build.0 = Release|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x64.ActiveCfg = Release|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x64.Build.0 = Release|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x86.ActiveCfg = Release|Win32 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x86.Build.0 = Release|Win32 - {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|Any CPU.ActiveCfg = Debug|x64 - {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|Any CPU.Build.0 = Debug|x64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|arm64.ActiveCfg = Debug|arm64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|arm64.Build.0 = Debug|arm64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|x64.ActiveCfg = Debug|x64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|x64.Build.0 = Debug|x64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|x86.ActiveCfg = Debug|x86 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Debug|x86.Build.0 = Debug|x86 - {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|Any CPU.ActiveCfg = Release|x64 - {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|Any CPU.Build.0 = Release|x64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|arm64.ActiveCfg = Release|arm64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|arm64.Build.0 = Release|arm64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|x64.ActiveCfg = Release|x64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|x64.Build.0 = Release|x64 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|x86.ActiveCfg = Release|x86 {AC872D0F-2F11-48C4-949C-2464EA1AC66F}.Release|x86.Build.0 = Release|x86 - {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|Any CPU.ActiveCfg = Debug|x64 - {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|Any CPU.Build.0 = Debug|x64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|arm64.ActiveCfg = Debug|arm64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|arm64.Build.0 = Debug|arm64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|x64.ActiveCfg = Debug|x64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|x64.Build.0 = Debug|x64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|x86.ActiveCfg = Debug|x86 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Debug|x86.Build.0 = Debug|x86 - {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|Any CPU.ActiveCfg = Release|x64 - {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|Any CPU.Build.0 = Release|x64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|arm64.ActiveCfg = Release|arm64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|arm64.Build.0 = Release|arm64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|x64.ActiveCfg = Release|x64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|x64.Build.0 = Release|x64 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|x86.ActiveCfg = Release|x86 {F9121D0A-BB3A-4010-A982-CD8B77F47AA2}.Release|x86.Build.0 = Release|x86 - {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|Any CPU.ActiveCfg = Debug|x64 - {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|Any CPU.Build.0 = Debug|x64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|arm64.ActiveCfg = Debug|ARM64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|arm64.Build.0 = Debug|ARM64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|x64.ActiveCfg = Debug|x64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|x64.Build.0 = Debug|x64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|x86.ActiveCfg = Debug|x86 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Debug|x86.Build.0 = Debug|x86 - {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|Any CPU.ActiveCfg = Release|x64 - {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|Any CPU.Build.0 = Release|x64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|arm64.ActiveCfg = Release|ARM64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|arm64.Build.0 = Release|ARM64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|x64.ActiveCfg = Release|x64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|x64.Build.0 = Release|x64 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|x86.ActiveCfg = Release|x86 {F4095FD3-6A3F-490B-966D-E63059612EE6}.Release|x86.Build.0 = Release|x86 - {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|Any CPU.ActiveCfg = Debug|x64 - {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|Any CPU.Build.0 = Debug|x64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|arm64.ActiveCfg = Debug|ARM64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|arm64.Build.0 = Debug|ARM64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|x64.ActiveCfg = Debug|x64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|x64.Build.0 = Debug|x64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|x86.ActiveCfg = Debug|x86 {0E05A442-BDC7-43D4-A000-F8C986826716}.Debug|x86.Build.0 = Debug|x86 - {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|Any CPU.ActiveCfg = Release|x64 - {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|Any CPU.Build.0 = Release|x64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|arm64.ActiveCfg = Release|ARM64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|arm64.Build.0 = Release|ARM64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|x64.ActiveCfg = Release|x64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|x64.Build.0 = Release|x64 {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|x86.ActiveCfg = Release|x86 {0E05A442-BDC7-43D4-A000-F8C986826716}.Release|x86.Build.0 = Release|x86 - {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|Any CPU.Build.0 = Debug|x64 {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|arm64.ActiveCfg = Debug|arm64 {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|arm64.Build.0 = Debug|arm64 {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|x64.ActiveCfg = Debug|x64 {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|x64.Build.0 = Debug|x64 {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|x86.ActiveCfg = Debug|x86 {D759CD66-494C-4A00-8075-8B65A9891349}.Debug|x86.Build.0 = Debug|x86 - {D759CD66-494C-4A00-8075-8B65A9891349}.Release|Any CPU.ActiveCfg = Release|x64 - {D759CD66-494C-4A00-8075-8B65A9891349}.Release|Any CPU.Build.0 = Release|x64 {D759CD66-494C-4A00-8075-8B65A9891349}.Release|arm64.ActiveCfg = Release|arm64 {D759CD66-494C-4A00-8075-8B65A9891349}.Release|arm64.Build.0 = Release|arm64 {D759CD66-494C-4A00-8075-8B65A9891349}.Release|x64.ActiveCfg = Release|x64 {D759CD66-494C-4A00-8075-8B65A9891349}.Release|x64.Build.0 = Release|x64 {D759CD66-494C-4A00-8075-8B65A9891349}.Release|x86.ActiveCfg = Release|x86 {D759CD66-494C-4A00-8075-8B65A9891349}.Release|x86.Build.0 = Release|x86 - {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|Any CPU.ActiveCfg = Debug|x64 - {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|Any CPU.Build.0 = Debug|x64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|arm64.ActiveCfg = Debug|arm64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|arm64.Build.0 = Debug|arm64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|x64.ActiveCfg = Debug|x64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|x64.Build.0 = Debug|x64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|x86.ActiveCfg = Debug|x86 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Debug|x86.Build.0 = Debug|x86 - {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|Any CPU.ActiveCfg = Release|x64 - {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|Any CPU.Build.0 = Release|x64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|arm64.ActiveCfg = Release|arm64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|arm64.Build.0 = Release|arm64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|x64.ActiveCfg = Release|x64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|x64.Build.0 = Release|x64 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|x86.ActiveCfg = Release|x86 {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C}.Release|x86.Build.0 = Release|x86 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|Any CPU.ActiveCfg = Debug|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|Any CPU.Build.0 = Debug|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|arm64.ActiveCfg = Debug|ARM64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|arm64.Build.0 = Debug|ARM64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x64.ActiveCfg = Debug|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x64.Build.0 = Debug|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x86.ActiveCfg = Debug|Win32 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Debug|x86.Build.0 = Debug|Win32 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|Any CPU.ActiveCfg = Release|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|Any CPU.Build.0 = Release|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|arm64.ActiveCfg = Release|ARM64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|arm64.Build.0 = Release|ARM64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x64.ActiveCfg = Release|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x64.Build.0 = Release|x64 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x86.ActiveCfg = Release|Win32 - {AF5A7FA0-E3E8-44C8-8830-31DD08F583E8}.Release|x86.Build.0 = Release|Win32 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Debug|arm64.ActiveCfg = Debug|arm64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Debug|arm64.Build.0 = Debug|arm64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Debug|x64.ActiveCfg = Debug|x64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Debug|x64.Build.0 = Debug|x64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Debug|x86.ActiveCfg = Debug|x86 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Debug|x86.Build.0 = Debug|x86 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Release|arm64.ActiveCfg = Release|arm64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Release|arm64.Build.0 = Release|arm64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Release|x64.ActiveCfg = Release|x64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Release|x64.Build.0 = Release|x64 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Release|x86.ActiveCfg = Release|x86 + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7}.Release|x86.Build.0 = Release|x86 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|arm64.ActiveCfg = Debug|ARM64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|arm64.Build.0 = Debug|ARM64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|arm64.Deploy.0 = Debug|ARM64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|x64.ActiveCfg = Debug|x64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|x64.Build.0 = Debug|x64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|x64.Deploy.0 = Debug|x64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|x86.ActiveCfg = Debug|x86 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|x86.Build.0 = Debug|x86 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Debug|x86.Deploy.0 = Debug|x86 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|arm64.ActiveCfg = Release|ARM64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|arm64.Build.0 = Release|ARM64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|arm64.Deploy.0 = Release|ARM64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|x64.ActiveCfg = Release|x64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|x64.Build.0 = Release|x64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|x64.Deploy.0 = Release|x64 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|x86.ActiveCfg = Release|x86 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|x86.Build.0 = Release|x86 + {1317314E-9BDD-4F1C-A76F-22121637A091}.Release|x86.Deploy.0 = Release|x86 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|arm64.ActiveCfg = Debug|ARM64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|arm64.Build.0 = Debug|ARM64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|arm64.Deploy.0 = Debug|ARM64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|x64.ActiveCfg = Debug|x64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|x64.Build.0 = Debug|x64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|x64.Deploy.0 = Debug|x64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|x86.ActiveCfg = Debug|x86 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|x86.Build.0 = Debug|x86 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Debug|x86.Deploy.0 = Debug|x86 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|arm64.ActiveCfg = Release|ARM64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|arm64.Build.0 = Release|ARM64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|arm64.Deploy.0 = Release|ARM64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|x64.ActiveCfg = Release|x64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|x64.Build.0 = Release|x64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|x64.Deploy.0 = Release|x64 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|x86.ActiveCfg = Release|x86 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|x86.Build.0 = Release|x86 + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9}.Release|x86.Deploy.0 = Release|x86 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Debug|arm64.ActiveCfg = Debug|arm64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Debug|arm64.Build.0 = Debug|arm64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Debug|x64.ActiveCfg = Debug|x64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Debug|x64.Build.0 = Debug|x64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Debug|x86.ActiveCfg = Debug|x86 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Debug|x86.Build.0 = Debug|x86 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Release|arm64.ActiveCfg = Release|arm64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Release|arm64.Build.0 = Release|arm64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Release|x64.ActiveCfg = Release|x64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Release|x64.Build.0 = Release|x64 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Release|x86.ActiveCfg = Release|x86 + {5F9749BC-F34E-4F45-933F-61E0F3ED521F}.Release|x86.Build.0 = Release|x86 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Debug|arm64.ActiveCfg = Debug|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Debug|arm64.Build.0 = Debug|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Debug|x64.ActiveCfg = Debug|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Debug|x64.Build.0 = Debug|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Debug|x86.ActiveCfg = Debug|Win32 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Debug|x86.Build.0 = Debug|Win32 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Release|arm64.ActiveCfg = Release|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Release|arm64.Build.0 = Release|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Release|x64.ActiveCfg = Release|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Release|x64.Build.0 = Release|x64 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Release|x86.ActiveCfg = Release|Win32 + {8EB52F7D-D216-49FF-BF16-DE06E4695950}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -810,7 +732,7 @@ Global {CFD8A90D-8B6D-4ED6-BA35-FF894BEB46C0} = {8FC9A04E-1FFD-42BA-B304-D1FA964D99CE} {0689521A-1686-46DB-81E1-3B84AA0EF1AC} = {81AACED5-CFB5-47A6-AFD6-4625AADCFFA3} {A716481F-C1AF-4243-84F9-7B9399055E51} = {81AACED5-CFB5-47A6-AFD6-4625AADCFFA3} - {0ADDE603-FBC0-415C-A88B-8A3F5A086FB8} = {8296B318-2782-4A0E-97F1-C770411C779A} + {0ADDE603-FBC0-415C-A88B-8A3F5A086FB8} = {DCAF188B-60C3-4EDB-8049-BAA927FBCD7D} {75976510-22B7-4910-96F2-3E1519C3FF35} = {81AACED5-CFB5-47A6-AFD6-4625AADCFFA3} {D92BC45D-6D1B-4DE3-9303-4B3ED1971192} = {81AACED5-CFB5-47A6-AFD6-4625AADCFFA3} {81AACED5-CFB5-47A6-AFD6-4625AADCFFA3} = {0ADDE603-FBC0-415C-A88B-8A3F5A086FB8} @@ -825,6 +747,11 @@ Global {D759CD66-494C-4A00-8075-8B65A9891349} = {81AACED5-CFB5-47A6-AFD6-4625AADCFFA3} {623998FD-B0A6-4980-95D5-A5072301CA10} = {A972EC5B-FC61-4964-A6FF-F9633EB75DFD} {AF527EA4-6A24-4BD6-BC6E-A5863DC3489C} = {623998FD-B0A6-4980-95D5-A5072301CA10} + {FAB6FAA7-ADF4-4B65-9831-0C819915E6E1} = {A972EC5B-FC61-4964-A6FF-F9633EB75DFD} + {19C08C57-7C22-48C9-9B6C-FAAF1FCC65E7} = {FAB6FAA7-ADF4-4B65-9831-0C819915E6E1} + {1317314E-9BDD-4F1C-A76F-22121637A091} = {FAB6FAA7-ADF4-4B65-9831-0C819915E6E1} + {2E5629CA-0D1B-42B1-8D6E-934A6E1E18D9} = {FAB6FAA7-ADF4-4B65-9831-0C819915E6E1} + {5F9749BC-F34E-4F45-933F-61E0F3ED521F} = {FAB6FAA7-ADF4-4B65-9831-0C819915E6E1} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {030B5641-B206-46BB-BF71-36FF009088FA} diff --git a/HyperVExtension/src/DevSetupAgent/RequestManager.cs b/HyperVExtension/src/DevSetupAgent/RequestManager.cs deleted file mode 100644 index 07cde9cc46..0000000000 --- a/HyperVExtension/src/DevSetupAgent/RequestManager.cs +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using Serilog; - -namespace HyperVExtension.DevSetupAgent; - -/// -/// Request manager responsible for processing request messages from host. -/// -public class RequestManager : IRequestManager -{ - private readonly Serilog.ILogger _log = Log.ForContext("SourceContext", nameof(RequestManager)); - private const uint MaxRequestQueueSize = 3; - private readonly IRequestFactory _requestFactory; - private readonly IHostChannel _hostChannel; - private readonly Queue _requestQueue = new(); - private bool _asyncRequestRunning; - - public RequestManager(IRequestFactory requestFactory, IHostChannel hostChannel) - { - _requestFactory = requestFactory; - _hostChannel = hostChannel; - } - - private void ProgressHandler(IHostResponse progressResponse, CancellationToken stoppingToken) - { - _hostChannel.SendMessageAsync(progressResponse.GetResponseMessage(), stoppingToken); - } - - public void ProcessRequestMessage(IRequestMessage message, CancellationToken stoppingToken) - { - if (!string.IsNullOrEmpty(message.RequestId)) - { - var requestContext = new RequestContext(message, _hostChannel); - var request = _requestFactory.CreateRequest(requestContext); - if (request.IsStatusRequest) - { - // Status requests (like GetVersion) execute immediately and return response. - var response = request.Execute(ProgressHandler, stoppingToken); - if (response.SendResponse) - { - _hostChannel.SendMessageAsync(response.GetResponseMessage(), stoppingToken); - } - } - else - { - // Non-status request are queued and executed async in order one at a time. - int queueCount; - lock (_requestQueue) - { - queueCount = _requestQueue.Count; - } - - if (queueCount > MaxRequestQueueSize) - { - _log.Error($"Too many requests."); - var response = new TooManyRequestsResponse(message.RequestId); - _hostChannel.SendMessageAsync(response.GetResponseMessage(), stoppingToken); - return; - } - - lock (_requestQueue) - { - // TODO: send response indicating that request is queued. - _requestQueue.Enqueue(request); - if (!_asyncRequestRunning) - { - _asyncRequestRunning = true; - Task.Run(() => ProcessRequestQueue(stoppingToken), stoppingToken); - } - } - } - } - else - { - // Shouldn't happen, Log error - _log.Error($"Received empty message."); - } - } - - private void ProcessRequestQueue(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - IHostRequest request; - lock (_requestQueue) - { - if (_requestQueue.Count == 0) - { - _asyncRequestRunning = false; - break; - } - - request = _requestQueue.Dequeue(); - } - - try - { - var response = request.Execute(ProgressHandler, stoppingToken); - _hostChannel.SendMessageAsync(response.GetResponseMessage(), stoppingToken); - } - catch (Exception ex) - { - _log.Error(ex, $"Failed to execute request."); - } - } - } -} diff --git a/HyperVExtension/src/HyperVExtension/Assets/hyper-v-windows-default-image.jpg b/HyperVExtension/src/HyperVExtension/Assets/hyper-v-windows-default-image.jpg deleted file mode 100644 index eee923efb7..0000000000 Binary files a/HyperVExtension/src/HyperVExtension/Assets/hyper-v-windows-default-image.jpg and /dev/null differ diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpSession.cs b/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpSession.cs deleted file mode 100644 index 97114215bb..0000000000 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpSession.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -namespace HyperVExtension.CommunicationWithGuest; - -/// -/// Class to translate request/response objects to/from messages and pass them to/from channel to guest VM.. -/// -internal sealed class GuestKvpSession : IDisposable -{ - private readonly Guid _vmId; - private readonly GuestKvpChannel _channel; - private readonly ResponseFactory _responseFactory = new(); - private Dictionary _processedMessages = new(); - private bool _disposed; - - public GuestKvpSession(Guid vmId) - { - _vmId = vmId; - _channel = new GuestKvpChannel(vmId); - } - - public void SendRequest(IHostRequest request, CancellationToken stoppingToken) - { - _channel.SendMessage(request.GetRequestMessage(), stoppingToken); - } - - public List WaitForResponse(string responseId, TimeSpan timeout, bool expectProgressResponse, CancellationToken stoppingToken) - { - var result = new List(); - var responseMessages = _channel.WaitForResponseMessages(responseId, timeout, expectProgressResponse, stoppingToken); - - // There is no way for host to remove messages from guest kvp. So, we need to keep track of processed messages. - // If we find that we received the same message as in previous call of this method, we will ignore it. - // Host will send "AckRequest" to let guest know that it can remove the message from kvp. - var newProcessedMessages = new Dictionary(); - - foreach (var responseMessage in responseMessages) - { - if (!_processedMessages.ContainsKey(responseMessage.ResponseId)) - { - result.Add(_responseFactory.CreateResponse(responseMessage)); - _channel.SendMessage(new AckRequest(responseMessage.ResponseId).GetRequestMessage(), stoppingToken); - } - - newProcessedMessages[responseMessage.ResponseId] = responseMessage; - } - - _processedMessages = newProcessedMessages; - return result; - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - if (!_disposed) - { - if (disposing) - { - _channel?.Dispose(); - } - - _disposed = true; - } - } -} diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorNoTypeResponse.cs b/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorNoTypeResponse.cs deleted file mode 100644 index 1a8ad48c81..0000000000 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorNoTypeResponse.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -namespace HyperVExtension.CommunicationWithGuest; - -/// -/// Class used to handle requests that have no request type. -/// It creates an error response JSON to send back to the client. -/// -internal sealed class ErrorNoTypeResponse : IGuestResponse -{ - public ErrorNoTypeResponse(IResponseMessage message) - { - Timestamp = DateTime.UtcNow; - ResponseId = message.ResponseId!; - RequestId = message.ResponseId!; - } - - public string RequestId { get; set; } - - public string RequestType { get; set; } = ""; - - public string ResponseId { get; set; } - - public string ResponseType { get; set; } = ""; - - public uint Status { get; set; } = 0xFFFFFFFF; - - public string ErrorDescription { get; set; } = "Missing Response or Request type."; - - public uint Version { get; set; } = 1; - - public DateTime Timestamp { get; set; } -} diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorResponse.cs b/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorResponse.cs deleted file mode 100644 index 709c49434b..0000000000 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorResponse.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -namespace HyperVExtension.CommunicationWithGuest; - -/// -/// Class used to handle invalid requests (for example an exception while parsing request JSON). -/// It creates an error response to send back to the client. -/// -internal sealed class ErrorResponse : IGuestResponse -{ - public ErrorResponse(IResponseMessage responseMessage) - { - ResponseId = responseMessage.ResponseId!; - Timestamp = DateTime.UtcNow; - } - - public string RequestId { get; set; } = ""; - - public string RequestType { get; set; } = ""; - - public string ResponseId { get; set; } - - public string ResponseType { get; set; } = "ErrorNoData"; - - public uint Status { get; set; } = 0x80004005; // E_FAIL - - public string ErrorDescription { get; set; } = "Missing Request data."; - - public uint Version { get; set; } = 1; - - public DateTime Timestamp { get; set; } -} diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 0000000000..fbe80622b6 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,10727 @@ +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + +--------------------------------------------------------- + +Serilog 3.1.1 - Apache-2.0 + + +Copyright 2013-23 Serilog +Copyright (c) 2013-23 Serilog +copyright (c) Serilog Contributors + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Extensions.Logging 8.0.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Settings.Configuration 8.0.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Sinks.Console 5.0.1 - Apache-2.0 + + +Copyright (c) Serilog Contributors + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Sinks.Debug 2.0.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Sinks.File 5.0.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +WinUIEx 1.8.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Markdig.Signed 0.33.0 - BSD-2-Clause + + + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Antlr4.Runtime.Standard 4.11.1 - BSD-3-Clause + + + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +LibGit2Sharp.NativeBinaries 2.0.315-alpha.0.9 - GPL-2.0-only WITH GCC-exception-2.0 + + +Copyright Rich Salz. +Copyright 1995-2017 Mark Adler +Copyright (c) 2007 Francois Gouget +Copyright (c) 2011-2015 Vicent Marti +Copyright 1995-2017 Mark Adler +3 CScs DEFG +copyrighted by the Free Software Foundation +Copyright (c) 1998-2007 The OpenSSL Project. +Copyright (c) 2017 Marc Stevens Cryptology Group +Copyright 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com) +Copyright (c) 1989, 1991 Free Software Foundation, Inc. +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (c) 1995-2010 Jean-loup Gailly and Mark Adler +Copyright (c) 1985,1989-93,1995-98,2000,2001,2002,2003,2005,2006,2008 Free Software Foundation, Inc. + +GPL-2.0-only WITH GCC-exception-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +AdaptiveExpressions 4.20.1 - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.Common 8.2.2 - MIT + + +Copyright (c) 2021 Sergio Pedri +Copyright (c) 2020 Michael Dietrich +Copyright (c) Microsoft Corporation +(c) .NET Foundation and Contributors +Copyright (c) 2009 - 2018 Laurent Bugnion +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2017 Pedro Lamas, http://www.pedrolamas.com + +# .NET Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +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 NON-INFRINGEMENT. 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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.Mvvm 8.2.2 - MIT + + +Copyright (c) 2021 Sergio Pedri +Copyright (c) 2020 Michael Dietrich +Copyright (c) Microsoft Corporation +(c) .NET Foundation and Contributors +Copyright (c) 2009 - 2018 Laurent Bugnion +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2017 Pedro Lamas, http://www.pedrolamas.com + +# .NET Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +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 NON-INFRINGEMENT. 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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.WinUI.Controls.Primitives 8.0.240109 - MIT + + +(c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and Contributors + +# Windows Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +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 NON-INFRINGEMENT. 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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.WinUI.Controls.SettingsControls 8.0.240109 - MIT + + +(c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and Contributors + +# Windows Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +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 NON-INFRINGEMENT. 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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.WinUI.Triggers 8.0.240109 - MIT + + +(c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and Contributors + +# Windows Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +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 NON-INFRINGEMENT. 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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +JetBrains.Annotations 2021.2.0 - MIT + + +Copyright (c) 2016 JetBrains http://www.jetbrains.com + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Json.More.Net 1.9.0 - MIT + + +(c) Microsoft 2023 +Copyright (c) 2022 Greg Dennis + +MIT License + +Copyright (c) 2022 Greg Dennis + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +JsonPointer.Net 3.0.3 - MIT + + +(c) Microsoft 2023 +Copyright (c) 2022 Greg Dennis + +MIT License + +Copyright (c) 2022 Greg Dennis + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +JsonSchema.Net 5.2.6 - MIT + + + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +LibGit2Sharp 0.27.0-preview-0182 - MIT + + +(c) Microsoft 2022 +Copyright LibGit2Sharp contributors +Copyright (c) LibGit2Sharp contributors + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +MessageFormat 6.0.2 - MIT + + + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.ApplicationInsights 2.21.0 - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Bcl.AsyncInterfaces 5.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.Binder 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.CommandLine 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.CommandLine 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.EnvironmentVariables 6.0.1 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.EnvironmentVariables 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.FileExtensions 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.FileExtensions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.Json 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.Json 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.UserSecrets 6.0.1 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.UserSecrets 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.DependencyInjection 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.DependencyInjection.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.DependencyModel 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Diagnostics 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Diagnostics.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.FileProviders.Abstractions 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.FileProviders.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.FileProviders.Physical 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.FileProviders.Physical 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.FileSystemGlobbing 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.FileSystemGlobbing 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Hosting 6.0.1 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Hosting 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Hosting.Abstractions 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Hosting.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Hosting.WindowsServices 6.0.1 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Http 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Configuration 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Configuration 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Console 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Console 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Debug 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Debug 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.EventLog 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.EventLog 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.EventSource 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.EventSource 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.ObjectPool 6.0.1 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright (c) 2019 David Fowler +Copyright (c) 2016 Richard Morris +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2007 James Newton-King +Copyright (c) Microsoft Corporation. +Copyright (c) 2014-2018 Michael Daines +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2010-2019 Google LLC. http://angular.io/license +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Options 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Options.ConfigurationExtensions 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Options.ConfigurationExtensions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Primitives 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Management.Infrastructure 2.0.0 - MIT + + +(c) Microsoft Corporation. + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Management.Infrastructure 3.0.0 - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Management.Infrastructure.CimCmdlets 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. CPowerShell's Microsoft.Management.Infrastructure.CimCmdlets project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Management.Infrastructure.Runtime.Unix 2.0.0 - MIT + + +(c) Microsoft Corporation. + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Management.Infrastructure.Runtime.Unix 3.0.0 - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.Commands.Diagnostics 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. PowerShell's Microsoft.PowerShell.Commands.Diagnostics project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.Commands.Management 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. PowerShell's Microsoft.PowerShell.Commands.Management project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.Commands.Utility 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. :PowerShell's Microsoft.PowerShell.Commands.Utility project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.ConsoleHost 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. PowerShell Host + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.CoreCLR.Eventing 7.2.8 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. :PowerShell's Microsoft.PowerShell.CoreCLR.Eventing project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.CoreCLR.Eventing 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. :PowerShell's Microsoft.PowerShell.CoreCLR.Eventing project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.MarkdownRender 7.2.1 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. PowerShell's Markdown Rendering project PowerShell Markdown Renderer + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.Native 7.2.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) by P.J. Plauger + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.Native 7.4.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) by P.J. Plauger + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.SDK 7.4.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Microsoft Corporation +copyright Unmanaged32Bit Required32Bit +(c) Microsoft Corporation. PowerShell SDK +(c) Microsoft Corporation. PowerShell Host +(c) Microsoft Corporation. 1PowerShell's System.Management.Automation project +Copyright (c) Microsoft Corporation. ModuleVersion 7.0.0.0 CompatiblePSEditions +(c) Microsoft Corporation. :PowerShell's Microsoft.PowerShell.Commands.Utility project +(c) Microsoft Corporation. PowerShell's Microsoft.PowerShell.Commands.Management project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.PowerShell.Security 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. 2PowerShell's Microsoft.PowerShell.Security project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Recognizers.Text.DataTypes.TimexExpression 1.3.2 - MIT + + +(c) Microsoft Corporation. + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Security.Extensions 1.2.0 - MIT + + + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Toolkit.Uwp.Notifications 7.1.3 - MIT + + +(c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and Contributors + +# Windows Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +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 NON-INFRINGEMENT. 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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Win32.Registry.AccessControl 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Win32.Registry.AccessControl 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Win32.SystemEvents 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Win32.SystemEvents 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Windows.Compatibility 8.0.0 - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Windows.CppWinRT 2.0.240111.5 - MIT + + +(c) Microsoft 2023 +(c) Microsoft Corporation +Copyright (c) Microsoft Corporation + + MIT License + + Copyright (c) Microsoft Corporation. + + 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 + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Windows.ImplementationLibrary 1.0.240122.1 - MIT + + +(c) Microsoft 2024 +Copyright (c) Microsoft +(c) Microsoft Corporation +Copyright (c) Microsoft Corporation +Copyright (c) 2009-2014 by the contributors + + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + 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 + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.WindowsPackageManager.ComInterop 1.7.10091-preview - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.WindowsPackageManager.Configuration.OutOfProc 1.7.10091-preview - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.WSMan.Management 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. PowerShell's Microsoft.WSMan.Management project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.WSMan.Runtime 7.4.0 - MIT + + +(c) Microsoft Corporation +(c) Microsoft Corporation. ,PowerShell's Microsoft.WSMan.Runtime project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Xaml.Behaviors.WinUI.Managed 2.0.9 - MIT + + +Copyright (c) Microsoft +(c) Microsoft Corporation +Copyright Microsoft 2015-2020 +Copyright (c) Microsoft 2015-2020 + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Newtonsoft.Json 13.0.3 - MIT + + +Copyright James Newton-King 2008 +Copyright (c) 2007 James Newton-King +Copyright (c) James Newton-King 2008 +Copyright James Newton-King 2008 Json.NET + +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +runtime.linux-arm.runtime.native.System.IO.Ports 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +runtime.linux-arm64.runtime.native.System.IO.Ports 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +runtime.linux-x64.runtime.native.System.IO.Ports 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +runtime.native.System.Data.SqlClient.sni 4.7.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +runtime.native.System.IO.Ports 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +runtime.osx-arm64.runtime.native.System.IO.Ports 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +runtime.osx-x64.runtime.native.System.IO.Ports 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.CodeDom 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.CodeDom 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ComponentModel.Composition 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ComponentModel.Composition.Registration 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Configuration.ConfigurationManager 6.0.1 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Configuration.ConfigurationManager 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Data.Odbc 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Data.OleDb 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Data.SqlClient 4.8.5 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Diagnostics.EventLog 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Diagnostics.EventLog 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Diagnostics.PerformanceCounter 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.DirectoryServices 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.DirectoryServices 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.DirectoryServices.AccountManagement 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.DirectoryServices.Protocols 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Drawing.Common 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Drawing.Common 8.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Sven Groot (Ookii.org) 2009 +Copyright (c) .NET Foundation and Contributors + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Formats.Asn1 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Formats.Asn1 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.IO.Packaging 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.IO.Ports 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Management 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Management 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Management.Automation 7.2.8 - MIT + + +(c) Microsoft Corporation +CompanyName Copyright ModuleVersion +Copyright CoreModuleCannotBeRemoved CreatingModuleManifestFile +(c) Microsoft Corporation. 1PowerShell's System.Management.Automation project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Management.Automation 7.4.0 - MIT + + +(c) Microsoft Corporation +CompanyName Copyright ModuleVersion +Copyright CoreModuleCannotBeRemoved CreatingModuleManifestFile +(c) Microsoft Corporation. 1PowerShell's System.Management.Automation project + +MIT License + +Copyright (c) + +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. + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Memory 4.5.5 - MIT + + +(c) 2022 GitHub, Inc. +(c) Microsoft Corporation +Copyright (c) 2011, Google Inc. +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 2015 The Chromium Authors +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Net.Http.WinHttpHandler 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Private.ServiceModel 4.10.3 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2000-2014 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Reflection.Context 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Runtime.Caching 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Runtime.CompilerServices.Unsafe 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.AccessControl 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.AccessControl 6.0.2-mauipre.1.22102.15 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.Cryptography.Pkcs 6.0.1 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.Cryptography.Pkcs 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.Cryptography.ProtectedData 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.Cryptography.ProtectedData 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.Cryptography.Xml 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.Permissions 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.Permissions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceModel.Duplex 4.10.3 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2000-2014 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceModel.Http 4.10.3 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2000-2014 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceModel.NetTcp 4.10.3 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2000-2014 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceModel.Primitives 4.10.3 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2000-2014 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceModel.Security 4.10.3 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2000-2014 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceModel.Syndication 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceProcess.ServiceController 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ServiceProcess.ServiceController 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Speech 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Text.Encodings.Web 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Text.Json 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Threading.AccessControl 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ValueTuple 4.5.0 - MIT + + +(c) 2023 GitHub, Inc. +(c) Microsoft Corporation +Copyright (c) 2011, Google Inc. +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 2015 The Chromium Authors +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Web.Services.Description 4.10.0 - MIT + + + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Windows.Extensions 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Windows.Extensions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +YamlDotNet 15.1.0 - MIT + + +(c) Microsoft 2023 +(c) Antoine Aubry and contributors 2008 - 2019 +Copyright (c) Antoine Aubry and contributors 2008 - 2019 +Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Antoine Aubry and contributors + +Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Antoine Aubry and contributors + +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. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Management.Infrastructure.Runtime.Win 2.0.0 + + +(c) Microsoft Corporation. +Copyright (c) Microsoft Corporation. +9Copyright (c) Microsoft Corporation. + +MICROSOFT SOFTWARE LICENSE TERMS +Microsoft.Management.Infrastructure.dll +Microsoft.Management.Infrastructure.Native.dll +Microsoft.Management.Infrastructure.Unmanaged.dll +Mi.dll +Miutils.dll +________________________________________ +IF YOU LIVE IN (OR ARE A BUSINESS WITH A PRINCIPAL PLACE OF BUSINESS IN) THE UNITED STATES, PLEASE READ THE “BINDING ARBITRATION AND CLASS ACTION WAIVER” SECTION BELOW. IT AFFECTS HOW DISPUTES ARE RESOLVED. +________________________________________ + +These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. +1. INSTALLATION AND USE RIGHTS. +a) General. You may install and use any number of copies of the software solely for use with Microsoft PowerShell. +b) Third Party Software. The software may include third party applications that Microsoft, not the third party, licenses to you under this agreement. Any included notices for third party applications are for your information only. +2. DATA COLLECTION. The software may collect information about you and your use of the software and send that to Microsoft. Microsoft may use this information to provide services and improve Microsoft’s products and services. Your opt-out rights, if any, are described in the product documentation. Some features in the software may enable collection of data from users of your applications that access or use the software. If you use these features to enable data collection in your applications, you must comply with applicable law, including getting any required user consent, and maintain a prominent privacy policy that accurately informs users about how you use, collect, and share their data. You can learn more about Microsoft’s data collection and use in the product documentation and the Microsoft Privacy Statement at aka.ms/privacy. You agree to comply with all applicable provisions of the Microsoft Privacy Statement. +a. Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of personal data in connection with the software, Microsoft makes the commitments in the European Union General Data Protection Regulation Terms of the Online Services Terms to all customers effective May 25, 2018, at http://go.microsoft.com/?linkid=9840733. +3. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): +a) work around any technical limitations in the software that only allow you to use it in certain ways; +b) reverse engineer, decompile or disassemble the software; +c) remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; +d) use the software in any way that is against the law or to create or propagate malware; or +e) share, publish, distribute, or lend the software, provide the software as a stand-alone hosted solution for others to use, or transfer the software or this agreement to any third party. +4. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit http://aka.ms/exporting. +5. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. +6. UPDATES. The software may periodically check for updates, and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. +7. BINDING ARBITRATION AND CLASS ACTION WAIVER. This Section applies if you live in (or, if a business, your principal place of business is in) the United States. If you and Microsoft have a dispute, you and Microsoft agree to try for 60 days to resolve it informally. If you and Microsoft can’t, you and Microsoft agree to binding individual arbitration before the American Arbitration Association under the Federal Arbitration Act (“FAA”), and not to sue in court in front of a judge or jury. Instead, a neutral arbitrator will decide. Class action lawsuits, class-wide arbitrations, private attorney-general actions, and any other proceeding where someone acts in a representative capacity are not allowed; nor is combining individual proceedings without the consent of all parties. The complete Arbitration Agreement contains more terms and is at http://aka.ms/arb-agreement-1. You and Microsoft agree to these terms. +8. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this agreement if you fail to comply with any of its terms or conditions. In such event, you must destroy all copies of the software and all of its component parts. +9. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. +10. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles, except that the FAA governs everything related to arbitration. If you acquired the software in any other country, its laws apply, except that the FAA governs everything related to arbitration. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court (excluding arbitration). If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court (excluding arbitration). +11. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: +a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. +b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. +c) Germany and Austria. +i. Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. +ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. +Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. +12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +13. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law. +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. + +Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French. +Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. +Cette limitation concerne: +• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et +• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Management.Infrastructure.Runtime.Win 3.0.0 + + +(c) Microsoft 2023 +(c) Microsoft Corporation +Copyright (c) Microsoft Corporation + +MICROSOFT SOFTWARE LICENSE TERMS +Microsoft.Management.Infrastructure.dll +Microsoft.Management.Infrastructure.Native.dll +Microsoft.Management.Infrastructure.Unmanaged.dll +Mi.dll +Miutils.dll +________________________________________ +IF YOU LIVE IN (OR ARE A BUSINESS WITH A PRINCIPAL PLACE OF BUSINESS IN) THE UNITED STATES, PLEASE READ THE “BINDING ARBITRATION AND CLASS ACTION WAIVER” SECTION BELOW. IT AFFECTS HOW DISPUTES ARE RESOLVED. +________________________________________ + +These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. +1. INSTALLATION AND USE RIGHTS. +a) General. You may install and use any number of copies of the software solely for use with Microsoft PowerShell. +b) Third Party Software. The software may include third party applications that Microsoft, not the third party, licenses to you under this agreement. Any included notices for third party applications are for your information only. +2. DATA COLLECTION. The software may collect information about you and your use of the software and send that to Microsoft. Microsoft may use this information to provide services and improve Microsoft’s products and services. Your opt-out rights, if any, are described in the product documentation. Some features in the software may enable collection of data from users of your applications that access or use the software. If you use these features to enable data collection in your applications, you must comply with applicable law, including getting any required user consent, and maintain a prominent privacy policy that accurately informs users about how you use, collect, and share their data. You can learn more about Microsoft’s data collection and use in the product documentation and the Microsoft Privacy Statement at aka.ms/privacy. You agree to comply with all applicable provisions of the Microsoft Privacy Statement. +a. Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of personal data in connection with the software, Microsoft makes the commitments in the European Union General Data Protection Regulation Terms of the Online Services Terms to all customers effective May 25, 2018, at http://go.microsoft.com/?linkid=9840733. +3. SCOPE OF LICENSE. The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to): +a) work around any technical limitations in the software that only allow you to use it in certain ways; +b) reverse engineer, decompile or disassemble the software; +c) remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software; +d) use the software in any way that is against the law or to create or propagate malware; or +e) share, publish, distribute, or lend the software, provide the software as a stand-alone hosted solution for others to use, or transfer the software or this agreement to any third party. +4. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit http://aka.ms/exporting. +5. SUPPORT SERVICES. Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. +6. UPDATES. The software may periodically check for updates, and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices. +7. BINDING ARBITRATION AND CLASS ACTION WAIVER. This Section applies if you live in (or, if a business, your principal place of business is in) the United States. If you and Microsoft have a dispute, you and Microsoft agree to try for 60 days to resolve it informally. If you and Microsoft can’t, you and Microsoft agree to binding individual arbitration before the American Arbitration Association under the Federal Arbitration Act (“FAA”), and not to sue in court in front of a judge or jury. Instead, a neutral arbitrator will decide. Class action lawsuits, class-wide arbitrations, private attorney-general actions, and any other proceeding where someone acts in a representative capacity are not allowed; nor is combining individual proceedings without the consent of all parties. The complete Arbitration Agreement contains more terms and is at http://aka.ms/arb-agreement-1. You and Microsoft agree to these terms. +8. TERMINATION. Without prejudice to any other rights, Microsoft may terminate this agreement if you fail to comply with any of its terms or conditions. In such event, you must destroy all copies of the software and all of its component parts. +9. ENTIRE AGREEMENT. This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software. +10. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles, except that the FAA governs everything related to arbitration. If you acquired the software in any other country, its laws apply, except that the FAA governs everything related to arbitration. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court (excluding arbitration). If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court (excluding arbitration). +11. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: +a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. +b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. +c) Germany and Austria. +i. Warranty. The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software. +ii. Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law. +Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence. +12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +13. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law. +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages. + +Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French. +Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. +Cette limitation concerne: +• tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et +• les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + + + +--------------------------------------------------------- + diff --git a/Test.ps1 b/Test.ps1 index 0eedef88c7..3964c17c2e 100644 --- a/Test.ps1 +++ b/Test.ps1 @@ -2,6 +2,7 @@ param ( [string]$Platform = "x64", [string]$Configuration = "debug", [switch]$IsAzurePipelineBuild = $false, + [switch]$RunUITests = $false, [switch]$Help = $false ) @@ -49,6 +50,8 @@ $isInstalled = Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVe if (-not $IsAzurePipelineBuild) { if ($isInstalled) { Write-Host "WinAppDriver is already installed on this computer." + + Start-Process -FilePath "C:\Program Files\Windows Application Driver\WinAppDriver.exe" } else { Write-Host "WinAppDriver will be installed in the background." $url = "https://github.com/microsoft/WinAppDriver/releases/download/v1.2.99/WindowsApplicationDriver-1.2.99-win-x64.exe" @@ -62,8 +65,6 @@ if (-not $IsAzurePipelineBuild) { Start-Process -Wait -FilePath (Join-Path $env:Build_SourcesDirectory "temp\WinAppDriverx64.exe") -ArgumentList "/S" -PassThru } - - Start-Process -FilePath "C:\Program Files\Windows Application Driver\WinAppDriver.exe" } function ShutDownTests { @@ -89,8 +90,8 @@ if (-not (Test-Path -Path "AppxPackages")) { try { foreach ($platform in $env:Build_Platform.Split(",")) { foreach ($configuration in $env:Build_Configuration.Split(",")) { - # TODO: UI tests are currently disabled in the pipeline until signing is solved - if (-not $IsAzurePipelineBuild) { + # TODO: UI tests are currently disabled in the pipeline until we can run tests as user + if ($RunUITests) { $DevHomePackage = Get-AppPackage "Microsoft.DevHome" -ErrorAction SilentlyContinue if ($DevHomePackage) { Write-Host "Uninstalling old Dev Home" @@ -98,6 +99,14 @@ try { } Write-Host "Installing Dev Home" Add-AppPackage (Join-Path "AppxPackages" "$configuration\DevHome-$platform.msix") + + if ($true) { + # Start/stop the app once so that WinAppDriver doesn't time out during first time setup + # and wait 60 seconds to give plenty of time + Start-Process "Shell:AppsFolder\Microsoft.Windows.DevHome.Dev_8wekyb3d8bbwe!App" + Start-Sleep 60 + Stop-Process -Name "DevHome" + } } $vstestArgs = @( @@ -108,12 +117,13 @@ try { $winAppTestArgs = @( "/Platform:$platform", "/Logger:trx;LogFileName=DevHome.UITest-$platform-$configuration.trx", + "/Settings:uitest\Test.runsettings", "uitest\bin\$platform\$configuration\net8.0-windows10.0.22621.0\DevHome.UITest.dll" ) & $vstestPath $vstestArgs - # TODO: UI tests are currently disabled in the pipeline until signing is solved - if (-not $IsAzurePipelineBuild) { + # TODO: UI tests are currently disabled in the pipeline until we can run tests as user + if ($RunUITests) { & $vstestPath $winAppTestArgs } @@ -128,12 +138,15 @@ try { $winAppTestArgs = @( "/Platform:$platform", "/Logger:trx;LogFileName=$tool.UITest-$platform-$configuration.trx", + "/Settings:uitest\Test.runsettings", "tools\$tool\*UITest\bin\$platform\$configuration\net8.0-windows10.0.22621.0\*.UITest.dll" ) - & $vstestPath $vstestArgs + if (Get-ChildItem "tools\$tool\*UnitTest\bin\$platform\$configuration\net8.0-windows10.0.22621.0\*.UnitTest.dll") { + & $vstestPath $vstestArgs + } # TODO: UI tests are currently disabled in the pipeline until signing is solved - if (-not $IsAzurePipelineBuild) { + if ($RunUITests) { & $vstestPath $winAppTestArgs } } diff --git a/TestingScenarios.md b/TestingScenarios.md index cb7d4f073a..9421fede57 100644 --- a/TestingScenarios.md +++ b/TestingScenarios.md @@ -9,3 +9,7 @@ These are the testing scenarios that need to be validated before shipping a new 1. [Dev Drive](tools/SetupFlow/DevHome.SetupFlow.UnitTest/TestingScenarios/DevDrive.md) 1. [Extension Library](tools/ExtensionLibrary/DevHome.ExtensionLibrary.UnitTest/TestingScenarios/ExtensionLibrary.md) 1. [Settings](settings/DevHome.Settings.UnitTest/TestingScenarios/Settings.md) +1. [Managing Environments](tools/Environments/DevHome.Environments/TestingScenarios/ManageEnvironments.md) +1. [Creating Environment](tools/SetupFlow/DevHome.SetupFlow.UnitTest/TestingScenarios/CreateEnvironment.md) +1. [Setting up an Environment](tools/SetupFlow/DevHome.SetupFlow.UnitTest/TestingScenarios/SetupEnvironment.md) + diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index e69e70024f..7e4a24542c 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -21,8 +21,8 @@ parameters: variables: # MSIXVersion's second part should always be odd to account for stub app's version - MSIXVersion: '0.1301' - VersionOfSDK: '0.400' + MSIXVersion: '0.1401' + VersionOfSDK: '0.600' solution: '**/DevHome.sln' appxPackageDir: 'AppxPackages' testOutputArtifactDir: 'TestResults' @@ -76,13 +76,18 @@ extends: filePath: 'Build.ps1' arguments: -Configuration "Release" -VersionOfSDK $(VersionOfSDK) -BuildStep "sdk" -IsAzurePipelineBuild - - task: PublishSymbols@2 - displayName: Publish Symbols - inputs: - SearchPattern: '**/bin/**/*.pdb' - IndexSources: false - SymbolServerType: TeamServices - SymbolsProduct: DevHomeSDK + - template: ./build/templates/publish-symbolrequestprod-api.yml@self + parameters: + includePublicSymbolServer: false + subscription: $(symbolsubscription) + symbolProject: 'DevHome' + indexSources: false + symbolsArtifactName: 'DevHomeSDK' + symbolsVersion: '$(Build.BuildNumber)' + searchPattern: | + **/bin/**/*.pdb + **/bin/**/*.exe + **/bin/**/*.dll templateContext: outputs: @@ -129,6 +134,7 @@ extends: - ${{ each configuration in parameters.Configurations }}: - ${{ each platform in parameters.Platforms }}: - job: Build_${{ platform }}_${{ configuration }} + timeoutInMinutes: 120 steps: - task: NuGetToolInstaller@1 @@ -147,13 +153,13 @@ extends: artifactName: 'SdkNugetPackage' targetPath: '$(Pipeline.Workspace)\sdkArtifacts\' - - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@1 + - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@3 displayName: Send and Download Localization Files for Artifacts condition: and(eq(variables['EnableLocalization'], 'true'), eq(variables['UpdateLocalization'], 'true')) inputs: teamId: 71220 - authId: $(TouchdownAppId) - authKey: $(TouchdownAppKey) + TDBuildServiceConnection: $(TouchdownServiceConnection) + authType: SubjectNameIssuer resourceFilePath: | **\en-US\*.resw **\en-US\PDP.xml @@ -162,14 +168,14 @@ extends: appendRelativeDir: true pseudoSetting: Included - - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@1 + - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@3 displayName: Download and Use Localization Files condition: eq(variables['EnableLocalization'], 'true') retryCountOnTaskFailure: 2 inputs: teamId: 71220 - authId: $(TouchdownAppId) - authKey: $(TouchdownAppKey) + TDBuildServiceConnection: $(TouchdownServiceConnection) + authType: SubjectNameIssuer resourceFilePath: | **\en-US\*.resw **\en-US\PDP.xml @@ -184,7 +190,7 @@ extends: targetType: inline script: >- $Files = Get-ChildItem . -R -Filter 'Resources.resw' | ? FullName -Like '*en-US\*\Resources.resw' - + $Files | % { Move-Item -Verbose $_.Directory $_.Directory.Parent.Parent -EA:Ignore } $Files = Get-ChildItem . -R -Filter 'PDP.xml' | ? FullName -Like '*en-US\*\PDP.xml' @@ -199,7 +205,7 @@ extends: targetType: inline script: >- New-Item -Path 'locArchive' -ItemType Directory - + tar czf locArchive\LocOutput.tar.gz LocOutput pwsh: true @@ -210,6 +216,31 @@ extends: filePath: 'Build.ps1' arguments: -Platform "${{ platform }}" -Configuration "${{ configuration }}" -Version $(MSIXVersion) -BuildStep "fullMsix" -AzureBuildingBranch "$(BuildingBranch)" -IsAzurePipelineBuild + - task: PowerShell@2 + displayName: Move BinLog to output directory + inputs: + targetType: inline + script: >- + Move-Item -Path $(Build.SourcesDirectory)\DevHome.${{ platform }}.${{ configuration }}.binlog -Destination $(Build.SourcesDirectory)\src\bin -Force + pwsh: true + + - template: ./build/templates/publish-symbolrequestprod-api.yml@self + parameters: + includePublicSymbolServer: true + symbolProject: 'DevHome' + subscription: $(SymbolSubscription) + indexSources: true + symbolsArtifactName: 'DevHome_${{ platform }}_${{ configuration }}' + symbolsVersion: $(Build.BuildNumber) + searchPattern: >- + $(Build.SourcesDirectory)\**\bin\**\*.pdb + + $(Build.SourcesDirectory)\**\bin\**\*.exe + + $(Build.SourcesDirectory)\**\bin\**\*.dll + + $(Build.SourcesDirectory)\**\obj\**\*.r2r.ni.pdb + - task: EsrpCodeSigning@2 inputs: ConnectedServiceName: 'Xlang Code Signing' @@ -299,17 +330,6 @@ extends: buildPlatform: '${{ platform }}' buildConfiguration: '${{ configuration }}' - - task: PublishSymbols@2 - displayName: Publish Symbols - inputs: - SearchPattern: >- - $(Build.SourcesDirectory)\**\bin\**\*.pdb - - $(Build.SourcesDirectory)\**\obj\**\*.r2r.ni.pdb - IndexSources: true - SymbolServerType: TeamServices - SymbolsProduct: DevHome - templateContext: outputs: - output: pipelineArtifact @@ -495,14 +515,14 @@ extends: artifactName: MsixBundle_Release targetPath: StorePublish - - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@1 + - task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@3 displayName: Download and Use Localization Files condition: eq(variables['EnableLocalization'], 'true') retryCountOnTaskFailure: 2 inputs: teamId: 71220 - authId: $(TouchdownAppId) - authKey: $(TouchdownAppKey) + TDBuildServiceConnection: $(TouchdownServiceConnection) + authType: SubjectNameIssuer resourceFilePath: | **\en-US\PDP.xml localizationTarget: false diff --git a/build/scripts/CreateBuildInfo.ps1 b/build/scripts/CreateBuildInfo.ps1 index e9882b5e1b..4acf970541 100644 --- a/build/scripts/CreateBuildInfo.ps1 +++ b/build/scripts/CreateBuildInfo.ps1 @@ -6,7 +6,7 @@ Param( ) $Major = "0" -$Minor = "13" +$Minor = "14" $Patch = "99" # default to 99 for local builds $versionSplit = $Version.Split("."); diff --git a/build/scripts/Unstub.ps1 b/build/scripts/Unstub.ps1 index b79e3d83aa..7888f14917 100644 --- a/build/scripts/Unstub.ps1 +++ b/build/scripts/Unstub.ps1 @@ -1,5 +1,9 @@ # This script unstubs the telemetry at build time and replaces the stubbed file with a reference internal nuget package +# +# Unstub managed telemetry +# + Remove-Item "$($PSScriptRoot)\..\..\telemetry\DevHome.Telemetry\TelemetryEventSource.cs" $projFile = "$($PSScriptRoot)\..\..\telemetry\DevHome.Telemetry\DevHome.Telemetry.csproj" @@ -25,4 +29,31 @@ $packageReferenceNode.SetAttribute("Version", "10.0.25148.1001-220626-1600.rs-fu $itemGroupNode = $xml.CreateElement("ItemGroup") $itemGroupNode.AppendChild($packageReferenceNode) $xml.DocumentElement.AppendChild($itemGroupNode) -$xml.Save($projFile) \ No newline at end of file +$xml.Save($projFile) + + +# +# Unstub native telemetry +# + +# Delete the existing stub .h +Remove-Item "$($PSScriptRoot)\..\..\telemetry\DevHome.Telemetry.Native\inc\MicrosoftTelemetry.h" + +# Load packages.config +$packagesConfig = "$($PSScriptRoot)\..\..\telemetry\DevHome.Telemetry.Native\packages.config" +$xml = [xml](Get-Content $packagesConfig -Encoding UTF8 -Raw) +$xml.PreserveWhitespace = $true + +# Create new +# e.g. +$packageNode = $xml.CreateElement("package"); +$packageNode.SetAttribute("id", "Microsoft.Telemetry.Inbox.Native") +$packageNode.SetAttribute("version", "10.0.18362.1-190318-1202.19h1-release.amd64fre") +$packageNode.SetAttribute("targetFramework", "native") + +# Append to +$packagesNode = $xml.SelectSingleNode("/packages") +$packagesNode.AppendChild($packageNode) + +# Save +$xml.Save($packagesConfig) diff --git a/build/templates/publish-symbolrequestprod-api.yml b/build/templates/publish-symbolrequestprod-api.yml new file mode 100644 index 0000000000..ee88098471 --- /dev/null +++ b/build/templates/publish-symbolrequestprod-api.yml @@ -0,0 +1,89 @@ +parameters: + - name: includePublicSymbolServer + type: boolean + default: false + - name: symbolsFolder + type: string + default: '$(Build.SourcesDirectory)/bin' + - name: searchPattern + type: string + default: '**/*.pdb' + - name: jobName + type: string + default: PublishSymbols + - name: indexSources + type: boolean + default: true + - name: symbolExpiryTime + type: string + default: 36530 # This is the default from PublishSymbols@2 + - name: symbolsArtifactName + type: string + default: '' + - name: symbolsVersion + type: string + default: '' + - name: symbolProject + type: string + - name: subscription + type: string + +steps: + - powershell: |- + Get-PackageProvider -Name NuGet -ForceBootstrap + Install-Module -Verbose -AllowClobber -Force Az.Accounts, Az.Storage, Az.Network, Az.Resources, Az.Compute + displayName: Install Azure Module Dependencies + + # Transit the Azure token from the Service Connection into a secret variable for the rest of the pipeline to use. + - task: AzurePowerShell@5 + displayName: Generate an Azure Token + inputs: + azureSubscription: ${{ parameters.subscription }} + azurePowerShellVersion: LatestVersion + pwsh: true + ScriptType: InlineScript + Inline: |- + $AzToken = (Get-AzAccessToken -ResourceUrl api://30471ccf-0966-45b9-a979-065dbedb24c1).Token + Write-Host "##vso[task.setvariable variable=SymbolAccessToken;issecret=true]$AzToken" + + - task: PublishSymbols@2 + displayName: Publish Symbols (to current Azure DevOps tenant) + continueOnError: True + inputs: + SearchPattern: ${{ parameters.searchPattern }} + IndexSources: ${{ parameters.indexSources }} + DetailedLog: true + SymbolsMaximumWaitTime: 30 + SymbolServerType: 'TeamServices' + SymbolsProduct: 'DevHome' + SymbolsVersion: ${{ parameters.symbolsVersion }} + SymbolsArtifactName: '${{ parameters.symbolsArtifactName }}_${{ parameters.symbolsVersion }}' + SymbolExpirationInDays: ${{ parameters.symbolExpiryTime }} + env: + LIB: $(Build.SourcesDirectory) + + - pwsh: |- + # Prepare the defaults for IRM + $PSDefaultParameterValues['Invoke-RestMethod:Headers'] = @{ Authorization = "Bearer $(SymbolAccessToken)" } + $PSDefaultParameterValues['Invoke-RestMethod:ContentType'] = "application/json" + $PSDefaultParameterValues['Invoke-RestMethod:Method'] = "POST" + + $BaseUri = "https://symbolrequestprod.trafficmanager.net/projects/${{ parameters.symbolProject }}/requests" + + # Prepare the request + $expiration = (Get-Date).Add([TimeSpan]::FromDays(${{ parameters.symbolExpiryTime }})) + $createRequestBody = @{ + requestName = "${{ parameters.symbolsArtifactName }}_${{ parameters.symbolsVersion }}"; + expirationTime = $expiration.ToString(); + } + Write-Host "##[debug]Starting request $($createRequestBody.requestName) with expiration date of $($createRequestBody.expirationTime)" + Invoke-RestMethod -Uri "$BaseUri" -Body ($createRequestBody | ConvertTo-Json -Compress) -Verbose + + # Request symbol publication + $publishRequestBody = @{ + publishToInternalServer = $true; + publishToPublicServer = $${{ parameters.includePublicSymbolServer }}; + } + Write-Host "##[debug]Submitting request $($createRequestBody.requestName) ($($publishRequestBody | ConvertTo-Json -Compress))" + Invoke-RestMethod -Uri "$BaseUri/$($createRequestBody.requestName)" -Body ($publishRequestBody | ConvertTo-Json -Compress) -Verbose + displayName: Publish Symbols using internal REST API \ No newline at end of file diff --git a/common/Contracts/IQuickstartSetupService.cs b/common/Contracts/IQuickstartSetupService.cs new file mode 100644 index 0000000000..9b4ccecaf0 --- /dev/null +++ b/common/Contracts/IQuickstartSetupService.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Threading.Tasks; + +namespace DevHome.Common.Contracts; + +public interface IQuickstartSetupService +{ + public bool IsDevHomeAzureExtensionInstalled(); + + public Task InstallDevHomeAzureExtensionAsync(); +} diff --git a/common/Contracts/IWindowsIdentityService.cs b/common/Contracts/IWindowsIdentityService.cs deleted file mode 100644 index 568b0660ba..0000000000 --- a/common/Contracts/IWindowsIdentityService.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -namespace DevHome.Common.Contracts; - -public interface IWindowsIdentityService -{ - string? GetCurrentUserName(); - - bool IsUserHyperVAdmin(); -} diff --git a/common/Controls/ExperimentControl.cs b/common/Controls/ExperimentControl.cs new file mode 100644 index 0000000000..30bd582cd8 --- /dev/null +++ b/common/Controls/ExperimentControl.cs @@ -0,0 +1,93 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using DevHome.Common.Extensions; +using DevHome.Common.Services; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Serilog; + +namespace DevHome.Common.Controls; + +/// +/// Control that displays content based on the state of an experiment. +/// +public sealed partial class ExperimentControl : ContentControl +{ + private readonly ILogger _log = Log.ForContext("SourceContext", nameof(ExperimentControl)); + + public ExperimentControl() + { + // Hide the control from the tab order. + IsTabStop = false; + Content = DefaultContent; + } + + /// + /// Gets or sets the key of the experiment to check for. + /// + public string? ExperimentKey + { + get => (string?)GetValue(ExperimentKeyProperty); + set => SetValue(ExperimentKeyProperty, value); + } + + /// + /// Gets or sets the content to display when the experiment is disabled. + /// + public object DefaultContent + { + get => GetValue(DefaultContentProperty); + set => SetValue(DefaultContentProperty, value); + } + + /// + /// Gets or sets the content to display when the experiment is enabled. + /// + public object ExperimentContent + { + get => GetValue(ExperimentContentProperty); + set => SetValue(ExperimentContentProperty, value); + } + + /// + /// Handles the change to any of the dependency properties. + /// + /// Experiment control. + /// Event arguments. + private static void ExperimentChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) + { + var control = (ExperimentControl)dependencyObject; + control.Content = control.GetContent(); + } + + /// + /// Gets the content to display based on the experiment state. + /// + /// The content to display. + private object GetContent() + { + if (string.IsNullOrEmpty(ExperimentKey)) + { + return DefaultContent; + } + + try + { + var experimentationService = Application.Current.GetService(); + var isExperimentEnabled = experimentationService.IsExperimentEnabled(ExperimentKey); + return isExperimentEnabled ? ExperimentContent : DefaultContent; + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to resolve experiment '{ExperimentKey}'"); + return DefaultContent; + } + } + + // List of dependency properties. + public static readonly DependencyProperty ExperimentKeyProperty = DependencyProperty.Register(nameof(ExperimentKey), typeof(string), typeof(ExperimentControl), new PropertyMetadata(null, ExperimentChanged)); + public static readonly DependencyProperty DefaultContentProperty = DependencyProperty.Register(nameof(DefaultContent), typeof(object), typeof(ExperimentControl), new PropertyMetadata(null, ExperimentChanged)); + public static readonly DependencyProperty ExperimentContentProperty = DependencyProperty.Register(nameof(ExperimentContent), typeof(object), typeof(ExperimentControl), new PropertyMetadata(null, ExperimentChanged)); +} diff --git a/common/DevHome.Common.csproj b/common/DevHome.Common.csproj index 0611a8d44c..5e046bf8ec 100644 --- a/common/DevHome.Common.csproj +++ b/common/DevHome.Common.csproj @@ -14,6 +14,8 @@ + + @@ -42,7 +44,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + @@ -52,7 +54,7 @@ - + @@ -73,9 +75,16 @@ $(DefaultXamlRuntime) + + $(DefaultXamlRuntime) + Designer + MSBuild:Compile + + $(DefaultXamlRuntime) + MSBuild:Compile diff --git a/common/Environments/CustomControls/CardBody.xaml b/common/Environments/CustomControls/CardBody.xaml index 2bf8a3d24c..c8fcfe3f80 100644 --- a/common/Environments/CustomControls/CardBody.xaml +++ b/common/Environments/CustomControls/CardBody.xaml @@ -35,7 +35,7 @@ Source="{x:Bind ComputeSystemImage, Mode=OneWay}" Width="{StaticResource ComputeSystemImage64px}" Height="{StaticResource ComputeSystemImage64px}" - Stretch="Fill"/> + Stretch="Uniform"/> @@ -61,7 +61,7 @@ ColumnSpacing="{StaticResource ContainerElementSpacing}"> - + GetBitmapImageAsync(ComputeSystem computeSystemWrapper) + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ComputeSystemHelpers)); + + public static async Task GetBitmapImageArrayAsync(ComputeSystemCache computeSystem) { try { - var result = await computeSystemWrapper.GetComputeSystemThumbnailAsync(string.Empty); + var result = await computeSystem.GetComputeSystemThumbnailAsync(string.Empty); if ((result.Result.Status == ProviderOperationStatus.Failure) || (result.ThumbnailInBytes.Length <= 0)) { - Log.Error($"Failed to get thumbnail for compute system {computeSystemWrapper}. Error: {result.Result.DiagnosticText}"); + _log.Error($"Failed to get thumbnail for compute system {computeSystem}. Error: {result.Result.DiagnosticText}"); // No thumbnail available, return null so that the card will display the default image. return null; } + return result.ThumbnailInBytes; + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to get thumbnail for compute system {computeSystem}."); + return null; + } + } + + public static BitmapImage? GetBitmapImageFromByteArray(byte[] array) + { + try + { var bitmap = new BitmapImage(); - bitmap.SetSource(result.ThumbnailInBytes.AsBuffer().AsStream().AsRandomAccessStream()); + bitmap.SetSource(array.AsBuffer().AsStream().AsRandomAccessStream()); return bitmap; } catch (Exception ex) { - Log.Error(ex, $"Failed to get thumbnail for compute system {computeSystemWrapper}."); + _log.Error(ex, "Failed to get thumbnail from a byte array."); return null; } } - public static async Task> GetComputeSystemPropertiesAsync(ComputeSystem computeSystemWrapper, string packageFullName) + public static async Task GetBitmapImageAsync(ComputeSystemCache computeSystem) + { + var array = await GetBitmapImageArrayAsync(computeSystem); + return (array != null) ? GetBitmapImageFromByteArray(array) : null; + } + + public static List GetComputeSystemCardProperties(IEnumerable properties, string packageFullName) { var propertyList = new List(); try { - var cuurentProperties = await computeSystemWrapper.GetComputeSystemPropertiesAsync(string.Empty); - foreach (var property in cuurentProperties) + foreach (var property in properties) { propertyList.Add(new CardProperty(property, packageFullName)); } @@ -56,11 +77,25 @@ public static async Task> GetComputeSystemPropertiesAsync(Com } catch (Exception ex) { - Log.Error(ex, $"Failed to get all properties for compute system {computeSystemWrapper}."); + _log.Error(ex, $"Failed to get all ComputeSystemCardProperties."); return propertyList; } } + public static async Task> GetComputeSystemCardPropertiesAsync(ComputeSystemCache computeSystem, string packageFullName) + { + try + { + var currentProperties = await computeSystem.GetComputeSystemPropertiesAsync(string.Empty); + return GetComputeSystemCardProperties(currentProperties, packageFullName); + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to get all properties for compute system {computeSystem}."); + return new List(); + } + } + public static CardStateColor GetColorBasedOnState(ComputeSystemState state) { return state switch @@ -70,4 +105,67 @@ public static CardStateColor GetColorBasedOnState(ComputeSystemState state) _ => CardStateColor.Caution, }; } + + public static EnvironmentsCallToActionData UpdateCallToActionText(int providerCount, bool isCreationPage = false) + { + var navigateToExtensionsLibrary = false; + string? callToActionText = null; + string? callToActionHyperLinkText = null; + + // When the provider count is zero we'll show UX to redirect the user to the extensions library and when it is + // greater than zero we'll show UX to redirect user to the create environment flow. + if (providerCount == 0) + { + navigateToExtensionsLibrary = true; + callToActionText = StringResourceHelper.GetResource("NoEnvironmentsAndExtensionsNotInstalledCallToAction"); + callToActionHyperLinkText = StringResourceHelper.GetResource("NoEnvironmentsAndExtensionsNotInstalledButton"); + } + else if (providerCount > 0 && !isCreationPage) + { + // Text to redirect user to Creation flow in Machine configuration + callToActionText = StringResourceHelper.GetResource("NoEnvironmentsButExtensionsInstalledCallToAction"); + callToActionHyperLinkText = StringResourceHelper.GetResource("NoEnvironmentsButExtensionsInstalledButton"); + } + + return new(navigateToExtensionsLibrary, callToActionText, callToActionHyperLinkText); + } + + /// + /// Safely removes all items from an observable collection and replaces them with new items. + /// + /// + /// There can be random COM exceptions due to using the "Clear()" method in an observable collection. This method + /// is used so that we can safely clear the observable collection without throwing an exceptions. This is related + /// to this GitHub issue https://github.com/microsoft/microsoft-ui-xaml/issues/8684. To work around this, + /// this method is used to remove all items individually from the end of the collection to the beginning of the collection. + /// + /// Type of objects that the collection contains + /// An observable collection that contains zero to N elements that will have its contents replaced + /// A list that contains zero to N elements whose elements will be added to collectionToUpdate + /// + /// True only if we successfully replaced all items in the collection. False otherwise. + /// + public static bool RemoveAllItemsAndReplace(ObservableCollection collectionToUpdate, List listWithUpdates) + { + try + { + for (var i = collectionToUpdate.Count - 1; i >= 0; i--) + { + collectionToUpdate.RemoveAt(i); + } + + for (var i = 0; i < listWithUpdates.Count; i++) + { + collectionToUpdate.Add(listWithUpdates[i]); + } + + return true; + } + catch (Exception ex) + { + _log.Error(ex, "Unable to remove items from the collection"); + } + + return false; + } } diff --git a/common/Environments/Helpers/EnvironmentsNotificationHelper.cs b/common/Environments/Helpers/EnvironmentsNotificationHelper.cs new file mode 100644 index 0000000000..98d56cd1c4 --- /dev/null +++ b/common/Environments/Helpers/EnvironmentsNotificationHelper.cs @@ -0,0 +1,250 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.WinUI.Behaviors; +using DevHome.Common.Environments.Models; +using DevHome.Common.Environments.Scripts; +using DevHome.Common.Extensions; +using DevHome.Common.Helpers; +using DevHome.Common.Services; +using Microsoft.UI.Xaml.Controls; +using Microsoft.Windows.DevHome.SDK; +using Serilog; + +namespace DevHome.Common.Environments.Helpers; + +/// +/// Helper class for the pages in Dev Home that display environments. These pages can use this helper to display +/// the Community toolkits which allows info bars to be shown in a queue +/// like manner. +/// +public partial class EnvironmentsNotificationHelper +{ + private readonly ILogger _log = Log.ForContext("SourceContext", nameof(EnvironmentsNotificationHelper)); + + private readonly WindowsIdentityHelper _windowsIdentityHelper = new(); + + private const string MicrosoftHyperVText = "Microsoft Hyper-V"; + + private static bool _shouldShowHyperVRebootButton; + + private readonly StringResource _stringResource; + + private readonly StackedNotificationsBehavior _stackedNotificationsBehavior; + + public EnvironmentsNotificationHelper(StackedNotificationsBehavior notificationsQueue) + { + _stackedNotificationsBehavior = notificationsQueue; + _stringResource = new StringResource("DevHome.Common.pri", "DevHome.Common/Resources"); + } + + public void DisplayComputeSystemProviderErrors(ComputeSystemProviderDetails providerDetails) + { + var extensionId = providerDetails.ExtensionWrapper.ExtensionClassId; + + // When the Hyper-V feature is not present it will never be queried for its compute systems. + // So it is safe to assume that when we enter this if statement the feature is available on the machine + if (extensionId.Equals(CommonConstants.HyperVExtensionClassId, StringComparison.OrdinalIgnoreCase)) + { + ShowAddUserToAdminGroupAndEnableHyperVNotification(); + } + } + + public void DisplayComputeSystemEnumerationErrors(ComputeSystemsLoadedData computeSystemData) + { + DisplayComputeSystemProviderErrors(computeSystemData.ProviderDetails); + + // Show error notifications for failed provider/developer id combinations + var provider = computeSystemData.ProviderDetails.ComputeSystemProvider; + + foreach (var mapping in computeSystemData.DevIdToComputeSystemMap.Where(kv => + kv.Value.Result.Status == ProviderOperationStatus.Failure)) + { + var result = mapping.Value.Result; + _stackedNotificationsBehavior.ShowWithWindowExtension(provider.DisplayName, result.DisplayMessage, InfoBarSeverity.Error); + + _log.Error($"Error after retrieving Compute systems for provider: " + + $"Provider Id: {provider.Id} \n" + + $"DisplayText: {result.DisplayMessage} \n" + + $"DiagnosticText: {result.DiagnosticText} \n" + + $"ExtendedError: {result.ExtendedError}"); + } + } + + public void ClearNotifications() + { + _stackedNotificationsBehavior.ClearWithWindowExtension(); + } + + private void ShowAddUserToAdminGroupAndEnableHyperVNotification() + { + // If we've already added the user to the group, their local security access token won't be updated + // until the user logs off and back on again. With enabling Hyper-V, the feature won't be active until + // the user reboots. If they choose not to reboot then we don't want to prompt + // them to be enable it or added again so we'll prompt them to reboot again. + if (_shouldShowHyperVRebootButton) + { + ShowRestartNotification(); + return; + } + + var userInAdminGroup = _windowsIdentityHelper.IsUserHyperVAdmin(); + var featureEnabled = ManagementInfrastructureHelper.IsWindowsFeatureAvailable(CommonConstants.HyperVWindowsOptionalFeatureName) == FeatureAvailabilityKind.Enabled; + + if (!featureEnabled && !userInAdminGroup) + { + // Notification to enable Hyper-V and add user to Admin group + _stackedNotificationsBehavior.ShowWithWindowExtension( + MicrosoftHyperVText, + _stringResource.GetLocalized("HyperVAdminAddUserAndEnableHyperVMessage"), + InfoBarSeverity.Error, + AddUserToHyperVAdminGroupAndEnableHyperVCommand, + _stringResource.GetLocalized("HyperVAdminAddUserAndEnableHyperVButton")); + } + else if (!featureEnabled && userInAdminGroup) + { + // Notification to enable the Hyper-V feature when user is in the admin group + _stackedNotificationsBehavior.ShowWithWindowExtension( + MicrosoftHyperVText, + _stringResource.GetLocalized("HyperVFeatureNotEnabledMessage"), + InfoBarSeverity.Error, + AddUserToHyperVAdminGroupAndEnableHyperVCommand, + _stringResource.GetLocalized("HyperVEnableButton")); + } + else if (featureEnabled && !userInAdminGroup) + { + // Notification to add user to the Hyper-V admin group when the feature is enabled + _stackedNotificationsBehavior.ShowWithWindowExtension( + MicrosoftHyperVText, + _stringResource.GetLocalized("UserNotInHyperAdminGroupMessage"), + InfoBarSeverity.Error, + AddUserToHyperVAdminGroupAndEnableHyperVCommand, + _stringResource.GetLocalized("HyperVAdminAddUserButton")); + } + } + + private void ShowErrorWithRebootAfterExecutionMessage(string errorMsg) + { + _stackedNotificationsBehavior.ShowWithWindowExtension( + MicrosoftHyperVText, + errorMsg, + InfoBarSeverity.Error); + } + + private void ShowRestartNotification() + { + _stackedNotificationsBehavior.ShowWithWindowExtension( + MicrosoftHyperVText, + _stringResource.GetLocalized("RestartAfterChangesMessage"), + InfoBarSeverity.Warning, + RestartComputerCommand, + _stringResource.GetLocalized("RestartButton")); + } + + public void DisplayComputeSystemOperationError(string providerDisplayName, string computeSystemDisplayName, string errorText) + { + var titleText = $"{providerDisplayName} ({computeSystemDisplayName})"; + _stackedNotificationsBehavior.ShowWithWindowExtension(titleText, errorText, InfoBarSeverity.Error); + } + + [RelayCommand] + private void RestartComputer() + { + var startInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Hidden, + + // Restart the computer + FileName = Environment.SystemDirectory + "\\shutdown.exe", + Arguments = "-r -t 0", + Verb = string.Empty, + }; + + var process = new Process + { + StartInfo = startInfo, + }; + process.Start(); + } + + [RelayCommand] + private void AddUserToHyperVAdminGroupAndEnableHyperV(Notification notification) + { + var user = _windowsIdentityHelper.GetCurrentUserName(); + if (user == null) + { + _log.Error("Unable to get the current user name"); + return; + } + + _stackedNotificationsBehavior.RemoveWithWindowExtension(notification); + var startInfo = new ProcessStartInfo(); + + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.FileName = $"powershell.exe"; + + // Add the user to the Hyper-V Administrators group and enable the Hyper-V feature if it is not already enabled. + // Using a string instead of a file for the script so it can't be manipulated via the file system. + startInfo.Arguments = $"-ExecutionPolicy Bypass -Command \"{HyperVSetupScript.SetupFunction}\""; + startInfo.UseShellExecute = true; + startInfo.Verb = "runas"; + + var process = new Process(); + process.StartInfo = startInfo; + Task.Run(() => + { + // Since a UAC prompt will be shown, we need to wait for the process to exit + // This can also be cancelled by the user which will result in an exception + try + { + process.Start(); + process.WaitForExit(); + + _stackedNotificationsBehavior.ClearWithWindowExtension(); + _log.Information($"Script exited with code: '{process.ExitCode}'"); + + // ExitCodes come directly from within the script in HyperVSetupScript.SetupFunction. + switch (process.ExitCode) + { + case 0: + // The script successfully added the user to the Hyper-V Admin Group and enabled the Hyper-V Feature. + _shouldShowHyperVRebootButton = true; + ShowRestartNotification(); + return; + case 2: + // Hyper-V Feature is already enabled and the script successfully added the user to the Hyper-V Admin group. + _shouldShowHyperVRebootButton = true; + ShowRestartNotification(); + return; + case 3: + // Hyper-V Feature is already enabled and the script failed to add the user to the Hyper-V Admin group. + ShowErrorWithRebootAfterExecutionMessage(_stringResource.GetLocalized("UserNotAddedToHyperVAdminGroupMessage")); + return; + case 4: + // The user is already in the Hyper-V Admin group and the script successfully enabled the Hyper-Feature. + _shouldShowHyperVRebootButton = true; + ShowRestartNotification(); + return; + case 5: + // The user is already in the Hyper-V Admin group and the script failed to enable the Hyper-Feature. + ShowErrorWithRebootAfterExecutionMessage(_stringResource.GetLocalized("UnableToEnableHyperVFeatureMessage")); + return; + case 6: + // Display nothing as there is no work to be done + return; + } + } + catch (Exception ex) + { + _log.Error(ex, "Script failed, we may not have been able to add user to Hyper-V admin group or enable Hyper-V"); + } + + ShowErrorWithRebootAfterExecutionMessage(_stringResource.GetLocalized("UnableToAddUserToHyperVAdminAndEnableHyperVMessage")); + }); + } +} diff --git a/common/Environments/Models/CardProperty.cs b/common/Environments/Models/CardProperty.cs index cc46c5a33c..9ff8eea24c 100644 --- a/common/Environments/Models/CardProperty.cs +++ b/common/Environments/Models/CardProperty.cs @@ -51,7 +51,7 @@ public partial class CardProperty : ObservableObject public string PackageFullName { get; private set; } - public CardProperty(ComputeSystemProperty property, string packageFullName) + public CardProperty(ComputeSystemPropertyCache property, string packageFullName) { Title = property.Name; PackageFullName = packageFullName; diff --git a/common/Environments/Models/ComputeSystem.cs b/common/Environments/Models/ComputeSystem.cs index 78be6f02e5..5d3f6722b0 100644 --- a/common/Environments/Models/ComputeSystem.cs +++ b/common/Environments/Models/ComputeSystem.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Globalization; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using DevHome.Common.Environments.Helpers; @@ -11,6 +13,8 @@ using Microsoft.Windows.DevHome.SDK; using Serilog; using Windows.Foundation; +using Windows.Win32; +using WinRT; namespace DevHome.Common.Environments.Models; @@ -275,10 +279,26 @@ public async Task> GetComputeSystemProperties } } + // We need to give DevHomeAzureExtension the ability to SetForeground on the processes it creates. In some cases + // these processes need to show UI, in some cases they call APIs that only succeed if they are called from a + // foreground process. We call CoAllowSetForegroundWindow on the COM interface that we are about to use to allow + // the process to set foreground window. + // CoAllowSetForegroundWindow must be called on a raw COM interface, not a .NET CCW, in order to work correctly, since + // the underlying functionality is implemented by COM runtime and the object itself. CoAllowSetForegroundWindow wrapper + // below takes a WinRT object and extracts the raw COM interface pointer from it before calling native CoAllowSetForegroundWindow. + [DllImport("ole32.dll", ExactSpelling = true, PreserveSig = false)] + private static extern void CoAllowSetForegroundWindow(IntPtr pUnk, IntPtr lpvReserved); + + private void CoAllowSetForegroundWindow(IComputeSystem computeSystem) + { + CoAllowSetForegroundWindow(((IWinRTObject)computeSystem).NativeObject.ThisPtr, 0); + } + public async Task ConnectAsync(string options) { try { + CoAllowSetForegroundWindow(_computeSystem); return await _computeSystem.ConnectAsync(options); } catch (Exception ex) @@ -294,6 +314,7 @@ public async Task PinToStartMenuAsync(string optio { if (_computeSystem is IComputeSystem2 computeSystem2) { + CoAllowSetForegroundWindow(computeSystem2); return await computeSystem2.PinToStartMenuAsync(); } @@ -312,6 +333,7 @@ public async Task UnpinFromStartMenuAsync(string o { if (_computeSystem is IComputeSystem2 computeSystem2) { + CoAllowSetForegroundWindow(computeSystem2); return await computeSystem2.UnpinFromStartMenuAsync(); } @@ -330,6 +352,7 @@ public async Task PinToTaskbarAsync(string options { if (_computeSystem is IComputeSystem2 computeSystem2) { + CoAllowSetForegroundWindow(computeSystem2); return await computeSystem2.PinToTaskbarAsync(); } @@ -348,6 +371,7 @@ public async Task UnpinFromTaskbarAsync(string opt { if (_computeSystem is IComputeSystem2 computeSystem2) { + CoAllowSetForegroundWindow(computeSystem2); return await computeSystem2.UnpinFromTaskbarAsync(); } @@ -366,6 +390,7 @@ public async Task GetIsPinnedToStartMenuAsync() { if (_computeSystem is IComputeSystem2 computeSystem2) { + CoAllowSetForegroundWindow(computeSystem2); return await computeSystem2.GetIsPinnedToStartMenuAsync(); } @@ -384,6 +409,7 @@ public async Task GetIsPinnedToTaskbarAsync() { if (_computeSystem is IComputeSystem2 computeSystem2) { + CoAllowSetForegroundWindow(computeSystem2); return await computeSystem2.GetIsPinnedToTaskbarAsync(); } diff --git a/common/Environments/Models/ComputeSystemCache.cs b/common/Environments/Models/ComputeSystemCache.cs new file mode 100644 index 0000000000..56eaf4ecd5 --- /dev/null +++ b/common/Environments/Models/ComputeSystemCache.cs @@ -0,0 +1,274 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Threading.Tasks; +using DevHome.Common.Helpers; +using Microsoft.Windows.DevHome.SDK; +using Serilog; +using Windows.Foundation; + +namespace DevHome.Common.Environments.Models; + +/// +/// Wrapper class for the IComputeSystem interface that can be used throughout the application. +/// It uses lazy initialization to cache the results of OOP calls to the extension methods. +/// The implementation of the calls to IComputeSystem remains in ComputeSystem class for now. +/// Once we remove direct usage of ComputeSystem class throughout the code, we can merge these two classes. +/// +public class ComputeSystemCache +{ + private readonly ILogger _log = Log.ForContext("SourceContext", nameof(ComputeSystemCache)); + + public ComputeSystem ComputeSystem { get; private set; } + + public Lazy Id { get; private set; } + + public Lazy DisplayName { get; private set; } + + public Lazy SupportedOperations { get; private set; } + + public Lazy SupplementalDisplayName { get; private set; } + + public Lazy AssociatedDeveloperId { get; private set; } + + public Lazy AssociatedProviderId { get; private set; } + + private readonly Lazy> _stateResult; + private readonly Lazy> _thumbnailResult; + private Lazy>> _properties; + private Lazy> _pinnedToStartResult; + private Lazy> _pinnedToTaskbarResult; + + // This is used to store the parameter for the thumbnail request so that it can be used with lazy initialization. + // There is a race if it's used concurrently from different threads, however it's not expected to use this class + // to initialize properties concurrently and these parameters are not used at the moment. + private string _thumbnailParameter = string.Empty; + private string _propertiesParameter = string.Empty; + + public ComputeSystemCache(ComputeSystem computeSystem) + { + ComputeSystem = computeSystem; + + // TODO: The following non-async properties are already cached in ComputeSystem. Once we update + // code to use ComputeSystemCache in most places, we can do all the caching in this class. + Id = new Lazy(() => ComputeSystem.Id); + DisplayName = new Lazy(() => ComputeSystem.DisplayName); + SupplementalDisplayName = new Lazy(() => ComputeSystem.SupplementalDisplayName); + AssociatedDeveloperId = new Lazy(() => ComputeSystem.AssociatedDeveloperId); + AssociatedProviderId = new Lazy(() => ComputeSystem.AssociatedProviderId); + SupportedOperations = new Lazy(() => ComputeSystem.SupportedOperations); + + // Async properties + _stateResult = new Lazy>(() => ComputeSystem.GetStateAsync()); + _thumbnailResult = new Lazy>(() => ComputeSystem.GetComputeSystemThumbnailAsync(_thumbnailParameter)); + _properties = new Lazy>>(() => InitComputeSystemPropertiesAsync(_propertiesParameter)); + _pinnedToStartResult = new Lazy>(() => ComputeSystem.GetIsPinnedToStartMenuAsync()); + _pinnedToTaskbarResult = new Lazy>(() => ComputeSystem.GetIsPinnedToTaskbarAsync()); + } + + public ComputeSystemCache(IComputeSystem computeSystem) + : this(new ComputeSystem(computeSystem)) + { + } + + public event TypedEventHandler StateChanged + { + add => ComputeSystem.StateChanged += value; + remove => ComputeSystem.StateChanged -= value; + } + + public async Task GetStateAsync() + { + return await _stateResult.Value; + } + + public async Task StartAsync(string options) + { + return await ComputeSystem.StartAsync(options); + } + + public async Task ShutDownAsync(string options) + { + return await ComputeSystem.ShutDownAsync(options); + } + + public async Task RestartAsync(string options) + { + return await ComputeSystem.RestartAsync(options); + } + + public async Task TerminateAsync(string options) + { + return await ComputeSystem.TerminateAsync(options); + } + + public async Task DeleteAsync(string options) + { + return await ComputeSystem.DeleteAsync(options); + } + + public async Task SaveAsync(string options) + { + return await ComputeSystem.SaveAsync(options); + } + + public async Task PauseAsync(string options) + { + return await ComputeSystem.PauseAsync(options); + } + + public async Task ResumeAsync(string options) + { + return await ComputeSystem.ResumeAsync(options); + } + + public async Task CreateSnapshotAsync(string options) + { + return await ComputeSystem.CreateSnapshotAsync(options); + } + + public async Task RevertSnapshotAsync(string options) + { + return await ComputeSystem.RevertSnapshotAsync(options); + } + + public async Task DeleteSnapshotAsync(string options) + { + return await ComputeSystem.DeleteSnapshotAsync(options); + } + + public async Task ModifyPropertiesAsync(string options) + { + return await ComputeSystem.ModifyPropertiesAsync(options); + } + + public async Task GetComputeSystemThumbnailAsync(string options) + { + _thumbnailParameter = options; + return await _thumbnailResult.Value; + } + + public async Task> InitComputeSystemPropertiesAsync(string options) + { + var remoteProperties = await ComputeSystem.GetComputeSystemPropertiesAsync(options); + var localProperties = new List(); + foreach (var property in remoteProperties) + { + try + { + localProperties.Add(new ComputeSystemPropertyCache(property)); + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to get property value for {ComputeSystem} due to exception"); + } + } + + return localProperties; + } + + public async Task> GetComputeSystemPropertiesAsync(string options) + { + _propertiesParameter = options; + return await _properties.Value; + } + + public async Task ConnectAsync(string options) + { + return await ComputeSystem.ConnectAsync(options); + } + + public async Task PinToStartMenuAsync(string options) + { + return await ComputeSystem.PinToStartMenuAsync(options); + } + + public async Task UnpinFromStartMenuAsync(string options) + { + return await ComputeSystem.UnpinFromStartMenuAsync(options); + } + + public async Task PinToTaskbarAsync(string options) + { + return await ComputeSystem.PinToTaskbarAsync(options); + } + + public async Task UnpinFromTaskbarAsync(string options) + { + return await ComputeSystem.UnpinFromTaskbarAsync(options); + } + + public async Task GetIsPinnedToStartMenuAsync() + { + return await _pinnedToStartResult.Value; + } + + public void ResetPinnedToStartMenu() + { + _pinnedToStartResult = new Lazy>(() => ComputeSystem.GetIsPinnedToStartMenuAsync()); + } + + public async Task GetIsPinnedToTaskbarAsync() + { + return await _pinnedToTaskbarResult.Value; + } + + public void ResetPinnedToTaskbar() + { + _pinnedToTaskbarResult = new Lazy>(() => ComputeSystem.GetIsPinnedToTaskbarAsync()); + } + + public void ResetComputeSystemProperties() + { + _properties = new Lazy>>(() => InitComputeSystemPropertiesAsync(_propertiesParameter)); + } + + public IApplyConfigurationOperation CreateApplyConfigurationOperation(string configuration) + { + return ComputeSystem.CreateApplyConfigurationOperation(configuration); + } + + public async Task FetchDataAsync() + { + _ = await GetStateAsync(); + var supportedOperations = SupportedOperations?.Value ?? ComputeSystemOperations.None; + + if (supportedOperations.HasFlag(ComputeSystemOperations.PinToStartMenu)) + { + _ = await GetIsPinnedToStartMenuAsync(); + } + + if (supportedOperations.HasFlag(ComputeSystemOperations.PinToTaskbar)) + { + _ = await GetIsPinnedToTaskbarAsync(); + } + + _ = await GetComputeSystemThumbnailAsync(string.Empty); + _ = await GetComputeSystemPropertiesAsync(string.Empty); + } + + public void ResetSupportedOperations() + { + SupportedOperations = new Lazy(() => ComputeSystem.SupportedOperations); + } + + public override string ToString() + { + StringBuilder builder = new(); + builder.AppendLine(CultureInfo.InvariantCulture, $"ComputeSystem ID: {Id} "); + builder.AppendLine(CultureInfo.InvariantCulture, $"ComputeSystem name: {DisplayName} "); + builder.AppendLine(CultureInfo.InvariantCulture, $"ComputeSystem SupplementalDisplayName: {SupplementalDisplayName} "); + builder.AppendLine(CultureInfo.InvariantCulture, $"ComputeSystem associated Provider Id : {AssociatedProviderId} "); + builder.AppendLine(CultureInfo.InvariantCulture, $"ComputeSystem associated developerId LoginId: {AssociatedDeveloperId?.Value?.LoginId} "); + builder.AppendLine(CultureInfo.InvariantCulture, $"ComputeSystem associated developerId Url: {AssociatedDeveloperId?.Value?.Url} "); + + var supportedOperations = EnumHelper.SupportedOperationsToString(SupportedOperations.Value); + builder.AppendLine(CultureInfo.InvariantCulture, $"ComputeSystem supported operations : {string.Join(",", supportedOperations)} "); + + return builder.ToString(); + } +} diff --git a/common/Environments/Models/ComputeSystemPropertyCache.cs b/common/Environments/Models/ComputeSystemPropertyCache.cs new file mode 100644 index 0000000000..2e24f1b61d --- /dev/null +++ b/common/Environments/Models/ComputeSystemPropertyCache.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Globalization; +using Microsoft.Windows.DevHome.SDK; + +namespace DevHome.Common.Environments.Models; + +/// +/// Wrapper class for the ComputeSystemProperty SDK class that can be used to fetch data once and use is +/// after that without making OOP calls to Compute System extension. +/// +public class ComputeSystemPropertyCache +{ + public string Name { get; private set; } + + public ComputeSystemPropertyKind PropertyKind { get; private set; } + + public object? Value { get; private set; } + + public Uri Icon { get; private set; } + + public ComputeSystemPropertyCache(ComputeSystemProperty property) + { + Name = property.Name; + PropertyKind = property.PropertyKind; + Value = ConvertToLocalObjectIfPossible(property.Value); + Icon = property.Icon; + } + + private object? ConvertToLocalObjectIfPossible(object value) + { + switch (PropertyKind) + { + case ComputeSystemPropertyKind.UptimeIn100ns: + return value as TimeSpan?; + case ComputeSystemPropertyKind.CpuCount: + case ComputeSystemPropertyKind.StorageSizeInBytes: + case ComputeSystemPropertyKind.AssignedMemorySizeInBytes: + return Convert.ToUInt64(value, CultureInfo.CurrentCulture); + default: + return value; + } + } +} diff --git a/common/Environments/Models/ComputeSystemReviewItem.cs b/common/Environments/Models/ComputeSystemReviewItem.cs index 36fe3f4f4e..aff6a5ae4d 100644 --- a/common/Environments/Models/ComputeSystemReviewItem.cs +++ b/common/Environments/Models/ComputeSystemReviewItem.cs @@ -9,11 +9,11 @@ namespace DevHome.Common.Environments.Models; /// public class ComputeSystemReviewItem { - public ComputeSystem ComputeSystemToSetup { get; set; } + public ComputeSystemCache ComputeSystemToSetup { get; set; } public ComputeSystemProvider AssociatedProvider { get; set; } - public ComputeSystemReviewItem(ComputeSystem computeSystemToSetup, ComputeSystemProvider associatedProvider) + public ComputeSystemReviewItem(ComputeSystemCache computeSystemToSetup, ComputeSystemProvider associatedProvider) { ComputeSystemToSetup = computeSystemToSetup; AssociatedProvider = associatedProvider; diff --git a/common/Environments/Models/EnvironmentsCallToActionData.cs b/common/Environments/Models/EnvironmentsCallToActionData.cs new file mode 100644 index 0000000000..8e274bc26c --- /dev/null +++ b/common/Environments/Models/EnvironmentsCallToActionData.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace DevHome.Common.Environments.Models; + +public class EnvironmentsCallToActionData +{ + public bool NavigateToExtensionsLibrary { get; } + + public string? CallToActionText { get; } + + public string? CallToActionHyperLinkText { get; } + + public EnvironmentsCallToActionData(bool navigateToExtensionsLibrary, string? callToActionText, string? callToActionHyperLinkText) + { + NavigateToExtensionsLibrary = navigateToExtensionsLibrary; + CallToActionText = callToActionText; + CallToActionHyperLinkText = callToActionHyperLinkText; + } +} diff --git a/common/Environments/Scripts/HyperVSetupScript.cs b/common/Environments/Scripts/HyperVSetupScript.cs new file mode 100644 index 0000000000..6274e083c6 --- /dev/null +++ b/common/Environments/Scripts/HyperVSetupScript.cs @@ -0,0 +1,142 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DevHome.Common.Environments.Scripts; + +public static class HyperVSetupScript +{ + public const string SetupFunction = @" + + # For cmdlet operation results so we can compare results and choose the right exit code + enum OperationStatus + { + OperationSucceeded = 0 + OperationFailed = 1 + OperationNotRun = 2 + } + + <# + This script does the following: + 1. Checks if the user is in the Hyper-V Administrators group and adds them if they are not in it + 2. Checks if the Hyper-V Feature is enabled and enables the feature if it is not already enabled. + 3. If the user is in the Hyper-V Administrators group and the Hyper-V feature is enabled. The script does nothing. + + The script uses the following exit codes to signal to Dev Home what message it should show to the user. + + Exit Codes (Note: we don't use exit code of 1 since that's the generic exit code if there was an exception): + 0. The script successfully added the user to the Hyper-V Admin Group and enabled the Hyper-V Feature. + 2. The user is not in the Hyper-V Admin Group and the Hyper-V Feature is already enabled. The script successfully added the user to the Hyper-V Admin group. + 3. The user is not in the Hyper-V Admin Group and the Hyper-V Feature is already enabled. The script failed to add the user to the Hyper-V Admin group. + 4. The user is in the Hyper-V Admin group and the Hyper-V Feature is not already enabled. The script successfully enabled the Hyper-Feature. + 5. The user is in the Hyper-V Admin group and the Hyper-V Feature is not already enabled. The script failed to enable the Hyper-Feature. + 6. The user is already in the Hyper-V Admin group and the Hyper-V Feature is already enabled. + #> + function Initialize-HyperVForDevHome() + { + $featureEnablementResult = [OperationStatus]::OperationNotRun + $adminGroupResult = [OperationStatus]::OperationNotRun + + # Check the security token the user logged on with contains the Hyper-V Administrators group SID (S-1-5-32-578). This can only be updated, + # once the user logs off and on again. Even if we add the user to the group later on in the script. + $foundSecurityTokenString = [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups.Value | Where-Object { $_ -eq 'S-1-5-32-578' } + $doesUserSecurityTokenContainHyperAdminGroup = $foundSecurityTokenString -eq 'S-1-5-32-578' + + # Check if the Hyper-V feature is enabled + $featureState = Get-WindowsOptionalFeature -FeatureName 'Microsoft-Hyper-V' -Online | Select-Object -ExpandProperty State + $featureEnabled = $featureState -eq 'Enabled' + + if ($doesUserSecurityTokenContainHyperAdminGroup -and $featureEnabled) + { + # User already in Admin group and feature already enabled + exit 6 + } + + # Enable the Hyper-V feature if it is not already enabled + if (-not $featureEnabled) + { + $dsimHyperVFeature = Enable-WindowsOptionalFeature -Online -FeatureName 'Microsoft-Hyper-V' -All -NoRestart + + # when $dsimHyperVFeature is not null we've enabled the feature successfully + if ($null -ne $dsimHyperVFeature) + { + # Hyper-V feature enabled successfully. + $featureEnablementResult = [OperationStatus]::OperationSucceeded + } + else + { + # Failed to enable the Hyper-V feature. + $featureEnablementResult = [OperationStatus]::OperationFailed + } + } + + # Check the Hyper-V Administrators group to see if the user is inside the group + $userGroupObject = Get-LocalGroupMember -Group 'Hyper-V Administrators' | Where-Object { $_.Name -eq ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name) } + $isUserInGroup = $null -ne $userGroupObject + + # Add user to Hyper-v Administrators group if they aren't already in the group + if (-not $isUserInGroup) + { + Add-LocalGroupMember -Group 'Hyper-V Administrators' -Member ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name) + + # Check if the last command succeeded + if ($?) + { + # User added to the Hyper-V Administrators group. + $adminGroupResult = [OperationStatus]::OperationSucceeded + } + else + { + # Failed to add user to the Hyper-V Administrators group. + $adminGroupResult = [OperationStatus]::OperationFailed + } + } + + # We added the user to the admin group and enabled the Hyper-V feature during this script + if ($adminGroupResult -eq [OperationStatus]::OperationSucceeded -and $featureEnablementResult -eq [OperationStatus]::OperationSucceeded) + { + exit 0 + } + # We added the user to the admin group but the Hyper-V feature was already enabled before this script ran + elseif ($adminGroupResult -eq [OperationStatus]::OperationSucceeded -and $featureEnablementResult -eq [OperationStatus]::OperationNotRun) + { + exit 2 + } + # We failed to add the user to the admin group and the Hyper-V feature was already enabled before this script ran + elseif ($adminGroupResult -eq [OperationStatus]::OperationFailed -and $featureEnablementResult -eq [OperationStatus]::OperationNotRun) + { + exit 3 + } + # We enabled the Hyper-V feature but the user was already in the Hyper-V admin group before this script ran + elseif ($featureEnablementResult -eq [OperationStatus]::OperationSucceeded -and $adminGroupResult -eq [OperationStatus]::OperationNotRun) + { + exit 4 + } + # We failed to enable the Hyper-V feature and the user was already in the Hyper-V admin group before this script ran + elseif ($featureEnablementResult -eq [OperationStatus]::OperationFailed -and $adminGroupResult -eq [OperationStatus]::OperationNotRun) + { + exit 5 + } + # If both operations have not been run at this point, then user is already in the Hyper-V admin group and the Hyper-V feature is enabled. + # This could happen if the script runs the first time without the user being in the group, while Hyper-V is enabled but the user doesn't + # log off/on again or reboot. The second time we run the script there would be no work to be done. Since the actual token of the user + # doesn't update until they log off, the $doesUserSecurityTokenContainHyperAdminGroup variable above will still remain false, which is + # how we ended up here. + elseif ($featureEnablementResult -eq [OperationStatus]::OperationNotRun -and $adminGroupResult -eq [OperationStatus]::OperationNotRun) + { + exit 6 + } + + # If we get here we instruct the user to check both manually. This could happen if one failed and the other succeeded or if both failed. + exit 99 + } + + # Run script + Initialize-HyperVForDevHome + "; +} diff --git a/common/Environments/Services/ComputeSystemManager.cs b/common/Environments/Services/ComputeSystemManager.cs index 616566deae..7643daea17 100644 --- a/common/Environments/Services/ComputeSystemManager.cs +++ b/common/Environments/Services/ComputeSystemManager.cs @@ -9,6 +9,7 @@ using DevHome.Common.Contracts.Services; using DevHome.Common.Environments.Models; using DevHome.Common.Models; +using DevHome.Common.Services; using Microsoft.Windows.DevHome.SDK; using Serilog; using Windows.Foundation; diff --git a/common/Extensions/StackedNotificationsBehaviorExtensions.cs b/common/Extensions/StackedNotificationsBehaviorExtensions.cs new file mode 100644 index 0000000000..93b665302d --- /dev/null +++ b/common/Extensions/StackedNotificationsBehaviorExtensions.cs @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.WinUI; +using CommunityToolkit.WinUI.Behaviors; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using WinUIEx; + +namespace DevHome.Common.Extensions; + +public static class StackedNotificationsBehaviorExtensions +{ + public static void ShowWithWindowExtension( + this StackedNotificationsBehavior behavior, + string title, + string message, + InfoBarSeverity severity, + IRelayCommand? command = null, + string? buttonContent = null) + { + var dispatcherQueue = Application.Current.GetService().DispatcherQueue; + + dispatcherQueue.EnqueueAsync(() => + { + var notificationToShow = new Notification + { + Title = title, + Message = message, + Severity = severity, + }; + + if (command != null) + { + notificationToShow.ActionButton = new Button + { + Content = buttonContent, + Command = command, + }; + + // Make the command parameter the notification so RelayCommands can reference the notification in case they need + // to close it within the command. + notificationToShow.ActionButton.CommandParameter = notificationToShow; + } + + behavior.Show(notificationToShow); + }); + } + + public static void RemoveWithWindowExtension(this StackedNotificationsBehavior behavior, Notification notification) + { + var dispatcherQueue = Application.Current.GetService().DispatcherQueue; + + dispatcherQueue.EnqueueAsync(() => + { + behavior.Remove(notification); + }); + } + + public static void ClearWithWindowExtension(this StackedNotificationsBehavior behavior) + { + var dispatcherQueue = Application.Current.GetService().DispatcherQueue; + + dispatcherQueue.EnqueueAsync(() => + { + behavior.Clear(); + }); + } +} diff --git a/common/Helpers/CommonConstants.cs b/common/Helpers/CommonConstants.cs new file mode 100644 index 0000000000..879748a45c --- /dev/null +++ b/common/Helpers/CommonConstants.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DevHome.Common.Helpers; + +public static class CommonConstants +{ + public const string HyperVExtensionClassId = "F8B26528-976A-488C-9B40-7198FB425C9E"; + + public const string HyperVWindowsOptionalFeatureName = "Microsoft-Hyper-V"; +} diff --git a/common/Helpers/Logging.cs b/common/Helpers/Logging.cs index 1e4fc9720b..38fba2b23c 100644 --- a/common/Helpers/Logging.cs +++ b/common/Helpers/Logging.cs @@ -3,6 +3,8 @@ using System; using System.IO; +using Microsoft.Extensions.Configuration; +using Serilog; using Windows.Storage; namespace DevHome.Common; @@ -17,5 +19,16 @@ public class Logging private static readonly Lazy _logFolderRoot = new(() => Path.Combine(ApplicationData.Current.TemporaryFolder.Path, LogFolderName)); - public static readonly string LogFolderRoot = _logFolderRoot.Value; + public static readonly string LogFolderRoot = _logFolderRoot.Value; + + public static void SetupLogging(string jsonFileName, string appName) + { + Environment.SetEnvironmentVariable("DEVHOME_LOGS_ROOT", Path.Join(LogFolderRoot, appName)); + var configuration = new ConfigurationBuilder() + .AddJsonFile(jsonFileName) + .Build(); + Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(configuration) + .CreateLogger(); + } } diff --git a/common/Helpers/ManagementInfrastructureHelper.cs b/common/Helpers/ManagementInfrastructureHelper.cs new file mode 100644 index 0000000000..5e734def24 --- /dev/null +++ b/common/Helpers/ManagementInfrastructureHelper.cs @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Globalization; +using Microsoft.Management.Infrastructure; +using Serilog; + +namespace DevHome.Common.Helpers; + +// States based on InstallState value in Win32_OptionalFeature +// See: https://learn.microsoft.com/windows/win32/cimwin32prov/win32-optionalfeature +public enum FeatureAvailabilityKind +{ + Enabled, + Disabled, + Absent, + Unknown, +} + +public static class ManagementInfrastructureHelper +{ + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(ManagementInfrastructureHelper)); + + public static FeatureAvailabilityKind IsWindowsFeatureAvailable(string featureName) + { + try + { + // use the local session + using var session = CimSession.Create(null); + + // There will only be one feature returned by the query + foreach (var featureInstance in session.QueryInstances("root\\cimv2", "WQL", $"SELECT * FROM Win32_OptionalFeature WHERE Name = '{featureName}'")) + { + if (featureInstance?.CimInstanceProperties["InstallState"].Value is uint installState) + { + var featureAvailability = GetAvailabilityKindFromState(installState); + + _log.Information($"Found feature: '{featureName}' with enablement state: '{featureAvailability}'"); + return featureAvailability; + } + } + } + catch (Exception ex) + { + _log.Error(ex, $"Error attempting to get the {featureName} feature state"); + } + + _log.Information($"Unable to get state of {featureName} feature"); + return FeatureAvailabilityKind.Unknown; + } + + private static FeatureAvailabilityKind GetAvailabilityKindFromState(uint state) + { + switch (state) + { + case 1: + return FeatureAvailabilityKind.Enabled; + case 2: + return FeatureAvailabilityKind.Disabled; + case 3: + return FeatureAvailabilityKind.Absent; + default: + return FeatureAvailabilityKind.Unknown; + } + } +} diff --git a/common/Services/WindowsIdentityService.cs b/common/Helpers/WindowsIdentityHelper.cs similarity index 65% rename from common/Services/WindowsIdentityService.cs rename to common/Helpers/WindowsIdentityHelper.cs index 0655fe9cfa..1c6a76b646 100644 --- a/common/Services/WindowsIdentityService.cs +++ b/common/Helpers/WindowsIdentityHelper.cs @@ -1,31 +1,29 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System.Linq; -using System.Security.Principal; -using DevHome.Common.Contracts; - -namespace DevHome.Common.Services; - -/// -/// From the Hyper-V extension. -/// Checks if the current user is part of the Hyper-V Admin group. -/// -public class WindowsIdentityService : IWindowsIdentityService -{ - private readonly WindowsIdentity _currentUserIdentity = WindowsIdentity.GetCurrent(); - - // From: https://learn.microsoft.com/windows-server/identity/ad-ds/manage/understand-security-identifiers - private const string HyperVAdminSid = "S-1-5-32-578"; - - public bool IsUserHyperVAdmin() - { - var wasHyperVSidFound = _currentUserIdentity?.Groups?.Any(sid => sid.Value == HyperVAdminSid); - return wasHyperVSidFound ?? false; - } - - public string? GetCurrentUserName() - { - return _currentUserIdentity?.Name; - } -} +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Linq; +using System.Security.Principal; + +namespace DevHome.Common.Helpers; + +/// +/// Wrapper to interact with the WindowsIdentity class +/// +public class WindowsIdentityHelper +{ + private readonly WindowsIdentity _currentUserIdentity = WindowsIdentity.GetCurrent(); + + // From: https://learn.microsoft.com/windows-server/identity/ad-ds/manage/understand-security-identifiers + private const string HyperVAdminSid = "S-1-5-32-578"; + + public virtual bool IsUserHyperVAdmin() + { + var wasHyperVSidFound = _currentUserIdentity?.Groups?.Any(sid => sid.Value == HyperVAdminSid); + return wasHyperVSidFound ?? false; + } + + public virtual string? GetCurrentUserName() + { + return _currentUserIdentity?.Name; + } +} diff --git a/common/Models/ExperimentalFeature.cs b/common/Models/ExperimentalFeature.cs index bc07cfc843..635fddd5dc 100644 --- a/common/Models/ExperimentalFeature.cs +++ b/common/Models/ExperimentalFeature.cs @@ -1,75 +1,88 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using DevHome.Common.Contracts; -using DevHome.Common.Services; -using DevHome.Common.TelemetryEvents; -using DevHome.Telemetry; - -namespace DevHome.Common.Models; - -public partial class ExperimentalFeature : ObservableObject -{ - private readonly bool _isEnabledByDefault; - - [ObservableProperty] - private bool _isEnabled; - - public string Id { get; init; } - - public bool IsVisible { get; init; } - - public static ILocalSettingsService? LocalSettingsService { get; set; } - - public ExperimentalFeature(string id, bool enabledByDefault, bool visible = true) - { - Id = id; - _isEnabledByDefault = enabledByDefault; - IsVisible = visible; - - IsEnabled = CalculateEnabled(); - } - - public bool CalculateEnabled() - { - if (LocalSettingsService!.HasSettingAsync($"ExperimentalFeature_{Id}").Result) - { - return LocalSettingsService.ReadSettingAsync($"ExperimentalFeature_{Id}").Result; - } - - return _isEnabledByDefault; - } - - public string Name - { - get - { - var stringResource = new StringResource("DevHome.Settings.pri", "DevHome.Settings/Resources"); - return stringResource.GetLocalized(Id + "_Name"); - } - } - - public string Description - { - get - { - var stringResource = new StringResource("DevHome.Settings.pri", "DevHome.Settings/Resources"); - return stringResource.GetLocalized(Id + "_Description"); - } - } - - [RelayCommand] - public async Task OnToggledAsync() - { - IsEnabled = !IsEnabled; - +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using DevHome.Common.Contracts; +using DevHome.Common.Services; +using DevHome.Common.TelemetryEvents; +using DevHome.Telemetry; + +namespace DevHome.Common.Models; + +public partial class ExperimentalFeature : ObservableObject +{ + private readonly bool _isEnabledByDefault; + + [ObservableProperty] + private bool _isEnabled; + + public string Id { get; init; } + + public bool IsVisible { get; init; } + + public static ILocalSettingsService? LocalSettingsService { get; set; } + + public static IQuickstartSetupService? QuickstartSetupService { get; set; } + + public ExperimentalFeature(string id, bool enabledByDefault, bool visible = true) + { + Id = id; + _isEnabledByDefault = enabledByDefault; + IsVisible = visible; + + IsEnabled = CalculateEnabled(); + } + + public bool CalculateEnabled() + { + if (LocalSettingsService!.HasSettingAsync($"ExperimentalFeature_{Id}").Result) + { + return LocalSettingsService.ReadSettingAsync($"ExperimentalFeature_{Id}").Result; + } + + return _isEnabledByDefault; + } + + public string Name + { + get + { + var stringResource = new StringResource("DevHome.Settings.pri", "DevHome.Settings/Resources"); + return stringResource.GetLocalized(Id + "_Name"); + } + } + + public string Description + { + get + { + var stringResource = new StringResource("DevHome.Settings.pri", "DevHome.Settings/Resources"); + return stringResource.GetLocalized(Id + "_Description"); + } + } + + [RelayCommand] + public async Task OnToggledAsync() + { + IsEnabled = !IsEnabled; + await LocalSettingsService!.SaveSettingAsync($"ExperimentalFeature_{Id}", IsEnabled); - await LocalSettingsService!.SaveSettingAsync($"IsSeeker", true); - - TelemetryFactory.Get().Log("ExperimentalFeature_Toggled_Event", LogLevel.Critical, new ExperimentalFeatureEvent(Id, IsEnabled)); - } -} + await LocalSettingsService!.SaveSettingAsync($"IsSeeker", true); + + TelemetryFactory.Get().Log("ExperimentalFeature_Toggled_Event", LogLevel.Critical, new ExperimentalFeatureEvent(Id, IsEnabled)); + + // To simplify setup for the Quickstart experimental feature, install the associated Dev Home Azure Extension if it's not already present + // when that feature is enabled. Those operations will only occur on Canary and Stable builds of Dev Home. + if (string.Equals(Id, "QuickstartPlayground", StringComparison.Ordinal) && IsEnabled) + { + if (!QuickstartSetupService!.IsDevHomeAzureExtensionInstalled()) + { + await QuickstartSetupService!.InstallDevHomeAzureExtensionAsync(); + } + } + } +} diff --git a/common/NativeMethods.txt b/common/NativeMethods.txt index 1ac89190c1..8507f58dc3 100644 --- a/common/NativeMethods.txt +++ b/common/NativeMethods.txt @@ -12,4 +12,4 @@ WINDOW_EX_STYLE SHLoadIndirectString StrFormatByteSizeEx SFBS_FLAGS -MAX_PATH \ No newline at end of file +MAX_PATH diff --git a/common/Services/AppInstallManagerService.cs b/common/Services/AppInstallManagerService.cs index 4e8e017efa..419217ebcb 100644 --- a/common/Services/AppInstallManagerService.cs +++ b/common/Services/AppInstallManagerService.cs @@ -123,7 +123,14 @@ await Task.Run(() => installItem.Completed += (sender, args) => { - tcs.SetResult(true); + if (!tcs.TrySetResult(true)) + { + _log.Information("WidgetHostingService", $"{packageId} In Completed handler, RanToCompleted already set."); + } + else + { + _log.Information("WidgetHostingService", $"{packageId} In Completed handler, RanToCompleted set."); + } }; installItem.StatusChanged += (sender, args) => @@ -135,7 +142,14 @@ await Task.Run(() => } else if (installItem.GetCurrentStatus().InstallState == AppInstallState.Completed) { - tcs.SetResult(true); + if (!tcs.TrySetResult(true)) + { + _log.Information("WidgetHostingService", $"{packageId} In StatusChanged handler, RanToCompleted already set."); + } + else + { + _log.Information("WidgetHostingService", $"{packageId} In StatusChanged handler, RanToCompleted set."); + } } }; return tcs.Task; diff --git a/common/Services/ComputeSystemService.cs b/common/Services/ComputeSystemService.cs index 395b68f1fa..fa5b2a1307 100644 --- a/common/Services/ComputeSystemService.cs +++ b/common/Services/ComputeSystemService.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using DevHome.Common.Contracts.Services; using DevHome.Common.Environments.Models; +using DevHome.Common.Helpers; using DevHome.Common.Models; using Microsoft.Windows.DevHome.SDK; using Serilog; @@ -16,6 +17,8 @@ namespace DevHome.Common.Services; public class ComputeSystemService : IComputeSystemService { + private readonly ILogger _log = Log.ForContext("SourceContext", nameof(ComputeSystemService)); + private const string DevHomePreviewPackageFamilyName = "Microsoft.Windows.DevHome_8wekyb3d8bbwe"; private const string DevHomeDevPackageFamilyName = "Microsoft.Windows.DevHome.Dev_8wekyb3d8bbwe"; @@ -58,6 +61,16 @@ public async Task> GetComputeSystemProvidersA continue; } + // If we're looking at the Hyper-V extension and the feature isn't present on the users machine, disable the extension. + // This can happen if the user is not on a SKU that supports Hyper-V. + if (extension.ExtensionClassId.Equals(CommonConstants.HyperVExtensionClassId, StringComparison.OrdinalIgnoreCase) && + ManagementInfrastructureHelper.IsWindowsFeatureAvailable(CommonConstants.HyperVWindowsOptionalFeatureName) == FeatureAvailabilityKind.Absent) + { + _log.Information("User machine does not have the Hyper-V feature present. Disabling the Hyper-V extension"); + _extensionService.DisableExtension(extension.ExtensionUniqueId); + continue; + } + var computeSystemProviders = await extension.GetListOfProvidersAsync(); var extensionObj = extension.GetExtensionObject(); var devIdList = new List(); diff --git a/common/Services/IStringResource.cs b/common/Services/IStringResource.cs index e97b52cc1c..9d0709f4cd 100644 --- a/common/Services/IStringResource.cs +++ b/common/Services/IStringResource.cs @@ -6,4 +6,6 @@ namespace DevHome.Common.Services; public interface IStringResource { public string GetLocalized(string key, params object[] args); + + public string GetResourceFromPackage(string resource, string packageFullName); } diff --git a/common/Services/NotificationService.cs b/common/Services/NotificationService.cs deleted file mode 100644 index 28904fbe8a..0000000000 --- a/common/Services/NotificationService.cs +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using System.Threading.Tasks; -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.WinUI; -using CommunityToolkit.WinUI.Behaviors; -using DevHome.Common.Contracts; -using DevHome.Common.Environments.Helpers; -using Microsoft.UI.Xaml.Controls; -using Microsoft.Windows.AppLifecycle; -using Microsoft.Windows.AppNotifications; -using Microsoft.Windows.AppNotifications.Builder; -using Serilog; -using Windows.ApplicationModel.Activation; -using WinUIEx; - -namespace DevHome.Common.Services; - -public class NotificationService -{ - private readonly ILogger _log = Log.ForContext("SourceContext", nameof(NotificationService)); - - private readonly IWindowsIdentityService _windowsIdentityService; - - private readonly string _hyperVText = "Hyper-V"; - - private readonly string _microsoftText = "Microsoft"; - - private readonly StringResource _stringResource; - - private readonly WindowEx _windowEx; - - private StackedNotificationsBehavior? _notificationQueue; - - public NotificationService(IWindowsIdentityService windowsIdentityService, WindowEx windowEx) - { - _windowsIdentityService = windowsIdentityService; - _windowEx = windowEx; - _stringResource = new StringResource("DevHome.Common.pri", "DevHome.Common/Resources"); - } - - public bool ShowHyperVAdminWarningToast() - { - // Temporary toast notification to inform the user that they are not in the Hyper-V admin group. - // In the future we'll use an admin process from Dev Home to add the user to the group. - var toast = new AppNotificationBuilder() - .AddText("Warning") - .AddText(StringResourceHelper.GetResource(StringResourceHelper.UserNotInHyperAdminGroupMessage)) - .AddButton(new AppNotificationButton(StringResourceHelper.GetResource(StringResourceHelper.UserNotInHyperAdminGroupButton)) - .AddArgument("action", "AddUserToHyperVAdminGroup")) - .BuildNotification(); - - AppNotificationManager.Default.Show(toast); - return toast.Id != 0; - } - - public void Initialize(StackedNotificationsBehavior notificationQueue) - { - _notificationQueue = notificationQueue; - } - - public void HandlerNotificationActions(AppActivationArguments args) - { - if (args.Data is ToastNotificationActivatedEventArgs toastArgs) - { - try - { - if (toastArgs.Argument.Contains("action=AddUserToHyperVAdminGroup")) - { - // Launch compmgmt.msc in PowerShell - var psi = new ProcessStartInfo(); - psi.FileName = "powershell"; - psi.Arguments = "Start-Process compmgmt.msc -Verb RunAs"; - Process.Start(psi); - } - } - catch (Exception ex) - { - _log.Error(ex, $"Unable to launch computer management due to exception"); - } - } - } - - public void ShowRestartNotification() - { - if (_notificationQueue != null) - { - var command = new RelayCommand(() => - { - var startInfo = new ProcessStartInfo - { - WindowStyle = ProcessWindowStyle.Hidden, - - // Restart the computer - FileName = Environment.SystemDirectory + "\\shutdown.exe", - Arguments = "-r -t 0", - Verb = string.Empty, - }; - - var process = new Process - { - StartInfo = startInfo, - }; - process.Start(); - }); - - _windowEx.DispatcherQueue.EnqueueAsync(() => - _notificationQueue?.Show(new Notification - { - Title = _stringResource.GetLocalized("HyperVErrorTitle", _microsoftText, _hyperVText), - Message = _stringResource.GetLocalized("RestartMessage", _hyperVText), - Severity = InfoBarSeverity.Warning, - ActionButton = new Button - { - Content = _stringResource.GetLocalized("RestartButton"), - Command = command, - }, - })); - } - else - { - _log.Error("Notification queue is not initialized"); - } - } - - private void ShowUnableToAddToHyperVAdminGroupNotification() - { - ShowNotificationAsync( - _stringResource.GetLocalized("HyperVErrorTitle", _microsoftText, _hyperVText), - _stringResource.GetLocalized("UserAddHyperVAdminFailed", _hyperVText), - InfoBarSeverity.Warning).Wait(); - } - - public void CheckIfUserIsAHyperVAdminAndShowNotification() - { - if (!_windowsIdentityService.IsUserHyperVAdmin()) - { - if (_notificationQueue != null) - { - var notification = new Notification(); - - var command = new RelayCommand(() => - { - var user = _windowsIdentityService.GetCurrentUserName(); - if (user == null) - { - _log.Error("Unable to get the current user name"); - return; - } - - var startInfo = new System.Diagnostics.ProcessStartInfo(); - startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; - startInfo.FileName = Environment.SystemDirectory + "\\net.exe"; - - // Add the user to the Hyper-V Administrators group - startInfo.Arguments = "localgroup \"Hyper-V Administrators\" " + user + " /add"; - startInfo.UseShellExecute = true; - startInfo.Verb = "runas"; - - var process = new System.Diagnostics.Process(); - process.StartInfo = startInfo; - - // Since a UAC prompt will be shown, we need to wait for the process to exit - // This can also be cancelled by the user which will result in an exception - try - { - process.Start(); - process.WaitForExit(); - - CloseNotification(notification); - - if (process.ExitCode == 0) - { - ShowRestartNotification(); - } - else - { - ShowUnableToAddToHyperVAdminGroupNotification(); - } - } - catch (Exception ex) - { - _log.Error(ex, "Unable to add the user to the Hyper-V Administrators group"); - ShowUnableToAddToHyperVAdminGroupNotification(); - } - }); - - _windowEx.DispatcherQueue.EnqueueAsync(() => - { - notification = new Notification - { - Title = _stringResource.GetLocalized("HyperVErrorTitle", _microsoftText, _hyperVText), - Message = _stringResource.GetLocalized("UserNotInHyperAdminGroupMessage", _hyperVText), - Severity = InfoBarSeverity.Error, - ActionButton = new Button - { - Content = _stringResource.GetLocalized("HyperVAdminAddUser", _hyperVText), - Command = command, - }, - }; - - _notificationQueue?.Show(notification); - }); - } - else - { - _log.Error("Notification queue is not initialized"); - } - } - } - - public void CloseNotification(Notification notification) - { - _windowEx.DispatcherQueue.EnqueueAsync(() => _notificationQueue?.Remove(notification)); - } - - public async Task ShowNotificationAsync(string title, string message, InfoBarSeverity severity) - { - await _windowEx.DispatcherQueue.EnqueueAsync(() => - { - try - { - var notification = new Notification - { - Title = title, - Message = message, - Severity = severity, - }; - - _notificationQueue?.Show(notification); - } - catch (Exception ex) - { - _log.Error(ex, "unable to show user notification message due to an exception"); - } - }); - } - - public void CheckIfUserIsAHyperVAdmin() - { - if (!_windowsIdentityService.IsUserHyperVAdmin()) - { - ShowHyperVAdminWarningToast(); - } - } -} diff --git a/common/Services/QuickstartSetupService.cs b/common/Services/QuickstartSetupService.cs new file mode 100644 index 0000000000..d379b060df --- /dev/null +++ b/common/Services/QuickstartSetupService.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Linq; +using System.Threading.Tasks; +using DevHome.Common.Contracts; +using DevHome.Common.Services; +using Serilog; + +namespace DevHome.Services; + +public class QuickstartSetupService(IAppInstallManagerService appInstallManagerService, IPackageDeploymentService packageDeploymentService) : IQuickstartSetupService +{ +#if CANARY_BUILD + private const string AzureExtensionStorePackageId = "9NBVFRMSFXHW"; + private const string AzureExtensionPackageFamilyName = "Microsoft.Windows.DevHomeAzureExtension.Canary_8wekyb3d8bbwe"; +#elif STABLE_BUILD + private const string AzureExtensionStorePackageId = "9MV8F79FGXTR"; + private const string AzureExtensionPackageFamilyName = "Microsoft.Windows.DevHomeAzureExtension_8wekyb3d8bbwe"; +#else + private const string AzureExtensionStorePackageId = ""; + private const string AzureExtensionPackageFamilyName = ""; +#endif + + private readonly ILogger _log = Log.ForContext("SourceContext", nameof(QuickstartSetupService)); + + private readonly IAppInstallManagerService _appInstallManagerService = appInstallManagerService; + private readonly IPackageDeploymentService _packageDeploymentService = packageDeploymentService; + + public bool IsDevHomeAzureExtensionInstalled() + { +#if CANARY_BUILD || STABLE_BUILD + var packages = _packageDeploymentService.FindPackagesForCurrentUser(AzureExtensionPackageFamilyName); + return packages.Any(); +#else + return true; +#endif + } + + public async Task InstallDevHomeAzureExtensionAsync() + { + try + { + _log.Information("Installing DevHomeAzureExtension"); + await _appInstallManagerService.TryInstallPackageAsync(AzureExtensionStorePackageId); + } + catch (Exception ex) + { + _log.Error(ex, "Installing DevHomeAzureExtension failed"); + } + } +} diff --git a/common/Services/StringResource.cs b/common/Services/StringResource.cs index 1be13d023e..068f7b5f78 100644 --- a/common/Services/StringResource.cs +++ b/common/Services/StringResource.cs @@ -1,13 +1,18 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System; using System.Globalization; using Microsoft.Windows.ApplicationModel.Resources; +using Windows.Win32; +using Windows.Win32.Foundation; namespace DevHome.Common.Services; public class StringResource : IStringResource { + private const int MaxBufferLength = 1024; + private readonly ResourceLoader _resourceLoader; /// @@ -52,4 +57,26 @@ public string GetLocalized(string key, params object[] args) return string.IsNullOrEmpty(value) ? key : value; } + + /// + /// Gets the string of a ms-resource for a given package. + /// + /// the ms-resource:// path to a resource in an app package's pri file. + /// the package containing the resource. + /// The retrieved string represented by the resource key. + public unsafe string GetResourceFromPackage(string resource, string packageFullName) + { + var indirectPathToResource = "@{" + packageFullName + "?" + resource + "}"; + Span outputBuffer = new char[MaxBufferLength]; + + fixed (char* outBufferPointer = outputBuffer) + { + fixed (char* resourcePathPointer = indirectPathToResource) + { + var res = PInvoke.SHLoadIndirectString(resourcePathPointer, new PWSTR(outBufferPointer), (uint)outputBuffer.Length); + res.ThrowOnFailure(); + return new string(outputBuffer.TrimEnd('\0')); + } + } + } } diff --git a/common/Strings/en-us/Resources.resw b/common/Strings/en-us/Resources.resw index 93edddf01b..a3a3ad5a31 100644 --- a/common/Strings/en-us/Resources.resw +++ b/common/Strings/en-us/Resources.resw @@ -205,33 +205,49 @@ Uptime: Title for the uptime property of a compute system. (The amount of time its been running) - - Add user to {0} administrators group - Locked="{0}" Text for the button to add user to {0} administrators group + + Add user to group + Text for the button to add user to the Hyper-V administrators group - - {0} {1} - {Locked="{0}","{1}"} Title text for the UI showing errors for user not part of {1} administrators group + + Set up Hyper-V in Dev Home + Locked="{Hyper-V}" Text for the button to add user to Hyper-V administrators group and enable the Hyper-V feature + + + Enable Hyper-V + Locked="{Hyper-V}" Text for the button to enable the Hyper-V feature Restart now - Locked="{0}" Text for button that restarts the system. - - - You must restart the computer after adding the user to the {0} administrators group for changes to take effect. - Locked="{0}" Text explaining that a restart is needed after a user is added to the {0} group. + Text for button that restarts the system. - - Unable to add user to {0} administrators group. Please try manually. - Locked="{0}" Text explaining that the user add operation to {0} administrators group failed. + + Changes completed successfully. Please restart your machine for the changes to take effect + Text explaining that a restart is needed after enabling the Hyper-V feature or adding the user to the Hyper-V Admin group - - Launch computer management - Button text for the user to click, in order to launch computer management + + The current user is not in the Hyper-V administrators group and the Hyper-V feature is not enabled. Hyper-V virtual machines will not load. To resolve both issues please click the set up Hyper-V in Dev Home button and reboot + Locked="{Hyper-V}" Text explaining that the user is not in the Hyper-V administrators group and the Hyper-V feature is not enabled - The current user is not a {0} administrators. {0} virtual machines will not load. Please add the user to the {0} administrators group and reboot. - Locked="{0}" Text explaining that the user is not in the {0} administrators group and that we need to add them. + The current user is not in the Hyper-V administrators group. Hyper-V virtual machines will not load. To resolve the issue, click the add user to group button + Locked="{Hyper-V}" Text explaining that the user is not in the Hyper-V administrators group + + + The Hyper-V feature is not enabled. Hyper-V virtual machines will not load. To resolve the issue, click the enable Hyper-V button + Locked="{Hyper-V}" Text explaining that the Hyper-V feature is not enabled + + + Unable to enable the Hyper-V feature. Hyper-V virtual machines will not load. To resolve the issue manually, enable Hyper-V manually and reboot + Locked="{Hyper-V}" Text explaining that we were not able to enable the Hyper-V feature. + + + Unable to add the user to the Hyper-V administrators group or enable Hyper-V. Hyper-V virtual machines may not load. To resolve the issue manually, add the user to the Hyper-V administrators group, enable Hyper-V and reboot + Locked="{Hyper-V}" Text explaining that we couldn't fully complete the operation that would have added the user to the Hyper-V Administrators group and enable Hyper-V + + + Failed to add the user to the Hyper-V administrators group. Hyper-V virtual machines will not load. To resolve the issue add the user to the Hyper-V administrators group and reboot + Locked="{Hyper-V}" Text explaining that we couldn't add the user to the Hyper-V Administrators group. Open @@ -281,8 +297,24 @@ An unexpected error occured while attempting to create your new environment Error text for when there was an unexpected error that we could not handle within Dev Home. - + New Environment Generic name text for the card header for an environment that is being created in Dev Homes environment page + + Create new environment + Text for a hyperlink button that will redirect user to the create environment page + + + No environments added yet + Text for when the environment page in Dev Home is empty + + + Install an extension that supports environments and refresh the page + Text for when the environment page in Dev Home is empty and no extensions are installed that support environments + + + Go to extensions library + Text for when the environment page in Dev Home is empty and the user has no extensions installed that support environments + \ No newline at end of file diff --git a/common/TelemetryEvents/SeekerEvent.cs b/common/TelemetryEvents/SeekerEvent.cs index d1a8cae5f7..0deb509625 100644 --- a/common/TelemetryEvents/SeekerEvent.cs +++ b/common/TelemetryEvents/SeekerEvent.cs @@ -13,7 +13,7 @@ namespace DevHome.Common.TelemetryEvents; [EventData] public class SeekerEvent : EventBase { - public override PartA_PrivTags PartA_PrivTags => PrivTags.ProductAndServiceUsage; + public override PartA_PrivTags PartA_PrivTags => PrivTags.ProductAndServicePerformance; public bool IsSeeker { diff --git a/common/TelemetryEvents/SetupFlow/AppInstallResultEvent.cs b/common/TelemetryEvents/SetupFlow/AppInstallResultEvent.cs new file mode 100644 index 0000000000..4c36d25746 --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/AppInstallResultEvent.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow; + +[EventData] +public class AppInstallResultEvent : EventBase +{ + public string PackageId { get; } + + public string SourceId { get; } + + public override PartA_PrivTags PartA_PrivTags => PrivTags.ProductAndServicePerformance; + + public AppInstallResultEvent(string packageId, string sourceId) + { + PackageId = packageId; + SourceId = sourceId; + } + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/TelemetryEvents/SetupFlow/ConfigureModeCommandEvent.cs b/common/TelemetryEvents/SetupFlow/ConfigureModeCommandEvent.cs new file mode 100644 index 0000000000..11c4bb4220 --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/ConfigureModeCommandEvent.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow; + +[EventData] +public class ConfigureModeCommandEvent : EventBase +{ + public string ViewMode { get; } + + public override PartA_PrivTags PartA_PrivTags => PrivTags.ProductAndServiceUsage; + + public ConfigureModeCommandEvent(string viewMode) + { + ViewMode = viewMode; + } + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/TelemetryEvents/SetupFlow/QuickstartPlayground/FeedbackSubmitted.cs b/common/TelemetryEvents/SetupFlow/QuickstartPlayground/FeedbackSubmitted.cs new file mode 100644 index 0000000000..00fa55dbd2 --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/QuickstartPlayground/FeedbackSubmitted.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow.QuickstartPlayground; + +[EventData] +public class FeedbackSubmitted(bool isPositive, string message) : EventBase +{ + public bool IsPositive { get; } = isPositive; + + public string Message { get; } = message; + + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/TelemetryEvents/SetupFlow/QuickstartPlayground/GenerateButtonClicked.cs b/common/TelemetryEvents/SetupFlow/QuickstartPlayground/GenerateButtonClicked.cs new file mode 100644 index 0000000000..d8d27a707f --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/QuickstartPlayground/GenerateButtonClicked.cs @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow.QuickstartPlayground; + +[EventData] +public class GenerateButtonClicked(string prompt) : EventBase +{ + public string Prompt { get; } = prompt; + + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServiceUsage; + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/TelemetryEvents/SetupFlow/QuickstartPlayground/ProjectGenerationErrorInfo.cs b/common/TelemetryEvents/SetupFlow/QuickstartPlayground/ProjectGenerationErrorInfo.cs new file mode 100644 index 0000000000..1790475e03 --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/QuickstartPlayground/ProjectGenerationErrorInfo.cs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow.QuickstartPlayground; + +[EventData] +public class ProjectGenerationErrorInfo(string errorMessage, Exception extendedError, string diagnosticText) : EventBase +{ + public string ErrorMessage { get; } = errorMessage; + + public string ExtendedError { get; } = extendedError.ToString(); + + public string DiagnosticText { get; } = diagnosticText; + + public override PartA_PrivTags PartA_PrivTags => PartA_PrivTags.ProductAndServicePerformance; + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/TelemetryEvents/SetupFlow/ReviewGenerateConfigurationCommandEvent.cs b/common/TelemetryEvents/SetupFlow/ReviewGenerateConfigurationCommandEvent.cs new file mode 100644 index 0000000000..a1b6a84d11 --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/ReviewGenerateConfigurationCommandEvent.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow; + +[EventData] +public class ReviewGenerateConfigurationCommandEvent : EventBase +{ + public string Flow { get; } + + public override PartA_PrivTags PartA_PrivTags => PrivTags.ProductAndServiceUsage; + + public ReviewGenerateConfigurationCommandEvent(List flow) + { + Flow = string.Join(',', flow); + } + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/TelemetryEvents/SetupFlow/ReviewGenerateConfigurationForInstallEvent.cs b/common/TelemetryEvents/SetupFlow/ReviewGenerateConfigurationForInstallEvent.cs new file mode 100644 index 0000000000..acf2f26de6 --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/ReviewGenerateConfigurationForInstallEvent.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow; + +[EventData] +public class ReviewGenerateConfigurationForInstallEvent : EventBase +{ + /// + /// Gets the number installed packages generated as part of the + /// configuration file + /// + public int InstalledCount { get; } + + /// + /// Gets the number non-installed packages generated as part of the + /// configuration file + /// + public int NotInstalledCount { get; } + + public override PartA_PrivTags PartA_PrivTags => PrivTags.ProductAndServicePerformance; + + public ReviewGenerateConfigurationForInstallEvent(int installedCount, int notInstalledCount) + { + InstalledCount = installedCount; + NotInstalledCount = notInstalledCount; + } + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/TelemetryEvents/SetupFlow/ReviewSetUpCommandEvent.cs b/common/TelemetryEvents/SetupFlow/ReviewSetUpCommandEvent.cs new file mode 100644 index 0000000000..4a96561138 --- /dev/null +++ b/common/TelemetryEvents/SetupFlow/ReviewSetUpCommandEvent.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using DevHome.Telemetry; +using Microsoft.Diagnostics.Telemetry; +using Microsoft.Diagnostics.Telemetry.Internal; + +namespace DevHome.Common.TelemetryEvents.SetupFlow; + +[EventData] +public class ReviewSetUpCommandEvent : EventBase +{ + public bool IsSettingUpATargetMachine { get; } + + public string Flow { get; } + + public override PartA_PrivTags PartA_PrivTags => PrivTags.ProductAndServiceUsage; + + public ReviewSetUpCommandEvent(bool isSettingUpATargetMachine, List flow) + { + IsSettingUpATargetMachine = isSettingUpATargetMachine; + Flow = string.Join(',', flow); + } + + public override void ReplaceSensitiveStrings(Func replaceSensitiveStrings) + { + // No sensitive strings to replace. + } +} diff --git a/common/Views/AddCreateButton.xaml b/common/Views/AddCreateButton.xaml new file mode 100644 index 0000000000..15ceb7cc16 --- /dev/null +++ b/common/Views/AddCreateButton.xaml @@ -0,0 +1,14 @@ + diff --git a/common/Views/AddCreateButton.xaml.cs b/common/Views/AddCreateButton.xaml.cs new file mode 100644 index 0000000000..39dbaed2ff --- /dev/null +++ b/common/Views/AddCreateButton.xaml.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace DevHome.Common.Views; + +/// +/// A button whose content is a + icon and a string. Used for creating new items. +/// +public sealed partial class AddCreateButton : Button +{ + /// + /// Gets or Sets the Content to display on the Button alongside the icon. + /// + public new string Content + { + get => (string)GetValue(ContentProperty); + set => SetValue(ContentProperty, value); + } + + public AddCreateButton() + { + this.InitializeComponent(); + } + + public static readonly new DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(string), typeof(Button), new PropertyMetadata(string.Empty)); +} diff --git a/common/Views/AddCreateHyperlinkButton.xaml b/common/Views/AddCreateHyperlinkButton.xaml new file mode 100644 index 0000000000..d7ebb7b493 --- /dev/null +++ b/common/Views/AddCreateHyperlinkButton.xaml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/common/Views/AddCreateHyperlinkButton.xaml.cs b/common/Views/AddCreateHyperlinkButton.xaml.cs new file mode 100644 index 0000000000..3366fc9aa1 --- /dev/null +++ b/common/Views/AddCreateHyperlinkButton.xaml.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace DevHome.Common.Views; + +/// +/// A HyperlinkButton whose content is a + icon and a string. Used for creating new items. +/// +public sealed partial class AddCreateHyperlinkButton : HyperlinkButton +{ + /// + /// Gets or Sets the Content to display on the Button alongside the icon. + /// + public new string Content + { + get => (string)GetValue(ContentProperty); + set => SetValue(ContentProperty, value); + } + + public AddCreateHyperlinkButton() + { + this.InitializeComponent(); + } + + public static readonly new DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(string), typeof(HyperlinkButton), new PropertyMetadata(string.Empty)); +} diff --git a/common/Windows/SecondaryWindow.cs b/common/Windows/SecondaryWindow.cs index 845dbddfec..a5834f21cd 100644 --- a/common/Windows/SecondaryWindow.cs +++ b/common/Windows/SecondaryWindow.cs @@ -1,180 +1,180 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Runtime.InteropServices; -using DevHome.Common.Extensions; -using DevHome.Common.Services; -using DevHome.Contracts.Services; -using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Markup; -using Windows.Win32; -using Windows.Win32.Foundation; -using Windows.Win32.UI.WindowsAndMessaging; -using WinUIEx; - -namespace DevHome.Common.Windows; - -[ContentProperty(Name = nameof(SecondaryWindowContent))] -public class SecondaryWindow : WindowEx -{ - private readonly SecondaryWindowTemplate _windowTemplate; - private WindowEx? _primaryWindow; - private bool _useAppTheme; - private bool _isModal; - private bool _isTopLevel; - - private WindowEx MainWindow => Application.Current.GetService(); - - private IThemeSelectorService ThemeSelector => Application.Current.GetService(); - - private IAppInfoService AppInfo => Application.Current.GetService(); - - public WindowTitleBar? WindowTitleBar - { - get => _windowTemplate.TitleBar; - set - { - if (WindowTitleBar != value) - { - // Remove title changed event handler from previous title bar - if (WindowTitleBar != null) - { - WindowTitleBar.TitleChanged -= OnSecondaryWindowTitleChanged; - } - - // Set new title bar - _windowTemplate.TitleBar = value; - - // By default, if no title is set, use the application name as title - var title = value?.Title; - title = string.IsNullOrEmpty(title) ? AppInfo.GetAppNameLocalized() : title; - OnSecondaryWindowTitleChanged(null, title); - - // Add title changed event handler to new title bar - if (value != null) - { - value.Title = title; - value.TitleChanged += OnSecondaryWindowTitleChanged; - } - } - } - } - - /// - /// Gets or sets the window content in the custom layout. - /// - /// - /// This is the default content of the secondary window. - /// See also . - /// - public object SecondaryWindowContent - { - get => _windowTemplate.MainContent; - set => _windowTemplate.MainContent = value; - } - - /// - /// Gets or sets a value indicating whether the window should use the - /// application theme and listen for theme changes. - /// - public bool UseAppTheme - { - get => _useAppTheme; - set - { - if (_useAppTheme != value) - { - _useAppTheme = value; - if (value) - { - OnThemeChanged(null, ThemeSelector.Theme); - ThemeSelector.ThemeChanged += OnThemeChanged; - } - else - { - ThemeSelector.ThemeChanged -= OnThemeChanged; - } - } - } - } - - /// - /// Gets or sets a value indicating whether the window should be modal. - /// - /// Setting this property to true will disable interaction on the primary window. - public bool IsModal - { - get => _isModal; - set - { - if (_isModal != value) - { - _isModal = value; - if (PrimaryWindow != null) - { - // Note: This is a temporary workaround until there's a - // built-in support for modal windows in WinUI 3. - PInvoke.EnableWindow((HWND)PrimaryWindow.GetWindowHandle(), !value); - } - } - } - } - - /// - /// Gets or sets a value indicating whether the secondary window should stay on top of the primary window. - /// - public bool IsTopLevel - { - get => _isTopLevel; - set - { - if (_isTopLevel != value) - { - _isTopLevel = value; - - /* - * Note: Setting the owner here is a temporary workaround until there's is - * a built-in support for creating secondary windows with an owner while - * also being able to customize the content from XAML in WinUI 3. - * Related: https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/windowing/windowing-overview#limitations - * "The Windows App SDK doesn't currently provide methods for attaching UI framework content to an AppWindow." - */ - - // Set primary window as owner of secondary window - var sWindow = (HWND)this.GetWindowHandle(); - var pWindow = (HWND?)PrimaryWindow?.GetWindowHandle() ?? HWND.Null; - SetWindowOwner(sWindow, value ? pWindow : HWND.Null); - } - } - } - - public WindowEx? PrimaryWindow - { - get => _primaryWindow; - set - { - if (_primaryWindow != value) - { - // If a previous primary window was connected, disconnect it - if (_primaryWindow != null) - { - _primaryWindow.Closed -= OnPrimaryWindowClosed; - } - - // Set new primary window - _primaryWindow = value; - - // If a primary window is set, connect it - if (_primaryWindow != null) - { - _primaryWindow.Closed += OnPrimaryWindowClosed; - } - } - } - } - - public SecondaryWindow() +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Runtime.InteropServices; +using DevHome.Common.Extensions; +using DevHome.Common.Services; +using DevHome.Contracts.Services; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Markup; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.UI.WindowsAndMessaging; +using WinUIEx; + +namespace DevHome.Common.Windows; + +[ContentProperty(Name = nameof(SecondaryWindowContent))] +public class SecondaryWindow : WindowEx +{ + private readonly SecondaryWindowTemplate _windowTemplate; + private WindowEx? _primaryWindow; + private bool _useAppTheme; + private bool _isModal; + private bool _isTopLevel; + + private WindowEx MainWindow => Application.Current.GetService(); + + private IThemeSelectorService ThemeSelector => Application.Current.GetService(); + + private IAppInfoService AppInfo => Application.Current.GetService(); + + public WindowTitleBar? WindowTitleBar + { + get => _windowTemplate.TitleBar; + set + { + if (WindowTitleBar != value) + { + // Remove title changed event handler from previous title bar + if (WindowTitleBar != null) + { + WindowTitleBar.TitleChanged -= OnSecondaryWindowTitleChanged; + } + + // Set new title bar + _windowTemplate.TitleBar = value; + + // By default, if no title is set, use the application name as title + var title = value?.Title; + title = string.IsNullOrEmpty(title) ? AppInfo.GetAppNameLocalized() : title; + OnSecondaryWindowTitleChanged(null, title); + + // Add title changed event handler to new title bar + if (value != null) + { + value.Title = title; + value.TitleChanged += OnSecondaryWindowTitleChanged; + } + } + } + } + + /// + /// Gets or sets the window content in the custom layout. + /// + /// + /// This is the default content of the secondary window. + /// See also . + /// + public object SecondaryWindowContent + { + get => _windowTemplate.MainContent; + set => _windowTemplate.MainContent = value; + } + + /// + /// Gets or sets a value indicating whether the window should use the + /// application theme and listen for theme changes. + /// + public bool UseAppTheme + { + get => _useAppTheme; + set + { + if (_useAppTheme != value) + { + _useAppTheme = value; + if (value) + { + OnThemeChanged(null, ThemeSelector.Theme); + ThemeSelector.ThemeChanged += OnThemeChanged; + } + else + { + ThemeSelector.ThemeChanged -= OnThemeChanged; + } + } + } + } + + /// + /// Gets or sets a value indicating whether the window should be modal. + /// + /// Setting this property to true will disable interaction on the primary window. + public bool IsModal + { + get => _isModal; + set + { + if (_isModal != value) + { + _isModal = value; + if (PrimaryWindow != null) + { + // Note: This is a temporary workaround until there's a + // built-in support for modal windows in WinUI 3. + PInvoke.EnableWindow((HWND)PrimaryWindow.GetWindowHandle(), !value); + } + } + } + } + + /// + /// Gets or sets a value indicating whether the secondary window should stay on top of the primary window. + /// + public bool IsTopLevel + { + get => _isTopLevel; + set + { + if (_isTopLevel != value) + { + _isTopLevel = value; + + /* + * Note: Setting the owner here is a temporary workaround until there's is + * a built-in support for creating secondary windows with an owner while + * also being able to customize the content from XAML in WinUI 3. + * Related: https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/windowing/windowing-overview#limitations + * "The Windows App SDK doesn't currently provide methods for attaching UI framework content to an AppWindow." + */ + + // Set primary window as owner of secondary window + var sWindow = (HWND)this.GetWindowHandle(); + var pWindow = (HWND?)PrimaryWindow?.GetWindowHandle() ?? HWND.Null; + SetWindowOwner(sWindow, value ? pWindow : HWND.Null); + } + } + } + + public WindowEx? PrimaryWindow + { + get => _primaryWindow; + set + { + if (_primaryWindow != value) + { + // If a previous primary window was connected, disconnect it + if (_primaryWindow != null) + { + _primaryWindow.Closed -= OnPrimaryWindowClosed; + } + + // Set new primary window + _primaryWindow = value; + + // If a primary window is set, connect it + if (_primaryWindow != null) + { + _primaryWindow.Closed += OnPrimaryWindowClosed; + } + } + } + } + + public SecondaryWindow() { // Set the theme of the secondary window before creating the window template. // This must be done before the creation of the template, or else the secondary window @@ -182,155 +182,155 @@ public SecondaryWindow() // set by the app itself. UseAppTheme = true; - // Initialize window content template - _windowTemplate = new(this); - Content = _windowTemplate; + // Initialize window content template + _windowTemplate = new(this); + Content = _windowTemplate; // Register secondary window events handlers - Activated += OnSecondaryWindowActivated; - Closed += OnSecondaryWindowClosed; - - // Set default window configuration + Activated += OnSecondaryWindowActivated; + Closed += OnSecondaryWindowClosed; + + // Set default window configuration PrimaryWindow = MainWindow; - SystemBackdrop = PrimaryWindow.SystemBackdrop; - - Title = AppInfo.GetAppNameLocalized(); - this.SetIcon(AppInfo.IconPath); - - ShowInTaskbar(); - } - - public SecondaryWindow(object secondaryWindowContent) - : this() - { - SecondaryWindowContent = secondaryWindowContent; - } - - /// - /// If the primary window is set, center the secondary window on the - /// primary window. Otherwise, center the secondary window on the screen. - /// - /// - /// This method should be called after the secondary window is shown. - /// See also: - /// - public void CenterOnWindow() - { - if (PrimaryWindow == null) - { - this.CenterOnScreen(); - } - else - { - // Get DPI for primary widow - const float defaultDPI = 96f; - var dpi = HwndExtensions.GetDpiForWindow(PrimaryWindow.GetWindowHandle()) / defaultDPI; - - // Extract primary window dimensions - var primaryWindowLeftOffset = PrimaryWindow.AppWindow.Position.X; - var primaryWindowTopOffset = PrimaryWindow.AppWindow.Position.Y; - var primaryWindowHalfWidth = (PrimaryWindow.Width * dpi) / 2; - var primaryWindowHalfHeight = (PrimaryWindow.Height * dpi) / 2; - - // Derive secondary window dimensions - var secondaryWindowHalfWidth = (Width * dpi) / 2; - var secondaryWindowHalfHeight = (Height * dpi) / 2; - var secondaryWindowLeftOffset = primaryWindowLeftOffset + primaryWindowHalfWidth - secondaryWindowHalfWidth; - var secondaryWindowTopOffset = primaryWindowTopOffset + primaryWindowHalfHeight - secondaryWindowHalfHeight; - - // Move and resize secondary window - this.MoveAndResize(secondaryWindowLeftOffset, secondaryWindowTopOffset, Width, Height); - } - } - - /// - /// Show secondary window in taskbar. - /// - /// - /// This is specifically required when a window owner is set, where by - /// default the secondary window is not visible in the taskbar. - /// - private void ShowInTaskbar() - { - var hwnd = (HWND)this.GetWindowHandle(); - var exStyle = PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE) | (int)WINDOW_EX_STYLE.WS_EX_APPWINDOW; - _ = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle); - } - - private static void SetWindowOwner(HWND secondaryWindow, HWND primaryWindow) - { - // On x64 platform (IntPtr.Size = 8), call SetWindowLongPtr - // On x32 platform (IntPtr.Size = 4), call SetWindowLong - // Reference: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlongptra - // Note: CsWin32 will not generate PInvoke.SetWindowLongPtr for x86 platform which will cause a compilation error. - if (IntPtr.Size == 8) - { - SetWindowLongPtr(secondaryWindow, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, primaryWindow); - } - else - { - _ = PInvoke.SetWindowLong(secondaryWindow, WINDOW_LONG_PTR_INDEX.GWL_HWNDPARENT, primaryWindow.Value.ToInt32()); - } - } - - /// - /// This method cannot be added to the NativeMethods.txt because it is not - /// available when compiling the solution for x86 platform. - /// - [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "SetWindowLongPtrW", SetLastError = true)] - private static extern nint SetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint dwNewLong); - - /********************************************************** - * Application services event handlers * - * Note: Application services event must be unregistered * - * when the secondary window is closed. * - **********************************************************/ - - private void OnThemeChanged(object? sender, ElementTheme theme) - { - // Update the window theme - this.SetRequestedTheme(theme); - } - - /************************************************************** - * Primary window event handlers * - * Note: Primary window event handlers must be unregistered * - * when the secondary window is closed. * - **************************************************************/ - - private void OnPrimaryWindowClosed(object? sender, WindowEventArgs args) - { - // Close secondary window - Close(); - } - - /************************************* - * Secondary window event handlers * - ************************************/ - - private void OnSecondaryWindowActivated(object? sender, WindowActivatedEventArgs args) - { - // Reflect window activation state in title bar - if (this.WindowTitleBar != null) - { - this.WindowTitleBar.IsActive = args.WindowActivationState != WindowActivationState.Deactivated; - } - } - - private void OnSecondaryWindowClosed(object? sender, WindowEventArgs args) - { - // Free the secondary window from the application - IsModal = false; - IsTopLevel = false; - UseAppTheme = false; - - // Unset the primary window at the end - PrimaryWindow = null; - } - - private void OnSecondaryWindowTitleChanged(object? sender, string? title) - { - // Update window title (e.g. in taskbar) - Title = title ?? string.Empty; - } -} + SystemBackdrop = PrimaryWindow.SystemBackdrop; + + Title = AppInfo.GetAppNameLocalized(); + this.SetIcon(AppInfo.IconPath); + + ShowInTaskbar(); + } + + public SecondaryWindow(object secondaryWindowContent) + : this() + { + SecondaryWindowContent = secondaryWindowContent; + } + + /// + /// If the primary window is set, center the secondary window on the + /// primary window. Otherwise, center the secondary window on the screen. + /// + /// + /// This method should be called after the secondary window is shown. + /// See also: + /// + public void CenterOnWindow() + { + if (PrimaryWindow == null) + { + this.CenterOnScreen(); + } + else + { + // Get DPI for primary widow + const float defaultDPI = 96f; + var dpi = HwndExtensions.GetDpiForWindow(PrimaryWindow.GetWindowHandle()) / defaultDPI; + + // Extract primary window dimensions + var primaryWindowLeftOffset = PrimaryWindow.AppWindow.Position.X; + var primaryWindowTopOffset = PrimaryWindow.AppWindow.Position.Y; + var primaryWindowHalfWidth = (PrimaryWindow.Width * dpi) / 2; + var primaryWindowHalfHeight = (PrimaryWindow.Height * dpi) / 2; + + // Derive secondary window dimensions + var secondaryWindowHalfWidth = (Width * dpi) / 2; + var secondaryWindowHalfHeight = (Height * dpi) / 2; + var secondaryWindowLeftOffset = primaryWindowLeftOffset + primaryWindowHalfWidth - secondaryWindowHalfWidth; + var secondaryWindowTopOffset = primaryWindowTopOffset + primaryWindowHalfHeight - secondaryWindowHalfHeight; + + // Move and resize secondary window + this.MoveAndResize(secondaryWindowLeftOffset, secondaryWindowTopOffset, Width, Height); + } + } + + /// + /// Show secondary window in taskbar. + /// + /// + /// This is specifically required when a window owner is set, where by + /// default the secondary window is not visible in the taskbar. + /// + private void ShowInTaskbar() + { + var hwnd = (HWND)this.GetWindowHandle(); + var exStyle = PInvoke.GetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE) | (int)WINDOW_EX_STYLE.WS_EX_APPWINDOW; + _ = PInvoke.SetWindowLong(hwnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle); + } + + private static void SetWindowOwner(HWND secondaryWindow, HWND primaryWindow) + { + // On x64 platform (IntPtr.Size = 8), call SetWindowLongPtr + // On x32 platform (IntPtr.Size = 4), call SetWindowLong + // Reference: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlongptra + // Note: CsWin32 will not generate PInvoke.SetWindowLongPtr for x86 platform which will cause a compilation error. + if (IntPtr.Size == 8) + { + SetWindowLongPtr(secondaryWindow, WINDOW_LONG_PTR_INDEX.GWLP_HWNDPARENT, primaryWindow); + } + else + { + _ = PInvoke.SetWindowLong(secondaryWindow, WINDOW_LONG_PTR_INDEX.GWL_HWNDPARENT, primaryWindow.Value.ToInt32()); + } + } + + /// + /// This method cannot be added to the NativeMethods.txt because it is not + /// available when compiling the solution for x86 platform. + /// + [DllImport("user32.dll", ExactSpelling = true, EntryPoint = "SetWindowLongPtrW", SetLastError = true)] + private static extern nint SetWindowLongPtr(HWND hWnd, WINDOW_LONG_PTR_INDEX nIndex, nint dwNewLong); + + /********************************************************** + * Application services event handlers * + * Note: Application services event must be unregistered * + * when the secondary window is closed. * + **********************************************************/ + + private void OnThemeChanged(object? sender, ElementTheme theme) + { + // Update the window theme + this.SetRequestedTheme(theme); + } + + /************************************************************** + * Primary window event handlers * + * Note: Primary window event handlers must be unregistered * + * when the secondary window is closed. * + **************************************************************/ + + private void OnPrimaryWindowClosed(object? sender, WindowEventArgs args) + { + // Close secondary window + Close(); + } + + /************************************* + * Secondary window event handlers * + ************************************/ + + private void OnSecondaryWindowActivated(object? sender, WindowActivatedEventArgs args) + { + // Reflect window activation state in title bar + if (this.WindowTitleBar != null) + { + this.WindowTitleBar.IsActive = args.WindowActivationState != WindowActivationState.Deactivated; + } + } + + private void OnSecondaryWindowClosed(object? sender, WindowEventArgs args) + { + // Free the secondary window from the application + IsModal = false; + IsTopLevel = false; + UseAppTheme = false; + + // Unset the primary window at the end + PrimaryWindow = null; + } + + private void OnSecondaryWindowTitleChanged(object? sender, string? title) + { + // Update window title (e.g. in taskbar) + Title = title ?? string.Empty; + } +} diff --git a/common/Windows/WindowTitleBar.xaml b/common/Windows/WindowTitleBar.xaml index bf7e13a019..9dd510c24d 100644 --- a/common/Windows/WindowTitleBar.xaml +++ b/common/Windows/WindowTitleBar.xaml @@ -46,7 +46,7 @@ - + diff --git a/common/Windows/WindowTitleBar.xaml.cs b/common/Windows/WindowTitleBar.xaml.cs index e1deaf64f6..88876aacc1 100644 --- a/common/Windows/WindowTitleBar.xaml.cs +++ b/common/Windows/WindowTitleBar.xaml.cs @@ -5,6 +5,7 @@ using DevHome.Common.Helpers; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media; namespace DevHome.Common.Windows; @@ -22,6 +23,12 @@ public string Title set => SetValue(TitleProperty, value); } + public ImageSource IconSource + { + get => (ImageSource)GetValue(IconSourceProperty) ?? (ImageSource)Application.Current.Resources["WindowTitleBarDefaultIcon"]; + set => SetValue(IconSourceProperty, value); + } + public IconElement Icon { get => (IconElement)GetValue(IconProperty) ?? DefaultIconContent; @@ -73,6 +80,7 @@ private static void OnIsActiveChanged(WindowTitleBar windowTitleBar, bool newVal } private static readonly DependencyProperty TitleProperty = DependencyProperty.Register(nameof(Title), typeof(string), typeof(WindowTitleBar), new PropertyMetadata(null, (s, e) => OnTitleChanged((WindowTitleBar)s, (string)e.NewValue))); + private static readonly DependencyProperty IconSourceProperty = DependencyProperty.Register(nameof(IconSource), typeof(string), typeof(WindowTitleBar), new PropertyMetadata(null)); private static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(IconElement), typeof(WindowTitleBar), new PropertyMetadata(null)); private static readonly DependencyProperty HideIconProperty = DependencyProperty.Register(nameof(HideIcon), typeof(bool), typeof(WindowTitleBar), new PropertyMetadata(false)); private static readonly DependencyProperty IsActiveProperty = DependencyProperty.Register(nameof(IsActive), typeof(bool), typeof(WindowTitleBar), new PropertyMetadata(true, (s, e) => OnIsActiveChanged((WindowTitleBar)s, (bool)e.NewValue))); diff --git a/docs/architecture.md b/docs/architecture.md index 7fb47116df..1433f53717 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -14,7 +14,6 @@ A more detailed look at how the projects are related: ```mermaid graph TD; DevHome.Telemetry-->DevHome.Common; - DevHome.Common-->DevHome; DevHome.Common-->DevHome.Customization; DevHome.Common-->DevHome.Dashboard; DevHome.Common-->DevHome.Experiments; @@ -27,6 +26,8 @@ graph TD; DevHome.SetupFlow.ElevatedComponent-->DevHome.SetupFlow.ElevatedServer; DevHome.SetupFlow.ElevatedComponent.Projection-->DevHome.SetupFlow; CoreWidgetProvider-->DevHome; + HyperVExtensionServer-->DevHome; + DevHome.Common-->DevHome; DevHome.Customization-->DevHome; DevHome.Dashboard-->DevHome; DevHome.Experiments-->DevHome; diff --git a/docs/extensions/LocalRepository/readme.md b/docs/extensions/LocalRepository/readme.md new file mode 100644 index 0000000000..7e6dfff3c0 --- /dev/null +++ b/docs/extensions/LocalRepository/readme.md @@ -0,0 +1,14 @@ +# LocalRepository + +Using Dev Home, a user can opt into File Explorer Source Control Integration. Doing so means that a user can navigate to a repo path in File Explorer +and see property information displayed after retrieval from a source control technology. + +## List of Allowed Property Values Displayed in File Explorer + +System.VersionControl.Status, +System.VersionControl.LastChangeDate, +System.VersionControl.LastChangeAuthorEmail, +System.VersionControl.LastChangeAuthorName, +System.VersionControl.LastChangeID, +System.VersionControl.LastChangeMessage, +System.VersionControl.CurrentFolderStatus \ No newline at end of file diff --git a/docs/extensions/environments/Interfaces/IComputeSystem.md b/docs/extensions/environments/Interfaces/IComputeSystem.md index ee58ecd284..248da4bead 100644 --- a/docs/extensions/environments/Interfaces/IComputeSystem.md +++ b/docs/extensions/environments/Interfaces/IComputeSystem.md @@ -37,7 +37,7 @@ Extensions should create objects that represent each compute system that their u ### Example -The [Hyper-V extension](https://github.com/microsoft/devhome/tree/main/HyperVExtension) interacts directly with the Hyper-V virtual machine management service to perform the above operations on the virtual machine. +The [Hyper-V extension](https://github.com/microsoft/devhome/tree/main/extensions/HyperVExtension) interacts directly with the Hyper-V virtual machine management service to perform the above operations on the virtual machine. To provide Dev Home the ability to initiate one of these operations, we have created the `IComputeSystem` interface. Extensions are expected to map their software/hardware system to the `IComputeSystem` interface and send these operations back to Dev Home. Dev Home can initiate one of these operations via a method call in the `IComputeSystem` interface, based on user input. The extension can then interact with its underlying hardware/software system to perform that operation. diff --git a/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/DisableWindowsSettings.yaml b/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/DisableWindowsSettings.yaml deleted file mode 100644 index 8030dee9be..0000000000 --- a/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/DisableWindowsSettings.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 - -########################################################################### -# This configuration will enable or disable various Windows Settings. # -# PowerShell module: Microsoft.Windows.Developer (v0.1.3-alpha) # -########################################################################### - -properties: - resources: - - resource: Microsoft.Windows.Developer/TaskBarAlignment - directives: - description: Set taskbar alignment to left - allowPrerelease: true - settings: - Alignment: Middle # 'Left' - - resource: Microsoft.Windows.Developer/ShowSecondsInClock - directives: - description: Show seconds in clock - allowPrerelease: true - settings: - Ensure: Absent - - resource: Microsoft.Windows.Developer/HideFileExtensions - directives: - description: Hide file extensions - allowPrerelease: true - settings: - Ensure: Absent - - resource: Microsoft.Windows.Developer/ShowTaskViewButton - directives: - description: Show task view button - allowPrerelease: true - settings: - Ensure: Absent - - resource: Microsoft.Windows.Developer/ShowHiddenFiles - directives: - description: Show hidden files - allowPrerelease: true - settings: - Ensure: Absent - - resource: Microsoft.Windows.Developer/HideTaskBarLabels - directives: - description: Never hide task bar labels - allowPrerelease: true - settings: - HideLabels: Always # 'WhenFull', 'Never' - # Use caution when setting `RestartExplorer: true` as this will force explorer to close. - RestartExplorer: true # Required to apply changes - - resource: Microsoft.Windows.Developer/EnableDarkMode - directives: - description: Enable dark mode - allowPrerelease: true - settings: - Ensure: Absent - # Use caution when setting `RestartExplorer: true` as this will force explorer to close. - RestartExplorer: true # Required to apply changes - configurationVersion: 0.2.0 diff --git a/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/EnableWindowsSettings.yaml b/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/EnableWindowsSettings.yaml deleted file mode 100644 index 2c0a0af8b2..0000000000 --- a/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/EnableWindowsSettings.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 - -########################################################################### -# This configuration will enable or disable various Windows Settings. # -# PowerShell module: Microsoft.Windows.Developer (v0.1.3-alpha) # -########################################################################### - -properties: - resources: - - resource: Microsoft.Windows.Developer/TaskBarAlignment - directives: - description: Set taskbar alignment to left - allowPrerelease: true - settings: - Alignment: Left # 'Middle' - - resource: Microsoft.Windows.Developer/ShowSecondsInClock - directives: - description: Show seconds in clock - allowPrerelease: true - settings: - Ensure: Present - - resource: Microsoft.Windows.Developer/HideFileExtensions - directives: - description: Hide file extensions - allowPrerelease: true - settings: - Ensure: Present - - resource: Microsoft.Windows.Developer/ShowTaskViewButton - directives: - description: Show task view button - allowPrerelease: true - settings: - Ensure: Present - - resource: Microsoft.Windows.Developer/ShowHiddenFiles - directives: - description: Show hidden files - allowPrerelease: true - settings: - Ensure: Present - - resource: Microsoft.Windows.Developer/HideTaskBarLabels - directives: - description: Never hide task bar labels - allowPrerelease: true - settings: - HideLabels: Never # 'WhenFull', 'Always' - # Use caution when setting `RestartExplorer: true` as this will force explorer to close. - RestartExplorer: true # Required to apply changes - - resource: Microsoft.Windows.Developer/EnableDarkMode - directives: - description: Enable dark mode - allowPrerelease: true - settings: - Ensure: Present - # Use caution when setting `RestartExplorer: true` as this will force explorer to close. - RestartExplorer: true # Required to apply changes - configurationVersion: 0.2.0 diff --git a/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/ModifyWindowsSettings.yaml b/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/ModifyWindowsSettings.yaml new file mode 100644 index 0000000000..b5398d580e --- /dev/null +++ b/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/ModifyWindowsSettings.yaml @@ -0,0 +1,44 @@ +# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 + +########################################################################### +# This configuration will modify various Windows Settings. # +# PowerShell module: Microsoft.Windows.Developer (v0.2.1-alpha) # +########################################################################### + +properties: + resources: + - resource: Microsoft.Windows.Developer/Taskbar + directives: + description: Modify taskbar settings + allowPrerelease: true + settings: + Alignment: Left # [KeepCurrentValue, Middle] + HideLabelsMode: Never # [KeepCurrentValue, WhenFull, Always] + SearchBoxMode: ShowIconAndLabel # [KeepCurrentValue, ShowIconOnly, SearchBox, Hide] + TaskViewButton: Show # [KeepCurrentValue, Hide] + WidgetsButton: Show # [KeepCurrentValue, Hide] + RestartExplorer: True # Use caution when setting `RestartExplorer: true` as this will force explorer to close. Required for `HideLabelsMode`. + - resource: Microsoft.Windows.Developer/WindowsExplorer + directives: + description: Modify Windows Explorer settings + allowPrerelease: true + settings: + FileExtensions: Hide # [KeepCurrentValue, Hide] + HiddenFiles: Hide # [KeepCurrentValue, Hide] + ItemCheckBoxes: Hide # [KeepCurrentValue, Hide] + RestartExplorer: True # Use caution when setting `RestartExplorer: true` as this will force explorer to close. Required for all WindowsExplorer settings. + - resource: Microsoft.Windows.Developer/ShowSecondsInClock + directives: + description: Show seconds in clock + allowPrerelease: true + settings: + Ensure: Present + - resource: Microsoft.Windows.Developer/EnableDarkMode + directives: + description: Disable dark mode + allowPrerelease: true + settings: + Ensure: Absent + # Use caution when setting `RestartExplorer: true` as this will force explorer to close. + RestartExplorer: true # Required to apply changes + configurationVersion: 0.2.0 diff --git a/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/RevertWindowsSettings.yaml b/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/RevertWindowsSettings.yaml new file mode 100644 index 0000000000..2cf7050ef9 --- /dev/null +++ b/docs/sampleConfigurations/DscResources/Microsoft.Windows.Developer/RevertWindowsSettings.yaml @@ -0,0 +1,44 @@ +# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2 + +########################################################################### +# This configuration will revert various Windows Settings. # +# PowerShell module: Microsoft.Windows.Developer (v0.2.1-alpha) # +########################################################################### + +properties: + resources: + - resource: Microsoft.Windows.Developer/Taskbar + directives: + description: Revert taskbar settings + allowPrerelease: true + settings: + Alignment: Middle # [KeepCurrentValue, Left] + HideLabelsMode: Always # [KeepCurrentValue, WhenFull, Never] + SearchBoxMode: Hide # [KeepCurrentValue, ShowIconOnly, SearchBox, ShowIconAndLabel] + TaskViewButton: Hide # [KeepCurrentValue, Show] + WidgetsButton: Hide # [KeepCurrentValue, Show] + RestartExplorer: True # Use caution when setting `RestartExplorer: true` as this will force explorer to close. Required for `HideLabelsMode`. + - resource: Microsoft.Windows.Developer/WindowsExplorer + directives: + description: Revert Windows Explorer settings + allowPrerelease: true + settings: + FileExtensions: Show # [KeepCurrentValue, Hide] + HiddenFiles: Show # [KeepCurrentValue, Hide] + ItemCheckBoxes: Show # [KeepCurrentValue, Hide] + RestartExplorer: # Use caution when setting `RestartExplorer: true` as this will force explorer to close. Required for all WindowsExplorer settings. + - resource: Microsoft.Windows.Developer/ShowSecondsInClock + directives: + description: Hide seconds in clock + allowPrerelease: true + settings: + Ensure: Absent + - resource: Microsoft.Windows.Developer/EnableDarkMode + directives: + description: Enable dark mode + allowPrerelease: true + settings: + Ensure: Present + # Use caution when setting `RestartExplorer: true` as this will force explorer to close. + RestartExplorer: true # Required to apply changes + configurationVersion: 0.2.0 diff --git a/docs/specs/#2160 - Generate a Configuration File/GenerateConfigurationFileSpec.md b/docs/specs/#2160 - Generate a Configuration File/GenerateConfigurationFileSpec.md new file mode 100644 index 0000000000..6b7ef6178e --- /dev/null +++ b/docs/specs/#2160 - Generate a Configuration File/GenerateConfigurationFileSpec.md @@ -0,0 +1,126 @@ +--- +author: Sharla Soennichsen @shakersMSFT +created on: 2024-02-21 +last updated: 2024-02-23 +issue id: #2160 +--- + +# Dev Home machine configuration generates a configuration file + +## 1. Overview + +### 1.1 Establish the Problem + +Today a user can specify details for setting up their machine in the end to end machine configuration flow, but they don't have a way to easily repeat that set up. Winget configuration files make it easy and repeatable to configure a machine like the end to end flow, but there isn't a way to generate a configuration file easily today. + +### 1.2 Introduce the Solution + +In the proposed solution, the developer doesn’t need to modify how they are using the end to end flow today, they can make the same selections and on the last step they get to choose whether they want to save those steps as a configuration file to share with teammates or use to set up another machine for development. + +### 1.3 Rough-in Designs + +*Coming soon* + +## 2. Goals & User Cans + +### 2.1 Goals + +1. Make it easy to create a configuration file through Dev Home +2. Increase the number of Winget configuration files available to make it easy to configure and share + + +### 2.2 Non-Goals + +1. Build out a full new UI for generating, editing, customizing a configuration file (i.e. we are not building a form/new wizard at this time) + +### 2.3 User Cans Summary Table + +| No. | User Can | Pri | +| --- | -------- | --- | +| 1 | User can generate a winget configuration file as part of any setup option (except running a config file) | 0 | +| 2 | User can choose to set up & generate a file | 0 | +| 3 | User can choose to just generate a file | 0 | +| 4 | User can choose to just set up and not generate a file | 0 | +| 5 | User can select a local save location for their configuration file | 0 | +| 6 | User can specify the file name | 0 | +| 7 | User can specify the file extension as .dsc.yaml or .winget(default) | 0 | + +## 3. User Stories + +### 3.1 User story - Setting up a new machine + +#### Job-to-be-done + +A user is setting up their machine for the first time, and wants to make it easy for themselves to get set up in the future. + +#### User experience + +1. User navigates to e2e machine configuration flow +2. User specifies repos to clone to their machine +3. User adds a dev drive +4. User adds applications to install +5. User reviews their selections and elects to ‘save as’ a configuration file +6. User specifies a file name, file extension, and save location for their configuration file +7. A configuration file is generated and saved +8. User then clicks ‘set up’ +9. Set up runs and the machine is configured + +#### Golden paths (with images to guide) + +#### Edge cases +1. User specifies some private repos to clone. The private repos will be cloned to their local machine during set up but will be commented out in their configuration file due to authentication restrictions. + +### 3.2 User story - Create a file on an existing machine + +#### Job-to-be-done + +A user has an existing dev machine that they use and they want to use dev home to generate a configuration file based on their machine. + +#### User experience + +1. User navigates to e2e machine configuration flow +2. User specifies repos to clone +3. User adds a dev drive +4. User adds applications to install (some may already be installed) +5. User reviews their selections and elects to ‘save as’ a configuration file +6. User specifies a file name, file extension, and save location for their configuration file +7. A configuration file is generated and saved +8. User then clicks ‘set up’ +9. Set up runs and the machine is configured + +#### Golden paths (with images to guide) + +#### Edge cases +1. User specifies some private repos to clone. The private repos will be cloned to their local machine during set up but will be commented out in their configuration file due to authentication restrictions. + +## 4. Requirements + +### 4.1 Functional Requirements + +#### Summary + +On the review page of the end to end flow in machine configuration, the user can opt to generate a configuration file, which will then generate a configuration file that contains the set of items that the user specified they wanted included in their set up such as repos, dev drive, and applications. They can also specify the name, save location, and file type for their configuration file for use on another machine or for sharing with others. + +#### Detailed Experience Walkthrough + +*Coming soon* + +#### Detailed Functional Requirements + +| No. | Requirement | Pri | +| --- | ----------- | --- | +| 1 |A configuration file can be generated from any flow except the ‘run a configuration file’ flow | 0 | +| 2 |A configuration file is generated based on the selections a user makes during the set up flow (repos, dev drive, applications) | 0 | +| 3 |On the review page, there is a ‘save as’ configuration file button | 0 | +| 4 |A configuration file generated from Dev Home indicates it was generated through Dev Home | 0 | +| 5 |Default file name is configuration.winget | 0 | +| 6 |User can select to generate a dsc.yaml and/or a .winget file (default .winget) | 0 | +| 7 |If the user selected private repos to clone, notify them that they will be commented out due to the authentication requirement and auth not being supported in DSC yet. | 0 | +| 8 |The summary page provides a link to the file location of the configuration file generated. | 0 | +| 9 |Configuration file generation follows best practices for creation | 0 | +| 10 |The configuration file generated always uses the latest schema https://aka.ms/configuration-dsc-schema/ | 0 | +| 11 |The default DSC module/resource for cloning repos is GitDSC/GitClone | 0 | +| 12 |The default DSC module/resource for creating dev drives is StorageDSC/Disk | 0 | +| 13 |The default DSC module/resource for installing applications is Microsoft.WinGet.DSC/WinGetPackage | 0 | +| 14 |If there is a known dependency for a module/resource, ensure the dependency is included and tagged as such in the configuration file | 0 | +| 15 |Installed applications added to a configuration file can include app settings | 3 | diff --git a/docs/specs/#2211 - Detect Configuration Files/DetectConfigurationFilesSpec.md b/docs/specs/#2211 - Detect Configuration Files/DetectConfigurationFilesSpec.md new file mode 100644 index 0000000000..bdb5b80817 --- /dev/null +++ b/docs/specs/#2211 - Detect Configuration Files/DetectConfigurationFilesSpec.md @@ -0,0 +1,113 @@ +--- +author: Sharla Soennichsen @shakersMSFT +created on: 2024-02-22 +last updated: 2024-02-23 +issue id: #2211 +--- + +# Detect Configuration files in repositories + +## 1. Overview + +### 1.1 Establish the Problem + +Setting up to build a repository is one of the more tedious tasks that a developer needs to do in their workflow. We have been building out WinGet Configuration files and the ability to specify the set up needs for a repository within a configuration file which will then configure applications, settings, and variables needed. We have been adding them to our repos to make it easier for set up but we don’t have an easy way to clone + find the configuration to complete the set up in one flow. + +### 1.2 Introduce the Solution + +When a user clones a repository, we can check the repository for the existence of a WinGet configuration file, and allow the user to elect to apply that configuration file to easily fast track the set up process for any given repository. Configuration files will allow the repository owner to specify applications to install, dependencies, and even settings that can be configured all in one go. + +### 1.3 Rough-in Designs + +*coming soon* + +## 2. Goals & User Cans + +### 2.1 Goals + +1. Improve the discoverability of WinGet configuration files +2. Make it easier to configure repos as part of the set up flow + +### 2.2 Non-Goals + +1. Run any configuration file other than Winget configuration files +2. Detect configuration files anywhere in a repo (must be in .configurations folder) +3. Allow the upload of a local configuration file as part of the e2e set up flow + +### 2.3 User Cans Summary Table + +| No. | User Can | Pri | +| --- | -------- | --- | +| 1 | User can see if any repositories they cloned have a configuration file | 0 | +| 2 | User can see the associated repo for each configuration file | 0 | +| 3 | User can view the file location of each configuration file detected | 0 | +| 4 | User can choose to run any configuration file detected during set up | 0 | + +## 3. User Stories + +### 3.1 User story - Configuration files are automatically detected when cloning (user runs from Dev Home) + +#### Job-to-be-done + +User is setting up their development machine for the first time and has a few repositories they need to set up for development. + +#### User experience + +1. User selects e2e machine configuration flow (or repo cloning quick action) +2. User selects repos to clone +3. Set up flow continues, user makes any other selections, and then starts the set up process +4. During set up, repos are cloned +5. Dev Home checks repos for configuration files and gathers the list of detected files +6. On the summary page, user is notified of detected configuration files. +7. User can view the list of all detected configuration files, and choose to view or run the file +8. User selects to run a configuration file detected +9. An admin command prompt is launched with the configuration command and file pre-set +10. User can opt to run the configuration file and finish setting up their repo + +#### Golden paths (with images to guide) + +#### Edge cases + +### 3.2 User story - Configuration files are automatically detected when cloning (user runs manually) + +#### Job-to-be-done + +#### User experience +1. User selects e2e machine configuration flow (or repo cloning quick action) +2. User selects repos to clone +3. Set up flow continues, user makes any other selections, and then starts the set up process +4. During set up, repos are cloned +5. Dev Home checks repos for configuration files and gathers the list of detected files +6. On the summary page, user is notified of detected configuration files. +7. User can view the list of all detected configuration files, and choose to view or run the file +8. User selects to view the file location of a configuration file +9. User's file explorer is opened to the location of the configuration file within their cloned repo + +#### Golden paths (with images to guide) +1. (post flow) User navigates to the configuration file flow, and selects a configuration file from a cloned repo to run + +#### Edge cases + +## 4. Requirements + +### 4.1 Functional Requirements + +#### Summary + +As a user goes through the machine configuration flow, we want to optimize their experience where we can. When they are cloning repos, we can check for WinGet configuration files and show those to help developers set up and configure repositories faster. + +#### Detailed Experience Walkthrough + +*coming soon* + +#### Detailed Functional Requirements + +| No. | Requirement | Pri | +| --- | ----------- | --- | +| 1 | When a repo is cloned, check for a WinGet configuration file (*.dsc.yaml or *.winget in the .configurations folder) | 0 | +| 2 | The total number of detected configuration files from a flow is shown on the summary page | 0 | +| 3 | A user can see file location or choose to run a configuration file from the summary page | 0 | +| 4 | Viewing a configuration file links to its file location | 0 | +| 5 | Running a configuration file opens up an admin command prompt with the WinGet Configure command populated with the selected file | 0 | +| 6 | User can elect to run the configuration file from the command prompt | 0 | +| 7 | Each 'run file' will open a new command prompt | 0 | diff --git a/docs/tools/common/AddCreateButton.md b/docs/tools/common/AddCreateButton.md new file mode 100644 index 0000000000..7ef261f730 --- /dev/null +++ b/docs/tools/common/AddCreateButton.md @@ -0,0 +1,12 @@ +# AddCreateButton +Create a button with a + symbol and the given text content. Used for buttons that add or create something. + +## Usage +### Example +#### HelloWorldDialog.xaml +```xml + +``` diff --git a/docs/tools/common/ExperimentControl.md b/docs/tools/common/ExperimentControl.md new file mode 100644 index 0000000000..6b3d63d2a9 --- /dev/null +++ b/docs/tools/common/ExperimentControl.md @@ -0,0 +1,22 @@ +# Experiment control +Control to show different content based on the experiment key. By default, the default content is shown. If the experiment is enabled, the experiment content is shown. + +## Example +```xml + + + + + + + + + + + + + + + +``` +| \ No newline at end of file diff --git a/docs/tools/common/Readme.md b/docs/tools/common/Readme.md index bfca75325c..fd6e34e3f1 100644 --- a/docs/tools/common/Readme.md +++ b/docs/tools/common/Readme.md @@ -6,7 +6,9 @@ List of common controls that are generic, customizable and reusable from all pag - [Secondary window](./SecondaryWindow.md) ## Controls +- [AddCreateButton](./AddCreateButton.md) - [CloseButton](./CloseButton.md) +- [ExperimentControl](./ExperimentControl.md) ## File dialog > [!NOTE] diff --git a/docs/tools/creating-a-tool.md b/docs/tools/creating-a-tool.md index a8be7e740b..0a2ef7f75c 100644 --- a/docs/tools/creating-a-tool.md +++ b/docs/tools/creating-a-tool.md @@ -1,13 +1,13 @@ # Creating a tool -1. Create a new directory with your tool's name under `tools` with three subdirectories `src`, `test`, and `uitest` -1. Create a new `WinUI 3 Class Library` project in your `src` directory +1. Create a new directory with your tool's name under `tools`. +1. Create a new `WinUI 3 Class Library` project in the directory you just created. 1. In your project file, remove `TargetFramework` and `TargetPlatformMinVersion`. Add the following line to the top: ```xml ``` 1. Remove the PackageReference to WindowsAppSDK, since it will be added via the Common project in a few steps. -1. Create the `Strings\en-us` directories under `src`. Add `Resources.resw` and include the following code: +1. Create the `Strings\en-us` directories under your project directory. Add `Resources.resw` and include the following code: ```xml [Name of your tool that will appear in navigation menu] @@ -56,4 +56,4 @@ Returns the name of the tool. This is used for the navigation menu text. ## Code organization [`toolpage.cs`](../common/ToolPage.cs) -Contains the interface definition for Dev Home tools. \ No newline at end of file +Contains the interface definition for Dev Home tools. diff --git a/extensions/CoreWidgetProvider/CoreWidgetProvider.csproj b/extensions/CoreWidgetProvider/CoreWidgetProvider.csproj index 603330e692..7eb8890a64 100644 --- a/extensions/CoreWidgetProvider/CoreWidgetProvider.csproj +++ b/extensions/CoreWidgetProvider/CoreWidgetProvider.csproj @@ -22,7 +22,7 @@ all - + diff --git a/extensions/CoreWidgetProvider/Helpers/ChartHelper.cs b/extensions/CoreWidgetProvider/Helpers/ChartHelper.cs index 91ff869adb..a18d095b3c 100644 --- a/extensions/CoreWidgetProvider/Helpers/ChartHelper.cs +++ b/extensions/CoreWidgetProvider/Helpers/ChartHelper.cs @@ -18,7 +18,7 @@ public enum ChartType } public const int ChartHeight = 86; - public const int ChartWidth = 264; + public const int ChartWidth = 268; private const string LightGrayBoxStyle = "fill:none;stroke:lightgrey;stroke-width:1"; @@ -59,7 +59,7 @@ public enum ChartType private const string Y2Attr = "y2"; private const string IdAttr = "id"; - private const int MaxChartValues = 30; + private const int MaxChartValues = 34; public static string CreateImageUrl(List chartValues, ChartType type) { @@ -225,17 +225,25 @@ private static StringBuilder TransformPointsToLine(List chartValues, out // The X value where the graph starts must be adjusted so that the graph is right-aligned. // The max available width of the widget is 268. Since there is a 1 px border around the chart, the width of the chart's line must be <=266. - // To create a chart of exactly the right size, we'll have 30 points with 9 pixels in between: - // index 0 1 2 - 262 263 - // 1 px left border + 1 px for first point + 29 segments * 9 px per segment + 1 px right border = 264 pixels total in width. - const int pxBetweenPoints = 9; + // To create a chart of exactly the right size, we'll have 34 points with 8 pixels in between: + // 1 px left border + 1 px for first point + 33 segments * 8 px per segment + 1 px right border = 267 pixels total in width. + const int pxBetweenPoints = 8; // When the chart doesn't have all points yet, move the chart over to the right by increasing the starting X coordinate. // For a chart with only 1 point, the svg will not render a polyline. - // For a chart with 2 points, starting X coordinate == 1 + (30 - 2) * 9 == 1 + 28 * 9 == 1 + 252 == 253 - // For a chart with 30 points, starting X coordinate == 1 + (30 - 30) * 9 == 1 + 0 * 9 == 1 + 0 == 1 - startX = 1 + ((MaxChartValues - chartValues.Count) * pxBetweenPoints); + // For a chart with 2 points, starting X coordinate == 2 + (34 - 2) * 8 == 1 + 32 * 8 == 1 + 256 == 257 + // For a chart with 30 points, starting X coordinate == 2 + (34 - 34) * 8 == 1 + 0 * 8 == 1 + 0 == 2 + startX = 2 + ((MaxChartValues - chartValues.Count) * pxBetweenPoints); finalX = startX; + + // Extend graph by one pixel to cover gap on the left when the chart is otherwise full. + if (startX == 2) + { + var invertedHeight = 100 - chartValues[0]; + var finalY = (invertedHeight * (ChartHeight / 100.0)) - 1; + points.Append(CultureInfo.InvariantCulture, $"1,{finalY} "); + } + foreach (var origY in chartValues) { // We receive the height as a number up from the X axis (bottom of the chart), but we have to invert it diff --git a/extensions/CoreWidgetProvider/Widgets/CoreWidget.cs b/extensions/CoreWidgetProvider/Widgets/CoreWidget.cs index 9700800557..54051fda8a 100644 --- a/extensions/CoreWidgetProvider/Widgets/CoreWidget.cs +++ b/extensions/CoreWidgetProvider/Widgets/CoreWidget.cs @@ -6,6 +6,7 @@ using CoreWidgetProvider.Helpers; using CoreWidgetProvider.Widgets.Enums; using Microsoft.Windows.Widgets.Providers; +using Windows.ApplicationModel; namespace CoreWidgetProvider.Widgets; @@ -131,7 +132,7 @@ protected string GetTemplateForPage(WidgetPageState page) try { - var path = Path.Combine(AppContext.BaseDirectory, GetTemplatePath(page)); + var path = Path.Combine(Package.Current.EffectivePath, GetTemplatePath(page)); var template = File.ReadAllText(path, Encoding.Default) ?? throw new FileNotFoundException(path); template = Resources.ReplaceIdentifers(template, Resources.GetWidgetResourceIdentifiers(), Log); Log.Debug($"Caching template for {page}"); diff --git a/HyperVExtension/BuildDevSetupAgentHelper.cmd b/extensions/HyperVExtension/BuildDevSetupAgentHelper.cmd similarity index 100% rename from HyperVExtension/BuildDevSetupAgentHelper.cmd rename to extensions/HyperVExtension/BuildDevSetupAgentHelper.cmd diff --git a/HyperVExtension/BuildDevSetupAgentHelper.ps1 b/extensions/HyperVExtension/BuildDevSetupAgentHelper.ps1 similarity index 85% rename from HyperVExtension/BuildDevSetupAgentHelper.ps1 rename to extensions/HyperVExtension/BuildDevSetupAgentHelper.ps1 index 3be5d8836c..0fef8bda84 100644 --- a/HyperVExtension/BuildDevSetupAgentHelper.ps1 +++ b/extensions/HyperVExtension/BuildDevSetupAgentHelper.ps1 @@ -79,7 +79,7 @@ Try { & $nugetPath restore $msbuildArgs = @( - ("HyperVExtension\DevSetupAgent.sln"), + ("extensions\HyperVExtension\DevSetupAgent.sln"), ("/p:Platform="+$platform), ("/p:Configuration="+$configuration), ("/restore"), @@ -93,8 +93,8 @@ Try { & $msbuildPath $msbuildArgs # SDK version and .NEt version needs to stay in sync with ToolingVersion.props, DevSetupEngineIdl.vcxproj, and DevHome-CL.yaml - $binariesOutputPath = (Join-Path $env:Build_RootDirectory "HyperVExtension\src\DevSetupAgent\bin\$Platform\$Configuration\net8.0-windows10.0.22621.0\win-$Platform\*") - $zipOutputPath = (Join-Path $env:Build_RootDirectory "HyperVExtension\src\DevSetupAgent\bin\$Platform\$Configuration\DevSetupAgent_$Platform.zip") + $binariesOutputPath = (Join-Path $env:Build_RootDirectory "extensions\HyperVExtension\src\DevSetupAgent\bin\$Platform\$Configuration\net8.0-windows10.0.22621.0\win-$Platform\*") + $zipOutputPath = (Join-Path $env:Build_RootDirectory "extensions\HyperVExtension\src\DevSetupAgent\bin\$Platform\$Configuration\DevSetupAgent_$Platform.zip") Compress-Archive -Force -Path $binariesOutputPath $zipOutputPath } Catch { diff --git a/HyperVExtension/DevSetupAgent.sln b/extensions/HyperVExtension/DevSetupAgent.sln similarity index 78% rename from HyperVExtension/DevSetupAgent.sln rename to extensions/HyperVExtension/DevSetupAgent.sln index 0bf4068e06..90fa81e425 100644 --- a/HyperVExtension/DevSetupAgent.sln +++ b/extensions/HyperVExtension/DevSetupAgent.sln @@ -31,154 +31,116 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevSetupEngine.Test", "test EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU Debug|arm64 = Debug|arm64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU Release|arm64 = Release|arm64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|Any CPU.ActiveCfg = Debug|x64 - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|Any CPU.Build.0 = Debug|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|arm64.ActiveCfg = Debug|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|arm64.Build.0 = Debug|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x64.ActiveCfg = Debug|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x64.Build.0 = Debug|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x86.ActiveCfg = Debug|Win32 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Debug|x86.Build.0 = Debug|Win32 - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|Any CPU.ActiveCfg = Release|x64 - {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|Any CPU.Build.0 = Release|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|arm64.ActiveCfg = Release|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|arm64.Build.0 = Release|ARM64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x64.ActiveCfg = Release|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x64.Build.0 = Release|x64 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x86.ActiveCfg = Release|Win32 {D6B0C16D-858A-4C1B-99CF-D6F4CF5BCD5F}.Release|x86.Build.0 = Release|Win32 - {81637044-773F-4A0D-A166-AD110738435E}.Debug|Any CPU.ActiveCfg = Debug|x64 - {81637044-773F-4A0D-A166-AD110738435E}.Debug|Any CPU.Build.0 = Debug|x64 {81637044-773F-4A0D-A166-AD110738435E}.Debug|arm64.ActiveCfg = Debug|arm64 {81637044-773F-4A0D-A166-AD110738435E}.Debug|arm64.Build.0 = Debug|arm64 {81637044-773F-4A0D-A166-AD110738435E}.Debug|x64.ActiveCfg = Debug|x64 {81637044-773F-4A0D-A166-AD110738435E}.Debug|x64.Build.0 = Debug|x64 {81637044-773F-4A0D-A166-AD110738435E}.Debug|x86.ActiveCfg = Debug|x86 {81637044-773F-4A0D-A166-AD110738435E}.Debug|x86.Build.0 = Debug|x86 - {81637044-773F-4A0D-A166-AD110738435E}.Release|Any CPU.ActiveCfg = Release|x64 - {81637044-773F-4A0D-A166-AD110738435E}.Release|Any CPU.Build.0 = Release|x64 {81637044-773F-4A0D-A166-AD110738435E}.Release|arm64.ActiveCfg = Release|arm64 {81637044-773F-4A0D-A166-AD110738435E}.Release|arm64.Build.0 = Release|arm64 {81637044-773F-4A0D-A166-AD110738435E}.Release|x64.ActiveCfg = Release|x64 {81637044-773F-4A0D-A166-AD110738435E}.Release|x64.Build.0 = Release|x64 {81637044-773F-4A0D-A166-AD110738435E}.Release|x86.ActiveCfg = Release|x86 {81637044-773F-4A0D-A166-AD110738435E}.Release|x86.Build.0 = Release|x86 - {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|Any CPU.ActiveCfg = Debug|x64 - {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|Any CPU.Build.0 = Debug|x64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|arm64.ActiveCfg = Debug|arm64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|arm64.Build.0 = Debug|arm64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|x64.ActiveCfg = Debug|x64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|x64.Build.0 = Debug|x64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|x86.ActiveCfg = Debug|x86 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Debug|x86.Build.0 = Debug|x86 - {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|Any CPU.ActiveCfg = Release|x64 - {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|Any CPU.Build.0 = Release|x64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|arm64.ActiveCfg = Release|arm64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|arm64.Build.0 = Release|arm64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|x64.ActiveCfg = Release|x64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|x64.Build.0 = Release|x64 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|x86.ActiveCfg = Release|x86 {61D565EF-FA52-4426-B3D3-CBF6841C3014}.Release|x86.Build.0 = Release|x86 - {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|Any CPU.ActiveCfg = Debug|x64 - {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|Any CPU.Build.0 = Debug|x64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|arm64.ActiveCfg = Debug|arm64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|arm64.Build.0 = Debug|arm64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|x64.ActiveCfg = Debug|x64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|x64.Build.0 = Debug|x64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|x86.ActiveCfg = Debug|x86 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Debug|x86.Build.0 = Debug|x86 - {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|Any CPU.ActiveCfg = Release|x64 - {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|Any CPU.Build.0 = Release|x64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|arm64.ActiveCfg = Release|arm64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|arm64.Build.0 = Release|arm64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|x64.ActiveCfg = Release|x64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|x64.Build.0 = Release|x64 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|x86.ActiveCfg = Release|x86 {CB5CE4D1-89E9-4E24-9C0C-40439B6317BA}.Release|x86.Build.0 = Release|x86 - {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|Any CPU.ActiveCfg = Debug|x64 - {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|Any CPU.Build.0 = Debug|x64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|arm64.ActiveCfg = Debug|arm64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|arm64.Build.0 = Debug|arm64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|x64.ActiveCfg = Debug|x64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|x64.Build.0 = Debug|x64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|x86.ActiveCfg = Debug|x86 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Debug|x86.Build.0 = Debug|x86 - {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|Any CPU.ActiveCfg = Release|x64 - {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|Any CPU.Build.0 = Release|x64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|arm64.ActiveCfg = Release|arm64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|arm64.Build.0 = Release|arm64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|x64.ActiveCfg = Release|x64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|x64.Build.0 = Release|x64 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|x86.ActiveCfg = Release|x86 {7F1EB9CE-372C-434E-ACA1-3AC009D7AC81}.Release|x86.Build.0 = Release|x86 - {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|Any CPU.ActiveCfg = Debug|x64 - {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|Any CPU.Build.0 = Debug|x64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|arm64.ActiveCfg = Debug|arm64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|arm64.Build.0 = Debug|arm64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|x64.ActiveCfg = Debug|x64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|x64.Build.0 = Debug|x64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|x86.ActiveCfg = Debug|x86 {A06B631E-D563-44A3-A678-2F7E7806902F}.Debug|x86.Build.0 = Debug|x86 - {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|Any CPU.ActiveCfg = Release|x64 - {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|Any CPU.Build.0 = Release|x64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|arm64.ActiveCfg = Release|arm64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|arm64.Build.0 = Release|arm64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|x64.ActiveCfg = Release|x64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|x64.Build.0 = Release|x64 {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|x86.ActiveCfg = Release|x86 {A06B631E-D563-44A3-A678-2F7E7806902F}.Release|x86.Build.0 = Release|x86 - {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|Any CPU.ActiveCfg = Debug|x64 - {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|Any CPU.Build.0 = Debug|x64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|arm64.ActiveCfg = Debug|arm64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|arm64.Build.0 = Debug|arm64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|x64.ActiveCfg = Debug|x64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|x64.Build.0 = Debug|x64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|x86.ActiveCfg = Debug|x86 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Debug|x86.Build.0 = Debug|x86 - {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|Any CPU.ActiveCfg = Release|x64 - {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|Any CPU.Build.0 = Release|x64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|arm64.ActiveCfg = Release|arm64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|arm64.Build.0 = Release|arm64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|x64.ActiveCfg = Release|x64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|x64.Build.0 = Release|x64 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|x86.ActiveCfg = Release|x86 {FD0D43E0-3724-4C77-B06E-33B3B83E9945}.Release|x86.Build.0 = Release|x86 - {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|Any CPU.ActiveCfg = Debug|x64 - {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|Any CPU.Build.0 = Debug|x64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|arm64.ActiveCfg = Debug|arm64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|arm64.Build.0 = Debug|arm64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|x64.ActiveCfg = Debug|x64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|x64.Build.0 = Debug|x64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|x86.ActiveCfg = Debug|x86 {F38A10BC-C93B-4D99-B079-CE486E529176}.Debug|x86.Build.0 = Debug|x86 - {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|Any CPU.ActiveCfg = Release|x64 - {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|Any CPU.Build.0 = Release|x64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|arm64.ActiveCfg = Release|arm64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|arm64.Build.0 = Release|arm64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|x64.ActiveCfg = Release|x64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|x64.Build.0 = Release|x64 {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|x86.ActiveCfg = Release|x86 {F38A10BC-C93B-4D99-B079-CE486E529176}.Release|x86.Build.0 = Release|x86 - {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|Any CPU.ActiveCfg = Debug|x64 - {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|Any CPU.Build.0 = Debug|x64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|arm64.ActiveCfg = Debug|arm64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|arm64.Build.0 = Debug|arm64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|x64.ActiveCfg = Debug|x64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|x64.Build.0 = Debug|x64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|x86.ActiveCfg = Debug|x86 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Debug|x86.Build.0 = Debug|x86 - {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Release|Any CPU.ActiveCfg = Release|x64 - {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Release|Any CPU.Build.0 = Release|x64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Release|arm64.ActiveCfg = Release|arm64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Release|arm64.Build.0 = Release|arm64 {1ABAEFB2-B954-431A-9814-9EEDBD676C21}.Release|x64.ActiveCfg = Release|x64 diff --git a/HyperVExtension/ToolingVersions.props b/extensions/HyperVExtension/ToolingVersions.props similarity index 100% rename from HyperVExtension/ToolingVersions.props rename to extensions/HyperVExtension/ToolingVersions.props diff --git a/HyperVExtension/src/DevSetupAgent/DevAgentService.cs b/extensions/HyperVExtension/src/DevSetupAgent/DevAgentService.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/DevAgentService.cs rename to extensions/HyperVExtension/src/DevSetupAgent/DevAgentService.cs diff --git a/HyperVExtension/src/DevSetupAgent/DevSetupAgent.csproj b/extensions/HyperVExtension/src/DevSetupAgent/DevSetupAgent.csproj similarity index 83% rename from HyperVExtension/src/DevSetupAgent/DevSetupAgent.csproj rename to extensions/HyperVExtension/src/DevSetupAgent/DevSetupAgent.csproj index 7b184dcd53..5e9bebe632 100644 --- a/HyperVExtension/src/DevSetupAgent/DevSetupAgent.csproj +++ b/extensions/HyperVExtension/src/DevSetupAgent/DevSetupAgent.csproj @@ -11,6 +11,23 @@ true + + + win-x86 + + + + win-x64 + + + + win-arm64 + + + $(DefineConstants);CANARY_BUILD $(DefineConstants);STABLE_BUILD @@ -51,7 +68,7 @@ - + diff --git a/HyperVExtension/src/DevSetupAgent/Extensions/ApplyConfigurationResultExtensions.cs b/extensions/HyperVExtension/src/DevSetupAgent/Extensions/ApplyConfigurationResultExtensions.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Extensions/ApplyConfigurationResultExtensions.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Extensions/ApplyConfigurationResultExtensions.cs diff --git a/HyperVExtension/src/DevSetupAgent/HostRegistryChannel.cs b/extensions/HyperVExtension/src/DevSetupAgent/HostRegistryChannel.cs similarity index 86% rename from HyperVExtension/src/DevSetupAgent/HostRegistryChannel.cs rename to extensions/HyperVExtension/src/DevSetupAgent/HostRegistryChannel.cs index 11e8f8a076..be3e299a1b 100644 --- a/HyperVExtension/src/DevSetupAgent/HostRegistryChannel.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/HostRegistryChannel.cs @@ -15,7 +15,7 @@ namespace HyperVExtension.DevSetupAgent; /// https://learn.microsoft.com/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn798287(v=ws.11) /// "HKLM\SOFTWARE\Microsoft\Virtual Machine\External" contains data pushed to the guest from the host by a user /// "HKLM\SOFTWARE\Microsoft\Virtual Machine\Guest" contains data created on the guest. This data is available to the host as non-intrinsic data. -/// Host client will create registry value named "DevSetup{}~~" with JSON message as a string value. +/// Host client will create registry value named "DevSetup{}~~" with JSON message as a string value. /// The name of the registry value becomes "MessageId" and will be used for response so the client can match /// request with response. /// @@ -43,7 +43,7 @@ public HostRegistryChannel(IRegistryChannelSettings registryChannelSettings) // If running x86 version on x64 OS, we need to open 64-bit registry view. _registryHiveKey = RegistryKey.OpenBaseKey(registryChannelSettings.RegistryHive, RegistryView.Registry64); - // Search and delete all existing registry values with name "DevSetup{}" + // Search and delete all existing registry values with name "DevSetup{}" MessageHelper.DeleteAllMessages(_registryHiveKey, _toHostRegistryKeyPath, MessageHelper.MessageIdStart); MessageHelper.DeleteAllMessages(_registryHiveKey, _fromHostRegistryKeyPath, MessageHelper.MessageIdStart); @@ -66,7 +66,7 @@ public async Task WaitForMessageAsync(CancellationToken stoppin while (!stoppingToken.IsCancellationRequested) { requestMessage = TryReadMessage(); - if (!string.IsNullOrEmpty(requestMessage.RequestId)) + if (!string.IsNullOrEmpty(requestMessage.CommunicationId)) { break; } @@ -108,29 +108,29 @@ await Task.Run( foreach (var subString in responseMessage.ResponseData.SplitByLength(MaxValueCount)) { index++; - regKey.SetValue($"{responseMessage.ResponseId}{MessageHelper.Separator}{index}{totalStr}", subString, RegistryValueKind.String); + regKey.SetValue($"{responseMessage.CommunicationId}{MessageHelper.Separator}{index}{totalStr}", subString, RegistryValueKind.String); } } catch (Exception ex) { - _log.Error(ex, $"Could not write host message. Response ID: {responseMessage.ResponseId}"); + _log.Error(ex, $"Could not write host message. Response ID: {responseMessage.CommunicationId}"); } }, stoppingToken); } - public async void DeleteResponseMessageAsync(string responseId, CancellationToken stoppingToken) + public async void DeleteResponseMessageAsync(string communicationId, CancellationToken stoppingToken) { await Task.Run( () => { try { - MessageHelper.DeleteAllMessages(_registryHiveKey, _toHostRegistryKeyPath, responseId); + MessageHelper.DeleteAllMessages(_registryHiveKey, _toHostRegistryKeyPath, communicationId); } catch (Exception ex) { - _log.Error(ex, $"Could not delete host message. Response ID: {responseId}"); + _log.Error(ex, $"Could not delete host message. Response ID: {communicationId}"); } }, stoppingToken); @@ -143,7 +143,7 @@ private RequestMessage TryReadMessage() { // Messages are split in parts to workaround HyperV KVP service the 2048 bytes limit of registry value. // We need to merge all parts of the message before processing it. - // TODO: Modify this class to use MessageHelper.MergeMessageParts (requires changing return valu and handling in the caller). + // TODO: Modify this class to use MessageHelper.MergeMessageParts (requires changing return value and handling in the caller). HashSet ignoreMessages = new(); var regKey = _registryHiveKey.OpenSubKey(_fromHostRegistryKeyPath, true); var valueNames = regKey?.GetValueNames(); @@ -168,7 +168,7 @@ private RequestMessage TryReadMessage() var count = 0; foreach (var valueNameTmp in valueNames) { - if (valueNameTmp.StartsWith(s[0] + $"{MessageHelper.Separator}", StringComparison.InvariantCultureIgnoreCase)) + if (valueNameTmp.StartsWith($"{s[0]}{MessageHelper.Separator}", StringComparison.InvariantCultureIgnoreCase)) { if (!MessageHelper.IsValidMessageName(valueNameTmp.Split(MessageHelper.Separator), out var indeTmp, out var totalTmp)) { @@ -187,14 +187,14 @@ private RequestMessage TryReadMessage() } // Merge all parts of the message - // Preserve message GUID, delete the value and create response even if reading failed. - requestMessage.RequestId = s[0]; + // Preserve communication id ("DevSetup{}"), delete the value and create response even if reading failed. + requestMessage.CommunicationId = s[0]; try { var sb = new StringBuilder(); for (var i = 1; i <= total; i++) { - var value1 = (string?)regKey!.GetValue(s[0] + $"{MessageHelper.Separator}{i}{MessageHelper.Separator}{total}"); + var value1 = (string?)regKey!.GetValue($"{requestMessage.CommunicationId}{MessageHelper.Separator}{i}{MessageHelper.Separator}{total}"); if (value1 == null) { throw new InvalidOperationException($"Could not read guest message {valueName}"); @@ -210,7 +210,7 @@ private RequestMessage TryReadMessage() _log.Error(ex, $"Could not read host message {valueName}"); } - MessageHelper.DeleteAllMessages(_registryHiveKey, _fromHostRegistryKeyPath, s[0]); + MessageHelper.DeleteAllMessages(_registryHiveKey, _fromHostRegistryKeyPath, requestMessage.CommunicationId); break; } } diff --git a/HyperVExtension/src/DevSetupAgent/IHostChannel.cs b/extensions/HyperVExtension/src/DevSetupAgent/IHostChannel.cs similarity index 79% rename from HyperVExtension/src/DevSetupAgent/IHostChannel.cs rename to extensions/HyperVExtension/src/DevSetupAgent/IHostChannel.cs index 14d8f7c1fd..69ac20e453 100644 --- a/HyperVExtension/src/DevSetupAgent/IHostChannel.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/IHostChannel.cs @@ -12,5 +12,5 @@ public interface IHostChannel void SendMessageAsync(IResponseMessage responseMessage, CancellationToken stoppingToken); - void DeleteResponseMessageAsync(string responseId, CancellationToken stoppingToken); + void DeleteResponseMessageAsync(string communicationId, CancellationToken stoppingToken); } diff --git a/HyperVExtension/src/DevSetupAgent/IHostExtensions.cs b/extensions/HyperVExtension/src/DevSetupAgent/IHostExtensions.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/IHostExtensions.cs rename to extensions/HyperVExtension/src/DevSetupAgent/IHostExtensions.cs diff --git a/extensions/HyperVExtension/src/DevSetupAgent/IProgressHandler.cs b/extensions/HyperVExtension/src/DevSetupAgent/IProgressHandler.cs new file mode 100644 index 0000000000..cfd710fab8 --- /dev/null +++ b/extensions/HyperVExtension/src/DevSetupAgent/IProgressHandler.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.DevSetupAgent; + +/// +/// Interface to report request execution progress. +/// +public interface IProgressHandler +{ + public void Progress(IHostResponse progressResponse, CancellationToken stoppingToken); +} diff --git a/HyperVExtension/src/DevSetupAgent/IRegistryChannelSettings.cs b/extensions/HyperVExtension/src/DevSetupAgent/IRegistryChannelSettings.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/IRegistryChannelSettings.cs rename to extensions/HyperVExtension/src/DevSetupAgent/IRegistryChannelSettings.cs diff --git a/HyperVExtension/src/DevSetupAgent/IRequestManager.cs b/extensions/HyperVExtension/src/DevSetupAgent/IRequestManager.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/IRequestManager.cs rename to extensions/HyperVExtension/src/DevSetupAgent/IRequestManager.cs diff --git a/HyperVExtension/src/DevSetupAgent/Logging.cs b/extensions/HyperVExtension/src/DevSetupAgent/Logging.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Logging.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Logging.cs diff --git a/HyperVExtension/src/DevSetupAgent/NativeMethods.txt b/extensions/HyperVExtension/src/DevSetupAgent/NativeMethods.txt similarity index 100% rename from HyperVExtension/src/DevSetupAgent/NativeMethods.txt rename to extensions/HyperVExtension/src/DevSetupAgent/NativeMethods.txt diff --git a/HyperVExtension/src/DevSetupAgent/Program.cs b/extensions/HyperVExtension/src/DevSetupAgent/Program.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Program.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Program.cs diff --git a/extensions/HyperVExtension/src/DevSetupAgent/ProgressHandler.cs b/extensions/HyperVExtension/src/DevSetupAgent/ProgressHandler.cs new file mode 100644 index 0000000000..b8ab7f65dc --- /dev/null +++ b/extensions/HyperVExtension/src/DevSetupAgent/ProgressHandler.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.DevSetupAgent; + +/// +/// Helper progress handler class to report request execution progress. +/// +internal sealed class ProgressHandler : IProgressHandler +{ + private readonly IHostChannel _hostChannel; + private readonly string _communicationId; + private uint _progressCounter; + + public ProgressHandler(IHostChannel hostChannel, string communicationId) + { + _hostChannel = hostChannel; + _communicationId = communicationId; + } + + public void Progress(IHostResponse progressResponse, CancellationToken stoppingToken) + { + var progressCommunicationId = _communicationId + $"_Progress_{++_progressCounter}"; + var responseMessage = new ResponseMessage(progressCommunicationId, progressResponse.GetResponseData()); + _hostChannel.SendMessageAsync(responseMessage, stoppingToken); + } +} diff --git a/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-arm64.pubxml b/extensions/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-arm64.pubxml similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-arm64.pubxml rename to extensions/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-arm64.pubxml diff --git a/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x64.pubxml b/extensions/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x64.pubxml similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x64.pubxml rename to extensions/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x64.pubxml diff --git a/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x86.pubxml b/extensions/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x86.pubxml similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x86.pubxml rename to extensions/HyperVExtension/src/DevSetupAgent/Properties/PublishProfiles/win-x86.pubxml diff --git a/HyperVExtension/src/DevSetupAgent/Properties/launchSettings.json b/extensions/HyperVExtension/src/DevSetupAgent/Properties/launchSettings.json similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Properties/launchSettings.json rename to extensions/HyperVExtension/src/DevSetupAgent/Properties/launchSettings.json diff --git a/HyperVExtension/src/DevSetupAgent/RegistryChannelSettings.cs b/extensions/HyperVExtension/src/DevSetupAgent/RegistryChannelSettings.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/RegistryChannelSettings.cs rename to extensions/HyperVExtension/src/DevSetupAgent/RegistryChannelSettings.cs diff --git a/HyperVExtension/src/DevSetupAgent/RegistryWatcher.cs b/extensions/HyperVExtension/src/DevSetupAgent/RegistryWatcher.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/RegistryWatcher.cs rename to extensions/HyperVExtension/src/DevSetupAgent/RegistryWatcher.cs diff --git a/extensions/HyperVExtension/src/DevSetupAgent/RequestManager.cs b/extensions/HyperVExtension/src/DevSetupAgent/RequestManager.cs new file mode 100644 index 0000000000..7a7646806d --- /dev/null +++ b/extensions/HyperVExtension/src/DevSetupAgent/RequestManager.cs @@ -0,0 +1,128 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using HyperVExtension.HostGuestCommunication; +using Serilog; + +namespace HyperVExtension.DevSetupAgent; + +/// +/// Request manager responsible for processing request messages from host. +/// +public class RequestManager : IRequestManager +{ + private readonly Serilog.ILogger _log = Log.ForContext("SourceContext", nameof(RequestManager)); + private const uint MaxRequestQueueSize = 3; + private readonly IRequestFactory _requestFactory; + private readonly IHostChannel _hostChannel; + private readonly Queue<(string communicationId, IHostRequest request)> _requestQueue = new(); + private bool _asyncRequestRunning; + private string? _currentAsyncRequestCommunicationId; + private IHostRequest? _currentAsyncRequest; + + public RequestManager(IRequestFactory requestFactory, IHostChannel hostChannel) + { + _requestFactory = requestFactory; + _hostChannel = hostChannel; + } + + public void ProcessRequestMessage(IRequestMessage message, CancellationToken stoppingToken) + { + if (!string.IsNullOrEmpty(message.CommunicationId)) + { + var requestsInQueue = new List(); + + lock (_requestQueue) + { + // Get a snapshot of the current requests in the queue. + // _currentAsyncRequestCommunicationId is not in the waiting queue anymore, but it doesn't matter for the host. + // We'll report all requests that we have at the moment. By the time host will receive the response, the current requests + // could be finished. This is not intended to be super accurate, but to give host an idea of what's going on, so it can wait + // for an idle state before sending another request. + if (!string.IsNullOrEmpty(_currentAsyncRequestCommunicationId) && (_currentAsyncRequest != null)) + { + requestsInQueue.Add(new RequestsInQueue(_currentAsyncRequestCommunicationId, _currentAsyncRequest.RequestId)); + } + + requestsInQueue.AddRange(_requestQueue.Select(item => new RequestsInQueue(item.communicationId, item.request.RequestId)).ToList()); + } + + var requestContext = new RequestContext(message, _hostChannel, requestsInQueue); + var request = _requestFactory.CreateRequest(requestContext); + if (request.IsStatusRequest) + { + // Status requests (like GetVersion) execute immediately and return response. + var response = request.Execute(new ProgressHandler(_hostChannel, message.CommunicationId), stoppingToken); + if (response.SendResponse) + { + _hostChannel.SendMessageAsync(new ResponseMessage(message.CommunicationId, response.GetResponseData()), stoppingToken); + } + } + else + { + // Non-status request are queued and executed async in order one at a time. + int queueCount; + lock (_requestQueue) + { + queueCount = _requestQueue.Count; + } + + if (queueCount > MaxRequestQueueSize) + { + _log.Error($"Too many requests."); + var responseData = new TooManyRequestsResponse(request.RequestId).GetResponseData(); + _hostChannel.SendMessageAsync(new ResponseMessage(message.CommunicationId, responseData), stoppingToken); + return; + } + + lock (_requestQueue) + { + // TODO: send response indicating that request is queued. + _requestQueue.Enqueue((message.CommunicationId, request)); + if (!_asyncRequestRunning) + { + _asyncRequestRunning = true; + Task.Run(() => ProcessRequestQueue(stoppingToken), stoppingToken); + } + } + } + } + else + { + // Shouldn't happen, Log error + _log.Error($"Received empty message."); + } + } + + private void ProcessRequestQueue(CancellationToken stoppingToken) + { + while (true) + { + lock (_requestQueue) + { + if ((_requestQueue.Count == 0) || stoppingToken.IsCancellationRequested) + { + _asyncRequestRunning = false; + _currentAsyncRequestCommunicationId = null; + _currentAsyncRequest = null; + break; + } + + (_currentAsyncRequestCommunicationId, _currentAsyncRequest) = _requestQueue.Dequeue(); + } + + try + { + var response = _currentAsyncRequest.Execute( + new ProgressHandler(_hostChannel, _currentAsyncRequestCommunicationId), + stoppingToken); + + _hostChannel.SendMessageAsync(new ResponseMessage(_currentAsyncRequestCommunicationId, response.GetResponseData()), stoppingToken); + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to execute request."); + } + } + } +} diff --git a/HyperVExtension/src/DevSetupAgent/Requests/AckRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/AckRequest.cs similarity index 74% rename from HyperVExtension/src/DevSetupAgent/Requests/AckRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/AckRequest.cs index c2a086fc1c..99298b5242 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/AckRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/AckRequest.cs @@ -8,6 +8,8 @@ namespace HyperVExtension.DevSetupAgent; /// internal sealed class AckRequest : RequestBase { + public const string RequestTypeId = "Ack"; + public AckRequest(IRequestContext requestContext) : base(requestContext) { @@ -18,7 +20,7 @@ public AckRequest(IRequestContext requestContext) public override bool IsStatusRequest => true; - public override IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken) + public override IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) { Task.Run( () => @@ -27,6 +29,6 @@ public override IHostResponse Execute(ProgressHandler progressHandler, Cancellat }, stoppingToken); - return new AckResponse(RequestMessage.RequestId!); + return new AckResponse(RequestMessage.CommunicationId!); } } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/ConfigureRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ConfigureRequest.cs similarity index 80% rename from HyperVExtension/src/DevSetupAgent/Requests/ConfigureRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/ConfigureRequest.cs index f8d269618b..2d7d885d4f 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/ConfigureRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ConfigureRequest.cs @@ -21,15 +21,17 @@ namespace HyperVExtension.DevSetupAgent; /// internal sealed class ConfigureRequest : RequestBase { + public const string RequestTypeId = "Configure"; + public ConfigureRequest(IRequestContext requestContext) : base(requestContext) { - ConfigureData = GetRequiredStringValue("Configure").Replace("\\n", System.Environment.NewLine); + ConfigureData = GetRequiredStringValue("Configure").Replace("\\n", Environment.NewLine); } public string ConfigureData { get; } - public override IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken) + public override IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) { var devSetupEnginePtr = IntPtr.Zero; var devSetupEngine = default(IDevSetupEngine); @@ -50,14 +52,18 @@ public override IHostResponse Execute(ProgressHandler progressHandler, Cancellat operation.Progress = (operation, data) => { System.Diagnostics.Trace.WriteLine($" - Unit: {data.Unit.Type} [{data.UnitState}]"); - var progressResponse = new ProgressResponse(RequestMessage.RequestId!, data, ++progressCounter); - progressHandler(progressResponse, stoppingToken); + var progressResponse = new ProgressResponse(RequestId, data, ++progressCounter); + progressHandler.Progress(progressResponse, stoppingToken); }; operation.AsTask().Wait(stoppingToken); var result = operation.GetResults(); - return new ConfigureResponse(RequestMessage.RequestId!, result); + return new ConfigureResponse(RequestId, result); + } + catch (Exception ex) + { + return new ErrorResponse(RequestId, ex); } finally { diff --git a/HyperVExtension/src/DevSetupAgent/Requests/ErrorNoTypeRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorNoTypeRequest.cs similarity index 80% rename from HyperVExtension/src/DevSetupAgent/Requests/ErrorNoTypeRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorNoTypeRequest.cs index 05e83a12dc..9efc69e0bf 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/ErrorNoTypeRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorNoTypeRequest.cs @@ -15,7 +15,7 @@ public ErrorNoTypeRequest(IRequestMessage requestMessage) public override string RequestType => "ErrorNoType"; - public override IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken) + public override IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) { return new ErrorNoTypeResponse(RequestId); } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/ErrorRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorRequest.cs similarity index 81% rename from HyperVExtension/src/DevSetupAgent/Requests/ErrorRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorRequest.cs index 725f3dedf5..6398d85b60 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/ErrorRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorRequest.cs @@ -12,7 +12,7 @@ internal class ErrorRequest : IHostRequest public ErrorRequest(IRequestMessage requestMessage, Exception? ex = null) { Timestamp = DateTime.UtcNow; - RequestId = requestMessage.RequestId!; + RequestId = requestMessage.CommunicationId!; Error = ex; } @@ -26,7 +26,7 @@ public ErrorRequest(IRequestMessage requestMessage, Exception? ex = null) public DateTime Timestamp { get; } - public virtual IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken) + public virtual IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) { return new ErrorResponse(RequestId, Error); } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/ErrorUnsupportedRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorUnsupportedRequest.cs similarity index 79% rename from HyperVExtension/src/DevSetupAgent/Requests/ErrorUnsupportedRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorUnsupportedRequest.cs index 1807b18174..acc0b4731c 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/ErrorUnsupportedRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/ErrorUnsupportedRequest.cs @@ -15,7 +15,7 @@ public ErrorUnsupportedRequest(IRequestContext requestContext) public override bool IsStatusRequest => true; - public override IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken) + public override IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) { return new ErrorUnsupportedRequestResponse(RequestId, RequestType); } diff --git a/extensions/HyperVExtension/src/DevSetupAgent/Requests/GetStateRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/GetStateRequest.cs new file mode 100644 index 0000000000..c39759d7f1 --- /dev/null +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/GetStateRequest.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.DevSetupAgent; + +/// +/// Class used to handle request for service state (RequestType = GetState). +/// Returns the number of requests in the queue. +/// +internal sealed class GetStateRequest : RequestBase +{ + public const string RequestTypeId = "GetState"; + + public GetStateRequest(IRequestContext requestContext) + : base(requestContext) + { + } + + public override bool IsStatusRequest => true; + + public override IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) + { + return new GetStateResponse(RequestId, RequestContext.RequestsInQueue); + } +} diff --git a/HyperVExtension/src/DevSetupAgent/Requests/GetVersionRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/GetVersionRequest.cs similarity index 65% rename from HyperVExtension/src/DevSetupAgent/Requests/GetVersionRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/GetVersionRequest.cs index 1b9c255fcf..5296c9b8d9 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/GetVersionRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/GetVersionRequest.cs @@ -8,6 +8,8 @@ namespace HyperVExtension.DevSetupAgent; /// internal sealed class GetVersionRequest : RequestBase { + public const string RequestTypeId = "GetVersion"; + public GetVersionRequest(IRequestContext requestContext) : base(requestContext) { @@ -15,8 +17,8 @@ public GetVersionRequest(IRequestContext requestContext) public override bool IsStatusRequest => true; - public override IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken) + public override IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) { - return new GetVersionResponse(RequestMessage.RequestId!); + return new GetVersionResponse(RequestId); } } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/IHostRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IHostRequest.cs similarity index 65% rename from HyperVExtension/src/DevSetupAgent/Requests/IHostRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/IHostRequest.cs index d4d8f51db9..185fa5c2f4 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/IHostRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IHostRequest.cs @@ -3,8 +3,6 @@ namespace HyperVExtension.DevSetupAgent; -public delegate void ProgressHandler(IHostResponse progressResponse, CancellationToken stoppingToken); - /// /// Interface for handling requests from client (host machine). /// @@ -20,5 +18,5 @@ public interface IHostRequest DateTime Timestamp { get; } - IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken); + IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken); } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/IRequestContext.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestContext.cs similarity index 77% rename from HyperVExtension/src/DevSetupAgent/Requests/IRequestContext.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestContext.cs index 15fb38d81b..d4bc2dc1cf 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/IRequestContext.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestContext.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System.Text.Json.Nodes; +using HyperVExtension.HostGuestCommunication; namespace HyperVExtension.DevSetupAgent; @@ -15,4 +16,6 @@ public interface IRequestContext IHostChannel HostChannel { get; set; } JsonNode? JsonData { get; set; } + + List RequestsInQueue { get; set; } } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/IRequestFactory.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestFactory.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Requests/IRequestFactory.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestFactory.cs diff --git a/HyperVExtension/src/DevSetupAgent/Requests/IRequestMessage.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestMessage.cs similarity index 83% rename from HyperVExtension/src/DevSetupAgent/Requests/IRequestMessage.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestMessage.cs index 84af15f5e6..8eda76dda3 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/IRequestMessage.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IRequestMessage.cs @@ -8,7 +8,7 @@ namespace HyperVExtension.DevSetupAgent; /// public interface IRequestMessage { - string? RequestId { get; set; } + string? CommunicationId { get; set; } string? RequestData { get; set; } } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/IsUserLoggedInRequest.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IsUserLoggedInRequest.cs similarity index 92% rename from HyperVExtension/src/DevSetupAgent/Requests/IsUserLoggedInRequest.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/IsUserLoggedInRequest.cs index 7c5bb55c22..18bd80caab 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/IsUserLoggedInRequest.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/IsUserLoggedInRequest.cs @@ -15,6 +15,8 @@ namespace HyperVExtension.DevSetupAgent; /// internal sealed class IsUserLoggedInRequest : RequestBase { + public const string RequestTypeId = "IsUserLoggedIn"; + private static readonly Serilog.ILogger _log = Log.ForContext("SourceContext", nameof(IsUserLoggedInRequest)); public IsUserLoggedInRequest(IRequestContext requestContext) @@ -24,10 +26,10 @@ public IsUserLoggedInRequest(IRequestContext requestContext) public override bool IsStatusRequest => true; - public override IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken) + public override IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken) { var loggedInUsers = EnumerateLogonSessions(); - return new IsUserLoggedInResponse(RequestMessage.RequestId!, loggedInUsers); + return new IsUserLoggedInResponse(RequestId, loggedInUsers); } private static List EnumerateLogonSessions() diff --git a/HyperVExtension/src/DevSetupAgent/Requests/NtStatusException.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/NtStatusException.cs similarity index 84% rename from HyperVExtension/src/DevSetupAgent/Requests/NtStatusException.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/NtStatusException.cs index 896889db34..05a9ce4649 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/NtStatusException.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/NtStatusException.cs @@ -22,7 +22,7 @@ public NtStatusException(string? message, Exception? innerException) public NtStatusException(string? message, int ntStatus) : base(message) { - // NTStatus is not an HRESULT, but we will uonly use it to pass error back to the caller + // NTStatus is not an HRESULT, but we will only use it to pass error back to the caller // for diagnostic. Conversion to HRESULT can be done in more that one way and can be not 1 to 1 mapping anyway HResult = ntStatus; } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/RequestBase.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestBase.cs similarity index 92% rename from HyperVExtension/src/DevSetupAgent/Requests/RequestBase.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestBase.cs index aaab9e8681..7b3781d633 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/RequestBase.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestBase.cs @@ -38,7 +38,7 @@ public RequestBase(IRequestContext requestContext) public virtual DateTime Timestamp { get; } - public abstract IHostResponse Execute(ProgressHandler progressHandler, CancellationToken stoppingToken); + public abstract IHostResponse Execute(IProgressHandler progressHandler, CancellationToken stoppingToken); public IRequestMessage RequestMessage => RequestContext.RequestMessage; diff --git a/HyperVExtension/src/DevSetupAgent/Requests/RequestContext.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestContext.cs similarity index 61% rename from HyperVExtension/src/DevSetupAgent/Requests/RequestContext.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestContext.cs index a8bfc26524..32cbfb685b 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/RequestContext.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestContext.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System.Text.Json.Nodes; +using HyperVExtension.HostGuestCommunication; namespace HyperVExtension.DevSetupAgent; @@ -10,10 +11,14 @@ namespace HyperVExtension.DevSetupAgent; /// internal sealed class RequestContext : IRequestContext { - public RequestContext(IRequestMessage requestMessage, IHostChannel channel) + public RequestContext( + IRequestMessage requestMessage, + IHostChannel channel, + List requestsInQueue) { RequestMessage = requestMessage; HostChannel = channel; + RequestsInQueue = requestsInQueue; } public IRequestMessage RequestMessage @@ -30,4 +35,9 @@ public JsonNode? JsonData { get; set; } + + public List RequestsInQueue + { + get; set; + } } diff --git a/HyperVExtension/src/DevSetupAgent/Requests/RequestFactory.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestFactory.cs similarity index 71% rename from HyperVExtension/src/DevSetupAgent/Requests/RequestFactory.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestFactory.cs index bd15df8917..9fc50e69a6 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/RequestFactory.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestFactory.cs @@ -17,11 +17,11 @@ public class RequestFactory : IRequestFactory private static readonly Dictionary _requestFactories = new() { - // TODO: Define request type constants in one place - { "GetVersion", (requestContext) => new GetVersionRequest(requestContext) }, - { "Configure", (requestContext) => new ConfigureRequest(requestContext) }, - { "Ack", (requestContext) => new AckRequest(requestContext) }, - { "IsUserLoggedIn", (requestContext) => new IsUserLoggedInRequest(requestContext) }, + { GetVersionRequest.RequestTypeId, (requestContext) => new GetVersionRequest(requestContext) }, + { GetStateRequest.RequestTypeId, (requestContext) => new GetStateRequest(requestContext) }, + { ConfigureRequest.RequestTypeId, (requestContext) => new ConfigureRequest(requestContext) }, + { AckRequest.RequestTypeId, (requestContext) => new AckRequest(requestContext) }, + { IsUserLoggedInRequest.RequestTypeId, (requestContext) => new IsUserLoggedInRequest(requestContext) }, }; public RequestFactory() @@ -35,14 +35,14 @@ public IHostRequest CreateRequest(IRequestContext requestContext) { if (!string.IsNullOrEmpty(requestContext.RequestMessage.RequestData)) { - _log.Information($"Received message: ID: '{requestContext.RequestMessage.RequestId}' Data: '{requestContext.RequestMessage.RequestData}'"); + _log.Information($"Received message: ID: '{requestContext.RequestMessage.CommunicationId}' Data: '{requestContext.RequestMessage.RequestData}'"); var requestJson = JsonNode.Parse(requestContext.RequestMessage.RequestData); var requestType = (string?)requestJson?["RequestType"]; if (requestType != null) { + requestContext.JsonData = requestJson!; if (_requestFactories.TryGetValue(requestType, out var createRequest)) { - requestContext.JsonData = requestJson!; return createRequest(requestContext); } else @@ -56,13 +56,13 @@ public IHostRequest CreateRequest(IRequestContext requestContext) else { // We have message id but no data, log error. Send error response. - _log.Information($"Received message with empty data: ID: {requestContext.RequestMessage.RequestId}"); + _log.Information($"Received message with empty data: ID: {requestContext.RequestMessage.CommunicationId}"); return new ErrorRequest(requestContext.RequestMessage); } } catch (Exception ex) { - var messageId = requestContext.RequestMessage.RequestId ?? ""; + var messageId = requestContext.RequestMessage.CommunicationId ?? ""; var requestData = requestContext.RequestMessage.RequestData ?? ""; _log.Error(ex, $"Error processing message. Message ID: {messageId}. Request data: {requestData}"); return new ErrorRequest(requestContext.RequestMessage); diff --git a/HyperVExtension/src/DevSetupAgent/Requests/RequestMessage.cs b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestMessage.cs similarity index 81% rename from HyperVExtension/src/DevSetupAgent/Requests/RequestMessage.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestMessage.cs index 938d735ef9..e4a4d4d081 100644 --- a/HyperVExtension/src/DevSetupAgent/Requests/RequestMessage.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Requests/RequestMessage.cs @@ -8,7 +8,7 @@ namespace HyperVExtension.DevSetupAgent; /// internal struct RequestMessage : IRequestMessage { - public string? RequestId { get; set; } + public string? CommunicationId { get; set; } public string? RequestData { get; set; } } diff --git a/HyperVExtension/src/DevSetupAgent/Responses/AckResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/AckResponse.cs similarity index 87% rename from HyperVExtension/src/DevSetupAgent/Responses/AckResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/AckResponse.cs index 4e75fe9aca..57f2a66dae 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/AckResponse.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/AckResponse.cs @@ -11,7 +11,7 @@ namespace HyperVExtension.DevSetupAgent; internal sealed class AckResponse : ResponseBase { public AckResponse(string requestId) - : base(requestId, "Ack") + : base(requestId, AckRequest.RequestTypeId) { SendResponse = false; } diff --git a/HyperVExtension/src/DevSetupAgent/Responses/ConfigureResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ConfigureResponse.cs similarity index 83% rename from HyperVExtension/src/DevSetupAgent/Responses/ConfigureResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/ConfigureResponse.cs index 3843f17585..609d05cf33 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/ConfigureResponse.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ConfigureResponse.cs @@ -58,12 +58,19 @@ internal sealed class ConfigureResponse : ResponseBase private readonly ApplyConfigurationResult _applyConfigurationResult; public ConfigureResponse(string requestId, IApplyConfigurationResult applyConfigurationResult) - : base(requestId, "Configure") + : base(requestId, ConfigureRequest.RequestTypeId) { _applyConfigurationResult = new ApplyConfigurationResult().Populate(applyConfigurationResult); GenerateJsonData(); } + public ConfigureResponse(string requestId, int resultCode, string? resultDescription = null) + : base(requestId, ConfigureRequest.RequestTypeId) + { + _applyConfigurationResult = new ApplyConfigurationResult(resultCode, resultDescription); + GenerateJsonData(); + } + protected override void GenerateJsonData() { base.GenerateJsonData(); diff --git a/HyperVExtension/src/DevSetupAgent/Responses/ErrorNoTypeResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ErrorNoTypeResponse.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Responses/ErrorNoTypeResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/ErrorNoTypeResponse.cs diff --git a/HyperVExtension/src/DevSetupAgent/Responses/ErrorResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ErrorResponse.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Responses/ErrorResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/ErrorResponse.cs diff --git a/HyperVExtension/src/DevSetupAgent/Responses/ErrorUnsupportedRequestResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ErrorUnsupportedRequestResponse.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Responses/ErrorUnsupportedRequestResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/ErrorUnsupportedRequestResponse.cs diff --git a/extensions/HyperVExtension/src/DevSetupAgent/Responses/GetStateResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/GetStateResponse.cs new file mode 100644 index 0000000000..55fa0d9601 --- /dev/null +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/GetStateResponse.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Text.Json; +using HyperVExtension.HostGuestCommunication; + +namespace HyperVExtension.DevSetupAgent; + +/// +/// Class to generate response to GetState request. +/// Output IDs of requests that are in queue to let client know if VM is busy processing previous requests. +/// +internal sealed class GetStateResponse : ResponseBase +{ + public GetStateResponse(string requestId, List requestsInQueue) + : base(requestId, GetStateRequest.RequestTypeId) + { + StateData = new StateData(requestsInQueue); + GenerateJsonData(); + } + + public StateData StateData { get; private set; } + + protected override void GenerateJsonData() + { + base.GenerateJsonData(); + + var stateData = JsonSerializer.Serialize(StateData); + JsonData![nameof(StateData)] = stateData; + } +} diff --git a/HyperVExtension/src/DevSetupAgent/Responses/GetVersionResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/GetVersionResponse.cs similarity index 81% rename from HyperVExtension/src/DevSetupAgent/Responses/GetVersionResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/GetVersionResponse.cs index 002de1ee37..72548fa6f0 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/GetVersionResponse.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/GetVersionResponse.cs @@ -9,9 +9,8 @@ namespace HyperVExtension.DevSetupAgent; internal sealed class GetVersionResponse : ResponseBase { public GetVersionResponse(string requestId) - : base(requestId) + : base(requestId, GetVersionRequest.RequestTypeId) { - RequestType = "GetVersion"; GenerateJsonData(); } } diff --git a/HyperVExtension/src/DevSetupAgent/Responses/IHostResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/IHostResponse.cs similarity index 88% rename from HyperVExtension/src/DevSetupAgent/Responses/IHostResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/IHostResponse.cs index dd27742c1b..ee24b39805 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/IHostResponse.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/IHostResponse.cs @@ -24,7 +24,7 @@ public interface IHostResponse DateTime Timestamp { get; set; } - IResponseMessage GetResponseMessage(); + string GetResponseData(); bool SendResponse { get; set; } } diff --git a/HyperVExtension/src/DevSetupAgent/Responses/IResponseMessage.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/IResponseMessage.cs similarity index 83% rename from HyperVExtension/src/DevSetupAgent/Responses/IResponseMessage.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/IResponseMessage.cs index 595bf5ed55..3a53a17767 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/IResponseMessage.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/IResponseMessage.cs @@ -8,7 +8,7 @@ namespace HyperVExtension.DevSetupAgent; /// public interface IResponseMessage { - string ResponseId { get; set; } + string CommunicationId { get; set; } string ResponseData { get; set; } } diff --git a/HyperVExtension/src/DevSetupAgent/Responses/IsUserLoggedInResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/IsUserLoggedInResponse.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Responses/IsUserLoggedInResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/IsUserLoggedInResponse.cs diff --git a/HyperVExtension/src/DevSetupAgent/Responses/ProgressResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ProgressResponse.cs similarity index 93% rename from HyperVExtension/src/DevSetupAgent/Responses/ProgressResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/ProgressResponse.cs index 63ee212e65..2beeb104e0 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/ProgressResponse.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ProgressResponse.cs @@ -25,7 +25,7 @@ internal sealed class ProgressResponse : ResponseBase private uint ProgressCounter { get; } public ProgressResponse(string requestId, IConfigurationSetChangeData progressData, uint progressCounter) - : base(requestId, "Configure") + : base(requestId, ConfigureRequest.RequestTypeId) { _progressData = new ConfigurationSetChangeData().Populate(progressData); ProgressCounter = progressCounter; diff --git a/HyperVExtension/src/DevSetupAgent/Responses/ResponseBase.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ResponseBase.cs similarity index 91% rename from HyperVExtension/src/DevSetupAgent/Responses/ResponseBase.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/ResponseBase.cs index 4e38dcf77b..efba97af4d 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/ResponseBase.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ResponseBase.cs @@ -47,14 +47,14 @@ public ResponseBase(string requestId, string? requestType = null) public virtual DateTime Timestamp { get; set; } - public virtual IResponseMessage GetResponseMessage() + public virtual string GetResponseData() { if (JsonData == null) { GenerateJsonData(); } - return new ResponseMessage(ResponseId, JsonData!.ToJsonString()); + return JsonData!.ToJsonString(); } public virtual bool SendResponse { get; set; } diff --git a/HyperVExtension/src/DevSetupAgent/Responses/ResponseMessage.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ResponseMessage.cs similarity index 78% rename from HyperVExtension/src/DevSetupAgent/Responses/ResponseMessage.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/ResponseMessage.cs index b42ae4a077..c283174e95 100644 --- a/HyperVExtension/src/DevSetupAgent/Responses/ResponseMessage.cs +++ b/extensions/HyperVExtension/src/DevSetupAgent/Responses/ResponseMessage.cs @@ -10,11 +10,11 @@ internal struct ResponseMessage : IResponseMessage { public ResponseMessage(string requestId, string responseData) { - ResponseId = requestId; + CommunicationId = requestId; ResponseData = responseData; } - public string ResponseId { get; set; } + public string CommunicationId { get; set; } public string ResponseData { get; set; } } diff --git a/HyperVExtension/src/DevSetupAgent/Responses/TooManyRequestsResponse.cs b/extensions/HyperVExtension/src/DevSetupAgent/Responses/TooManyRequestsResponse.cs similarity index 100% rename from HyperVExtension/src/DevSetupAgent/Responses/TooManyRequestsResponse.cs rename to extensions/HyperVExtension/src/DevSetupAgent/Responses/TooManyRequestsResponse.cs diff --git a/HyperVExtension/src/DevSetupAgent/appsettings_hypervsetupagent.json b/extensions/HyperVExtension/src/DevSetupAgent/appsettings_hypervsetupagent.json similarity index 100% rename from HyperVExtension/src/DevSetupAgent/appsettings_hypervsetupagent.json rename to extensions/HyperVExtension/src/DevSetupAgent/appsettings_hypervsetupagent.json diff --git a/HyperVExtension/src/DevSetupEngine/ApplyConfigurationProgressWatcher.cs b/extensions/HyperVExtension/src/DevSetupEngine/ApplyConfigurationProgressWatcher.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/ApplyConfigurationProgressWatcher.cs rename to extensions/HyperVExtension/src/DevSetupEngine/ApplyConfigurationProgressWatcher.cs diff --git a/HyperVExtension/src/DevSetupEngine/ApplyConfigurationResult.cs b/extensions/HyperVExtension/src/DevSetupEngine/ApplyConfigurationResult.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/ApplyConfigurationResult.cs rename to extensions/HyperVExtension/src/DevSetupEngine/ApplyConfigurationResult.cs diff --git a/HyperVExtension/src/DevSetupEngine/ComServer.cs b/extensions/HyperVExtension/src/DevSetupEngine/ComServer.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/ComServer.cs rename to extensions/HyperVExtension/src/DevSetupEngine/ComServer.cs diff --git a/HyperVExtension/src/DevSetupEngine/ConfigurationFileHelper.cs b/extensions/HyperVExtension/src/DevSetupEngine/ConfigurationFileHelper.cs similarity index 72% rename from HyperVExtension/src/DevSetupEngine/ConfigurationFileHelper.cs rename to extensions/HyperVExtension/src/DevSetupEngine/ConfigurationFileHelper.cs index c8885f2d4c..244a60ec55 100644 --- a/HyperVExtension/src/DevSetupEngine/ConfigurationFileHelper.cs +++ b/extensions/HyperVExtension/src/DevSetupEngine/ConfigurationFileHelper.cs @@ -21,6 +21,7 @@ public class ConfigurationFileHelper private readonly ILogger _log = Log.ForContext("SourceContext", nameof(ConfigurationFileHelper)); private const string PowerShellHandlerIdentifier = "pwsh"; + private const string PowerShellHandlerIdentifierWithSecurityContext = "{73fea39f-6f4a-41c9-ba94-6fd14d633e40}"; public class ApplicationResult { @@ -43,30 +44,42 @@ public ApplicationResult(WinGet.ApplyConfigurationSetResult result) private WinGet.ConfigurationProcessor? _processor; private WinGet.ConfigurationSet? _configSet; + private PackageVersion _appInstallerVersion = new(0, 0, 0, 0); public ConfigurationFileHelper() { } - private static async Task InstallOrUpdateAppInstallerIfNeeded(IProgress progress) + private static PackageVersion GetAppInstallerVersion() { - const string AppInstallerPackageName = "Microsoft.DesktopAppInstaller"; const string AppInstallerPackageFamilyName = "Microsoft.DesktopAppInstaller_8wekyb3d8bbwe"; - const string AppInstallerStoreId = "9NBLGGH4NNS1"; - var doInstall = false; Windows.Management.Deployment.PackageManager packageManager = new(); var currentInstallerPackage = packageManager.FindPackagesForUser(string.Empty, AppInstallerPackageFamilyName).FirstOrDefault(); if (currentInstallerPackage == null) + { + return new PackageVersion(0, 0, 0, 0); + } + + return currentInstallerPackage.Id.Version; + } + + private async Task InstallOrUpdateAppInstallerIfNeeded(IProgress progress) + { + const string AppInstallerPackageName = "Microsoft.DesktopAppInstaller"; + const string AppInstallerPackageFamilyName = "Microsoft.DesktopAppInstaller_8wekyb3d8bbwe"; + const string AppInstallerStoreId = "9NBLGGH4NNS1"; + + var doInstall = false; + _appInstallerVersion = GetAppInstallerVersion(); + + if (_appInstallerVersion == new PackageVersion(0, 0, 0, 0)) { doInstall = true; } - else + else if (!IsAppInstallerUpdateNeeded(_appInstallerVersion)) { - if (!IsAppInstallerUpdateNeeded(currentInstallerPackage)) - { - return; - } + return; } AppInstallManager installManager = new(); @@ -77,10 +90,12 @@ private static async Task InstallOrUpdateAppInstallerIfNeeded(IProgress completedHandler = (sender, args) => { - configurationSetChangeData = GetConfigurationSetChangeData(AppInstallerPackageName, DevSetupEngineTypes.ConfigurationUnitState.Completed); - progressWatcher.Report(configurationSetChangeData); cancellationToken.Cancel(); + _log.Information($"Completed {AppInstallerPackageName} update."); }; + var lastStatusReportTime = DateTime.MinValue; TypedEventHandler statusChangedHandler = (sender, args) => { - configurationSetChangeData = GetConfigurationSetChangeData(AppInstallerPackageName, DevSetupEngineTypes.ConfigurationUnitState.InProgress); - progressWatcher.Report(configurationSetChangeData); + try + { + var installStatus = installItem.GetCurrentStatus(); + _log.Information(GetInstallStatusDescription(installStatus)); + + // AppInstallManager can report progress too often (for example reporting downloading progress every few percents), + // so we limit the frequency of progress reports not more often than once per minute. + if ((DateTime.Now - lastStatusReportTime) > TimeSpan.FromMinutes(1)) + { + lastStatusReportTime = DateTime.Now; + configurationSetChangeData = GetConfigurationSetChangeData(AppInstallerPackageName, DevSetupEngineTypes.ConfigurationUnitState.InProgress); + progressWatcher.Report(configurationSetChangeData); + } + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to report {AppInstallerPackageName} update progress"); + } }; try @@ -110,40 +141,41 @@ private static async Task InstallOrUpdateAppInstallerIfNeeded(IProgress(); foreach (var unitResult in result.UnitResults) @@ -323,43 +365,16 @@ private IInputStream StringToStream(string str) /// /// Check if the App Installer needs to be updated. /// - /// Microsoft.DesktopAppInstaller package + /// Package version /// true if current Microsoft.DesktopAppInstaller package version is less than 1.22.10661.0 - private static bool IsAppInstallerUpdateNeeded(Package currentInstallerPackage) + private static bool IsAppInstallerUpdateNeeded(PackageVersion currentInstallerPackageVersion) { - var packageVersion = currentInstallerPackage.Id.Version; - const int minMajor = 1; - const int minMinor = 22; - const int minBuild = 10661; - - if (packageVersion.Major > minMajor) - { - return false; - } - else if (packageVersion.Major < minMajor) - { - return true; - } - - if (packageVersion.Minor > minMinor) - { - return false; - } - else if (packageVersion.Minor < minMinor) - { - return true; - } - - if (packageVersion.Build > minBuild) - { - return false; - } - else if (packageVersion.Build < minBuild) - { - return true; - } + return currentInstallerPackageVersion.LessThan(1, 22, 10661, 0); + } - return false; + private static bool IsSecurityContextSupported(PackageVersion currentInstallerPackageVersion) + { + return !currentInstallerPackageVersion.LessThan(1, 23, 1174, 0); } private static ConfigurationResultTypes.ConfigurationSetChangeData GetConfigurationSetChangeData(string identifier, DevSetupEngineTypes.ConfigurationUnitState unitState, string description = "") @@ -387,7 +402,6 @@ private static ConfigurationResultTypes.ConfigurationSetChangeData GetConfigurat configurationUnit); } -#if DEBUG private static string GetInstallStatusDescription(AppInstallStatus installStatus) { switch (installStatus.InstallState) @@ -424,5 +438,4 @@ private static string GetInstallStatusDescription(AppInstallStatus installStatus return "Status: Unknown"; } } -#endif } diff --git a/HyperVExtension/src/DevSetupEngine/DevSetupEngine.csproj b/extensions/HyperVExtension/src/DevSetupEngine/DevSetupEngine.csproj similarity index 84% rename from HyperVExtension/src/DevSetupEngine/DevSetupEngine.csproj rename to extensions/HyperVExtension/src/DevSetupEngine/DevSetupEngine.csproj index 6256e07c5f..aeb6868887 100644 --- a/HyperVExtension/src/DevSetupEngine/DevSetupEngine.csproj +++ b/extensions/HyperVExtension/src/DevSetupEngine/DevSetupEngine.csproj @@ -22,6 +22,22 @@ true + + + win-x86 + + + + win-x64 + + + + win-arm64 + + $(DefineConstants);CANARY_BUILD $(DefineConstants);STABLE_BUILD diff --git a/HyperVExtension/src/DevSetupEngine/DevSetupEngineClassFactory.cs b/extensions/HyperVExtension/src/DevSetupEngine/DevSetupEngineClassFactory.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/DevSetupEngineClassFactory.cs rename to extensions/HyperVExtension/src/DevSetupEngine/DevSetupEngineClassFactory.cs diff --git a/HyperVExtension/src/DevSetupEngine/DevSetupEngineImpl.cs b/extensions/HyperVExtension/src/DevSetupEngine/DevSetupEngineImpl.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/DevSetupEngineImpl.cs rename to extensions/HyperVExtension/src/DevSetupEngine/DevSetupEngineImpl.cs diff --git a/HyperVExtension/src/DevSetupEngine/IHostExtensions.cs b/extensions/HyperVExtension/src/DevSetupEngine/IHostExtensions.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/IHostExtensions.cs rename to extensions/HyperVExtension/src/DevSetupEngine/IHostExtensions.cs diff --git a/HyperVExtension/src/DevSetupEngine/Logging.cs b/extensions/HyperVExtension/src/DevSetupEngine/Logging.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/Logging.cs rename to extensions/HyperVExtension/src/DevSetupEngine/Logging.cs diff --git a/HyperVExtension/src/DevSetupEngine/NativeMethods.txt b/extensions/HyperVExtension/src/DevSetupEngine/NativeMethods.txt similarity index 100% rename from HyperVExtension/src/DevSetupEngine/NativeMethods.txt rename to extensions/HyperVExtension/src/DevSetupEngine/NativeMethods.txt diff --git a/HyperVExtension/src/DevSetupEngine/OpenConfigurationSetException.cs b/extensions/HyperVExtension/src/DevSetupEngine/OpenConfigurationSetException.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/OpenConfigurationSetException.cs rename to extensions/HyperVExtension/src/DevSetupEngine/OpenConfigurationSetException.cs diff --git a/HyperVExtension/src/DevSetupEngine/PackageOperationException.cs b/extensions/HyperVExtension/src/DevSetupEngine/PackageOperationException.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/PackageOperationException.cs rename to extensions/HyperVExtension/src/DevSetupEngine/PackageOperationException.cs diff --git a/extensions/HyperVExtension/src/DevSetupEngine/PackageVersionExtensions.cs b/extensions/HyperVExtension/src/DevSetupEngine/PackageVersionExtensions.cs new file mode 100644 index 0000000000..f713a09b81 --- /dev/null +++ b/extensions/HyperVExtension/src/DevSetupEngine/PackageVersionExtensions.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Windows.ApplicationModel; + +namespace HyperVExtension.DevSetupEngine; + +public static class PackageVersionExtensions +{ + public static bool LessThan(this PackageVersion version, ushort major, ushort minor, ushort build, ushort revision) + { + return LessThan(version, new PackageVersion(major, minor, build, revision)); + } + + public static bool LessThan(this PackageVersion version, PackageVersion other) + { + if (version.Major > other.Major) + { + return false; + } + else if (version.Major < other.Major) + { + return true; + } + + if (version.Minor > other.Minor) + { + return false; + } + else if (version.Minor < other.Minor) + { + return true; + } + + if (version.Build > other.Build) + { + return false; + } + else if (version.Build < other.Build) + { + return true; + } + + if (version.Revision >= other.Revision) + { + return false; + } + + return true; + } +} diff --git a/HyperVExtension/src/DevSetupEngine/Program.cs b/extensions/HyperVExtension/src/DevSetupEngine/Program.cs similarity index 100% rename from HyperVExtension/src/DevSetupEngine/Program.cs rename to extensions/HyperVExtension/src/DevSetupEngine/Program.cs diff --git a/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-arm64.pubxml b/extensions/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-arm64.pubxml similarity index 100% rename from HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-arm64.pubxml rename to extensions/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-arm64.pubxml diff --git a/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x64.pubxml b/extensions/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x64.pubxml similarity index 100% rename from HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x64.pubxml rename to extensions/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x64.pubxml diff --git a/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x86.pubxml b/extensions/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x86.pubxml similarity index 100% rename from HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x86.pubxml rename to extensions/HyperVExtension/src/DevSetupEngine/Properties/PublishProfiles/win-x86.pubxml diff --git a/HyperVExtension/src/DevSetupEngine/Properties/launchSettings.json b/extensions/HyperVExtension/src/DevSetupEngine/Properties/launchSettings.json similarity index 100% rename from HyperVExtension/src/DevSetupEngine/Properties/launchSettings.json rename to extensions/HyperVExtension/src/DevSetupEngine/Properties/launchSettings.json diff --git a/HyperVExtension/src/DevSetupEngine/appsettings_hypervsetup.json b/extensions/HyperVExtension/src/DevSetupEngine/appsettings_hypervsetup.json similarity index 100% rename from HyperVExtension/src/DevSetupEngine/appsettings_hypervsetup.json rename to extensions/HyperVExtension/src/DevSetupEngine/appsettings_hypervsetup.json diff --git a/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.filters b/extensions/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.filters similarity index 100% rename from HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.filters rename to extensions/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.filters diff --git a/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.vcxproj b/extensions/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.vcxproj similarity index 78% rename from HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.vcxproj rename to extensions/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.vcxproj index b021d874f9..2b01279a1d 100644 --- a/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.vcxproj +++ b/extensions/HyperVExtension/src/DevSetupEngineIdl/DevSetupEngineIdl.vcxproj @@ -1,6 +1,6 @@ - + true @@ -149,16 +149,13 @@ - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - + + \ No newline at end of file diff --git a/HyperVExtension/src/DevSetupEngineIdl/Microsoft.Windows.DevHome.DevSetupEngine.idl b/extensions/HyperVExtension/src/DevSetupEngineIdl/Microsoft.Windows.DevHome.DevSetupEngine.idl similarity index 100% rename from HyperVExtension/src/DevSetupEngineIdl/Microsoft.Windows.DevHome.DevSetupEngine.idl rename to extensions/HyperVExtension/src/DevSetupEngineIdl/Microsoft.Windows.DevHome.DevSetupEngine.idl diff --git a/HyperVExtension/src/DevSetupEngineIdl/packages.config b/extensions/HyperVExtension/src/DevSetupEngineIdl/packages.config similarity index 58% rename from HyperVExtension/src/DevSetupEngineIdl/packages.config rename to extensions/HyperVExtension/src/DevSetupEngineIdl/packages.config index 0b78db595c..0d39ebe771 100644 --- a/HyperVExtension/src/DevSetupEngineIdl/packages.config +++ b/extensions/HyperVExtension/src/DevSetupEngineIdl/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/HyperVExtension/src/DevSetupEngineProjection/DevSetupEngineProjection.csproj b/extensions/HyperVExtension/src/DevSetupEngineProjection/DevSetupEngineProjection.csproj similarity index 81% rename from HyperVExtension/src/DevSetupEngineProjection/DevSetupEngineProjection.csproj rename to extensions/HyperVExtension/src/DevSetupEngineProjection/DevSetupEngineProjection.csproj index b0e491b69f..b610826fdf 100644 --- a/HyperVExtension/src/DevSetupEngineProjection/DevSetupEngineProjection.csproj +++ b/extensions/HyperVExtension/src/DevSetupEngineProjection/DevSetupEngineProjection.csproj @@ -1,8 +1,6 @@  - - None x86;x64;arm64 @@ -10,7 +8,7 @@ - + @@ -31,7 +29,7 @@ Microsoft.Windows.DevHome.DevSetupEngine - $(SolutionDir)HyperVExtension\src\$(MSBuildProjectName)\bin\$(Platform)\$(Configuration)\ + $(SolutionDir)extensions\HyperVExtension\src\$(MSBuildProjectName)\bin\$(Platform)\$(Configuration)\ diff --git a/HyperVExtension/src/HyperVExtension.Common/Extensions/IHostExtensions.cs b/extensions/HyperVExtension/src/HyperVExtension.Common/Extensions/IHostExtensions.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.Common/Extensions/IHostExtensions.cs rename to extensions/HyperVExtension/src/HyperVExtension.Common/Extensions/IHostExtensions.cs diff --git a/HyperVExtension/src/HyperVExtension.Common/Extensions/ResourceExtensions.cs b/extensions/HyperVExtension/src/HyperVExtension.Common/Extensions/ResourceExtensions.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.Common/Extensions/ResourceExtensions.cs rename to extensions/HyperVExtension/src/HyperVExtension.Common/Extensions/ResourceExtensions.cs diff --git a/HyperVExtension/src/HyperVExtension.Common/Extensions/ServiceExtensions.cs b/extensions/HyperVExtension/src/HyperVExtension.Common/Extensions/ServiceExtensions.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.Common/Extensions/ServiceExtensions.cs rename to extensions/HyperVExtension/src/HyperVExtension.Common/Extensions/ServiceExtensions.cs diff --git a/HyperVExtension/src/HyperVExtension.Common/HyperVExtension.Common.csproj b/extensions/HyperVExtension/src/HyperVExtension.Common/HyperVExtension.Common.csproj similarity index 100% rename from HyperVExtension/src/HyperVExtension.Common/HyperVExtension.Common.csproj rename to extensions/HyperVExtension/src/HyperVExtension.Common/HyperVExtension.Common.csproj diff --git a/HyperVExtension/src/HyperVExtension.Common/Services/IStringResource.cs b/extensions/HyperVExtension/src/HyperVExtension.Common/Services/IStringResource.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.Common/Services/IStringResource.cs rename to extensions/HyperVExtension/src/HyperVExtension.Common/Services/IStringResource.cs diff --git a/HyperVExtension/src/HyperVExtension.Common/Services/StringResource.cs b/extensions/HyperVExtension/src/HyperVExtension.Common/Services/StringResource.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.Common/Services/StringResource.cs rename to extensions/HyperVExtension/src/HyperVExtension.Common/Services/StringResource.cs diff --git a/HyperVExtension/src/HyperVExtension.HostGuestCommunication/ApplyConfigurationResult.cs b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/ApplyConfigurationResult.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.HostGuestCommunication/ApplyConfigurationResult.cs rename to extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/ApplyConfigurationResult.cs diff --git a/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Extensions/StringExtensions.cs b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Extensions/StringExtensions.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.HostGuestCommunication/Extensions/StringExtensions.cs rename to extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Extensions/StringExtensions.cs diff --git a/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HResultException.cs b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HResultException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension.HostGuestCommunication/HResultException.cs rename to extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HResultException.cs diff --git a/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HyperVExtension.HostGuestCommunication.csproj b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HyperVExtension.HostGuestCommunication.csproj similarity index 82% rename from HyperVExtension/src/HyperVExtension.HostGuestCommunication/HyperVExtension.HostGuestCommunication.csproj rename to extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HyperVExtension.HostGuestCommunication.csproj index d59ecbc4c1..3c98d93a24 100644 --- a/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HyperVExtension.HostGuestCommunication.csproj +++ b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/HyperVExtension.HostGuestCommunication.csproj @@ -9,10 +9,13 @@ - - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - + diff --git a/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Providers/MessageHelper.cs b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Providers/MessageHelper.cs similarity index 63% rename from HyperVExtension/src/HyperVExtension.HostGuestCommunication/Providers/MessageHelper.cs rename to extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Providers/MessageHelper.cs index 6d8401907c..2fdafbf8ac 100644 --- a/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Providers/MessageHelper.cs +++ b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/Providers/MessageHelper.cs @@ -1,7 +1,9 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System.Globalization; using System.Text; +using System.Xml.Linq; using Microsoft.Win32; using Serilog; @@ -16,11 +18,13 @@ namespace HyperVExtension.HostGuestCommunication; public static class MessageHelper { public const char Separator = '~'; - public const string MessageIdStart = "DevSetup{"; + public const string DevSetupPrefix = "DevSetup"; + public const string MessageIdStart = DevSetupPrefix + "{"; + private static readonly char[] CommunicationIdSeparators = { '{', '}' }; public static bool IsValidMessageName(string[]? message, out int index, out int total) { - // Number of parts separated by '-' DevSetup{}-- + // Number of parts separated by '-' DevSetup{}-- const int ValueNamePartsCount = 3; index = 0; total = 0; @@ -42,22 +46,37 @@ public static bool IsValidMessageName(string[]? message, out int index, out int return true; } + private sealed class EqualityComparer : IEqualityComparer<(string name, int number)> + { + public bool Equals((string name, int number) x, (string name, int number) y) + { + return (x.number == y.number) && x.name.Equals(y.name, StringComparison.OrdinalIgnoreCase); + } + + public int GetHashCode((string name, int number) value) + { + return value.name.GetHashCode(StringComparison.OrdinalIgnoreCase) ^ value.number.GetHashCode(); + } + } + public static Dictionary MergeMessageParts(Dictionary messageParts) { - var messages = new Dictionary(); - var guestMessages = new Dictionary(); - var valueNames = messageParts.Keys.Where(k => k.StartsWith(MessageHelper.MessageIdStart, StringComparison.OrdinalIgnoreCase)).ToList(); - HashSet ignoreMessages = new(); + var messages = new Dictionary(StringComparer.OrdinalIgnoreCase); + var valueNames = messageParts.Keys.Where(k => k.StartsWith(MessageIdStart, StringComparison.OrdinalIgnoreCase)).ToList(); + HashSet<(string, int)> ignoreMessages = new(new EqualityComparer()); foreach (var valueName in valueNames) { var s = valueName.Split(Separator); - if (!MessageHelper.IsValidMessageName(s, out var index, out var total)) + if (!IsValidMessageName(s, out var index, out var total)) { continue; } - if (ignoreMessages.Contains(s[0])) + // Use communication id (DevSetup{}) and total number of message parts as a key to ignore messages + // with the same id, but different total number of parts. This potentially could happen if we have stale messages + // that were not cleaned up properly (say, the app crashed). + if (ignoreMessages.Contains((s[0], total))) { continue; } @@ -68,19 +87,22 @@ public static Dictionary MergeMessageParts(Dictionary MergeMessageParts(Dictionary GetRegistryMessageKvp(RegistryKey regKey) { - var messageParts = new Dictionary(); + var messageParts = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var valueName in regKey.GetValueNames()) { if (!valueName.StartsWith(MessageIdStart, StringComparison.OrdinalIgnoreCase)) @@ -160,4 +182,21 @@ public static void DeleteAllMessages(RegistryKey registryKey, string registryKey } } } + + /// + /// Extract number from communication id ("DevSetup{}"). + /// + /// + /// + /// Incorrect format of communication id + public static uint GetCounterFromCommunicationId(string communicationId) + { + var parts = communicationId.Split(CommunicationIdSeparators); + if (parts.Length != 2) + { + throw new ArgumentException("Invalid communication id"); + } + + return uint.Parse(parts[1], CultureInfo.InvariantCulture); + } } diff --git a/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/RequestsInQueue.cs b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/RequestsInQueue.cs new file mode 100644 index 0000000000..160aa45de7 --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/RequestsInQueue.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.HostGuestCommunication; + +public class RequestsInQueue +{ + public RequestsInQueue(string communicationId, string requestId) + { + CommunicationId = communicationId; + RequestId = requestId; + } + + public string CommunicationId { get; set; } + + public string RequestId { get; set; } +} diff --git a/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/StateData.cs b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/StateData.cs new file mode 100644 index 0000000000..07aad22e29 --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension.HostGuestCommunication/StateData.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.HostGuestCommunication; + +// Helper class to return DevSetupAgent state to the client. +public class StateData +{ + public StateData(List requestsInQueue) + { + RequestsInQueue = requestsInQueue; + } + + public List RequestsInQueue { get; private set; } +} diff --git a/HyperVExtension/src/HyperVExtension/Assets/hyper-v-provider-icon.png b/extensions/HyperVExtension/src/HyperVExtension/Assets/hyper-v-provider-icon.png similarity index 100% rename from HyperVExtension/src/HyperVExtension/Assets/hyper-v-provider-icon.png rename to extensions/HyperVExtension/src/HyperVExtension/Assets/hyper-v-provider-icon.png diff --git a/extensions/HyperVExtension/src/HyperVExtension/Assets/hyper-v-windows-default-image.jpg b/extensions/HyperVExtension/src/HyperVExtension/Assets/hyper-v-windows-default-image.jpg new file mode 100644 index 0000000000..086ae8f588 Binary files /dev/null and b/extensions/HyperVExtension/src/HyperVExtension/Assets/hyper-v-windows-default-image.jpg differ diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/ApplyConfigurationOperation.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/ApplyConfigurationOperation.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/ApplyConfigurationOperation.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/ApplyConfigurationOperation.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpChannel.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpChannel.cs similarity index 60% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpChannel.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpChannel.cs index ead246a52e..65c90294c5 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpChannel.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpChannel.cs @@ -6,6 +6,7 @@ using System.Xml.XPath; using HyperVExtension.HostGuestCommunication; using Serilog; +using Windows.Devices.Sms; namespace HyperVExtension.CommunicationWithGuest; @@ -25,6 +26,7 @@ internal sealed class GuestKvpChannel : IDisposable private readonly ManagementObject _virtualSystemService; private readonly ManagementScope _scope; private readonly ManagementObject _vmWmi; + private readonly List _kvpNamesToCleanup = []; private bool _disposed; public GuestKvpChannel(Guid vmId) @@ -35,7 +37,7 @@ public GuestKvpChannel(Guid vmId) _vmWmi = WmiUtility.GetTargetComputer(_vmId, _scope); } - public void SendMessage(IRequestMessage requestMessage, CancellationToken stoppingToken) + public void SendMessage(IRequestMessage requestMessage, uint communicationIdCounter, CancellationToken stoppingToken) { // Check if message is too large and split into multiple parts. var numberOfParts = requestMessage.RequestData.Length / MaxValueCount; @@ -44,16 +46,36 @@ public void SendMessage(IRequestMessage requestMessage, CancellationToken stoppi numberOfParts++; } - var totalStr = $"{MessageHelper.Separator}{numberOfParts}"; + var kvpNameStart = $"{MessageHelper.DevSetupPrefix}{{{communicationIdCounter}}}{MessageHelper.Separator}"; + var kvpNameEnd = $"{MessageHelper.Separator}{numberOfParts}"; + + // Try to remove all parts of the message first just in case if previous communication session was + // abruptly terminates and we got old messages not removed. + for (var i = 0; i < numberOfParts; i++) + { + RemoveKvpItem($"{kvpNameStart}{i}{kvpNameEnd}"); + } + + if (stoppingToken.IsCancellationRequested) + { + return; + } + var index = 0; foreach (var subString in requestMessage.RequestData.SplitByLength(MaxValueCount)) { index++; - SendMessage(requestMessage.RequestId + $"{MessageHelper.Separator}{index}" + totalStr, subString, stoppingToken); + var kvpName = $"{kvpNameStart}{index}{kvpNameEnd}"; + lock (_kvpNamesToCleanup) + { + _kvpNamesToCleanup.Add(kvpName); + } + + AddKvpItem(kvpName, subString); } } - private void SendMessage(string name, string value, CancellationToken stoppingToken) + private void AddKvpItem(string name, string value) { using ManagementClass kvpExchangeDataItem = new ManagementClass(_scope, new ManagementPath("Msvm_KvpExchangeDataItem"), null); using ManagementObject dataItem = kvpExchangeDataItem.CreateInstance(); @@ -88,13 +110,60 @@ private void SendMessage(string name, string value, CancellationToken stoppingTo } } - public List WaitForResponseMessages(string responseId, TimeSpan timeout, bool expectProgressResponse, CancellationToken stoppingToken) + /// + /// Delete Hyper-V KVP message from the VM. + /// Best effort. Log error if failed, but don't throw. + /// + /// Hyper-V KVP name. + private void RemoveKvpItem(string name) + { + try + { + using ManagementClass kvpExchangeDataItem = new ManagementClass(_scope, new ManagementPath("Msvm_KvpExchangeDataItem"), null); + using ManagementObject dataItem = kvpExchangeDataItem.CreateInstance(); + dataItem["Data"] = string.Empty; + dataItem["Name"] = name; + dataItem["Source"] = 0; + + var dataItems = new string[1]; + dataItems[0] = dataItem.GetText(TextFormat.CimDtd20); + + using ManagementBaseObject inParams = _virtualSystemService.GetMethodParameters("RemoveKvpItems"); + inParams["TargetSystem"] = _vmWmi.Path.Path; + inParams["DataItems"] = dataItems; + + using ManagementBaseObject outParams = _virtualSystemService.InvokeMethod("RemoveKvpItems", inParams, null); + if ((uint)outParams["ReturnValue"] == (uint)WmiUtility.ReturnCode.Started) + { + uint errorCode; + string errorDescription; + if (!WmiUtility.JobCompleted(outParams, _scope, out errorCode, out errorDescription)) + { + throw new System.ComponentModel.Win32Exception((int)errorCode, $"Cannot delete message from VM '{_vmId.ToString("D")}': '{errorDescription}'."); + } + } + else if ((uint)outParams["ReturnValue"] != (uint)WmiUtility.ReturnCode.Completed) + { + throw new System.ComponentModel.Win32Exception((int)outParams["ReturnValue"], $"Cannot delete message from VM '{_vmId.ToString("D")}': '{outParams["ReturnValue"]}'."); + } + else + { + _log.Information($"Deleted message from '{_vmId.ToString("D")}' VM. Message ID: '{name}'."); + } + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to delete message from '{_vmId.ToString("D")}' VM. Message ID: '{name}'."); + } + } + + public List WaitForResponseMessages(string communicationId, TimeSpan timeout, bool expectProgressResponse, CancellationToken stoppingToken) { var waitTime = TimeSpan.FromMilliseconds(500); var waitTimeLeft = timeout; while ((waitTimeLeft > TimeSpan.Zero) && !stoppingToken.IsCancellationRequested) { - var messages = TryReadResponseMessages(responseId, expectProgressResponse, stoppingToken); + var messages = TryReadResponseMessages(communicationId, expectProgressResponse, stoppingToken); if (messages.Count > 0) { return messages; @@ -107,16 +176,16 @@ public List WaitForResponseMessages(string responseId, TimeSpa return new List(); } - private List TryReadResponseMessages(string responseId, bool expectProgressResponse, CancellationToken stoppingToken) + private List TryReadResponseMessages(string communicationId, bool expectProgressResponse, CancellationToken stoppingToken) { var guestKvps = ReadGuestKvps(); var result = new List(); - guestKvps.TryGetValue(responseId, out var responseData); + guestKvps.TryGetValue(communicationId, out var responseData); IResponseMessage? progressResponse = null; if (responseData != null) { - progressResponse = new ResponseMessage(responseId, responseData); + progressResponse = new ResponseMessage(communicationId, responseData); } if (!expectProgressResponse) @@ -130,7 +199,7 @@ private List TryReadResponseMessages(string responseId, bool e { // Find all progress message in "_Progress_" // Then sort them by sequence number and add to the result list. - var progressResponseId = $"{responseId}_Progress_"; + var progressResponseId = $"{communicationId}_Progress_"; var kvps = guestKvps.Where(kvp => kvp.Key.StartsWith(progressResponseId, StringComparison.OrdinalIgnoreCase)); var orderedResponses = new Dictionary>(); foreach (var kvp in kvps) @@ -174,7 +243,7 @@ private Dictionary ReadGuestKvps() private Dictionary ReadRawGuestKvps() { - Dictionary guestKvps = new Dictionary(); + Dictionary guestKvps = new Dictionary(StringComparer.OrdinalIgnoreCase); using var collection = _vmWmi.GetRelated("Msvm_KvpExchangeComponent"); foreach (ManagementObject kvpExchangeComponent in collection) @@ -201,6 +270,40 @@ private Dictionary ReadRawGuestKvps() return guestKvps; } + public void CleanUp() + { + lock (_kvpNamesToCleanup) + { + foreach (var kvpName in _kvpNamesToCleanup) + { + RemoveKvpItem(kvpName); + } + + _kvpNamesToCleanup.Clear(); + } + } + + public void CleanUp(string communicationId) + { + lock (_kvpNamesToCleanup) + { + List kvpNamesToDelete = []; + foreach (var kvpName in _kvpNamesToCleanup) + { + if (kvpName.StartsWith(communicationId, StringComparison.OrdinalIgnoreCase)) + { + kvpNamesToDelete.Add(kvpName); + RemoveKvpItem(kvpName); + } + } + + foreach (var kvpName in kvpNamesToDelete) + { + _kvpNamesToCleanup.Remove(kvpName); + } + } + } + public void Dispose() { Dispose(true); @@ -213,6 +316,7 @@ private void Dispose(bool disposing) { if (disposing) { + CleanUp(); _vmWmi?.Dispose(); _virtualSystemService?.Dispose(); } diff --git a/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpSession.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpSession.cs new file mode 100644 index 0000000000..00f72f1a74 --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/GuestKvpSession.cs @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Text.Json.Nodes; +using HyperVExtension.HostGuestCommunication; + +namespace HyperVExtension.CommunicationWithGuest; + +/// +/// Class to translate request/response objects to/from messages and pass them to/from channel to guest VM.. +/// +internal sealed class GuestKvpSession : IDisposable +{ + private static uint _nextCommunicationIdCounter = 1; + private readonly Guid _vmId; + private readonly GuestKvpChannel _channel; + private readonly ResponseFactory _responseFactory = new(); + private HashSet _processedMessages = new(StringComparer.OrdinalIgnoreCase); + private bool _disposed; + + public GuestKvpSession(Guid vmId) + { + _vmId = vmId; + _channel = new GuestKvpChannel(vmId); + } + + public uint SendRequest(IHostRequest request, CancellationToken stoppingToken) + { + var communicationIdCounter = _nextCommunicationIdCounter++; + _channel.SendMessage(request.GetRequestMessage(), communicationIdCounter, stoppingToken); + return communicationIdCounter; + } + + public List WaitForResponse(uint communicationIdCounter, string requestId, TimeSpan timeout, bool expectProgressResponse, CancellationToken stoppingToken) + { + var communicationId = $"{MessageHelper.DevSetupPrefix}{{{communicationIdCounter}}}"; + var result = new List(); + var responseMessages = _channel.WaitForResponseMessages(communicationId, timeout, expectProgressResponse, stoppingToken); + + // There is no way for host to remove messages from guest kvp. So, we need to keep track of processed messages. + // If we find that we received the same message as in previous call of this method, we will ignore it. + // Host will send "AckRequest" to let guest know that it can remove the message from kvp. + var newProcessedMessages = new HashSet(StringComparer.OrdinalIgnoreCase); + + foreach (var responseMessage in responseMessages) + { + if (!_processedMessages.Contains(responseMessage.CommunicationId)) + { + var response = _responseFactory.CreateResponse(responseMessage); + if (requestId.Equals(response.RequestId, StringComparison.OrdinalIgnoreCase)) + { + newProcessedMessages.Add(responseMessage.CommunicationId); + + result.Add(response); + _channel.SendMessage(new AckRequest(responseMessage.CommunicationId).GetRequestMessage(), _nextCommunicationIdCounter++, stoppingToken); + + // We've received response to request with communicationId, so we can remove kvp entries for + // this communicationId as they've been processed on Hyper-V side. + _channel.CleanUp(communicationId); + } + } + else + { + // We've already processed this message in previous call of this method, but it was not deleted yet + // on Hyper-V side, so keep it in processed messages list. + newProcessedMessages.Add(responseMessage.CommunicationId); + } + } + + _processedMessages = newProcessedMessages; + return result; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!_disposed) + { + if (disposing) + { + _channel?.Dispose(); + } + + _disposed = true; + } + } + + internal void SetNextCommunicationIdCounter(uint communicationIdCounter) + { + if (communicationIdCounter > _nextCommunicationIdCounter) + { + _nextCommunicationIdCounter = communicationIdCounter; + } + } +} diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/AckRequest.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/AckRequest.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/AckRequest.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/AckRequest.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/ConfigureRequest.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/ConfigureRequest.cs similarity index 85% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/ConfigureRequest.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/ConfigureRequest.cs index 5979aa9d36..e7df829b50 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/ConfigureRequest.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/ConfigureRequest.cs @@ -8,10 +8,12 @@ namespace HyperVExtension.CommunicationWithGuest; /// internal sealed class ConfigureRequest : RequestBase { + public const string RequestTypeId = "Configure"; + private readonly string _configureYaml; public ConfigureRequest(string configureYaml) - : base("Configure") + : base(RequestTypeId) { _configureYaml = configureYaml; GenerateJsonData(); diff --git a/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetStateRequest.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetStateRequest.cs new file mode 100644 index 0000000000..406fdca61c --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetStateRequest.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.CommunicationWithGuest; + +/// +/// Class to generate GetState request. +/// +internal sealed class GetStateRequest : RequestBase +{ + public const string RequestTypeId = "GetState"; + + public GetStateRequest() + : base(RequestTypeId) + { + GenerateJsonData(); + } +} diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetVersionRequest.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetVersionRequest.cs similarity index 66% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetVersionRequest.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetVersionRequest.cs index 361a6aa0b1..5f93b6ff0e 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetVersionRequest.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/GetVersionRequest.cs @@ -4,12 +4,14 @@ namespace HyperVExtension.CommunicationWithGuest; /// -/// Class to generate response to GetVersion request. +/// Class to generate GetVersion request. /// internal sealed class GetVersionRequest : RequestBase { + public const string RequestTypeId = "GetVersion"; + public GetVersionRequest() - : base("GetVersion") + : base(RequestTypeId) { GenerateJsonData(); } diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IHostRequest.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IHostRequest.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IHostRequest.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IHostRequest.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IRequestMessage.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IRequestMessage.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IRequestMessage.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IRequestMessage.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IsUserLoggedInRequest.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IsUserLoggedInRequest.cs similarity index 75% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IsUserLoggedInRequest.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IsUserLoggedInRequest.cs index 488c37d2d1..891829c5d6 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IsUserLoggedInRequest.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/IsUserLoggedInRequest.cs @@ -8,8 +8,10 @@ namespace HyperVExtension.CommunicationWithGuest; /// internal sealed class IsUserLoggedInRequest : RequestBase { + public const string RequestTypeId = "IsUserLoggedIn"; + public IsUserLoggedInRequest() - : base("IsUserLoggedIn") + : base(RequestTypeId) { GenerateJsonData(); } diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestBase.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestBase.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestBase.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestBase.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestMessage.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestMessage.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestMessage.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Requests/RequestMessage.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureProgressResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureProgressResponse.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureProgressResponse.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureProgressResponse.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureResponse.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureResponse.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ConfigureResponse.cs diff --git a/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorNoTypeResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorNoTypeResponse.cs new file mode 100644 index 0000000000..2bfcc914c1 --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorNoTypeResponse.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.CommunicationWithGuest; + +/// +/// Class that represents a broken response from Hyper-V with request or response type. +/// This should only happen in case of a programming error that we'd need to investigate. +/// +internal sealed class ErrorNoTypeResponse : ErrorResponse +{ + public ErrorNoTypeResponse(IResponseMessage? responseMessage) + : base(responseMessage) + { + if ((responseMessage != null) && (responseMessage.ResponseData != null)) + { + ErrorDescription = $"Missing Response or Request type. Response data: '{responseMessage.ResponseData}'"; + } + else + { + ErrorDescription = $"Missing Response or Request type."; + } + } +} diff --git a/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorResponse.cs new file mode 100644 index 0000000000..0d4e884548 --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorResponse.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.CommunicationWithGuest; + +/// +/// Class used to handle invalid responses (for example an exception while parsing request JSON). +/// This should only happen in case of a programming error that we'd need to investigate. +/// +internal class ErrorResponse : IGuestResponse +{ + public ErrorResponse(IResponseMessage? responseMessage) + { + Timestamp = DateTime.UtcNow; + if ((responseMessage != null) && (responseMessage.ResponseData != null)) + { + ErrorDescription = $"Missing response data. Response data: '{responseMessage.ResponseData}'"; + } + else + { + ErrorDescription = $"Missing response data."; + } + } + + public string RequestId { get; set; } = ""; + + public string RequestType { get; set; } = ""; + + public string ResponseId { get; set; } = ""; + + public string ResponseType { get; set; } = ""; + + public uint Status { get; set; } = 0x80004005; // E_FAIL + + public string ErrorDescription { get; set; } + + public uint Version { get; set; } = 1; + + public DateTime Timestamp { get; set; } +} diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorUnsupportedResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorUnsupportedResponse.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorUnsupportedResponse.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ErrorUnsupportedResponse.cs diff --git a/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/GetStateResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/GetStateResponse.cs new file mode 100644 index 0000000000..208a84ba44 --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/GetStateResponse.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Text.Json.Nodes; +using HyperVExtension.HostGuestCommunication; + +namespace HyperVExtension.CommunicationWithGuest; + +/// +/// Class used to handle response for service state (RequestType = GetState). +/// +internal sealed class GetStateResponse : ResponseBase +{ + public GetStateResponse(IResponseMessage responseMessage, JsonNode jsonData) + : base(responseMessage, jsonData) + { + StateData = GetRequiredValue(nameof(StateData)); + } + + public StateData StateData { get; } +} diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/GetVersionResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/GetVersionResponse.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/GetVersionResponse.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/GetVersionResponse.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IGuestResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IGuestResponse.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IGuestResponse.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IGuestResponse.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseFactory.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseFactory.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseFactory.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseFactory.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseMessage.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseMessage.cs similarity index 83% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseMessage.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseMessage.cs index 1ab2f53cc2..dc492a0a8e 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseMessage.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IResponseMessage.cs @@ -8,7 +8,7 @@ namespace HyperVExtension.CommunicationWithGuest; /// public interface IResponseMessage { - string ResponseId { get; set; } + string CommunicationId { get; set; } string ResponseData { get; set; } } diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IsUserLoggedInResponse.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IsUserLoggedInResponse.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IsUserLoggedInResponse.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/IsUserLoggedInResponse.cs diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseBase.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseBase.cs similarity index 80% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseBase.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseBase.cs index 240f0dd5ee..30062735c3 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseBase.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseBase.cs @@ -1,7 +1,9 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System.Text.Json; using System.Text.Json.Nodes; +using HyperVExtension.HostGuestCommunication; namespace HyperVExtension.CommunicationWithGuest; @@ -112,4 +114,23 @@ protected bool GetRequiredBoolValue(string valueName) throw new ArgumentException($"{valueName} cannot be empty.", ex); } } + + protected T GetRequiredValue(string nodeName) + { + // Calling JsonSerializer.Deserialize directly on JasonNode fails (why?), but deserializing + // from the original string works. + var node = (string?)JsonData[nodeName]; + if (node == null) + { + throw new JsonException($"Missing {nodeName} in JSON data."); + } + + var result = JsonSerializer.Deserialize(node); + if (result == null) + { + throw new JsonException($"Failed to deserialize {nodeName} from JSON data."); + } + + return result; + } } diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseFactory.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseFactory.cs similarity index 59% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseFactory.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseFactory.cs index 0a0a4fd6e8..a3fae4ff47 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseFactory.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseFactory.cs @@ -18,10 +18,11 @@ public class ResponseFactory : IResponseFactory private static readonly Dictionary<(string, string), CreateRequestDelegate> _responseFactories = new() { // TODO: Define request type constants in one place - { ("Completed", "GetVersion"), (message, json) => new GetVersionResponse(message, json) }, - { ("Completed", "Configure"), (message, json) => new ConfigureResponse(message, json) }, - { ("Progress", "Configure"), (message, json) => new ConfigureProgressResponse(message, json) }, - { ("Completed", "IsUserLoggedIn"), (message, json) => new IsUserLoggedInResponse(message, json) }, + { ("Completed", GetVersionRequest.RequestTypeId), (message, json) => new GetVersionResponse(message, json) }, + { ("Completed", GetStateRequest.RequestTypeId), (message, json) => new GetStateResponse(message, json) }, + { ("Completed", ConfigureRequest.RequestTypeId), (message, json) => new ConfigureResponse(message, json) }, + { ("Progress", ConfigureRequest.RequestTypeId), (message, json) => new ConfigureProgressResponse(message, json) }, + { ("Completed", IsUserLoggedInRequest.RequestTypeId), (message, json) => new IsUserLoggedInResponse(message, json) }, }; public ResponseFactory() @@ -35,7 +36,7 @@ public IGuestResponse CreateResponse(IResponseMessage message) { if (!string.IsNullOrEmpty(message.ResponseData)) { - _log.Information($"Received message: ID: '{message.ResponseId}' Data: '{message.ResponseData}'"); + _log.Information($"Received message: ID: '{message.CommunicationId}' Data: '{message.ResponseData}'"); var responseJson = JsonNode.Parse(message.ResponseData); var responseType = (string?)responseJson?["ResponseType"]; var requestType = (string?)responseJson?["RequestType"]; @@ -43,8 +44,15 @@ public IGuestResponse CreateResponse(IResponseMessage message) { if (_responseFactories.TryGetValue((responseType!, requestType!), out var createResponse)) { - // TODO: Try/catch error. - return createResponse(message, responseJson!); + try + { + return createResponse(message, responseJson!); + } + catch (Exception ex) + { + _log.Error(ex, $"Received unsupported message ID: '{message.CommunicationId}', Message: '{message.ResponseData}'"); + return new ErrorUnsupportedResponse(message, responseJson!); + } } else { @@ -52,19 +60,19 @@ public IGuestResponse CreateResponse(IResponseMessage message) } } - _log.Information($"Received message with empty Response or Request type: ID: '{message.ResponseId}', Message: '{message.ResponseData}'"); + _log.Error($"Received message with empty Response or Request type: ID: '{message.CommunicationId}', Message: '{message.ResponseData}'"); return new ErrorNoTypeResponse(message); } else { // We have message id but no data, log error. Send error response. - _log.Information($"Received message with empty data: ID: {message.ResponseId}"); + _log.Error($"Received message with empty data: ID: {message.CommunicationId}"); return new ErrorResponse(message); } } catch (Exception ex) { - var messageId = message?.ResponseId ?? ""; + var messageId = message?.CommunicationId ?? ""; var responseData = message?.ResponseData ?? ""; _log.Error(ex, $"Error processing message. Message ID: {messageId}. Request data: {responseData}"); return new ErrorResponse(message!); diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseMessage.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseMessage.cs similarity index 64% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseMessage.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseMessage.cs index 1fc019e3f7..c4325d9444 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseMessage.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/Responses/ResponseMessage.cs @@ -8,13 +8,13 @@ namespace HyperVExtension.CommunicationWithGuest; /// internal struct ResponseMessage : IResponseMessage { - public ResponseMessage(string requestId, string responseData) + public ResponseMessage(string communicationId, string responseData) { - ResponseId = requestId; + CommunicationId = communicationId; ResponseData = responseData; } - public string ResponseId { get; set; } + public string CommunicationId { get; set; } public string ResponseData { get; set; } } diff --git a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/WmiUtility.cs b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/WmiUtility.cs similarity index 64% rename from HyperVExtension/src/HyperVExtension/CommunicationWithGuest/WmiUtility.cs rename to extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/WmiUtility.cs index 20c34ebe13..53d187ddcf 100644 --- a/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/WmiUtility.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/CommunicationWithGuest/WmiUtility.cs @@ -1,14 +1,28 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System.Globalization; using System.Management; +using Microsoft.Management.Infrastructure; using Serilog; using Windows.Win32.Foundation; namespace HyperVExtension.CommunicationWithGuest; +// States based on InstallState value in Win32_OptionalFeature +// See: https://learn.microsoft.com/windows/win32/cimwin32prov/win32-optionalfeature +public enum FeatureAvailabilityKind : uint +{ + Enabled, + Disabled, + Absent, + Unknown, +} + internal sealed class WmiUtility { + private static readonly ILogger _log = Log.ForContext("SourceContext", nameof(WmiUtility)); + public enum ReturnCode : uint { Completed = 0, @@ -124,4 +138,47 @@ public static bool JobCompleted(ManagementBaseObject outParams, ManagementScope return jobCompleted; } + + public static FeatureAvailabilityKind GetHyperVFeatureAvailability() + { + try + { + var searcher = new ManagementObjectSearcher($"SELECT InstallState FROM Win32_OptionalFeature WHERE Name = 'Microsoft-Hyper-V'"); + var collection = searcher.Get(); + + foreach (var instance in collection) + { + if (instance?.GetPropertyValue("InstallState") is uint enablementState) + { + var featureAvailability = GetAvailabilityKindFromState(enablementState); + + _log.Information($"Found Hyper-V feature with enablement state: '{featureAvailability}'"); + return featureAvailability; + } + } + } + catch (Exception ex) + { + // We'll handle cases where there are exceptions as if the feature does not exist. + _log.Error(ex, $"Error attempting to get the Hyper-V feature state"); + } + + _log.Information($"Unable to find Hyper-V feature"); + return FeatureAvailabilityKind.Unknown; + } + + private static FeatureAvailabilityKind GetAvailabilityKindFromState(uint state) + { + switch (state) + { + case 1: + return FeatureAvailabilityKind.Enabled; + case 2: + return FeatureAvailabilityKind.Disabled; + case 3: + return FeatureAvailabilityKind.Absent; + default: + return FeatureAvailabilityKind.Unknown; + } + } } diff --git a/HyperVExtension/src/HyperVExtension/Constants.cs b/extensions/HyperVExtension/src/HyperVExtension/Constants.cs similarity index 94% rename from HyperVExtension/src/HyperVExtension/Constants.cs rename to extensions/HyperVExtension/src/HyperVExtension/Constants.cs index 378dbe17c3..86771b8fcd 100644 --- a/HyperVExtension/src/HyperVExtension/Constants.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Constants.cs @@ -24,4 +24,6 @@ internal sealed class Constants #endif public const string ExtensionIconInternal = "ms-appx:///HyperVExtension/Assets/hyper-v-provider-icon.png"; + + public const string HyperVTemplatesSubPath = @"HyperVExtension\Templates"; } diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/AdaptiveCardInvalidActionException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/AdaptiveCardInvalidActionException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/AdaptiveCardInvalidActionException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/AdaptiveCardInvalidActionException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/ComputeSystemOperationException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/ComputeSystemOperationException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/ComputeSystemOperationException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/ComputeSystemOperationException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationCancelledException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationCancelledException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationCancelledException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationCancelledException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationFailedException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationFailedException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationFailedException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/DownloadOperationFailedException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/HyperVAdminGroupException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVAdminGroupException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/HyperVAdminGroupException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVAdminGroupException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/HyperVManagerException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVManagerException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/HyperVManagerException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVManagerException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/HyperVModuleNotLoadedException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVModuleNotLoadedException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/HyperVModuleNotLoadedException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVModuleNotLoadedException.cs diff --git a/extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVPrerequisiteFailedException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVPrerequisiteFailedException.cs new file mode 100644 index 0000000000..3481de962c --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVPrerequisiteFailedException.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace HyperVExtension.Exceptions; + +public class HyperVPrerequisiteFailedException : Exception +{ + public HyperVPrerequisiteFailedException(string message) + : base(message) + { + } +} diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/HyperVVirtualMachineManagementException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVVirtualMachineManagementException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/HyperVVirtualMachineManagementException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/HyperVVirtualMachineManagementException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/NoVMImagesAvailableException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/NoVMImagesAvailableException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/NoVMImagesAvailableException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/NoVMImagesAvailableException.cs diff --git a/HyperVExtension/src/HyperVExtension/Exceptions/OperationInProgressException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/OperationInProgressException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Exceptions/OperationInProgressException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Exceptions/OperationInProgressException.cs diff --git a/extensions/HyperVExtension/src/HyperVExtension/Exceptions/VirtualMachineManagementServiceException.cs b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/VirtualMachineManagementServiceException.cs new file mode 100644 index 0000000000..a9f3ad1720 --- /dev/null +++ b/extensions/HyperVExtension/src/HyperVExtension/Exceptions/VirtualMachineManagementServiceException.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HyperVExtension.Exceptions; + +public class VirtualMachineManagementServiceException : Exception +{ + public VirtualMachineManagementServiceException(string message, Exception innerException) + : base(message, innerException) + { + } +} diff --git a/HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentException.cs b/extensions/HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentException.cs diff --git a/HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentSessionException.cs b/extensions/HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentSessionException.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentSessionException.cs rename to extensions/HyperVExtension/src/HyperVExtension/Extensions/DevSetupAgentDeploymentSessionException.cs diff --git a/HyperVExtension/src/HyperVExtension/Extensions/ServiceExtensions.cs b/extensions/HyperVExtension/src/HyperVExtension/Extensions/ServiceExtensions.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Extensions/ServiceExtensions.cs rename to extensions/HyperVExtension/src/HyperVExtension/Extensions/ServiceExtensions.cs diff --git a/HyperVExtension/src/HyperVExtension/Extensions/StreamExtensions.cs b/extensions/HyperVExtension/src/HyperVExtension/Extensions/StreamExtensions.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Extensions/StreamExtensions.cs rename to extensions/HyperVExtension/src/HyperVExtension/Extensions/StreamExtensions.cs diff --git a/HyperVExtension/src/HyperVExtension/Helpers/AdaptiveCardActionPayload.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/AdaptiveCardActionPayload.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Helpers/AdaptiveCardActionPayload.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/AdaptiveCardActionPayload.cs diff --git a/HyperVExtension/src/HyperVExtension/Helpers/BytesHelper.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/BytesHelper.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Helpers/BytesHelper.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/BytesHelper.cs diff --git a/HyperVExtension/src/HyperVExtension/Helpers/DevSetupAgentDeploymentHelper.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/DevSetupAgentDeploymentHelper.cs similarity index 94% rename from HyperVExtension/src/HyperVExtension/Helpers/DevSetupAgentDeploymentHelper.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/DevSetupAgentDeploymentHelper.cs index b5796b7cc1..351abebb17 100644 --- a/HyperVExtension/src/HyperVExtension/Helpers/DevSetupAgentDeploymentHelper.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Helpers/DevSetupAgentDeploymentHelper.cs @@ -6,6 +6,7 @@ using System.Text; using HyperVExtension.Exceptions; using HyperVExtension.Services; +using Windows.ApplicationModel; namespace HyperVExtension.Helpers; @@ -128,7 +129,7 @@ private ushort GetVMArchitechture(PSObject session) private static string LoadScript() { - var path = Path.Combine(AppContext.BaseDirectory, "HyperVExtension", "Scripts", "DevSetupAgent.ps1"); + var path = Path.Combine(Package.Current.EffectivePath, "HyperVExtension", "Scripts", "DevSetupAgent.ps1"); return File.ReadAllText(path, Encoding.Default) ?? throw new FileNotFoundException(path); } } diff --git a/HyperVExtension/src/HyperVExtension/Helpers/HyperVStrings.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/HyperVStrings.cs similarity index 92% rename from HyperVExtension/src/HyperVExtension/Helpers/HyperVStrings.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/HyperVStrings.cs index 0a78189893..af823e8a52 100644 --- a/HyperVExtension/src/HyperVExtension/Helpers/HyperVStrings.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Helpers/HyperVStrings.cs @@ -96,4 +96,9 @@ public static class HyperVStrings public const string RunningState = "Running"; public const string PausedState = "Paused"; public const string SavedState = "Saved"; + public const string SavingState = "Saving"; + public const string PausingState = "Pausing"; + public const string StartingState = "Starting"; + public const string StoppingState = "Stopping"; + public const string ResumingState = "Resuming"; } diff --git a/HyperVExtension/src/HyperVExtension/Helpers/Json.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/Json.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Helpers/Json.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/Json.cs diff --git a/HyperVExtension/src/HyperVExtension/Helpers/Logging.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/Logging.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Helpers/Logging.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/Logging.cs diff --git a/HyperVExtension/src/HyperVExtension/Helpers/PsObjectHelper.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/PsObjectHelper.cs similarity index 83% rename from HyperVExtension/src/HyperVExtension/Helpers/PsObjectHelper.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/PsObjectHelper.cs index e3a1713603..a79c7bbfd7 100644 --- a/HyperVExtension/src/HyperVExtension/Helpers/PsObjectHelper.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Helpers/PsObjectHelper.cs @@ -13,6 +13,8 @@ namespace HyperVExtension.Helpers; /// public class PsObjectHelper { + private readonly ILogger _log = Log.ForContext("SourceContext", nameof(PsObjectHelper)); + private readonly PSObject _psObject; public PsObjectHelper(in PSObject pSObject) @@ -40,11 +42,18 @@ public PsObjectHelper(in PSObject pSObject) /// public T? MemberNameToValue(string memberName) { - var potentialValue = _psObject.Members?[memberName]?.Value; + try + { + var potentialValue = _psObject.Members?[memberName]?.Value; - if (potentialValue is T memberValue) + if (potentialValue is T memberValue) + { + return memberValue; + } + } + catch (Exception ex) { - return memberValue; + _log.Error(ex, $"Failed to get member value with name {memberName}"); } return default(T); @@ -70,8 +79,7 @@ public PsObjectHelper(in PSObject pSObject) } catch (Exception ex) { - var log = Log.ForContext("SourceContext", nameof(PsObjectHelper)); - log.Error(ex, $"Failed to get property value with name {propertyName} from object with type {type}."); + _log.Error(ex, $"Failed to get property value with name {propertyName} from object with type {type}."); } return default(T); diff --git a/HyperVExtension/src/HyperVExtension/Helpers/Resources.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/Resources.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Helpers/Resources.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/Resources.cs diff --git a/HyperVExtension/src/HyperVExtension/Helpers/StatementBuilder.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/StatementBuilder.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Helpers/StatementBuilder.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/StatementBuilder.cs diff --git a/HyperVExtension/src/HyperVExtension/Helpers/StringExtensions.cs b/extensions/HyperVExtension/src/HyperVExtension/Helpers/StringExtensions.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Helpers/StringExtensions.cs rename to extensions/HyperVExtension/src/HyperVExtension/Helpers/StringExtensions.cs diff --git a/HyperVExtension/src/HyperVExtension/HyperVExtension.cs b/extensions/HyperVExtension/src/HyperVExtension/HyperVExtension.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/HyperVExtension.cs rename to extensions/HyperVExtension/src/HyperVExtension/HyperVExtension.cs diff --git a/HyperVExtension/src/HyperVExtension/HyperVExtension.csproj b/extensions/HyperVExtension/src/HyperVExtension/HyperVExtension.csproj similarity index 95% rename from HyperVExtension/src/HyperVExtension/HyperVExtension.csproj rename to extensions/HyperVExtension/src/HyperVExtension/HyperVExtension.csproj index 6c20e46a99..d6ec3808d5 100644 --- a/HyperVExtension/src/HyperVExtension/HyperVExtension.csproj +++ b/extensions/HyperVExtension/src/HyperVExtension/HyperVExtension.csproj @@ -25,9 +25,9 @@ - Always - - + Always + + Always @@ -40,7 +40,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/HyperVExtension/src/HyperVExtension/Models/ByteTransferProgress.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/ByteTransferProgress.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/ByteTransferProgress.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/ByteTransferProgress.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/Checkpoint.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/Checkpoint.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/Checkpoint.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/Checkpoint.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachine.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachine.cs similarity index 75% rename from HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachine.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachine.cs index b154cb3938..a91e877d46 100644 --- a/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachine.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachine.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.Globalization; using System.Management.Automation; +using System.Runtime.InteropServices; using System.Runtime.InteropServices.WindowsRuntime; using System.Text; using HyperVExtension.Common; @@ -12,6 +13,7 @@ using HyperVExtension.CommunicationWithGuest; using HyperVExtension.Exceptions; using HyperVExtension.Helpers; +using HyperVExtension.HostGuestCommunication; using HyperVExtension.Services; using Microsoft.Extensions.Hosting; using Microsoft.Windows.DevHome.SDK; @@ -86,23 +88,69 @@ public class HyperVVirtualMachine : IComputeSystem public string? ComputerName => _psObjectHelper.MemberNameToValue(HyperVStrings.ComputerName); - public bool IsDeleted => _psObjectHelper.MemberNameToValue(HyperVStrings.IsDeleted); + private bool _isDeleted; - // Temporary will need to add more error strings for different operations. - public string OperationErrorUnknownString => _stringResource.GetLocalized(_errorResourceKey); + public string OperationErrorUnknownString => _stringResource.GetLocalized(_errorResourceKey, Logging.LogFolderRoot); - // TODO: make getting this list dynamic so we can remove operations based on OS version. - public ComputeSystemOperations SupportedOperations => ComputeSystemOperations.Start | - ComputeSystemOperations.ShutDown | - ComputeSystemOperations.Terminate | - ComputeSystemOperations.Delete | - ComputeSystemOperations.Save | - ComputeSystemOperations.Pause | - ComputeSystemOperations.Resume | - ComputeSystemOperations.CreateSnapshot | - ComputeSystemOperations.DeleteSnapshot | - ComputeSystemOperations.Restart | - ComputeSystemOperations.ApplyConfiguration; + public ComputeSystemOperations SupportedOperations + { + get + { + if (_isDeleted) + { + return ComputeSystemOperations.None; + } + + // Before applying the configuration we start the VM. So we will allow the ApplyConfiguration to be the base supported operation + // for the VM. + var supportedOperations = ComputeSystemOperations.ApplyConfiguration; + var revertOperation = Guid.Empty.Equals(ParentCheckpointId) ? ComputeSystemOperations.None : ComputeSystemOperations.RevertSnapshot; + + switch (GetState()) + { + case ComputeSystemState.Running: + // Supported operations when running + supportedOperations = ComputeSystemOperations.ShutDown | + ComputeSystemOperations.Terminate | + ComputeSystemOperations.Save | + ComputeSystemOperations.Pause | + ComputeSystemOperations.CreateSnapshot | + ComputeSystemOperations.Restart | + revertOperation; + break; + case ComputeSystemState.Stopped: + // Supported operations when stopped + supportedOperations = ComputeSystemOperations.Start | + ComputeSystemOperations.CreateSnapshot | + ComputeSystemOperations.Delete; + break; + case ComputeSystemState.Saved: + // Supported operations when saved + supportedOperations = ComputeSystemOperations.Start | + ComputeSystemOperations.CreateSnapshot | + ComputeSystemOperations.Delete | + revertOperation; + break; + case ComputeSystemState.Paused: + // Supported operations when paused + supportedOperations = ComputeSystemOperations.Terminate | + ComputeSystemOperations.Save | + ComputeSystemOperations.Resume | + ComputeSystemOperations.CreateSnapshot | + revertOperation; + break; + } + + // Disable ApplyConfiguration for ARM + var arch = RuntimeInformation.OSArchitecture; + if (arch == Architecture.Arm64 || arch == Architecture.Arm || arch == Architecture.Armv6) + { + return supportedOperations; + } + + return supportedOperations | ComputeSystemOperations.ApplyConfiguration; + } + } public string SupplementalDisplayName { get; set; } = string.Empty; @@ -146,20 +194,28 @@ public IEnumerable GetHardDrives() return returnList; } + private ComputeSystemState GetState() + { + return State switch + { + HyperVStrings.RunningState => ComputeSystemState.Running, + HyperVStrings.VMOffState => ComputeSystemState.Stopped, + HyperVStrings.PausedState => ComputeSystemState.Paused, + HyperVStrings.SavedState => ComputeSystemState.Saved, + HyperVStrings.SavingState => ComputeSystemState.Saving, + HyperVStrings.PausingState => ComputeSystemState.Pausing, + HyperVStrings.StartingState => ComputeSystemState.Starting, + HyperVStrings.ResumingState => ComputeSystemState.Starting, + HyperVStrings.StoppingState => ComputeSystemState.Stopping, + _ => ComputeSystemState.Unknown, + }; + } + public IAsyncOperation GetStateAsync() { return Task.Run(() => { - var currentState = State switch - { - HyperVStrings.RunningState => ComputeSystemState.Running, - HyperVStrings.VMOffState => ComputeSystemState.Stopped, - HyperVStrings.PausedState => ComputeSystemState.Paused, - HyperVStrings.SavedState => ComputeSystemState.Saved, - _ => ComputeSystemState.Unknown, - }; - - return new ComputeSystemStateResult(currentState); + return new ComputeSystemStateResult(GetState()); }).AsAsyncOperation(); } @@ -175,16 +231,10 @@ private ComputeSystemOperationResult Start(string options) { try { - if (State == HyperVStrings.RunningState) - { - // VM is already running. - return new ComputeSystemOperationResult(); - } - StateChanged(this, ComputeSystemState.Starting); if (_hyperVManager.StartVirtualMachine(VmId)) { - StateChanged(this, ComputeSystemState.Running); + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.Start)); return new ComputeSystemOperationResult(); } @@ -193,7 +243,7 @@ private ComputeSystemOperationResult Start(string options) } catch (Exception ex) { - StateChanged(this, ComputeSystemState.Unknown); + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.Start)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -205,16 +255,10 @@ public IAsyncOperation ShutDownAsync(string option { try { - if (State == HyperVStrings.VMOffState) - { - // VM is already off. - return new ComputeSystemOperationResult(); - } - StateChanged(this, ComputeSystemState.Stopping); if (_hyperVManager.StopVirtualMachine(VmId, StopVMKind.Default)) { - StateChanged(this, ComputeSystemState.Stopped); + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.ShutDown)); return new ComputeSystemOperationResult(); } @@ -223,7 +267,7 @@ public IAsyncOperation ShutDownAsync(string option } catch (Exception ex) { - StateChanged(this, ComputeSystemState.Unknown); + StateChanged(this, GetState()); _log.Error(OperationErrorString(ComputeSystemOperations.ShutDown)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -236,16 +280,10 @@ public IAsyncOperation TerminateAsync(string optio { try { - if (State == HyperVStrings.VMOffState) - { - // VM is already off. - return new ComputeSystemOperationResult(); - } - StateChanged(this, ComputeSystemState.Stopping); if (_hyperVManager.StopVirtualMachine(VmId, StopVMKind.TurnOff)) { - StateChanged(this, ComputeSystemState.Stopped); + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.Terminate)); return new ComputeSystemOperationResult(); } @@ -254,7 +292,7 @@ public IAsyncOperation TerminateAsync(string optio } catch (Exception ex) { - StateChanged(this, ComputeSystemState.Unknown); + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.Terminate)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -270,6 +308,7 @@ public IAsyncOperation DeleteAsync(string options) StateChanged(this, ComputeSystemState.Deleting); if (_hyperVManager.RemoveVirtualMachine(VmId)) { + _isDeleted = true; StateChanged(this, ComputeSystemState.Deleted); _log.Information(OperationSuccessString(ComputeSystemOperations.Delete)); return new ComputeSystemOperationResult(); @@ -292,16 +331,10 @@ public IAsyncOperation SaveAsync(string options) { try { - if (State == HyperVStrings.SavedState) - { - // VM is already saved. - return new ComputeSystemOperationResult(); - } - StateChanged(this, ComputeSystemState.Saving); if (_hyperVManager.StopVirtualMachine(VmId, StopVMKind.Save)) { - StateChanged(this, ComputeSystemState.Saved); + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.Save)); return new ComputeSystemOperationResult(); } @@ -310,7 +343,7 @@ public IAsyncOperation SaveAsync(string options) } catch (Exception ex) { - StateChanged(this, ComputeSystemState.Unknown); + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.Save)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -323,16 +356,10 @@ public IAsyncOperation PauseAsync(string options) { try { - if (State == HyperVStrings.PausedState) - { - // VM is already paused. - return new ComputeSystemOperationResult(); - } - StateChanged(this, ComputeSystemState.Pausing); if (_hyperVManager.PauseVirtualMachine(VmId)) { - StateChanged(this, ComputeSystemState.Paused); + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.Pause)); return new ComputeSystemOperationResult(); } @@ -341,7 +368,7 @@ public IAsyncOperation PauseAsync(string options) } catch (Exception ex) { - StateChanged(this, ComputeSystemState.Unknown); + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.Pause)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -354,16 +381,10 @@ public IAsyncOperation ResumeAsync(string options) { try { - if (State == HyperVStrings.RunningState) - { - // VM is already running. - return new ComputeSystemOperationResult(); - } - StateChanged(this, ComputeSystemState.Starting); if (_hyperVManager.ResumeVirtualMachine(VmId)) { - StateChanged(this, ComputeSystemState.Running); + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.Resume)); return new ComputeSystemOperationResult(); } @@ -372,7 +393,7 @@ public IAsyncOperation ResumeAsync(string options) } catch (Exception ex) { - StateChanged(this, ComputeSystemState.Unknown); + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.Resume)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -385,8 +406,11 @@ public IAsyncOperation CreateSnapshotAsync(string { try { + // we don't currently have a state for creating a checkpoint so we'll say we're in the saving state + StateChanged(this, ComputeSystemState.Saving); if (_hyperVManager.CreateCheckpoint(VmId)) { + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.CreateSnapshot)); return new ComputeSystemOperationResult(); } @@ -395,6 +419,7 @@ public IAsyncOperation CreateSnapshotAsync(string } catch (Exception ex) { + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.CreateSnapshot)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -407,9 +432,13 @@ public IAsyncOperation RevertSnapshotAsync(string { try { + // we don't currently have a state for reverting a checkpoint so we'll say we're in the saving state + StateChanged(this, ComputeSystemState.Saving); + // Reverting checkpoints means applying the previous checkpoint onto the VM. if (_hyperVManager.ApplyCheckpoint(VmId, ParentCheckpointId)) { + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.RevertSnapshot)); return new ComputeSystemOperationResult(); } @@ -418,6 +447,7 @@ public IAsyncOperation RevertSnapshotAsync(string } catch (Exception ex) { + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.RevertSnapshot)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -430,9 +460,13 @@ public IAsyncOperation DeleteSnapshotAsync(string { try { + // we don't currently have a state for deleting a checkpoint so we'll say we're in the saving state + StateChanged(this, ComputeSystemState.Saving); + // For v1 we only support deleting the previous checkpoint. if (_hyperVManager.RemoveCheckpoint(VmId, ParentCheckpointId)) { + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.DeleteSnapshot)); return new ComputeSystemOperationResult(); } @@ -441,6 +475,7 @@ public IAsyncOperation DeleteSnapshotAsync(string } catch (Exception ex) { + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.DeleteSnapshot)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -453,7 +488,7 @@ public IAsyncOperation ConnectAsync(string options { try { - _log.Information($"Starting vmconnect launch attempt on {DateTime.Now}: VM details: {this}"); + _log.Information($"Starting vmconnect launch attempt: VM details: {this}"); ProcessStartInfo processStartInfo = new ProcessStartInfo("vmconnect.exe"); processStartInfo.UseShellExecute = true; @@ -476,12 +511,12 @@ public IAsyncOperation ConnectAsync(string options PInvoke.SetForegroundWindow((HWND)vmConnectProcess.MainWindowHandle); } - _log.Information($"Successful vmconnect launch attempt on {DateTime.Now}: VM details: {this}"); + _log.Information($"Successful vmconnect launch attempt: VM details: {this}"); return new ComputeSystemOperationResult(); } catch (Exception ex) { - _log.Error(ex, $"Failed to launch vmconnect on {DateTime.Now}: VM details: {this}"); + _log.Error(ex, $"Failed to launch vmconnect: VM details: {this}"); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } }).AsAsyncOperation(); @@ -493,15 +528,10 @@ public IAsyncOperation RestartAsync(string options { try { - if (State != HyperVStrings.RunningState) - { - throw new ComputeSystemOperationException(ComputeSystemOperations.Restart); - } - StateChanged(this, ComputeSystemState.Restarting); if (_hyperVManager.RestartVirtualMachine(VmId)) { - StateChanged(this, ComputeSystemState.Running); + StateChanged(this, GetState()); _log.Information(OperationSuccessString(ComputeSystemOperations.Restart)); return new ComputeSystemOperationResult(); } @@ -510,7 +540,7 @@ public IAsyncOperation RestartAsync(string options } catch (Exception ex) { - StateChanged(this, ComputeSystemState.Unknown); + StateChanged(this, GetState()); _log.Error(ex, OperationErrorString(ComputeSystemOperations.Restart)); return new ComputeSystemOperationResult(ex, OperationErrorUnknownString, ex.Message); } @@ -553,14 +583,20 @@ public IAsyncOperation> GetComputeSystemPrope ComputeSystemProperty.Create(ComputeSystemPropertyKind.AssignedMemorySizeInBytes, MemoryAssigned), ComputeSystemProperty.Create(ComputeSystemPropertyKind.StorageSizeInBytes, totalDiskSize), ComputeSystemProperty.Create(ComputeSystemPropertyKind.UptimeIn100ns, Uptime), - ComputeSystemProperty.CreateCustom(ParentCheckpointName, _stringResource.GetLocalized(_currentCheckpointKey), null), }; + var lastCheckPoint = _hyperVManager.GetVirtualMachineCheckpoints(VmId).LastOrDefault(); + + if (lastCheckPoint != null) + { + properties.Add(ComputeSystemProperty.CreateCustom(lastCheckPoint.Name, _stringResource.GetLocalized(_currentCheckpointKey), null)); + } + return properties.AsEnumerable(); } catch (Exception ex) { - _log.Error(ex, $"Failed to GetComputeSystemPropertiesAsync on {DateTime.Now}: VM details: {this}"); + _log.Error(ex, $"GetComputeSystemPropertiesAsync failed: VM details: {this}"); return new List(); } }).AsAsyncOperation(); @@ -580,8 +616,7 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati try { - // TODO: Check if VM is already running. Set progress to Starting VM if needed. - // Hyper-V KVP service can set succeed even if VM is not running and VM will receive + // Start VM first. Hyper-V KVP service can set succeed even if VM is not running and VM will receive // registry key changes next time it starts. var startResult = Start(string.Empty); if (startResult.Result.Status == ProviderOperationStatus.Failure) @@ -589,24 +624,45 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati return operation.CompleteOperation(new HostGuestCommunication.ApplyConfigurationResult(startResult.Result.ExtendedError.HResult, startResult.Result.DisplayMessage)); } - var guestSession = new GuestKvpSession(Guid.Parse(Id)); + using var guestSession = new GuestKvpSession(Guid.Parse(Id)); // Query VM by sending a request to DevSetupAgent. - var getVersionRequest = new GetVersionRequest(); - guestSession.SendRequest(getVersionRequest, CancellationToken.None); - var getVersionResponses = guestSession.WaitForResponse(getVersionRequest.RequestId, TimeSpan.FromSeconds(15), true, CancellationToken.None); - if (getVersionResponses.Count > 0) + var getStateRequest = new GetStateRequest(); + var communicationId = guestSession.SendRequest(getStateRequest, CancellationToken.None); + var getStateResponses = guestSession.WaitForResponse(communicationId, getStateRequest.RequestId, TimeSpan.FromSeconds(15), false, CancellationToken.None); + if (getStateResponses.Count > 0) { - var response = getVersionResponses[0]; - if (response is GetVersionResponse getVersionResponse) + var response = getStateResponses[0]; + if (response is GetStateResponse getStateResponse) { - // TODO: Check if VM can accept new Configure requests. Or if we need to update DevSetupAgent to a new version. + // Check if VM can accept new Configure requests. We don't support reporting progress for requests + // that were started somehow outside of this operation yet. So for now, abort this operation. + // This could only happen if Dev Home was restarted while a configuration task was running. + if (getStateResponse.StateData.RequestsInQueue.Count > 0) + { + // Set CommunicationId counter to the value higher than the highest CommunicationId in the queue + // to avoid conflicts with previous requests. + uint communicationIdCounter = 1; // We've already sent at least one message. + foreach (var request in getStateResponse.StateData.RequestsInQueue) + { + var currentCounter = MessageHelper.GetCounterFromCommunicationId(request.CommunicationId); + if (currentCounter > communicationIdCounter) + { + communicationIdCounter = currentCounter; + } + } + + guestSession.SetNextCommunicationIdCounter(communicationIdCounter); + + _log.Error($"VM is busy with another configuration task. VM details: {this}"); + return operation.CompleteOperation(new HostGuestCommunication.ApplyConfigurationResult(HRESULT.E_ABORT, "VM is busy with another configuration task")); + } } else { // TODO: Check if we can get any diagnostic from this unexpected response. _log.Error( - $"Unexpected response while applying configuration on {DateTime.Now}: " + + $"Unexpected response while applying configuration: " + $"responseId: {response.RequestId}, responseType: {response.ResponseType}, " + $"VM details: {this}"); return operation.CompleteOperation(new HostGuestCommunication.ApplyConfigurationResult(HRESULT.E_FAIL, $"Received unexpected response from the VM")); @@ -642,8 +698,8 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati for (var i = 0; i < MaxRetryAttempts; i++) { var userLoggedInRequest = new IsUserLoggedInRequest(); - guestSession.SendRequest(userLoggedInRequest, CancellationToken.None); - var userLoggedInResponses = guestSession.WaitForResponse(userLoggedInRequest.RequestId, TimeSpan.FromSeconds(15), true, CancellationToken.None); + communicationId = guestSession.SendRequest(userLoggedInRequest, CancellationToken.None); + var userLoggedInResponses = guestSession.WaitForResponse(communicationId, userLoggedInRequest.RequestId, TimeSpan.FromSeconds(15), false, CancellationToken.None); if (userLoggedInResponses.Count > 0) { var response = userLoggedInResponses[0]; @@ -669,7 +725,7 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati { // TODO: Check if we can get any diagnostic from this unexpected response. _log.Error( - $"Unexpected response while applying configuration on {DateTime.Now}: " + + $"Unexpected response while applying configuration: " + $"responseId: {response.RequestId}, responseType: {response.ResponseType}, " + $"VM details: {this}"); return operation.CompleteOperation(new HostGuestCommunication.ApplyConfigurationResult(HRESULT.E_FAIL, $"Received unexpected response from the VM")); @@ -684,7 +740,7 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati } var configureRequest = new ConfigureRequest(operation.Configuration); - guestSession.SendRequest(configureRequest, CancellationToken.None); + communicationId = guestSession.SendRequest(configureRequest, CancellationToken.None); // Wait for response. 5 hours is an arbitrary period of time that should be big enough // for most scenarios. @@ -698,7 +754,7 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati var startTime = DateTime.Now; while ((DateTime.Now - startTime) < waitTime) { - var responses = guestSession.WaitForResponse(configureRequest.RequestId, TimeSpan.FromSeconds(30), true, CancellationToken.None); + var responses = guestSession.WaitForResponse(communicationId, configureRequest.RequestId, TimeSpan.FromSeconds(30), true, CancellationToken.None); foreach (var response in responses) { @@ -715,13 +771,13 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati LogApplyConfigurationProgress(configureProgressResponse.ProgressData); // Create SDK's result. Set Completed status and event. - operation.SetProgress(ConfigurationSetState.InProgress, configureProgressResponse.ProgressData, null); + operation.SetProgress(SDK.ConfigurationSetState.InProgress, configureProgressResponse.ProgressData, null); } else { // Unexpected (error) response. Log it and return error. Not much we can do here. _log.Error( - $"Unexpected response while applying configuration on {DateTime.Now}: " + + $"Unexpected response while applying configuration: " + $"responseId: {response.RequestId}, responseType: {response.ResponseType}, " + $"VM details: {this}"); } @@ -732,7 +788,7 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati } catch (Exception ex) { - _log.Error(ex, $"Failed to apply configuration on {DateTime.Now}: VM details: {this}"); + _log.Error(ex, $"Failed to apply configuration: VM details: {this}"); return operation.CompleteOperation(new HostGuestCommunication.ApplyConfigurationResult(ex.HResult, ex.Message)); } } @@ -745,7 +801,7 @@ public SDK.ApplyConfigurationResult ApplyConfiguration(ApplyConfigurationOperati } catch (Exception ex) { - _log.Error(ex, $"Failed to apply configuration on {DateTime.Now}: VM details: {this}"); + _log.Error(ex, $"Failed to apply configuration: VM details: {this}"); return new ApplyConfigurationOperation(this, ex); } } @@ -755,7 +811,7 @@ private bool DeployDevSetupAgent(ApplyConfigurationOperation operation, int atte var powerShell = _host.GetService(); var credentialsAdaptiveCardSession = new VmCredentialAdaptiveCardSession(_host, operation, attemptNumber); - operation.SetProgress(ConfigurationSetState.WaitingForAdminUserLogon, null, credentialsAdaptiveCardSession); + operation.SetProgress(SDK.ConfigurationSetState.WaitingForAdminUserLogon, null, credentialsAdaptiveCardSession); (var userName, var password) = credentialsAdaptiveCardSession.WaitForCredentials(); @@ -776,7 +832,7 @@ private bool WaitForUserToLogin(ApplyConfigurationOperation operation, int attem // Ask user to login to the VM and wait for confirmation. var waitForLoginAdaptiveCardSession = new WaitForLoginAdaptiveCardSession(_host, operation, attemptNumber); - operation.SetProgress(ConfigurationSetState.WaitingForUserLogon, null, waitForLoginAdaptiveCardSession); + operation.SetProgress(SDK.ConfigurationSetState.WaitingForUserLogon, null, waitForLoginAdaptiveCardSession); return waitForLoginAdaptiveCardSession.WaitForUserResponse(); } @@ -824,19 +880,19 @@ private string OperationErrorString(ComputeSystemOperations operation) { if (operation == ComputeSystemOperations.Delete) { - return $"Failed to complete {operation} operation on {DateTime.Now}: for VM {DisplayName}"; + return $"Failed to complete {operation}: for VM {DisplayName}"; } - return $"Failed to complete {operation} operation on {DateTime.Now}: VM details: {this}"; + return $"Failed to complete {operation}: VM details: {this}"; } private string OperationSuccessString(ComputeSystemOperations operation) { if (operation == ComputeSystemOperations.Delete) { - return $"Successfully completed {operation} operation on {DateTime.Now}: for VM {DisplayName}"; + return $"Successfully completed {operation}: for VM {DisplayName}"; } - return $"Successfully completed {operation} operation on {DateTime.Now}: VM details: {this}"; + return $"Successfully completed {operation}: VM details: {this}"; } } diff --git a/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHardDisk.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHardDisk.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHardDisk.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHardDisk.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHost.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHost.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHost.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/HyperVVirtualMachineHost.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/IPowerShellSession.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/IPowerShellSession.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/IPowerShellSession.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/IPowerShellSession.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/IWindowsIdentityService.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/IWindowsIdentityService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/IWindowsIdentityService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/IWindowsIdentityService.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/IWindowsServiceController.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/IWindowsServiceController.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/IWindowsServiceController.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/IWindowsServiceController.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/PowerShellCommandlineStatement.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellCommandlineStatement.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/PowerShellCommandlineStatement.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellCommandlineStatement.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/PowerShellResult.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellResult.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/PowerShellResult.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellResult.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/PowerShellResultBase.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellResultBase.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/PowerShellResultBase.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellResultBase.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/PowerShellSession.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellSession.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/PowerShellSession.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/PowerShellSession.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryCreationAdaptiveCardSession.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryCreationAdaptiveCardSession.cs similarity index 98% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryCreationAdaptiveCardSession.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryCreationAdaptiveCardSession.cs index 7136b91b3f..cac14baf3b 100644 --- a/HyperVExtension/src/HyperVExtension/Models/VMGalleryCreationAdaptiveCardSession.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryCreationAdaptiveCardSession.cs @@ -12,6 +12,7 @@ using HyperVExtension.Models.VMGalleryJsonToClasses; using Microsoft.Windows.DevHome.SDK; using Serilog; +using Windows.ApplicationModel; using Windows.Foundation; using Windows.Storage; using Windows.Storage.Streams; @@ -26,11 +27,11 @@ public enum SessionState public class VMGalleryCreationAdaptiveCardSession : IExtensionAdaptiveCardSession2 { - private readonly Serilog.ILogger _log = Log.ForContext("SourceContext", nameof(HyperVVirtualMachine)); + private readonly Serilog.ILogger _log = Log.ForContext("SourceContext", nameof(VMGalleryCreationAdaptiveCardSession)); - private readonly string _pathToInitialCreationFormTemplate = Path.Combine(AppContext.BaseDirectory, @"HyperVExtension\Templates\", "InitialVMGalleryCreationForm.json"); + private readonly string _pathToInitialCreationFormTemplate = Path.Combine(Package.Current.EffectivePath, Constants.HyperVTemplatesSubPath, "InitialVMGalleryCreationForm.json"); - private readonly string _pathToReviewFormTemplate = Path.Combine(AppContext.BaseDirectory, @"HyperVExtension\Templates\", "ReviewFormForVMGallery.json"); + private readonly string _pathToReviewFormTemplate = Path.Combine(Package.Current.EffectivePath, Constants.HyperVTemplatesSubPath, "ReviewFormForVMGallery.json"); private readonly string _adaptiveCardNextButtonId = "DevHomeMachineConfigurationNextButton"; diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/JsonSourceGenerationContext.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/JsonSourceGenerationContext.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/JsonSourceGenerationContext.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/JsonSourceGenerationContext.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryConfig.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryConfig.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryConfig.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryConfig.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDetail.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDetail.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDetail.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDetail.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDisk.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDisk.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDisk.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryDisk.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImage.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImage.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImage.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImage.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImageList.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImageList.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImageList.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryImageList.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryItemWithHashBase.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryItemWithHashBase.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryItemWithHashBase.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryItemWithHashBase.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryLogo.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryLogo.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryLogo.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryLogo.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryRequirements.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryRequirements.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryRequirements.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryRequirements.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGallerySymbol.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGallerySymbol.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGallerySymbol.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGallerySymbol.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryThumbnail.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryThumbnail.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryThumbnail.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VMGalleryJsonToClasses/VMGalleryThumbnail.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/ArchiveExtractionReport.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/ArchiveExtractionReport.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/ArchiveExtractionReport.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/ArchiveExtractionReport.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DotNetZipArchiveProvider.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DotNetZipArchiveProvider.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DotNetZipArchiveProvider.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DotNetZipArchiveProvider.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DownloadOperationReport.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DownloadOperationReport.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DownloadOperationReport.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/DownloadOperationReport.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IArchiveProvider.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IArchiveProvider.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IArchiveProvider.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IArchiveProvider.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IOperationReport.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IOperationReport.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IOperationReport.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IOperationReport.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IVMGalleryVMCreationOperation.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IVMGalleryVMCreationOperation.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IVMGalleryVMCreationOperation.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/IVMGalleryVMCreationOperation.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryCreationUserInput.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryCreationUserInput.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryCreationUserInput.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryCreationUserInput.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryVMCreationOperation.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryVMCreationOperation.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryVMCreationOperation.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreation/VMGalleryVMCreationOperation.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreationParameters.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreationParameters.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreationParameters.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VirtualMachineCreationParameters.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/VmCredentialAdaptiveCardSession.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/VmCredentialAdaptiveCardSession.cs similarity index 94% rename from HyperVExtension/src/HyperVExtension/Models/VmCredentialAdaptiveCardSession.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/VmCredentialAdaptiveCardSession.cs index b7be3a7ef1..b024702b68 100644 --- a/HyperVExtension/src/HyperVExtension/Models/VmCredentialAdaptiveCardSession.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Models/VmCredentialAdaptiveCardSession.cs @@ -13,6 +13,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Windows.DevHome.SDK; using Serilog; +using Windows.ApplicationModel; using Windows.Foundation; namespace HyperVExtension.Models; @@ -204,14 +205,14 @@ private string LoadTemplate() return _template; } - var path = Path.Combine(AppContext.BaseDirectory, @"HyperVExtension\Templates\", "VmCredentialAdaptiveCardTemplate.json"); + var path = Path.Combine(Package.Current.EffectivePath, Constants.HyperVTemplatesSubPath, "VmCredentialAdaptiveCardTemplate.json"); _template = File.ReadAllText(path, Encoding.Default) ?? throw new FileNotFoundException(path); return _template; } private static string ConvertIconToDataString(string fileName) { - var path = Path.Combine(AppContext.BaseDirectory, @"HyperVExtension\Templates\", fileName); + var path = Path.Combine(Package.Current.EffectivePath, Constants.HyperVTemplatesSubPath, fileName); var imageData = Convert.ToBase64String(File.ReadAllBytes(path.ToString())); return imageData; } diff --git a/HyperVExtension/src/HyperVExtension/Models/WaitForLoginAdaptiveCardSession.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/WaitForLoginAdaptiveCardSession.cs similarity index 94% rename from HyperVExtension/src/HyperVExtension/Models/WaitForLoginAdaptiveCardSession.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/WaitForLoginAdaptiveCardSession.cs index 3cafee187d..5b58f3942e 100644 --- a/HyperVExtension/src/HyperVExtension/Models/WaitForLoginAdaptiveCardSession.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Models/WaitForLoginAdaptiveCardSession.cs @@ -11,6 +11,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Windows.DevHome.SDK; using Serilog; +using Windows.ApplicationModel; using Windows.Foundation; namespace HyperVExtension.Models; @@ -191,14 +192,14 @@ private string LoadTemplate() return _template; } - var path = Path.Combine(AppContext.BaseDirectory, @"HyperVExtension\Templates\", "WaitForLoginAdaptiveCardTemplate.json"); + var path = Path.Combine(Package.Current.EffectivePath, Constants.HyperVTemplatesSubPath, "WaitForLoginAdaptiveCardTemplate.json"); _template = File.ReadAllText(path, Encoding.Default) ?? throw new FileNotFoundException(path); return _template; } private static string ConvertIconToDataString(string fileName) { - var path = Path.Combine(AppContext.BaseDirectory, @"HyperVExtension\Templates\", fileName); + var path = Path.Combine(AppContext.BaseDirectory, Constants.HyperVTemplatesSubPath, fileName); var imageData = Convert.ToBase64String(File.ReadAllBytes(path.ToString())); return imageData; } diff --git a/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityService.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/WindowsIdentityService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityService.cs diff --git a/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityWrapper.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityWrapper.cs similarity index 62% rename from HyperVExtension/src/HyperVExtension/Models/WindowsIdentityWrapper.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityWrapper.cs index c677941ace..dc31661bd8 100644 --- a/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityWrapper.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Models/WindowsIdentityWrapper.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System.Security.Principal; +using HyperVExtension.Helpers; namespace HyperVExtension.Models; @@ -14,4 +15,11 @@ public class WindowsIdentityWrapper // Get the sid's of the current user. public virtual IdentityReferenceCollection Groups => _windowsIdentity.Groups!; + + public virtual string UserName => _windowsIdentity.Name; + + public virtual bool IsUserInGroup(string groupSid) + { + return Groups.Any(sid => sid.Value.Equals(groupSid, StringComparison.OrdinalIgnoreCase)); + } } diff --git a/HyperVExtension/src/HyperVExtension/Models/WindowsServiceController.cs b/extensions/HyperVExtension/src/HyperVExtension/Models/WindowsServiceController.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Models/WindowsServiceController.cs rename to extensions/HyperVExtension/src/HyperVExtension/Models/WindowsServiceController.cs diff --git a/HyperVExtension/src/HyperVExtension/NativeMethods.txt b/extensions/HyperVExtension/src/HyperVExtension/NativeMethods.txt similarity index 100% rename from HyperVExtension/src/HyperVExtension/NativeMethods.txt rename to extensions/HyperVExtension/src/HyperVExtension/NativeMethods.txt diff --git a/HyperVExtension/src/HyperVExtension/Providers/HyperVProvider.cs b/extensions/HyperVExtension/src/HyperVExtension/Providers/HyperVProvider.cs similarity index 53% rename from HyperVExtension/src/HyperVExtension/Providers/HyperVProvider.cs rename to extensions/HyperVExtension/src/HyperVExtension/Providers/HyperVProvider.cs index dd00cd5376..9c94ae1dcf 100644 --- a/HyperVExtension/src/HyperVExtension/Providers/HyperVProvider.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Providers/HyperVProvider.cs @@ -1,8 +1,11 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System.Runtime.InteropServices; using System.Text.Json; using HyperVExtension.Common; +using HyperVExtension.CommunicationWithGuest; +using HyperVExtension.Exceptions; using HyperVExtension.Helpers; using HyperVExtension.Models; using HyperVExtension.Models.VirtualMachineCreation; @@ -18,22 +21,26 @@ public class HyperVProvider : IComputeSystemProvider { private readonly ILogger _log = Log.ForContext("SourceContext", nameof(HyperVProvider)); - private readonly string errorResourceKey = "ErrorPerformingOperation"; + private readonly string _errorResourceKey = "ErrorPerformingOperation"; + + private readonly string _hyperVPreReqErrorText; private readonly IStringResource _stringResource; private readonly IHyperVManager _hyperVManager; + private readonly WindowsIdentityWrapper _windowsIdentityWrapper; + private readonly VmGalleryCreationOperationFactory _vmGalleryCreationOperationFactory; private readonly IVMGalleryService _vmGalleryService; - // Temporary will need to add more error strings for different operations. - public string OperationErrorString => _stringResource.GetLocalized(errorResourceKey); + public string OperationErrorString => _stringResource.GetLocalized(_errorResourceKey, Logging.LogFolderRoot); public HyperVProvider( IHyperVManager hyperVManager, IStringResource stringResource, + IWindowsIdentityService windowsIdentityService, VmGalleryCreationOperationFactory vmGalleryCreationOperationFactory, IVMGalleryService vmGalleryService) { @@ -41,6 +48,8 @@ public HyperVProvider( _stringResource = stringResource; _vmGalleryCreationOperationFactory = vmGalleryCreationOperationFactory; _vmGalleryService = vmGalleryService; + _windowsIdentityWrapper = windowsIdentityService.GetCurrentWindowsIdentity(); + _hyperVPreReqErrorText = SetupHyperVPreReqErrorText(); } /// Gets or sets the default compute system properties. @@ -56,9 +65,22 @@ public HyperVProvider( public string Properties { get; private set; } = string.Empty; /// Gets the supported operations of the Hyper-V provider. - /// TODO: currently only CreateComputeSystem is supported in the SDK. For Hyper-V v1 creation - /// won't be supported. - public ComputeSystemProviderOperations SupportedOperations => ComputeSystemProviderOperations.CreateComputeSystem; + public ComputeSystemProviderOperations SupportedOperations + { + get + { + // Disable the create operation for ARM devices. + var arch = RuntimeInformation.OSArchitecture; + if (arch == Architecture.Arm64 || arch == Architecture.Arm || arch == Architecture.Armv6) + { + return ComputeSystemProviderOperations.None; + } + else + { + return ComputeSystemProviderOperations.CreateComputeSystem; + } + } + } public Uri Icon => new(Constants.ExtensionIcon); @@ -69,10 +91,21 @@ public IAsyncOperation GetComputeSystemsAsync(IDeveloperId { try { + if (!string.IsNullOrEmpty(_hyperVPreReqErrorText)) + { + // Dev Home contains code and error notifications to add the user to the admin group and enable Hyper-V. + // So we do not need to send this error back to Dev Home as it will result in duplication. + return new ComputeSystemsResult(new List()); + } + var computeSystems = _hyperVManager.GetAllVirtualMachines(); _log.Information($"Successfully retrieved all virtual machines on: {DateTime.Now}"); return new ComputeSystemsResult(computeSystems); } + catch (VirtualMachineManagementServiceException serviceException) + { + return new ComputeSystemsResult(serviceException, _stringResource.GetLocalized("HyperVVirtualMachineManagementServiceError"), serviceException.Message); + } catch (Exception ex) { _log.Error(ex, $"Failed to retrieved all virtual machines on: {DateTime.Now}"); @@ -83,6 +116,28 @@ public IAsyncOperation GetComputeSystemsAsync(IDeveloperId public ComputeSystemAdaptiveCardResult CreateAdaptiveCardSessionForDeveloperId(IDeveloperId developerId, ComputeSystemAdaptiveCardKind sessionKind) { + if (!string.IsNullOrEmpty(_hyperVPreReqErrorText)) + { + var hyperVPreReqEx = new HyperVPrerequisiteFailedException(_hyperVPreReqErrorText); + return new ComputeSystemAdaptiveCardResult(hyperVPreReqEx, _hyperVPreReqErrorText, _hyperVPreReqErrorText); + } + + // Before getting the VM gallery json check that the virtual machine management service is started + try + { + _hyperVManager.StartVirtualMachineManagementService(); + } + catch (VirtualMachineManagementServiceException serviceException) + { + _log.Error($"Failed to get adaptive card session for session kind: {sessionKind} due to virtual machine service exception"); + return new ComputeSystemAdaptiveCardResult(serviceException, _stringResource.GetLocalized("HyperVVirtualMachineManagementServiceError"), serviceException.Message); + } + catch (Exception ex) + { + _log.Error(ex, $"Failed to get adaptive card session for session kind: {sessionKind}"); + return new ComputeSystemAdaptiveCardResult(ex, OperationErrorString, ex.Message); + } + var imageList = _vmGalleryService.GetGalleryImagesAsync().GetAwaiter().GetResult(); return new ComputeSystemAdaptiveCardResult(new VMGalleryCreationAdaptiveCardSession(imageList, _stringResource)); } @@ -112,4 +167,28 @@ public ComputeSystemAdaptiveCardResult CreateAdaptiveCardSessionForComputeSystem return null; } } + + private string SetupHyperVPreReqErrorText() + { + switch (WmiUtility.GetHyperVFeatureAvailability()) + { + case FeatureAvailabilityKind.Disabled: + _log.Information($"Hyper-V Feature is disabled"); + return _stringResource.GetLocalized("HyperVFeatureDisabled"); + case FeatureAvailabilityKind.Absent: + _log.Information($"Hyper-V Feature is not present on this SKU of Windows"); + return _stringResource.GetLocalized("HyperVFeatureNotPresent"); + case FeatureAvailabilityKind.Unknown: + _log.Information($"Hyper-V Feature state is unknown"); + return _stringResource.GetLocalized("HyperVFeatureUnknown"); + } + + if (!_windowsIdentityWrapper.IsUserInGroup(HyperVStrings.HyperVAdminGroupWellKnownSid)) + { + _log.Information($"User not in Hyper-V admin group"); + return _stringResource.GetLocalized("UserNotInHyperVAdminGroup", _windowsIdentityWrapper.UserName); + } + + return string.Empty; + } } diff --git a/HyperVExtension/src/HyperVExtension/Scripts/DevSetupAgent.ps1 b/extensions/HyperVExtension/src/HyperVExtension/Scripts/DevSetupAgent.ps1 similarity index 100% rename from HyperVExtension/src/HyperVExtension/Scripts/DevSetupAgent.ps1 rename to extensions/HyperVExtension/src/HyperVExtension/Scripts/DevSetupAgent.ps1 diff --git a/HyperVExtension/src/HyperVExtension/Scripts/WindowsPSModulePath.ps1 b/extensions/HyperVExtension/src/HyperVExtension/Scripts/WindowsPSModulePath.ps1 similarity index 100% rename from HyperVExtension/src/HyperVExtension/Scripts/WindowsPSModulePath.ps1 rename to extensions/HyperVExtension/src/HyperVExtension/Scripts/WindowsPSModulePath.ps1 diff --git a/HyperVExtension/src/HyperVExtension/Services/ArchiveProviderFactory.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/ArchiveProviderFactory.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/ArchiveProviderFactory.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/ArchiveProviderFactory.cs diff --git a/HyperVExtension/src/HyperVExtension/Services/DownloaderService.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/DownloaderService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/DownloaderService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/DownloaderService.cs diff --git a/HyperVExtension/src/HyperVExtension/Services/HyperVManager.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/HyperVManager.cs similarity index 83% rename from HyperVExtension/src/HyperVExtension/Services/HyperVManager.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/HyperVManager.cs index 9b81ce980e..18aced8b1e 100644 --- a/HyperVExtension/src/HyperVExtension/Services/HyperVManager.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Services/HyperVManager.cs @@ -3,6 +3,7 @@ using System.ServiceProcess; using System.Xml.Linq; +using HyperVExtension.Common; using HyperVExtension.Common.Extensions; using HyperVExtension.Exceptions; using HyperVExtension.Helpers; @@ -46,117 +47,60 @@ public class HyperVManager : IHyperVManager, IDisposable private bool _disposed; - public HyperVManager(IHost host, IPowerShellService powerShellService, HyperVVirtualMachineFactory hyperVVirtualMachineFactory) + public HyperVManager(IHost host, IPowerShellService powerShellService, IStringResource stringResource, HyperVVirtualMachineFactory hyperVVirtualMachineFactory) { _powerShellService = powerShellService; _host = host; _hyperVVirtualMachineFactory = hyperVVirtualMachineFactory; } - /// - public bool IsHyperVModuleLoaded() - { - if (IsFirstTimeLoadingModule) - { - IsFirstTimeLoadingModule = false; - LoadHyperVModule(); - } - - // Build command line statement to get all the available modules. - // Work around for .Net 8 and PowerShell.SDK 7.4.* issue where the PowerShell session - // Can't find the module, even though it appears in a regular PowerShell terminal window. - // this will be removed once the issue is resolved. - var commandLineStatements = new StatementBuilder() - .AddScript("Get-Module -ListAvailable", true) - .Build(); - - var result = _powerShellService.Execute(commandLineStatements, PipeType.None); - var moduleFound = result.PsObjects?.Any(psObject => - { - var helper = new PsObjectHelper(psObject); - return helper.MemberNameToValue(HyperVStrings.Name) == HyperVStrings.HyperVModuleName; - }) ?? false; - - if (!moduleFound) - { - _log.Warning($"PowerShell could not find the Hyper-V module in the list of modules loaded into the current session: {result.CommandOutputErrorMessage}"); - } - - return moduleFound; - } - - private void LoadHyperVModule() - { - // Makes sure the Hyper-V module is loaded in the current PowerShell session. - // After moving to .Net 8 and using PowerShell.SDK 7.4.*, simply attempting to - // import the Hyper-V module from Dev Home does not work. We need to force the - // module by attempting to load it twice. - // A work around is to use the Get-Module twice in the PowerShell session - // to find the Hyper-V module. I'll need to investigate this further. - var commandLineStatements = new StatementBuilder() - .AddCommand(HyperVStrings.GetModule) - .AddParameter(HyperVStrings.ListAvailable, true) - .AddParameter(HyperVStrings.Name, HyperVStrings.HyperVModuleName) - .Build(); - - var result = _powerShellService.Execute(commandLineStatements, PipeType.None); - - if (!string.IsNullOrEmpty(result.CommandOutputErrorMessage)) - { - _log.Warning($"PowerShell returned an error while attempting to get the Hyper-V module on the first try: {result.CommandOutputErrorMessage}"); - } - } - /// public void StartVirtualMachineManagementService() { - if (!IsUserInHyperVAdminGroup()) - { - throw new HyperVAdminGroupException("The current logged on user is not in the Hyper-V administrator group"); - } - - if (!IsHyperVModuleLoaded()) + try { - // we won't throw an exception here. If there is a cmdlet failure due to the module not being loaded, we'll let the - // PowerShell cmdlet throw the exception. - _log.Error("The Hyper-V PowerShell Module is not Loaded"); - } + var serviceController = _host.GetService(); + serviceController.ServiceName = HyperVStrings.VMManagementService; - var serviceController = _host.GetService(); - serviceController.ServiceName = HyperVStrings.VMManagementService; + switch (serviceController.Status) + { + case ServiceControllerStatus.Running: + // The service is already running + return; + case ServiceControllerStatus.StartPending: + // The service is starting, so we'll wait to confirm it started. + break; + + // If the service is stopping, we'll wait till its fully stopped. + case ServiceControllerStatus.StopPending: + serviceController.WaitForStatusChange(ServiceControllerStatus.Stopped, _serviceTimeoutInSeconds); + goto case ServiceControllerStatus.Stopped; + + case ServiceControllerStatus.Stopped: + // Service is stopped try to start it. + serviceController.StartService(); + break; + + // If the service is pausing, we'll wait till its fully paused. + case ServiceControllerStatus.PausePending: + serviceController.WaitForStatusChange(ServiceControllerStatus.Paused, _serviceTimeoutInSeconds); + goto case ServiceControllerStatus.Paused; + + case ServiceControllerStatus.Paused: + // If the service is paused, try to resume it. + serviceController.ContinueService(); + break; + } - switch (serviceController.Status) + // wait for service to start. + serviceController.WaitForStatusChange(ServiceControllerStatus.Running, _serviceTimeoutInSeconds); + } + catch (Exception ex) { - case ServiceControllerStatus.Running: - // The service is already running - return; - case ServiceControllerStatus.StartPending: - // The service is starting, so we'll wait to confirm it started. - break; - - // If the service is stopping, we'll wait till its fully stopped. - case ServiceControllerStatus.StopPending: - serviceController.WaitForStatusChange(ServiceControllerStatus.Stopped, _serviceTimeoutInSeconds); - goto case ServiceControllerStatus.Stopped; - - case ServiceControllerStatus.Stopped: - // Service is stopped try to start it. - serviceController.StartService(); - break; - - // If the service is pausing, we'll wait till its fully paused. - case ServiceControllerStatus.PausePending: - serviceController.WaitForStatusChange(ServiceControllerStatus.Paused, _serviceTimeoutInSeconds); - goto case ServiceControllerStatus.Paused; - - case ServiceControllerStatus.Paused: - // If the service is paused, try to resume it. - serviceController.ContinueService(); - break; + var errorStr = "Unable to start Virtual Machine Management Service"; + _log.Error(ex, errorStr); + throw new VirtualMachineManagementServiceException(errorStr, ex); } - - // wait for service to start. - serviceController.WaitForStatusChange(ServiceControllerStatus.Running, _serviceTimeoutInSeconds); } /// @@ -423,8 +367,23 @@ public bool RemoveVirtualMachine(Guid vmId) return false; } - var virtualMachine = _hyperVVirtualMachineFactory(vmObject); - return virtualMachine.IsDeleted; + var psObjectHelper = new PsObjectHelper(vmObject); + + // Check if the Hyper-V virtual machine object returned to use has its IsDeleted status set to true + if (psObjectHelper.MemberNameToValue("IsDeleted")) + { + return true; + } + + // Unfortunately sometimes the IsDeleted property can be set to false and dynamically + // update to true later on. There is no documentation for the Hyper-V objects, or best practices for the Hyper-V PowerShell + // cmdlets, so we will do an additional check by attempting to get the VM with the Get-VM cmdlet. If there are no results + // we can say the VM has been deleted. + result = _powerShellService.Execute(GetVMCommandLineStatement(vmId), PipeType.None); + _log.Information($"Attempted second try of deletion check with result message: {result.CommandOutputErrorMessage}"); + + // If the VM does not exist then there should be no PsObjects in the list. + return result.PsObjects.FirstOrDefault() == null; } finally { @@ -660,7 +619,7 @@ public ulong GetVhdSize(string diskPath) if (!string.IsNullOrEmpty(result.CommandOutputErrorMessage)) { - throw new HyperVManagerException($"Unable to get disk size due to PowerShell error: {result.CommandOutputErrorMessage}"); + _log.Error($"Unable to get disk size due to PowerShell error: {result.CommandOutputErrorMessage}"); } // object in the returned results should represent a virtual disk. @@ -675,14 +634,6 @@ public ulong GetVhdSize(string diskPath) return helper.MemberNameToValue(HyperVStrings.Size); } - /// - public bool IsUserInHyperVAdminGroup() - { - var currentUser = _host.GetService().GetCurrentWindowsIdentity(); - var wasHyperVSidFound = currentUser?.Groups?.Any(sid => sid.Value == HyperVStrings.HyperVAdminGroupWellKnownSid); - return wasHyperVSidFound ?? false; - } - /// public HyperVVirtualMachineHost GetVirtualMachineHost() { diff --git a/HyperVExtension/src/HyperVExtension/Services/IArchiveProviderFactory.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/IArchiveProviderFactory.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/IArchiveProviderFactory.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/IArchiveProviderFactory.cs diff --git a/HyperVExtension/src/HyperVExtension/Services/IDownloaderService.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/IDownloaderService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/IDownloaderService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/IDownloaderService.cs diff --git a/HyperVExtension/src/HyperVExtension/Services/IHyperVManager.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/IHyperVManager.cs similarity index 92% rename from HyperVExtension/src/HyperVExtension/Services/IHyperVManager.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/IHyperVManager.cs index 30b1bf39ff..bf19b5a756 100644 --- a/HyperVExtension/src/HyperVExtension/Services/IHyperVManager.cs +++ b/extensions/HyperVExtension/src/HyperVExtension/Services/IHyperVManager.cs @@ -20,12 +20,6 @@ public enum StopVMKind /// Class that handles interacting directly with Hyper-V. public interface IHyperVManager { - /// Gets a boolean indicating whether the user is in the Hyper-V Administrator group. - public bool IsUserInHyperVAdminGroup(); - - /// Gets a boolean indicating whether the Hyper-V PowerShell module is available. - public bool IsHyperVModuleLoaded(); - /// Starts the virtual machine management service if it is not running. public void StartVirtualMachineManagementService(); diff --git a/HyperVExtension/src/HyperVExtension/Services/IPowerShellService.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/IPowerShellService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/IPowerShellService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/IPowerShellService.cs diff --git a/HyperVExtension/src/HyperVExtension/Services/IVMGalleryService.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/IVMGalleryService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/IVMGalleryService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/IVMGalleryService.cs diff --git a/HyperVExtension/src/HyperVExtension/Services/PowerShellService.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/PowerShellService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/PowerShellService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/PowerShellService.cs diff --git a/HyperVExtension/src/HyperVExtension/Services/VMGalleryService.cs b/extensions/HyperVExtension/src/HyperVExtension/Services/VMGalleryService.cs similarity index 100% rename from HyperVExtension/src/HyperVExtension/Services/VMGalleryService.cs rename to extensions/HyperVExtension/src/HyperVExtension/Services/VMGalleryService.cs diff --git a/HyperVExtension/src/HyperVExtension/Strings/en-US/Resources.resw b/extensions/HyperVExtension/src/HyperVExtension/Strings/en-US/Resources.resw similarity index 89% rename from HyperVExtension/src/HyperVExtension/Strings/en-US/Resources.resw rename to extensions/HyperVExtension/src/HyperVExtension/Strings/en-US/Resources.resw index b05d017339..6455f4e7e7 100644 --- a/HyperVExtension/src/HyperVExtension/Strings/en-US/Resources.resw +++ b/extensions/HyperVExtension/src/HyperVExtension/Strings/en-US/Resources.resw @@ -154,7 +154,7 @@ Error text for when we fail to create the file that the disk image will be downloaded into - Unable to perform the requested operation. Check the Dev Home Hyper-V extension's log files for more information. + Unable to perform the requested operation. Check the Dev Home Hyper-V Extension's log file: {0} for more information. Error text for when the hyper-v extension is unable to perform an operation the user requests @@ -337,4 +337,24 @@ Maximum attempts reached Error description text shown in the dialog asking to log in to Hyper-V VM after the last attempt. + + User {0} is not a member of the Hyper-V Administrators group. If you have already added the user to the group you may need to log off and back on again. + Locked="{Hyper-V}" Error text for when the user is not in the Hyper-V adminstrators group. {0} is the username of the user + + + The Hyper-V Feature is not present on this SKU of Windows. + Locked="{Hyper-V}" Error text to show the user that the Hyper-V feature is not available on the current SKU of Windows + + + The Hyper-V Feature is disabled. Please enable Hyper-V and reboot. + Locked="{Hyper-V}" Error text to show the user that the Hyper-V feature is disabled + + + The Hyper-V Feature is in an unknown state. Unable to perform any Hyper-V functionality. + Locked="{Hyper-V}" Error text to show the user that the state of the Hyper-V feature is unknown + + + Unable to start the virtual machine management service. The Hyper-V feature may have been recently enabled but a reboot has not been initiated. Please check that the service exists in the Windows Services snap-in if a reboot has already been done. + {Locked="{Hyper-V}", "{Windows}"} Error text to show the user that virtual machine management service can't be started by the extension + \ No newline at end of file diff --git a/HyperVExtension/src/HyperVExtension/Templates/DarkCaution.png b/extensions/HyperVExtension/src/HyperVExtension/Templates/DarkCaution.png similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/DarkCaution.png rename to extensions/HyperVExtension/src/HyperVExtension/Templates/DarkCaution.png diff --git a/HyperVExtension/src/HyperVExtension/Templates/DarkError.png b/extensions/HyperVExtension/src/HyperVExtension/Templates/DarkError.png similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/DarkError.png rename to extensions/HyperVExtension/src/HyperVExtension/Templates/DarkError.png diff --git a/HyperVExtension/src/HyperVExtension/Templates/DarkSuccess.png b/extensions/HyperVExtension/src/HyperVExtension/Templates/DarkSuccess.png similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/DarkSuccess.png rename to extensions/HyperVExtension/src/HyperVExtension/Templates/DarkSuccess.png diff --git a/HyperVExtension/src/HyperVExtension/Templates/InitialVMGalleryCreationForm.json b/extensions/HyperVExtension/src/HyperVExtension/Templates/InitialVMGalleryCreationForm.json similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/InitialVMGalleryCreationForm.json rename to extensions/HyperVExtension/src/HyperVExtension/Templates/InitialVMGalleryCreationForm.json diff --git a/HyperVExtension/src/HyperVExtension/Templates/LightCaution.png b/extensions/HyperVExtension/src/HyperVExtension/Templates/LightCaution.png similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/LightCaution.png rename to extensions/HyperVExtension/src/HyperVExtension/Templates/LightCaution.png diff --git a/HyperVExtension/src/HyperVExtension/Templates/LightError.png b/extensions/HyperVExtension/src/HyperVExtension/Templates/LightError.png similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/LightError.png rename to extensions/HyperVExtension/src/HyperVExtension/Templates/LightError.png diff --git a/HyperVExtension/src/HyperVExtension/Templates/LightSuccess.png b/extensions/HyperVExtension/src/HyperVExtension/Templates/LightSuccess.png similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/LightSuccess.png rename to extensions/HyperVExtension/src/HyperVExtension/Templates/LightSuccess.png diff --git a/HyperVExtension/src/HyperVExtension/Templates/ReviewFormForVMGallery.json b/extensions/HyperVExtension/src/HyperVExtension/Templates/ReviewFormForVMGallery.json similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/ReviewFormForVMGallery.json rename to extensions/HyperVExtension/src/HyperVExtension/Templates/ReviewFormForVMGallery.json diff --git a/HyperVExtension/src/HyperVExtension/Templates/VmCredentialAdaptiveCardTemplate.json b/extensions/HyperVExtension/src/HyperVExtension/Templates/VmCredentialAdaptiveCardTemplate.json similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/VmCredentialAdaptiveCardTemplate.json rename to extensions/HyperVExtension/src/HyperVExtension/Templates/VmCredentialAdaptiveCardTemplate.json diff --git a/HyperVExtension/src/HyperVExtension/Templates/WaitForLoginAdaptiveCardTemplate.json b/extensions/HyperVExtension/src/HyperVExtension/Templates/WaitForLoginAdaptiveCardTemplate.json similarity index 100% rename from HyperVExtension/src/HyperVExtension/Templates/WaitForLoginAdaptiveCardTemplate.json rename to extensions/HyperVExtension/src/HyperVExtension/Templates/WaitForLoginAdaptiveCardTemplate.json diff --git a/HyperVExtension/src/HyperVExtensionServer/HyperVExtensionServer.csproj b/extensions/HyperVExtension/src/HyperVExtensionServer/HyperVExtensionServer.csproj similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/HyperVExtensionServer.csproj rename to extensions/HyperVExtension/src/HyperVExtensionServer/HyperVExtensionServer.csproj diff --git a/HyperVExtension/src/HyperVExtensionServer/Program.cs b/extensions/HyperVExtension/src/HyperVExtensionServer/Program.cs similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/Program.cs rename to extensions/HyperVExtension/src/HyperVExtensionServer/Program.cs diff --git a/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-arm64.pubxml b/extensions/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-arm64.pubxml similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-arm64.pubxml rename to extensions/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-arm64.pubxml diff --git a/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x64.pubxml b/extensions/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x64.pubxml similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x64.pubxml rename to extensions/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x64.pubxml diff --git a/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x86.pubxml b/extensions/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x86.pubxml similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x86.pubxml rename to extensions/HyperVExtension/src/HyperVExtensionServer/Properties/PublishProfiles/win-x86.pubxml diff --git a/HyperVExtension/src/HyperVExtensionServer/Properties/launchSettings.json b/extensions/HyperVExtension/src/HyperVExtensionServer/Properties/launchSettings.json similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/Properties/launchSettings.json rename to extensions/HyperVExtension/src/HyperVExtensionServer/Properties/launchSettings.json diff --git a/HyperVExtension/src/HyperVExtensionServer/Strings/en-us/Resources.resw b/extensions/HyperVExtension/src/HyperVExtensionServer/Strings/en-us/Resources.resw similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/Strings/en-us/Resources.resw rename to extensions/HyperVExtension/src/HyperVExtensionServer/Strings/en-us/Resources.resw diff --git a/HyperVExtension/src/HyperVExtensionServer/appsettings_hyperv.json b/extensions/HyperVExtension/src/HyperVExtensionServer/appsettings_hyperv.json similarity index 100% rename from HyperVExtension/src/HyperVExtensionServer/appsettings_hyperv.json rename to extensions/HyperVExtension/src/HyperVExtensionServer/appsettings_hyperv.json diff --git a/HyperVExtension/src/Telemetry/HyperVExtension.Telemetry.csproj b/extensions/HyperVExtension/src/Telemetry/HyperVExtension.Telemetry.csproj similarity index 100% rename from HyperVExtension/src/Telemetry/HyperVExtension.Telemetry.csproj rename to extensions/HyperVExtension/src/Telemetry/HyperVExtension.Telemetry.csproj diff --git a/HyperVExtension/src/Telemetry/ILogger.cs b/extensions/HyperVExtension/src/Telemetry/ILogger.cs similarity index 100% rename from HyperVExtension/src/Telemetry/ILogger.cs rename to extensions/HyperVExtension/src/Telemetry/ILogger.cs diff --git a/HyperVExtension/src/Telemetry/LogLevel.cs b/extensions/HyperVExtension/src/Telemetry/LogLevel.cs similarity index 100% rename from HyperVExtension/src/Telemetry/LogLevel.cs rename to extensions/HyperVExtension/src/Telemetry/LogLevel.cs diff --git a/HyperVExtension/src/Telemetry/Logger.cs b/extensions/HyperVExtension/src/Telemetry/Logger.cs similarity index 100% rename from HyperVExtension/src/Telemetry/Logger.cs rename to extensions/HyperVExtension/src/Telemetry/Logger.cs diff --git a/HyperVExtension/src/Telemetry/LoggerFactory.cs b/extensions/HyperVExtension/src/Telemetry/LoggerFactory.cs similarity index 100% rename from HyperVExtension/src/Telemetry/LoggerFactory.cs rename to extensions/HyperVExtension/src/Telemetry/LoggerFactory.cs diff --git a/HyperVExtension/src/Telemetry/TelemetryEventSource.cs b/extensions/HyperVExtension/src/Telemetry/TelemetryEventSource.cs similarity index 100% rename from HyperVExtension/src/Telemetry/TelemetryEventSource.cs rename to extensions/HyperVExtension/src/Telemetry/TelemetryEventSource.cs diff --git a/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgent.Test.csproj b/extensions/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgent.Test.csproj similarity index 83% rename from HyperVExtension/test/DevSetupAgent.Test/DevSetupAgent.Test.csproj rename to extensions/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgent.Test.csproj index d0d2d2c48b..569a042b29 100644 --- a/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgent.Test.csproj +++ b/extensions/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgent.Test.csproj @@ -14,7 +14,6 @@ - @@ -29,6 +28,6 @@ - + diff --git a/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgentIntegrationTest.cs b/extensions/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgentIntegrationTest.cs similarity index 75% rename from HyperVExtension/test/DevSetupAgent.Test/DevSetupAgentIntegrationTest.cs rename to extensions/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgentIntegrationTest.cs index fa208d0980..86450250d5 100644 --- a/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgentIntegrationTest.cs +++ b/extensions/HyperVExtension/test/DevSetupAgent.Test/DevSetupAgentIntegrationTest.cs @@ -59,9 +59,10 @@ public void TestGetVersionRequest() { var registryChannelSettings = TestHost.GetService(); var inputkey = Registry.CurrentUser.CreateSubKey(registryChannelSettings.FromHostRegistryKeyPath); - var messageId = "DevSetup{10000000-1000-1000-1000-100000000000}"; - var messageName = messageId + "~1~1"; - inputkey.SetValue(messageName, $"{{\"RequestId\": \"{messageId}\", \"RequestType\": \"GetVersion\", \"Version\": 1, \"Timestamp\":\"2023-11-21T08:08:58.6287789Z\"}}"); + var communicationId = "DevSetup{1}"; + var requestId = "DevSetup{10000000-1000-1000-1000-100000000000}"; + var messageName = communicationId + "~1~1"; + inputkey.SetValue(messageName, $"{{\"RequestId\": \"{requestId}\", \"RequestType\": \"GetVersion\", \"Version\": 1, \"Timestamp\":\"2023-11-21T08:08:58.6287789Z\"}}"); Thread.Sleep(3000); @@ -69,7 +70,36 @@ public void TestGetVersionRequest() var responseMessage = (string?)outputKey.GetValue(messageName); Assert.IsNotNull(responseMessage); var json = JsonDocument.Parse(responseMessage).RootElement; - Assert.AreEqual(messageId, json.GetProperty("RequestId").GetString()); + Assert.AreEqual(requestId, json.GetProperty("RequestId").GetString()); + Assert.AreEqual(0, json.GetProperty("Status").GetInt32()); + + // Check that the timestamp is within 5 second of the current + var time = json.GetProperty("Timestamp").GetDateTime(); + var now = DateTime.UtcNow; + Assert.IsTrue(now - time < TimeSpan.FromSeconds(5)); + + var version = json.GetProperty("Version").GetInt32(); + Assert.AreEqual(1, version); + } + + [TestMethod] + public void TestGetStateRequest() + { + var registryChannelSettings = TestHost.GetService(); + var inputkey = Registry.CurrentUser.CreateSubKey(registryChannelSettings.FromHostRegistryKeyPath); + var communicationId = "DevSetup{1}"; + var requestId = "DevSetup{10000000-1000-1000-1000-100000000000}"; + var messageName = communicationId + "~1~1"; + inputkey.SetValue(messageName, $"{{\"RequestId\": \"{requestId}\", \"RequestType\": \"GetState\", \"Version\": 1, \"Timestamp\":\"2023-11-21T08:08:58.6287789Z\"}}"); + + Thread.Sleep(3000); + + var outputKey = Registry.CurrentUser.CreateSubKey(registryChannelSettings.ToHostRegistryKeyPath); + var responseMessage = (string?)outputKey.GetValue(messageName); + Assert.IsNotNull(responseMessage); + var json = JsonDocument.Parse(responseMessage).RootElement; + Assert.AreEqual(requestId, json.GetProperty("RequestId").GetString()); + Assert.AreEqual(0, json.GetProperty("Status").GetInt32()); // Check that the timestamp is within 5 second of the current var time = json.GetProperty("Timestamp").GetDateTime(); @@ -79,7 +109,8 @@ public void TestGetVersionRequest() var version = json.GetProperty("Version").GetInt32(); Assert.AreEqual(1, version); - // TODO: Check that the response message is deleted + var state = json.GetProperty("StateData").GetString(); + Assert.AreEqual($"{{\"RequestsInQueue\":[]}}", state); } /// @@ -92,17 +123,18 @@ public void TestIsUserLoggedInRequest() { var registryChannelSettings = TestHost.GetService(); var inputkey = Registry.CurrentUser.CreateSubKey(registryChannelSettings.FromHostRegistryKeyPath); - var messageId = "DevSetup{10000000-1000-1000-1000-100000000000}"; - var messageName = messageId + "~1~1"; - inputkey.SetValue(messageName, $"{{\"RequestId\": \"{messageId}\", \"RequestType\": \"IsUserLoggedIn\", \"Version\": 1, \"Timestamp\":\"2023-11-21T08:08:58.6287789Z\"}}"); + var communicationId = "DevSetup{1}"; + var requestId = "DevSetup{10000000-1000-1000-1000-100000000000}"; + var messageName = communicationId + "~1~1"; + inputkey.SetValue(messageName, $"{{\"RequestId\": \"{requestId}\", \"RequestType\": \"IsUserLoggedIn\", \"Version\": 1, \"Timestamp\":\"2023-11-21T08:08:58.6287789Z\"}}"); - Thread.Sleep(3000); + Thread.Sleep(5000); var outputKey = Registry.CurrentUser.CreateSubKey(registryChannelSettings.ToHostRegistryKeyPath); var responseMessage = (string?)outputKey.GetValue(messageName); Assert.IsNotNull(responseMessage); var json = JsonDocument.Parse(responseMessage).RootElement; - Assert.AreEqual(messageId, json.GetProperty("RequestId").GetString()); + Assert.AreEqual(requestId, json.GetProperty("RequestId").GetString()); // Check that the timestamp is within 5 second of the current var time = json.GetProperty("Timestamp").GetDateTime(); @@ -118,8 +150,9 @@ public void TestInvalidRequest() { var registryChannelSettings = TestHost.GetService(); var inputkey = Registry.CurrentUser.CreateSubKey(registryChannelSettings.FromHostRegistryKeyPath); + var communicationId = "DevSetup{1}"; var messageId = "DevSetup{10000000-1000-1000-1000-200000000000}"; - var messageName = messageId + "~1~1"; + var messageName = communicationId + "~1~1"; inputkey.SetValue(messageName, $"{{\"RequestId\": \"{messageId}\", \"Version\": 1, \"Timestamp\":\"2023-11-21T08:08:58.6287789Z\"}}"); Thread.Sleep(3000); @@ -166,12 +199,13 @@ public void TestConfigureRequest() Ensure: Present configurationVersion: 0.2.0"; - var noNewLinesYaml = yaml.Replace(System.Environment.NewLine, "\\n"); + var noNewLinesYaml = yaml.Replace(Environment.NewLine, "\\n"); var registryChannelSettings = TestHost.GetService(); var inputkey = Registry.CurrentUser.CreateSubKey(registryChannelSettings.FromHostRegistryKeyPath); + var communicationId = "DevSetup{1}"; var messageId = "DevSetup{10000000-1000-1000-1000-100000000001}"; - var messageName = messageId + "~1~1"; + var messageName = communicationId + "~1~1"; var requestData = $"{{\"RequestId\": \"{messageId}\"," + $" \"RequestType\": \"Configure\", \"Version\": 1, \"Timestamp\":\"2023-11-21T08:08:58.6287789Z\"," + diff --git a/HyperVExtension/test/DevSetupAgent.Test/GlobalUsings.cs b/extensions/HyperVExtension/test/DevSetupAgent.Test/GlobalUsings.cs similarity index 100% rename from HyperVExtension/test/DevSetupAgent.Test/GlobalUsings.cs rename to extensions/HyperVExtension/test/DevSetupAgent.Test/GlobalUsings.cs diff --git a/HyperVExtension/test/DevSetupAgent.Test/TestRegistryChannelSettings.cs b/extensions/HyperVExtension/test/DevSetupAgent.Test/TestRegistryChannelSettings.cs similarity index 100% rename from HyperVExtension/test/DevSetupAgent.Test/TestRegistryChannelSettings.cs rename to extensions/HyperVExtension/test/DevSetupAgent.Test/TestRegistryChannelSettings.cs diff --git a/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngine.Test.csproj b/extensions/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngine.Test.csproj similarity index 86% rename from HyperVExtension/test/DevSetupEngine.Test/DevSetupEngine.Test.csproj rename to extensions/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngine.Test.csproj index 768c60e6a7..caeb673ffe 100644 --- a/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngine.Test.csproj +++ b/extensions/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngine.Test.csproj @@ -15,8 +15,7 @@ - - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -36,6 +35,6 @@ - + diff --git a/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngineIntegrationTest.cs b/extensions/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngineIntegrationTest.cs similarity index 100% rename from HyperVExtension/test/DevSetupEngine.Test/DevSetupEngineIntegrationTest.cs rename to extensions/HyperVExtension/test/DevSetupEngine.Test/DevSetupEngineIntegrationTest.cs diff --git a/HyperVExtension/test/DevSetupEngine.Test/GlobalUsings.cs b/extensions/HyperVExtension/test/DevSetupEngine.Test/GlobalUsings.cs similarity index 100% rename from HyperVExtension/test/DevSetupEngine.Test/GlobalUsings.cs rename to extensions/HyperVExtension/test/DevSetupEngine.Test/GlobalUsings.cs diff --git a/HyperVExtension/test/DevSetupEngine.Test/IHostExtensions.cs b/extensions/HyperVExtension/test/DevSetupEngine.Test/IHostExtensions.cs similarity index 100% rename from HyperVExtension/test/DevSetupEngine.Test/IHostExtensions.cs rename to extensions/HyperVExtension/test/DevSetupEngine.Test/IHostExtensions.cs diff --git a/HyperVExtension/test/DevSetupEngine.Test/NativeMethods.txt b/extensions/HyperVExtension/test/DevSetupEngine.Test/NativeMethods.txt similarity index 100% rename from HyperVExtension/test/DevSetupEngine.Test/NativeMethods.txt rename to extensions/HyperVExtension/test/DevSetupEngine.Test/NativeMethods.txt diff --git a/HyperVExtension/test/HyperVExtension/Assets/6CFDC8E5163679E32B9886CEEACEB95F8919B20799CA8E5A6207B9F72EFEFD40.zip b/extensions/HyperVExtension/test/HyperVExtension/Assets/6CFDC8E5163679E32B9886CEEACEB95F8919B20799CA8E5A6207B9F72EFEFD40.zip similarity index 100% rename from HyperVExtension/test/HyperVExtension/Assets/6CFDC8E5163679E32B9886CEEACEB95F8919B20799CA8E5A6207B9F72EFEFD40.zip rename to extensions/HyperVExtension/test/HyperVExtension/Assets/6CFDC8E5163679E32B9886CEEACEB95F8919B20799CA8E5A6207B9F72EFEFD40.zip diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtension.UnitTest.csproj b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtension.UnitTest.csproj similarity index 82% rename from HyperVExtension/test/HyperVExtension/HyperVExtension.UnitTest.csproj rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtension.UnitTest.csproj index ab0eddaa15..40bae818a2 100644 --- a/HyperVExtension/test/HyperVExtension/HyperVExtension.UnitTest.csproj +++ b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtension.UnitTest.csproj @@ -12,15 +12,11 @@ true - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionIntegrationTest.cs b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionIntegrationTest.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionIntegrationTest.cs rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionIntegrationTest.cs diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionTestsBase.cs b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionTestsBase.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionTestsBase.cs rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVExtensionTestsBase.cs diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVManagerTest.cs b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVManagerTest.cs similarity index 89% rename from HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVManagerTest.cs rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVManagerTest.cs index ef36c64bf4..3dbd7dc015 100644 --- a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVManagerTest.cs +++ b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVManagerTest.cs @@ -15,42 +15,6 @@ namespace HyperVExtension.UnitTest.HyperVExtensionTests.Services; [TestClass] public class HyperVManagerTest : HyperVExtensionTestsBase { - /// - /// Gets common PowerShell results for loading the Hyper-V module and starting the VM management service. - /// Use this when you need to mock functionality that uses the Hyper-V Manager - /// - [TestMethod] - public void IsHyperVModuleLoadedReturnsFalseWhenModuleNotLoaded() - { - // Arrange - SetupHyperVTestMethod(string.Empty, ServiceControllerStatus.Running); - SetupPowerShellSessionInvokeResults() - .Returns(() => { return CreatePSObjectCollection(PowerShellHyperVModule); }); - - // Act - var hyperVManager = TestHost.GetService(); - var actualValue = hyperVManager.IsHyperVModuleLoaded(); - - // Assert - Assert.IsFalse(actualValue); - } - - [TestMethod] - public void IsHyperVModuleLoadedReturnsTrueWhenModuleIsLoaded() - { - // Arrange - SetupHyperVTestMethod(HyperVStrings.HyperVModuleName, ServiceControllerStatus.Running); - var hyperVManager = TestHost.GetService(); - SetupPowerShellSessionInvokeResults() - .Returns(() => { return CreatePSObjectCollection(PowerShellHyperVModule); }); - - // Act - var actualValue = hyperVManager.IsHyperVModuleLoaded(); - - // Assert - Assert.IsTrue(actualValue); - } - [TestMethod] [ExpectedException(typeof(HyperVAdminGroupException))] public void StartVirtualMachineManagementServiceFailsWhenUserNotInHyperVAdminGroup() diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVProviderTests.cs b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVProviderTests.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVProviderTests.cs rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVProviderTests.cs diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVVirtualMachineTest.cs b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVVirtualMachineTest.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVVirtualMachineTest.cs rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/HyperVVirtualMachineTest.cs diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/PowerShellServiceTest.cs b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/PowerShellServiceTest.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/PowerShellServiceTest.cs rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/PowerShellServiceTest.cs diff --git a/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/VMGalleryServiceTests.cs b/extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/VMGalleryServiceTests.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/VMGalleryServiceTests.cs rename to extensions/HyperVExtension/test/HyperVExtension/HyperVExtensionTests/Services/VMGalleryServiceTests.cs diff --git a/HyperVExtension/test/HyperVExtension/Initialize.cs b/extensions/HyperVExtension/test/HyperVExtension/Initialize.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/Initialize.cs rename to extensions/HyperVExtension/test/HyperVExtension/Initialize.cs diff --git a/HyperVExtension/test/HyperVExtension/Mocks/DownloaderServiceMock.cs b/extensions/HyperVExtension/test/HyperVExtension/Mocks/DownloaderServiceMock.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/Mocks/DownloaderServiceMock.cs rename to extensions/HyperVExtension/test/HyperVExtension/Mocks/DownloaderServiceMock.cs diff --git a/HyperVExtension/test/HyperVExtension/Mocks/PSCustomObjectMock.cs b/extensions/HyperVExtension/test/HyperVExtension/Mocks/PSCustomObjectMock.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/Mocks/PSCustomObjectMock.cs rename to extensions/HyperVExtension/test/HyperVExtension/Mocks/PSCustomObjectMock.cs diff --git a/HyperVExtension/test/HyperVExtension/Mocks/PowerShellSessionMock.cs b/extensions/HyperVExtension/test/HyperVExtension/Mocks/PowerShellSessionMock.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/Mocks/PowerShellSessionMock.cs rename to extensions/HyperVExtension/test/HyperVExtension/Mocks/PowerShellSessionMock.cs diff --git a/HyperVExtension/test/HyperVExtension/Mocks/WindowsIdentityServiceMock.cs b/extensions/HyperVExtension/test/HyperVExtension/Mocks/WindowsIdentityServiceMock.cs similarity index 78% rename from HyperVExtension/test/HyperVExtension/Mocks/WindowsIdentityServiceMock.cs rename to extensions/HyperVExtension/test/HyperVExtension/Mocks/WindowsIdentityServiceMock.cs index 59565aa423..006b2dfaa7 100644 --- a/HyperVExtension/test/HyperVExtension/Mocks/WindowsIdentityServiceMock.cs +++ b/extensions/HyperVExtension/test/HyperVExtension/Mocks/WindowsIdentityServiceMock.cs @@ -10,6 +10,8 @@ namespace HyperVExtension.UnitTest.Mocks; public class WindowsIdentityServiceMock : IWindowsIdentityService { + private const string MockedUserName = "MockedUser"; + public Mock WindowsIdentityWrapperMock { get; set; } = new(); public IdentityReferenceCollection WindowsIdentityGroups { get; set; } = new(); @@ -18,7 +20,8 @@ public class WindowsIdentityServiceMock : IWindowsIdentityService public WindowsIdentityServiceMock() { - WindowsIdentityWrapperMock.Setup(x => x.Groups).Returns(WindowsIdentityGroups); + WindowsIdentityWrapperMock.Setup(wrapper => wrapper.Groups).Returns(WindowsIdentityGroups); + WindowsIdentityWrapperMock.Setup(wrapper => wrapper.UserName).Returns(MockedUserName); } public WindowsIdentityWrapper GetCurrentWindowsIdentity() diff --git a/HyperVExtension/test/HyperVExtension/Mocks/WindowsServiceControllerMock.cs b/extensions/HyperVExtension/test/HyperVExtension/Mocks/WindowsServiceControllerMock.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/Mocks/WindowsServiceControllerMock.cs rename to extensions/HyperVExtension/test/HyperVExtension/Mocks/WindowsServiceControllerMock.cs diff --git a/HyperVExtension/test/HyperVExtension/README.md b/extensions/HyperVExtension/test/HyperVExtension/README.md similarity index 100% rename from HyperVExtension/test/HyperVExtension/README.md rename to extensions/HyperVExtension/test/HyperVExtension/README.md diff --git a/HyperVExtension/test/HyperVExtension/TestClass.cs b/extensions/HyperVExtension/test/HyperVExtension/TestClass.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/TestClass.cs rename to extensions/HyperVExtension/test/HyperVExtension/TestClass.cs diff --git a/HyperVExtension/test/HyperVExtension/Usings.cs b/extensions/HyperVExtension/test/HyperVExtension/Usings.cs similarity index 100% rename from HyperVExtension/test/HyperVExtension/Usings.cs rename to extensions/HyperVExtension/test/HyperVExtension/Usings.cs diff --git a/extensions/SampleExtension/SampleExtension.sln b/extensions/SampleExtension/SampleExtension.sln index 08d45e7229..1a2ad123fd 100644 --- a/extensions/SampleExtension/SampleExtension.sln +++ b/extensions/SampleExtension/SampleExtension.sln @@ -9,25 +9,20 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleExtension", "SampleEx EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ExtensionSdk", "ExtensionSdk", "{A4E5B553-54A3-4063-8186-6CCE376CE195}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.Windows.DevHome.SDK", "..\extensionsdk\Microsoft.Windows.DevHome.SDK\Microsoft.Windows.DevHome.SDK.vcxproj", "{295DD37E-C85D-4B08-AAFE-7381FA890463}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.Windows.DevHome.SDK", "..\..\extensionsdk\Microsoft.Windows.DevHome.SDK\Microsoft.Windows.DevHome.SDK.vcxproj", "{295DD37E-C85D-4B08-AAFE-7381FA890463}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.DevHome.SDK.Lib", "..\extensionsdk\Microsoft.Windows.DevHome.SDK.Lib\Microsoft.Windows.DevHome.SDK.Lib.csproj", "{CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Windows.DevHome.SDK.Lib", "..\..\extensionsdk\Microsoft.Windows.DevHome.SDK.Lib\Microsoft.Windows.DevHome.SDK.Lib.csproj", "{CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|AnyCPU = Debug|AnyCPU Debug|arm64 = Debug|arm64 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Release|AnyCPU = Release|AnyCPU Release|arm64 = Release|arm64 Release|x64 = Release|x64 Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|AnyCPU.ActiveCfg = Debug|x64 - {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|AnyCPU.Build.0 = Debug|x64 - {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|AnyCPU.Deploy.0 = Debug|x64 {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|arm64.ActiveCfg = Debug|arm64 {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|arm64.Build.0 = Debug|arm64 {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|arm64.Deploy.0 = Debug|arm64 @@ -37,9 +32,6 @@ Global {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|x86.ActiveCfg = Debug|x86 {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|x86.Build.0 = Debug|x86 {81215577-330C-4EAC-B9C0-574B2176ED18}.Debug|x86.Deploy.0 = Debug|x86 - {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|AnyCPU.ActiveCfg = Release|x64 - {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|AnyCPU.Build.0 = Release|x64 - {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|AnyCPU.Deploy.0 = Release|x64 {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|arm64.ActiveCfg = Release|arm64 {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|arm64.Build.0 = Release|arm64 {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|arm64.Deploy.0 = Release|arm64 @@ -49,32 +41,24 @@ Global {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|x86.ActiveCfg = Release|x86 {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|x86.Build.0 = Release|x86 {81215577-330C-4EAC-B9C0-574B2176ED18}.Release|x86.Deploy.0 = Release|x86 - {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|AnyCPU.ActiveCfg = Debug|x64 - {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|AnyCPU.Build.0 = Debug|x64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|arm64.ActiveCfg = Debug|ARM64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|arm64.Build.0 = Debug|ARM64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|x64.ActiveCfg = Debug|x64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|x64.Build.0 = Debug|x64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|x86.ActiveCfg = Debug|Win32 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Debug|x86.Build.0 = Debug|Win32 - {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|AnyCPU.ActiveCfg = Release|x64 - {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|AnyCPU.Build.0 = Release|x64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|arm64.ActiveCfg = Release|ARM64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|arm64.Build.0 = Release|ARM64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|x64.ActiveCfg = Release|x64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|x64.Build.0 = Release|x64 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|x86.ActiveCfg = Release|Win32 {295DD37E-C85D-4B08-AAFE-7381FA890463}.Release|x86.Build.0 = Release|Win32 - {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|AnyCPU.ActiveCfg = Debug|AnyCPU - {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|AnyCPU.Build.0 = Debug|AnyCPU {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|arm64.ActiveCfg = Debug|ARM64 {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|arm64.Build.0 = Debug|ARM64 {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|x64.ActiveCfg = Debug|x64 {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|x64.Build.0 = Debug|x64 {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|x86.ActiveCfg = Debug|x86 {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Debug|x86.Build.0 = Debug|x86 - {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Release|AnyCPU.ActiveCfg = Release|AnyCPU - {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Release|AnyCPU.Build.0 = Release|AnyCPU {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Release|arm64.ActiveCfg = Release|ARM64 {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Release|arm64.Build.0 = Release|ARM64 {CAD6D70B-6A44-4CDD-86E8-9BD64BD40F39}.Release|x64.ActiveCfg = Release|x64 diff --git a/extensionsdk/Directory.Build.props b/extensionsdk/Directory.Build.props index 7ad4f7baa4..275497c199 100644 --- a/extensionsdk/Directory.Build.props +++ b/extensionsdk/Directory.Build.props @@ -7,7 +7,7 @@ Dev Home SDK Microsoft Corporation en-US - x64;x86;ARM64;AnyCPU + x64;x86;ARM64 DevHome true Recommended diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK.Lib/Microsoft.Windows.DevHome.SDK.Lib.csproj b/extensionsdk/Microsoft.Windows.DevHome.SDK.Lib/Microsoft.Windows.DevHome.SDK.Lib.csproj index 9902219852..f91b812ac3 100644 --- a/extensionsdk/Microsoft.Windows.DevHome.SDK.Lib/Microsoft.Windows.DevHome.SDK.Lib.csproj +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK.Lib/Microsoft.Windows.DevHome.SDK.Lib.csproj @@ -9,6 +9,8 @@ enable enable pdbonly + + 0436 diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK.Lib/Uri.cs b/extensionsdk/Microsoft.Windows.DevHome.SDK.Lib/Uri.cs new file mode 100644 index 0000000000..2b47b51ce8 --- /dev/null +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK.Lib/Uri.cs @@ -0,0 +1,182 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// Copy of https://github.com/microsoft/CsWinRT/blob/2.0.4.231013.1/src/WinRT.Runtime/Projections/Uri.cs +// with bug fixes already in staging/AOT branch. Remove once updated CsWinRT is available. + +#nullable disable + +using System; +using System.Runtime.InteropServices; +using WinRT; +using WinRT.Interop; + +namespace ABI.Windows.Foundation +{ + [Guid("9E365E57-48B2-4160-956F-C7385120BBFC")] + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct IUriRuntimeClassVftbl + { + internal IInspectable.Vftbl IInspectableVftbl; + public IntPtr get_AbsoluteUri_0; + public IntPtr get_DisplayUri_1; + public IntPtr get_Domain_2; + public IntPtr get_Extension_3; + public IntPtr get_Fragment_4; + public IntPtr get_Host_5; + public IntPtr get_Password_6; + public IntPtr get_Path_7; + public IntPtr get_Query_8; + public IntPtr get_QueryParsed_9; + public void* _get_RawUri_10; + public delegate* unmanaged[Stdcall] get_RawUri_10 => (delegate* unmanaged[Stdcall])_get_RawUri_10; + public IntPtr get_SchemeName_11; + public IntPtr get_UserName_12; + public IntPtr get_Port_13; + public IntPtr get_Suspicious_14; + public IntPtr Equals_15; + public IntPtr CombineUri_16; + } +} + +namespace ABI.System +{ + + [global::WinRT.ObjectReferenceWrapper(nameof(_obj))] + [Guid("44A9796F-723E-4FDF-A218-033E75B0C084")] + internal sealed class WinRTUriRuntimeClassFactory + { + [Guid("44A9796F-723E-4FDF-A218-033E75B0C084")] + [StructLayout(LayoutKind.Sequential)] + public unsafe struct Vftbl + { + internal IInspectable.Vftbl IInspectableVftbl; + private void* _CreateUri_0; + public delegate* unmanaged[Stdcall] CreateUri_0 => (delegate* unmanaged[Stdcall])_CreateUri_0; + public IntPtr _CreateWithRelativeUri; + } + public static ObjectReference FromAbi(IntPtr thisPtr) => ObjectReference.FromAbi(thisPtr); + + public static implicit operator WinRTUriRuntimeClassFactory(IObjectReference obj) => (obj != null) ? new WinRTUriRuntimeClassFactory(obj) : null; + public static implicit operator WinRTUriRuntimeClassFactory(ObjectReference obj) => (obj != null) ? new WinRTUriRuntimeClassFactory(obj) : null; + private readonly ObjectReference _obj; + public IntPtr ThisPtr => _obj.ThisPtr; + public ObjectReference AsInterface() => _obj.As(); + public A As() => _obj.AsType(); + public WinRTUriRuntimeClassFactory(IObjectReference obj) : this(obj.As()) { } + public WinRTUriRuntimeClassFactory(ObjectReference obj) + { + _obj = obj; + } + + public unsafe IObjectReference CreateUri(string uri) + { + IntPtr __retval = default; + MarshalString.Pinnable __uri = new(uri); + fixed (void* ___uri = __uri) + { + global::WinRT.ExceptionHelpers.ThrowExceptionForHR(_obj.Vftbl.CreateUri_0(ThisPtr, MarshalString.GetAbi(ref __uri), out __retval)); + return ObjectReference.Attach(ref __retval); + } + } + + public unsafe ObjectReferenceValue CreateUriForMarshaling(string uri) + { + IntPtr __retval = default; + MarshalString.Pinnable __uri = new(uri); + fixed (void* ___uri = __uri) + { + global::WinRT.ExceptionHelpers.ThrowExceptionForHR(_obj.Vftbl.CreateUri_0(ThisPtr, MarshalString.GetAbi(ref __uri), out __retval)); + return ObjectReferenceValue.Attach(ref __retval); + } + } + } + + + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct Uri + { + private sealed class ActivationFactory : BaseActivationFactory + { + public ActivationFactory() : base("Windows.Foundation", "Windows.Foundation.Uri") + { + } + + internal static WinRTUriRuntimeClassFactory Instance = + new ActivationFactory()._As(); + } + + public static IObjectReference CreateMarshaler(global::System.Uri value) + { + if (value is null) + { + return null; + } + + return ActivationFactory.Instance.CreateUri(value.OriginalString); + } + + public static ObjectReferenceValue CreateMarshaler2(global::System.Uri value) + { + if (value is null) + { + return new ObjectReferenceValue(); + } + + return ActivationFactory.Instance.CreateUriForMarshaling(value.OriginalString); + } + + public static IntPtr GetAbi(IObjectReference m) => m?.ThisPtr ?? IntPtr.Zero; + + public static global::System.Uri FromAbi(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + { + return null; + } + + IntPtr rawUri = IntPtr.Zero; + try + { + ExceptionHelpers.ThrowExceptionForHR((**(ABI.Windows.Foundation.IUriRuntimeClassVftbl**)ptr).get_RawUri_10(ptr, &rawUri)); + return new global::System.Uri(MarshalString.FromAbi(rawUri)); + } + finally + { + MarshalString.DisposeAbi(rawUri); + } + } + + public static unsafe global::System.Uri[] FromAbiArray(object box) => MarshalInterfaceHelper.FromAbiArray(box, FromAbi); + + public static unsafe void CopyManaged(global::System.Uri o, IntPtr dest) + { + *(IntPtr*)dest.ToPointer() = CreateMarshaler2(o).Detach(); + } + + public static IntPtr FromManaged(global::System.Uri value) + { + if (value is null) + { + return IntPtr.Zero; + } + return CreateMarshaler2(value).Detach(); + } + + public static unsafe MarshalInterfaceHelper.MarshalerArray CreateMarshalerArray(global::System.Uri[] array) => MarshalInterfaceHelper.CreateMarshalerArray2(array, (o) => CreateMarshaler2(o)); + public static (int length, IntPtr data) GetAbiArray(object box) => MarshalInterfaceHelper.GetAbiArray(box); + public static void CopyAbiArray(global::System.Uri[] array, object box) => MarshalInterfaceHelper.CopyAbiArray(array, box, FromAbi); + public static (int length, IntPtr data) FromManagedArray(global::System.Uri[] array) => MarshalInterfaceHelper.FromManagedArray(array, (o) => FromManaged(o)); + public static void DisposeMarshalerArray(MarshalInterfaceHelper.MarshalerArray array) => MarshalInterfaceHelper.DisposeMarshalerArray(array); + public static void DisposeMarshaler(IObjectReference m) { m?.Dispose(); } + public static void DisposeAbi(IntPtr abi) { MarshalInspectable.DisposeAbi(abi); } + public static void DisposeAbiArray(object box) => MarshalInterfaceHelper.DisposeAbiArray(box); + + public static string GetGuidSignature() + { + return "rc(Windows.Foundation.Uri;{9e365e57-48b2-4160-956f-c7385120bbfc})"; + } + } +} + +#nullable restore \ No newline at end of file diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/GetLocalRepositoryResult.cpp b/extensionsdk/Microsoft.Windows.DevHome.SDK/GetLocalRepositoryResult.cpp new file mode 100644 index 0000000000..e0d5414803 --- /dev/null +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/GetLocalRepositoryResult.cpp @@ -0,0 +1,24 @@ +#include "pch.h" +#include "GetLocalRepositoryResult.h" +#include "GetLocalRepositoryResult.g.cpp" + +namespace winrt::Microsoft::Windows::DevHome::SDK::implementation +{ + GetLocalRepositoryResult::GetLocalRepositoryResult(winrt::Microsoft::Windows::DevHome::SDK::ILocalRepository const& repository) : + _repository(repository), _result(ProviderOperationStatus::Success, S_OK, hstring(), hstring()) + { + } + + GetLocalRepositoryResult::GetLocalRepositoryResult(winrt::hresult const& e, hstring const& displayMessage, hstring const& diagnosticText) : + _result(ProviderOperationStatus::Failure, e, displayMessage, diagnosticText) + { + } + winrt::Microsoft::Windows::DevHome::SDK::ILocalRepository GetLocalRepositoryResult::Repository() + { + return _repository; + } + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult GetLocalRepositoryResult::Result() + { + return _result; + } +} \ No newline at end of file diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/GetLocalRepositoryResult.h b/extensionsdk/Microsoft.Windows.DevHome.SDK/GetLocalRepositoryResult.h new file mode 100644 index 0000000000..70fa8d9ad7 --- /dev/null +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/GetLocalRepositoryResult.h @@ -0,0 +1,25 @@ +#pragma once +#include "GetLocalRepositoryResult.g.h" + +namespace winrt::Microsoft::Windows::DevHome::SDK::implementation +{ + struct GetLocalRepositoryResult : GetLocalRepositoryResultT + { + GetLocalRepositoryResult() = default; + + const explicit GetLocalRepositoryResult(winrt::Microsoft::Windows::DevHome::SDK::ILocalRepository const& repository); + const GetLocalRepositoryResult(winrt::hresult const& e, hstring const& displayMessage, hstring const& diagnosticText); + winrt::Microsoft::Windows::DevHome::SDK::ILocalRepository Repository(); + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult Result(); + + private: + winrt::Microsoft::Windows::DevHome::SDK::ILocalRepository _repository; + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult _result; + }; +} +namespace winrt::Microsoft::Windows::DevHome::SDK::factory_implementation +{ + struct GetLocalRepositoryResult : GetLocalRepositoryResultT + { + }; +} diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.idl b/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.idl index 724b904276..3f112c4e8d 100644 --- a/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.idl +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.idl @@ -1,6 +1,6 @@ namespace Microsoft.Windows.DevHome.SDK { - [contractversion(4)] + [contractversion(6)] apicontract DevHomeContract {} [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 1)] @@ -20,6 +20,10 @@ namespace Microsoft.Windows.DevHome.SDK // an object that implements the IComputeSystemProvider interface. [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 2)] ComputeSystem = 4, + + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + QuickStartProject = 5, }; // Definitions for exceptions. @@ -1380,7 +1384,260 @@ namespace Microsoft.Windows.DevHome.SDK // End of Dev Environments feature. + // Begin FileExplorerSourceControlIntegration APIs + + // This interface is responsible for obtaining and relaying information on the repository + // from source control technology + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 5)] + interface ILocalRepository + { + // This function returns the requested information on a relative file path (under a + // tracked repository root folder) from the source control management technology. + // The requested information includes a predefined set of properties FE is aware of. + // These properties can be found inside docs/extensions/LocalRepository/readme.md + Windows.Foundation.Collections.IPropertySet GetProperties(String[] properties, String relativePath); + }; + + // This interface defines the result objects that can be returned to DevHome when it tries to + // obtain an enhanced repository. Enhanced repository is the term given to repositories for + // which File Explorer can display property information from version control technologies. + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 5)] + runtimeclass GetLocalRepositoryResult + { + GetLocalRepositoryResult(ILocalRepository repository); + + GetLocalRepositoryResult(HRESULT e, String displayMessage, String diagnosticText); + + ILocalRepository Repository + { + get; + }; + + ProviderOperationResult Result + { + get; + }; + }; + + // This interface is responsible for obtaining the ILocalRepository object given a root path + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 5)] + interface ILocalRepositoryProvider + { + // The method responsible for validating and returning the ILocalRepository object given its root path + GetLocalRepositoryResult GetRepository(String rootPath); + }; + + // End FileExplorerSourceControlIntegration APIs + + // Beginning of QuickStartProject APIs + + // Used to indicate an application such as an IDE which can be used to launch the generated quick start project. + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + interface IQuickStartProjectHost + { + // Name of the QuickStart project host that shows up on the UI. + String DisplayName + { + get; + }; + + // Uri for icon to represent the QuickStart project host. + // This is currently not shown anywhere but can be shown + // in the future such as on the UI alongside the display name. + // This Uri path needs to be located in a resource.pri file + // and be in the format of the ms-resource:// schema. + // E.g "ms-resource://Contoso.Extension/Files/Extension/Assets/icon.png" + // It is also recommended to be 16x16px for best appearance + // when displayed within the button for launching the project host. + Windows.Foundation.Uri Icon + { + get; + }; + + // Launches the project host for the quick start project that it was created for. + ProviderOperationResult Launch(); + } + + // Used by the extension to get any feedback provided by the user on the generated project. + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + interface IQuickStartProjectResultFeedbackHandler + { + // Handler to get any feedback provided to Dev Home by the user on the generated project. + ProviderOperationResult ProvideFeedback(Boolean isPositive, String feedback); + } + + // Used by the extension to provide information on the generated quickstart project. + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + runtimeclass QuickStartProjectResult + { + // Used when generating the project was successful. + QuickStartProjectResult(IQuickStartProjectHost[] projectHosts, Windows.Foundation.Uri[] referenceSamples); + + // Used when generating the quickstart project was unsuccessful. + // The extension can provide Dev Home with an error message to be displayed in the UI by providing + // a non-empty value for the displayMessage. diagnosticText can be used to send non-localized error + // information back to Dev Home. + QuickStartProjectResult(HRESULT e, String displayMessage, String diagnosticText); + + // Used when generating the project was successful and + // the extension would like to be get any feedback + // provided by the user on it. + static QuickStartProjectResult CreateWithFeedbackHandler(IQuickStartProjectHost[] projectHosts, Windows.Foundation.Uri[] referenceSamples, IQuickStartProjectResultFeedbackHandler feedbackHandler); + + // The array of hosts that support launching the project. + IQuickStartProjectHost[] ProjectHosts + { + get; + }; + + // The result of the operation. This contains the ProviderOperationStatus enum value that tells Dev Home + // whether the result was successful or failed. It is created based on the constructor that was used. + ProviderOperationResult Result + { + get; + }; + + // Used to provide to Dev Home the references / samples that were used + // by the AI in the extension or by the extension itself to generate + // the quick start project. Dev Home shows this to the user as the + // references that this project was generated based on. + Windows.Foundation.Uri[] ReferenceSamples + { + get; + }; + + // Used to provide Dev Home a way to pass feedback back to the + // extension if the user provides one on the generated project. + IQuickStartProjectResultFeedbackHandler FeedbackHandler + { + get; + }; + } + // Passed back to Dev Home to provide the progress in generating a quick start project. + // This is used by Dev Home to show progress to the user while the project is being generated. + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + struct QuickStartProjectProgress + { + // Allows extensions to provide intermediary status for the operation e.g "Generating project". + String DisplayStatus; + // Allows extensions to provide progress for the operation. + // Value should be in the range of 0 through 1.0. + Double Progress; + }; + + // The result object returned to Dev Home when it calls one of the IQuickStartProjectProvider + // CreateAdaptiveCard methods. + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + runtimeclass QuickStartProjectAdaptiveCardResult + { + // Used when retrieving the adaptive card session was successful. + QuickStartProjectAdaptiveCardResult(IExtensionAdaptiveCardSession2 adaptiveCardSession); + + // Used when retrieving the adaptive card session was unsuccessful. + // The extension can provide Dev Home with an error message to be displayed in the UI by providing + // a non-empty value for the displayMessage. diagnosticText can be used to send non-localized error + // information back to Dev Home. + QuickStartProjectAdaptiveCardResult(HRESULT e, String displayMessage, String diagnosticText); + + // The adaptive card session object. + IExtensionAdaptiveCardSession2 AdaptiveCardSession + { + get; + }; + + // The result of the operation. This contains the ProviderOperationStatus enum value that tells Dev Home + // whether the result was successful or failed. It is created based on the constructor that was used. + ProviderOperationResult Result + { + get; + }; + } + + // Extensions implement this and is provided to Dev Home when CreateProjectGenerationOperation is called. + // This allows to have an async operation can be started but also additional context reported back to Dev Home + // as progress is being made such as a detailed log out output through the adaptive card session. + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + interface IQuickStartProjectGenerationOperation + { + // Adaptive card session that can be provided by the extension to supplement + // the progress shown by Dev Home. This can be used where the extension + // may want to provide more progress information such as build output. + // Extension may return null if they don't want to show any custom progress + // other than the one based on Status and Progress. If one is + // provided when a progress is reported, it would be shown in a ScrollViewer + // on the Dev Home UI scrolled to the bottom as if it is some form of log output. + IExtensionAdaptiveCardSession2 AdaptiveCardSession + { + get; + }; + + // Starts the operation which generates a project based on a given prompt by the user in the + // given output folder. The generated content in the output folder can be anything that is needed + // for the project based on the technology it uses. Dev Home just displays the generated content + // in a file viewer. + Windows.Foundation.IAsyncOperationWithProgress GenerateAsync(); + } + + // Extensions can implement this provider to provide a way to + // create a project based on a prompt as part of the Dev Home + // quick start project feature. + [experimental] + [contract(Microsoft.Windows.DevHome.SDK.DevHomeContract, 6)] + interface IQuickStartProjectProvider + { + // Name of the QuickStart project provider that shows up on the UI. + String DisplayName + { + get; + }; + + // Used to provide the URI to the terms of service for the extension + // and its AI endpoint. This is shown on the Dev Home UI as a link + // and should be able to be protocol launched into the browser. + Windows.Foundation.Uri TermsOfServiceUri + { + get; + }; + + // Used to provide the URI to the privacy statement for the extension + // and its AI endpoint. This is shown on the Dev Home UI as a link + // and should be able to be protocol launched into the browser. + Windows.Foundation.Uri PrivacyPolicyUri + { + get; + }; + + // Used to provide the sample prompts to guide the user on what types of + // things they can generate with the extension. This is shown on the + // Dev Home UI. + String[] SamplePrompts + { + get; + }; + + // Adaptive card UI flow that can be provided by the extension to initialize or + // setup anything required by it such as to install any dependencies + // it needs or to setup its AI endpoint. In addition, to showing the user the dependencies, + // this flow can be used to install them through OnAction in the adaptive card session. + // Extension may return null if there is nothing to do here. + // This is called when the user selects in the extension provider that they want to use + // this extension to generate the project. + QuickStartProjectAdaptiveCardResult CreateAdaptiveCardSessionForExtensionInitialization(); + + // Creates an operation which allows to generate a project based on a given prompt by the + // user in the given output folder. The generated content in the output folder can be anything that + // is needed for the project based on the technology it uses. Dev Home just displays the generated content + // in a file viewer. + IQuickStartProjectGenerationOperation CreateProjectGenerationOperation(String prompt, Windows.Storage.StorageFolder outputFolder); + } + // End of QuickStartProject APIs } \ No newline at end of file diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.vcxproj b/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.vcxproj index ea0b10316b..e8f158297f 100644 --- a/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.vcxproj +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/Microsoft.Windows.DevHome.SDK.vcxproj @@ -223,9 +223,12 @@ + + + @@ -257,11 +260,14 @@ + Create + + diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectAdaptiveCardResult.cpp b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectAdaptiveCardResult.cpp new file mode 100644 index 0000000000..617bb7cd58 --- /dev/null +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectAdaptiveCardResult.cpp @@ -0,0 +1,28 @@ +#include "pch.h" +#include "QuickStartProjectAdaptiveCardResult.h" +#include "QuickStartProjectAdaptiveCardResult.g.cpp" + +namespace winrt::Microsoft::Windows::DevHome::SDK::implementation +{ + QuickStartProjectAdaptiveCardResult::QuickStartProjectAdaptiveCardResult(winrt::Microsoft::Windows::DevHome::SDK::IExtensionAdaptiveCardSession2 const& adaptiveCardSession) : + m_adaptiveCardSession(adaptiveCardSession), + m_result(ProviderOperationStatus::Success, S_OK, hstring{}, hstring{}) + { + } + + QuickStartProjectAdaptiveCardResult::QuickStartProjectAdaptiveCardResult(winrt::hresult const& e, hstring const& displayMessage, hstring const& diagnosticText) : + m_adaptiveCardSession(nullptr), + m_result(ProviderOperationStatus::Failure, e, displayMessage, diagnosticText) + { + } + + winrt::Microsoft::Windows::DevHome::SDK::IExtensionAdaptiveCardSession2 QuickStartProjectAdaptiveCardResult::AdaptiveCardSession() + { + return m_adaptiveCardSession; + } + + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult QuickStartProjectAdaptiveCardResult::Result() + { + return m_result; + } +} diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectAdaptiveCardResult.h b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectAdaptiveCardResult.h new file mode 100644 index 0000000000..8cd3669d5b --- /dev/null +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectAdaptiveCardResult.h @@ -0,0 +1,23 @@ +#pragma once +#include "QuickStartProjectAdaptiveCardResult.g.h" + +namespace winrt::Microsoft::Windows::DevHome::SDK::implementation +{ + struct QuickStartProjectAdaptiveCardResult : QuickStartProjectAdaptiveCardResultT + { + QuickStartProjectAdaptiveCardResult(winrt::Microsoft::Windows::DevHome::SDK::IExtensionAdaptiveCardSession2 const& adaptiveCardSession); + QuickStartProjectAdaptiveCardResult(winrt::hresult const& e, hstring const& displayMessage, hstring const& diagnosticText); + winrt::Microsoft::Windows::DevHome::SDK::IExtensionAdaptiveCardSession2 AdaptiveCardSession(); + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult Result(); + + private: + IExtensionAdaptiveCardSession2 m_adaptiveCardSession; + ProviderOperationResult m_result; + }; +} +namespace winrt::Microsoft::Windows::DevHome::SDK::factory_implementation +{ + struct QuickStartProjectAdaptiveCardResult : QuickStartProjectAdaptiveCardResultT + { + }; +} diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectResult.cpp b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectResult.cpp new file mode 100644 index 0000000000..95008522c8 --- /dev/null +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectResult.cpp @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#include "pch.h" +#include "QuickStartProjectResult.h" +#include "QuickStartProjectResult.g.cpp" + +namespace winrt::Microsoft::Windows::DevHome::SDK::implementation +{ + QuickStartProjectResult::QuickStartProjectResult( + array_view projectHosts, + array_view referenceSamples) : + m_projectHosts(projectHosts.begin(), projectHosts.end()), + m_referenceSamples(referenceSamples.begin(), referenceSamples.end()), + m_result(ProviderOperationStatus::Success, S_OK, hstring(), hstring()), + m_feedbackHandler(nullptr) + { + } + + QuickStartProjectResult::QuickStartProjectResult( + array_view projectHosts, + array_view referenceSamples, + winrt::Microsoft::Windows::DevHome::SDK::IQuickStartProjectResultFeedbackHandler const& feedbackHandler) : + m_projectHosts(projectHosts.begin(), projectHosts.end()), + m_referenceSamples(referenceSamples.begin(), referenceSamples.end()), + m_result(ProviderOperationStatus::Success, S_OK, hstring(), hstring()), + m_feedbackHandler(feedbackHandler) + { + } + + QuickStartProjectResult::QuickStartProjectResult(winrt::hresult const& e, hstring const& displayMessage, hstring const& diagnosticText) : + m_projectHosts(std::vector{}), + m_referenceSamples(std::vector{}), + m_result(ProviderOperationStatus::Failure, e, displayMessage, diagnosticText), + m_feedbackHandler(nullptr) + { + } + + winrt::Microsoft::Windows::DevHome::SDK::QuickStartProjectResult QuickStartProjectResult::CreateWithFeedbackHandler( + array_view projectHosts, + array_view referenceSamples, + winrt::Microsoft::Windows::DevHome::SDK::IQuickStartProjectResultFeedbackHandler const& feedbackHandler) + { + return make(projectHosts, referenceSamples, feedbackHandler); + } + + com_array QuickStartProjectResult::ProjectHosts() + { + return com_array(m_projectHosts.begin(), m_projectHosts.end()); + } + + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult QuickStartProjectResult::Result() + { + return m_result; + } + + com_array QuickStartProjectResult::ReferenceSamples() + { + return com_array(m_referenceSamples.begin(), m_referenceSamples.end()); + } + + winrt::Microsoft::Windows::DevHome::SDK::IQuickStartProjectResultFeedbackHandler QuickStartProjectResult::FeedbackHandler() + { + return m_feedbackHandler; + } +} diff --git a/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectResult.h b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectResult.h new file mode 100644 index 0000000000..70e7e55677 --- /dev/null +++ b/extensionsdk/Microsoft.Windows.DevHome.SDK/QuickStartProjectResult.h @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +#pragma once +#include "QuickStartProjectResult.g.h" + +namespace winrt::Microsoft::Windows::DevHome::SDK::implementation +{ + struct QuickStartProjectResult : QuickStartProjectResultT + { + QuickStartProjectResult( + array_view projectHosts, + array_view referenceSamples); + + QuickStartProjectResult( + array_view projectHosts, + array_view referenceSamples, + winrt::Microsoft::Windows::DevHome::SDK::IQuickStartProjectResultFeedbackHandler const& feedbackHandler); + + QuickStartProjectResult(winrt::hresult const& e, hstring const& displayMessage, hstring const& diagnosticText); + + static winrt::Microsoft::Windows::DevHome::SDK::QuickStartProjectResult CreateWithFeedbackHandler( + array_view projectHosts, + array_view referenceSamples, + winrt::Microsoft::Windows::DevHome::SDK::IQuickStartProjectResultFeedbackHandler const& feedbackHandler); + + com_array ProjectHosts(); + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult Result(); + com_array ReferenceSamples(); + winrt::Microsoft::Windows::DevHome::SDK::IQuickStartProjectResultFeedbackHandler FeedbackHandler(); + + private: + std::vector m_projectHosts; + winrt::Microsoft::Windows::DevHome::SDK::ProviderOperationResult m_result; + std::vector m_referenceSamples; + winrt::Microsoft::Windows::DevHome::SDK::IQuickStartProjectResultFeedbackHandler m_feedbackHandler; + }; +} +namespace winrt::Microsoft::Windows::DevHome::SDK::factory_implementation +{ + struct QuickStartProjectResult : QuickStartProjectResultT + { + }; +} diff --git a/settings/DevHome.Settings.UnitTest/TestingScenarios/Settings.md b/settings/DevHome.Settings.UnitTest/TestingScenarios/Settings.md index c79c3ed5fa..bf89160ff6 100644 --- a/settings/DevHome.Settings.UnitTest/TestingScenarios/Settings.md +++ b/settings/DevHome.Settings.UnitTest/TestingScenarios/Settings.md @@ -5,7 +5,6 @@ If your code affects the settings pages, please manually verify these scenarios. Please make sure to verify all these scenarios. 1. User can submit feedback via the feedback button -1. User can set the app theme 1. User can enable/disable an extension 1. User can add an account 1. User can remove an account diff --git a/settings/DevHome.Settings/DevHome.Settings.csproj b/settings/DevHome.Settings/DevHome.Settings.csproj index dcb8cad91e..728106ee76 100644 --- a/settings/DevHome.Settings/DevHome.Settings.csproj +++ b/settings/DevHome.Settings/DevHome.Settings.csproj @@ -33,12 +33,6 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - diff --git a/settings/DevHome.Settings/Strings/en-us/Resources.resw b/settings/DevHome.Settings/Strings/en-us/Resources.resw index b078587296..812608237b 100644 --- a/settings/DevHome.Settings/Strings/en-us/Resources.resw +++ b/settings/DevHome.Settings/Strings/en-us/Resources.resw @@ -198,6 +198,9 @@ https://go.microsoft.com/fwlink/?linkid=2234882 URL + + Third Party Notices + Add account @@ -244,10 +247,10 @@ Connect your account - Dev Home specifications + About Dev Home - © 2023 Microsoft. All rights reserved. + © Microsoft. All rights reserved. Related links @@ -542,22 +545,6 @@ View logs Click on this if you want to see Dev Home's logs on your machine. - - Manage your local and cloud development virtual machines from Dev Home - Text within a display card that explains what users can do with the Environments management feature. Users can choose to toggle this on/off to add or remove the feature. - - - Environments Management - Title text for the Environments management feature. - - - Configure your local and cloud development virtual machines from Dev Home - Text within a display card that explains what users can do with the Environments configuration feature. Users can choose to toggle this on/off to add or remove the feature. - - - Environments Configuration - Title text for the Environments configuration feature. - Quiet background processes Name of experimental feature 'Quiet background processes' on the 'Settings -> Experiments' page where you enable it. @@ -566,12 +553,12 @@ Quiet background processes allows you to free up resources while developing Inline description of the Quiet background processes experimental feature on the 'Settings -> Experiments' page where you enable it. - - Create a local or cloud machine from Dev Home - Text within a display card that explains what users can do with the Environments creation feature. Users can choose to toggle this on/off to add or remove the feature. + + Quickstart Playground + Locked="{Quickstart Playground}" Title text for the Quickstart Playground feature. - - Environments Creation - Title text for the Environments creation feature. + + Get started in a new devcontainer-based project from a natural language prompt. Enabling this feature installs the Dev Home Azure Extension from the Store. + Text within a display card that explains what users can do with the Quickstart Playground feature. Users can choose to toggle this feature on or off. - \ No newline at end of file + diff --git a/settings/DevHome.Settings/ViewModels/AboutViewModel.cs b/settings/DevHome.Settings/ViewModels/AboutViewModel.cs index b7eaac518b..5ba142cac8 100644 --- a/settings/DevHome.Settings/ViewModels/AboutViewModel.cs +++ b/settings/DevHome.Settings/ViewModels/AboutViewModel.cs @@ -1,14 +1,18 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System; using System.Collections.ObjectModel; +using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using DevHome.Common.Extensions; using DevHome.Common.Models; using DevHome.Common.Services; using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; +using Serilog; +using Windows.Storage; +using Windows.System; namespace DevHome.Settings.ViewModels; @@ -31,6 +35,20 @@ public AboutViewModel() }; } + [RelayCommand] + private async Task OpenThirdPartyNoticeAsync() + { + try + { + var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/NOTICE.txt")); + await Launcher.LaunchFileAsync(file); + } + catch (Exception ex) + { + Log.Error(ex, $"Failed to launch third party notice file. Error: {ex}"); + } + } + private static string GetVersionDescription() { var appInfoService = Application.Current.GetService(); diff --git a/settings/DevHome.Settings/Views/AboutPage.xaml b/settings/DevHome.Settings/Views/AboutPage.xaml index 7f94aa73d3..6aceb5db4f 100644 --- a/settings/DevHome.Settings/Views/AboutPage.xaml +++ b/settings/DevHome.Settings/Views/AboutPage.xaml @@ -26,6 +26,7 @@ + - + + + + - + - - + - + @@ -65,7 +66,7 @@ @@ -154,7 +155,7 @@ - + @@ -186,86 +187,90 @@ - + + MaxWidth="{ThemeResource MaxPageContentWidth}" Margin="{ThemeResource HeaderMargin}"> - - + x:Uid="CreateEnvironmentButton" + Command="{x:Bind ViewModel.CallToActionInvokeButtonCommand}" /> + - + + + + + + + + + + + + + + @@ -283,35 +288,60 @@ - - - - - - - - - - + + + + + + + + + + + + - + + + + + + - - - - - - - + + + + + + + diff --git a/tools/Environments/DevHome.Environments/Views/LandingPage.xaml.cs b/tools/Environments/DevHome.Environments/Views/LandingPage.xaml.cs index 10c2fca29e..e4aece3bc4 100644 --- a/tools/Environments/DevHome.Environments/Views/LandingPage.xaml.cs +++ b/tools/Environments/DevHome.Environments/Views/LandingPage.xaml.cs @@ -41,7 +41,7 @@ private void AddDebugButtons(object sender, RoutedEventArgs e) TitleGrid.Children.Add(onlyLocalButton); - var column = Grid.GetColumn(Titlebar); + var column = Grid.GetColumn(EnvironmentsHeader); Grid.SetColumn(onlyLocalButton, column + 1); } diff --git a/tools/Experiments/src/DevHome.Experiments.csproj b/tools/Experiments/src/DevHome.Experiments.csproj index d613eeb4a8..282fc72016 100644 --- a/tools/Experiments/src/DevHome.Experiments.csproj +++ b/tools/Experiments/src/DevHome.Experiments.csproj @@ -9,14 +9,6 @@ - - - - - - - - diff --git a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/DevHome.ExtensionLibrary.csproj b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/DevHome.ExtensionLibrary.csproj index 79a64f896f..c830fb85fa 100644 --- a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/DevHome.ExtensionLibrary.csproj +++ b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/DevHome.ExtensionLibrary.csproj @@ -7,6 +7,14 @@ enable true + + + + + + + + @@ -15,12 +23,6 @@ - - - - - - @@ -38,7 +40,6 @@ - diff --git a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Strings/en-us/Resources.resw b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Strings/en-us/Resources.resw index 77512f2dbf..389e068036 100644 --- a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Strings/en-us/Resources.resw +++ b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Strings/en-us/Resources.resw @@ -79,8 +79,8 @@ Text that precedes the version number of a specific package - Uninstall - Button to uninstall the extension + Uninstall + Button to uninstall the extension Manage extension diff --git a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/ExtensionLibraryViewModel.cs b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/ExtensionLibraryViewModel.cs index f9a50252c7..0fe6f4047c 100644 --- a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/ExtensionLibraryViewModel.cs +++ b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/ExtensionLibraryViewModel.cs @@ -10,6 +10,7 @@ using CommunityToolkit.Mvvm.Input; using CommunityToolkit.WinUI; using DevHome.Common.Extensions; +using DevHome.Common.Helpers; using DevHome.Common.Services; using Microsoft.UI.Xaml; using Microsoft.Windows.DevHome.SDK; @@ -31,6 +32,13 @@ public partial class ExtensionLibraryViewModel : ObservableObject private readonly IExtensionService _extensionService; private readonly WindowEx _windowEx; + // All internal Dev Home extensions that should allow users to enable/disable them, should add + // their class Ids to this set. + private readonly HashSet _internalClassIdsToBeShownInExtensionsPage = new() + { + CommonConstants.HyperVExtensionClassId, + }; + public ObservableCollection StorePackagesList { get; set; } public ObservableCollection InstalledPackagesList { get; set; } @@ -83,8 +91,10 @@ private async Task GetInstalledExtensionsAsync() foreach (var extensionWrapper in extensionWrappers) { - // Don't show self as an extension. - if (Package.Current.Id.FullName == extensionWrapper.PackageFullName) + // Don't show self as an extension unless internal extension is allowed to be enabled/disabled in the + // extensions page. + if (Package.Current.Id.FullName == extensionWrapper.PackageFullName && + !_internalClassIdsToBeShownInExtensionsPage.Contains(extensionWrapper.ExtensionClassId)) { continue; } diff --git a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/InstalledPackageViewModel.cs b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/InstalledPackageViewModel.cs index 7593a2ac7a..a3a893a332 100644 --- a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/InstalledPackageViewModel.cs +++ b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/InstalledPackageViewModel.cs @@ -101,6 +101,9 @@ public partial class InstalledPackageViewModel : ObservableObject [ObservableProperty] private PackageVersion _version; + [ObservableProperty] + private string _automationMoreOptionsPfn; + public ObservableCollection InstalledExtensionsList { get; set; } public InstalledPackageViewModel(string displayName, string publisher, string packageFamilyName, DateTimeOffset installedDate, PackageVersion version) @@ -110,6 +113,7 @@ public InstalledPackageViewModel(string displayName, string publisher, string pa _packageFamilyName = packageFamilyName; _installedDate = installedDate; _version = version; + _automationMoreOptionsPfn = $"MoreOptions_{packageFamilyName}"; InstalledExtensionsList = new(); } diff --git a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/StorePackageViewModel.cs b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/StorePackageViewModel.cs index 6e7db922e8..c8f2780e26 100644 --- a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/StorePackageViewModel.cs +++ b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/ViewModels/StorePackageViewModel.cs @@ -23,12 +23,16 @@ public partial class StorePackageViewModel : ObservableObject [ObservableProperty] private string _packageFamilyName; + [ObservableProperty] + private string _automationInstallPfn; + public StorePackageViewModel(string productId, string title, string publisher, string packageFamilyName) { _productId = productId; _title = title; _publisher = publisher; _packageFamilyName = packageFamilyName; + _automationInstallPfn = $"Install_{packageFamilyName}"; } [RelayCommand] diff --git a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Views/ExtensionLibraryView.xaml b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Views/ExtensionLibraryView.xaml index 9b84aab3ea..e5fb69179e 100644 --- a/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Views/ExtensionLibraryView.xaml +++ b/tools/ExtensionLibrary/DevHome.ExtensionLibrary/Views/ExtensionLibraryView.xaml @@ -54,6 +54,7 @@ Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" VerticalAlignment="Center"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [1] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/SetupFlow/DevHome.SetupFlow/Views/QuickstartPlaygroundView.xaml.cs b/tools/SetupFlow/DevHome.SetupFlow/Views/QuickstartPlaygroundView.xaml.cs new file mode 100644 index 0000000000..1d714d31e4 --- /dev/null +++ b/tools/SetupFlow/DevHome.SetupFlow/Views/QuickstartPlaygroundView.xaml.cs @@ -0,0 +1,235 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.ComponentModel; +using System.IO; +using System.Threading.Tasks; +using DevHome.Common.Extensions; +using DevHome.Common.Services; +using DevHome.Common.Views; +using DevHome.SetupFlow.ViewModels; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.Windows.DevHome.SDK; +using Serilog; + +namespace DevHome.SetupFlow.Views; + +#nullable enable +public sealed partial class QuickstartPlaygroundView : UserControl +{ + private readonly ILogger _log = Log.ForContext("SourceContext", nameof(QuickstartPlaygroundView)); + + private ContentDialog? _adaptiveCardContentDialog; + + public QuickstartPlaygroundViewModel ViewModel + { + get; set; + } + + public QuickstartPlaygroundView() + { + ViewModel = Application.Current.GetService(); + ViewModel.PropertyChanged += ViewModel_PropertyChanged; + this.InitializeComponent(); + PromptCharacterCount.Text = $"0 / {CustomPrompt.MaxLength}"; + } + + private void ViewModel_PropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (sender != null) + { + if (e.PropertyName == "IsLaunchDropDownVisible") + { + DropDownButtonFlyout.Items.Clear(); + foreach (var item in ViewModel.QuickStartProjectHosts) + { + DropDownButtonFlyout.Items.Add( + new MenuFlyoutItem() + { + Text = item.DisplayName, + Command = ViewModel.LaunchProjectHostCommand, + CommandParameter = item, + }); + } + } + else if (e.PropertyName == "ProgressAdaptiveCardSession") + { + _ = ShowProgressAdaptiveCard(); + } + } + } + + private void FolderHierarchy_ItemInvoked(TreeView sender, TreeViewItemInvokedEventArgs args) + { + if (args.InvokedItem is ExplorerItem item) + { + if (item.Type == ExplorerItem.ExplorerItemType.Folder) + { + ViewModel.GeneratedFileContent = string.Empty; + } + else + { + // TODO: should theoretically do this more efficiently instead of re-reading the file + if (item.FullPath != null) + { + ViewModel.GeneratedFileContent = File.ReadAllText(item.FullPath); + } + } + } + } + + private async void ExtensionProviderComboBox_Loading(FrameworkElement sender, object args) + { + // TODO: For a nicer UX, we should enable the user to pick a default provider so that they don't have to select it every time. + await ViewModel.PopulateQuickstartProvidersComboBox(); + } + + private async void ExtensionProviderComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + ViewModel.OnQuickstartSelectionChanged(); + await ShowExtensionInitializationUI(); + } + + private void NegativeFeedbackConfirmation_Click(object sender, RoutedEventArgs e) + { + ViewModel.NegativesGroupOne = false; + ViewModel.NegativesGroupTwo = true; + + ViewModel.ProvideFeedback(false, negativeFeedbackTextBox.Text); + negativeFeedbackTextBox.Text = string.Empty; + } + + private void PositiveFeedbackConfirmation_Click(object sender, RoutedEventArgs e) + { + ViewModel.ProvideFeedback(true, positiveFeedbackTextBox.Text); + positiveFeedbackTextBox.Text = string.Empty; + + ViewModel.PositivesGroupOne = false; + ViewModel.PositivesGroupTwo = true; + } + + private void NegativeFeedbackFlyout_Closed(object sender, object e) + { + ViewModel.NegativesGroupOne = true; + ViewModel.NegativesGroupTwo = false; + } + + private void PositiveFeedbackFlyout_Closed(object sender, object e) + { + ViewModel.PositivesGroupOne = true; + ViewModel.PositivesGroupTwo = false; + } + + private void NegCloseFlyout_Click(object sender, RoutedEventArgs e) + { + negativeFeedbackFlyout.Hide(); + } + + private void PosCloseFlyout_Click(object sender, RoutedEventArgs e) + { + positiveFeedbackFlyout.Hide(); + } + + public void OnAdaptiveCardSessionStopped(IExtensionAdaptiveCardSession2 cardSession, ExtensionAdaptiveCardSessionStoppedEventArgs data) + { + cardSession.Stopped -= OnAdaptiveCardSessionStopped; + if (_adaptiveCardContentDialog is not null) + { + DispatcherQueue.TryEnqueue(() => + { + _adaptiveCardContentDialog?.Hide(); + if (data.Result.Status == ProviderOperationStatus.Failure) + { + ViewModel.ActiveQuickstartSelection = null; + } + }); + } + } + + private async Task ShowAdaptiveCardOnContentDialog(QuickStartProjectAdaptiveCardResult adaptiveCardSessionResult) + { + if (adaptiveCardSessionResult == null) + { + // No adaptive card to show (i.e. no dependencies or AI initialization). + return; + } + + if (adaptiveCardSessionResult.Result.Status == ProviderOperationStatus.Failure) + { + _log.Error($"Failed to show adaptive card. {adaptiveCardSessionResult.Result.DisplayMessage} - {adaptiveCardSessionResult.Result.DiagnosticText}"); + return; + } + + var adapativeCardController = adaptiveCardSessionResult.AdaptiveCardSession; + var extensionAdaptiveCardPanel = new ExtensionAdaptiveCardPanel(); + var renderingService = Application.Current.GetService(); + var renderer = await renderingService.GetRendererAsync(); + + extensionAdaptiveCardPanel.Bind(adapativeCardController, renderer); + extensionAdaptiveCardPanel.RequestedTheme = ActualTheme; + + adapativeCardController.Stopped += OnAdaptiveCardSessionStopped; + + _adaptiveCardContentDialog = new ContentDialog + { + XamlRoot = this.XamlRoot, + Content = extensionAdaptiveCardPanel, + }; + + await _adaptiveCardContentDialog.ShowAsync(); + + adapativeCardController.Dispose(); + _adaptiveCardContentDialog = null; + } + + public async Task ShowExtensionInitializationUI() + { + if (ViewModel.ActiveQuickstartSelection is not null) + { + var adaptiveCardSessionResult = ViewModel.ActiveQuickstartSelection.CreateAdaptiveCardSessionForExtensionInitialization(); + await ShowAdaptiveCardOnContentDialog(adaptiveCardSessionResult); + } + } + + public async Task ShowProgressAdaptiveCard() + { + var progressAdaptiveCardSession = ViewModel.ProgressAdaptiveCardSession; + if (progressAdaptiveCardSession == null) + { + return; + } + + var extensionAdaptiveCardPanel = new ExtensionAdaptiveCardPanel(); + var renderingService = Application.Current.GetService(); + var renderer = await renderingService.GetRendererAsync(); + + extensionAdaptiveCardPanel.Bind(progressAdaptiveCardSession, renderer); + extensionAdaptiveCardPanel.RequestedTheme = ActualTheme; + + extensionAdaptiveCardPanel.UiUpdate += (object? sender, FrameworkElement e) => + { + DispatcherQueue.TryEnqueue(() => + { + ProgressOutputScrollViewer.ScrollToVerticalOffset(ProgressOutputScrollViewer.ScrollableHeight); + }); + }; + + ProgressOutputScrollViewer.Content = extensionAdaptiveCardPanel; + } + + private void CustomPrompt_TextChanged(object sender, TextChangedEventArgs e) + { + PromptCharacterCount.Text = $"{CustomPrompt.Text.Length} / {CustomPrompt.MaxLength}"; + } + + private void CustomPrompt_GotFocus(object sender, RoutedEventArgs e) + { + var promptTextBox = sender as TextBox; + if (promptTextBox != null) + { + promptTextBox.SelectionStart = promptTextBox.Text.Length; + } + } +} diff --git a/tools/SetupFlow/DevHome.SetupFlow/Views/RepoConfigView.xaml b/tools/SetupFlow/DevHome.SetupFlow/Views/RepoConfigView.xaml index a86acf64c6..bc0eba44a6 100644 --- a/tools/SetupFlow/DevHome.SetupFlow/Views/RepoConfigView.xaml +++ b/tools/SetupFlow/DevHome.SetupFlow/Views/RepoConfigView.xaml @@ -9,6 +9,7 @@ xmlns:converters="using:CommunityToolkit.WinUI.Converters" xmlns:setupControls="using:DevHome.SetupFlow.Controls" xmlns:models="using:DevHome.SetupFlow.Models" + xmlns:views="using:DevHome.Common.Views" mc:Ignorable="d"> @@ -37,9 +38,9 @@ Orchestrator="{x:Bind ViewModel.Orchestrator, Mode=OneWay}" Foreground="{ThemeResource TextFillColorSecondary}"> - + + + diff --git a/tools/Utilities/src/Views/UtilityView.xaml.cs b/tools/Utilities/src/Views/UtilityView.xaml.cs new file mode 100644 index 0000000000..2f7ff6dda9 --- /dev/null +++ b/tools/Utilities/src/Views/UtilityView.xaml.cs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using DevHome.Utilities.ViewModels; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace DevHome.Utilities.Views; + +public sealed partial class UtilityView : UserControl +{ + public UtilityView() + { + this.InitializeComponent(); + } + + public UtilityViewModel ViewModel + { + get => (UtilityViewModel)GetValue(ViewModelProperty); + set => SetValue(ViewModelProperty, value); + } + + public static DependencyProperty ViewModelProperty => ViewModelPropertyValue; + + private static readonly DependencyProperty ViewModelPropertyValue = DependencyProperty.Register(nameof(ViewModel), typeof(UtilityViewModel), typeof(UtilityView), new PropertyMetadata(null)); +} diff --git a/uitest/Common/DevHomeApplication.cs b/uitest/Common/DevHomeApplication.cs index 3a4aed7deb..944faa176a 100644 --- a/uitest/Common/DevHomeApplication.cs +++ b/uitest/Common/DevHomeApplication.cs @@ -32,7 +32,13 @@ public sealed class DevHomeApplication private WindowsElement DashboardNavigationItem => _devHomeSession.Driver.FindElementByAccessibilityId("DevHome.Dashboard"); - private WindowsElement MachineConfigurationNavigationItem => _devHomeSession.Driver.FindElementByAccessibilityId("DevHome.SetupFlow"); + private WindowsElement MachineConfigurationNavigationItem => _devHomeSession.Driver.FindElementByAccessibilityId("DevHome.SetupFlow"); + + private WindowsElement IntroducingDevHomeNavigationItem => _devHomeSession.Driver.FindElementByAccessibilityId("WhatsNew"); + + private WindowsElement SettingsNavigationItem => _devHomeSession.Driver.FindElementByAccessibilityId("SettingsItem"); + + private WindowsElement ExtensionsNavigationItem => _devHomeSession.Driver.FindElementByAccessibilityId("Extensions"); private DevHomeApplication() { @@ -53,6 +59,11 @@ public void Initialize(string appSettingsMode) _devHomeSession = new(Configuration.WindowsApplicationDriverUrl, $"{Configuration.PackageFamilyName}!App"); } + + public string GetMainPageId() + { + return _devHomeSession.Driver.FindElementByAccessibilityId("MainPage").Id; + } public DashboardPage NavigateToDashboardPage() { @@ -68,7 +79,28 @@ public MachineConfigurationPage NavigateToMachineConfigurationPage() Trace.WriteLine("Navigating to Machine Configuration"); MachineConfigurationNavigationItem.Click(); return new(_devHomeSession.Driver); + } + + public IntroducingDevHomePage NavigateToIntroducingDevHomePage() + { + Trace.WriteLine("Navigating to Introducing Dev Home"); + IntroducingDevHomeNavigationItem.Click(); + return new(_devHomeSession.Driver); + } + + public SettingsPage NavigateToSettingsPage() + { + Trace.WriteLine("Navigating to Settings"); + SettingsNavigationItem.Click(); + return new(_devHomeSession.Driver); } + + public ExtensionsPage NavigateToExtensionsPage() + { + Trace.WriteLine("Navigating to Extensions"); + ExtensionsNavigationItem.Click(); + return new(_devHomeSession.Driver); + } /// /// Start Dev Home application diff --git a/uitest/Common/DevHomeTestBase.cs b/uitest/Common/DevHomeTestBase.cs index aaeb5eee78..dd0808e03e 100644 --- a/uitest/Common/DevHomeTestBase.cs +++ b/uitest/Common/DevHomeTestBase.cs @@ -23,7 +23,7 @@ public class DevHomeTestBase private string TestDeploymentDir => TestContext.Properties[nameof(TestDeploymentDir)].ToString(); - private string TestRunDirectory => TestContext.Properties[nameof(TestRunDirectory)].ToString(); + public string TestRunDirectory => TestContext.Properties[nameof(TestRunDirectory)].ToString(); [TestInitialize] public void TestInitialize() @@ -47,6 +47,13 @@ public void TestCleanup() } Application.Stop(); + } + + public void RestartDevHome() + { + Application.Stop(); + + Application.Start(); } /// diff --git a/uitest/DevHome.UITest.csproj b/uitest/DevHome.UITest.csproj index c480aa09c5..4d36904914 100644 --- a/uitest/DevHome.UITest.csproj +++ b/uitest/DevHome.UITest.csproj @@ -12,19 +12,12 @@ $(MSBuildProjectDirectory)\Test.runsettings - - + - - - - - - diff --git a/uitest/Dialogs/AddWidgetDialog.cs b/uitest/Dialogs/AddWidgetDialog.cs index e4814dfec6..eaf4a44513 100644 --- a/uitest/Dialogs/AddWidgetDialog.cs +++ b/uitest/Dialogs/AddWidgetDialog.cs @@ -39,28 +39,7 @@ public AddWidgetDialog(WindowsDriver driver, DashboardPage dashb public DashboardPage.WidgetControl AddCPUUsageWidget() => QuickAddWidget(CPUUsageNavigationItem, "CPU"); - public DashboardPage.WidgetControl AddSSHWidget(string configFilePath) - { - return WaitForWidgetToBeAdded(() => - { - Trace.WriteLine($"Clicking on SSH navigation item"); - SSHNavigationItem.Click(); - - // Wait for the widget to be rendered before configuring and - // pinning it - // TODO: Can we use AccessibilityId for adaptive cards forms? - Trace.WriteLine($"Configuring SSH widget: Adding SSH config file path"); - var container = Driver.WaitUntilVisible(ByWindowsAutomation.ClassName("NamedContainerAutomationPeer")); - var input = container.FindElementByClassName("TextBox"); - input.Clear(); - input.SendKeys(configFilePath); - var submit = container.FindElementByClassName("Button"); - submit.Click(); - - Trace.WriteLine($"Pinning SSH widget"); - PinButton.Click(); - }); - } + public DashboardPage.WidgetControl AddSSHWidget() => QuickAddWidget(SSHNavigationItem, "SSH keychain"); private string GetWidgetNavigationItemId(string widgetId) => $"NavViewItem_{Configuration.Widget.IdPrefix}!App!!{Configuration.Widget.Provider}!!{widgetId}"; diff --git a/uitest/ExtensionsTest.cs b/uitest/ExtensionsTest.cs new file mode 100644 index 0000000000..077df61f10 --- /dev/null +++ b/uitest/ExtensionsTest.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using DevHome.UITest.Common; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace DevHome.Tests.UITest; + +[TestClass] +public class ExtensionsTest : DevHomeTestBase +{ +} diff --git a/uitest/IntroducingTest.cs b/uitest/IntroducingTest.cs new file mode 100644 index 0000000000..f60554a5ae --- /dev/null +++ b/uitest/IntroducingTest.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using DevHome.UITest.Common; +using DevHome.UITest.Dialogs; +using DevHome.UITest.Pages; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace DevHome.Tests.UITest; + +[TestClass] +public class IntroducingTest : DevHomeTestBase +{ + [TestMethod] + public void GetStartedTest() + { + // Arrange + var introPage = Application.NavigateToIntroducingDevHomePage(); + + // Act + var machineConfigurationPage = introPage.ClickGetStarted(); + + // Assert + Assert.IsTrue(machineConfigurationPage.EndToEndSetupButton.Displayed); + } + + [TestMethod] + public void ExploreExtensionsTest() + { + // Arrange + var introPage = Application.NavigateToIntroducingDevHomePage(); + + // Act + var extensionsPage = introPage.ClickExploreExtensions(); + + // Assert + Assert.IsTrue(extensionsPage.GetUpdatesButton.Displayed); + } + + [TestMethod] + public void PinWidgetsTest() + { + // Arrange + var introPage = Application.NavigateToIntroducingDevHomePage(); + + // Act + var dashboardPage = introPage.ClickPinWidgets(); + + // Assert + Assert.IsTrue(dashboardPage.AddWidgetButton.Displayed); + } + + [TestMethod] + public void ConnectAccountsTest() + { + // Arrange + var introPage = Application.NavigateToIntroducingDevHomePage(); + + // Act + var accountsPage = introPage.ClickConnectAccounts(); + + // Assert + Assert.IsTrue(accountsPage.AddAccountsButton.Displayed); + } +} diff --git a/uitest/Pages/DashboardPage.cs b/uitest/Pages/DashboardPage.cs index edf69af2a3..386e4a01e2 100644 --- a/uitest/Pages/DashboardPage.cs +++ b/uitest/Pages/DashboardPage.cs @@ -6,6 +6,7 @@ using DevHome.UITest.Extensions; using OpenQA.Selenium.Appium; using OpenQA.Selenium.Appium.Windows; +using OpenQA.Selenium.Interactions; namespace DevHome.UITest.Pages; @@ -14,7 +15,7 @@ namespace DevHome.UITest.Pages; /// public class DashboardPage : ApplicationPage { - private WindowsElement AddWidgetButton => Driver.FindElementByAccessibilityId("AddWidgetButton"); + public WindowsElement AddWidgetButton => Driver.FindElementByAccessibilityId("AddWidgetButton"); private IReadOnlyCollection WidgetItems => Driver.FindElementsByAccessibilityId("WidgetItem"); @@ -71,6 +72,12 @@ public class WidgetControl /// should be located from the application window private WindowsElement RemoveButton => _driver.FindElementByAccessibilityId("RemoveWidgetButton"); + private WindowsElement SmallButton => _driver.FindElementByAccessibilityId("SmallWidgetButton"); + + private WindowsElement MediumButton => _driver.FindElementByAccessibilityId("MediumWidgetButton"); + + private WindowsElement LargeButton => _driver.FindElementByAccessibilityId("LargeWidgetButton"); + public string TitleText => _element.FindElementByAccessibilityId("WidgetTitle").Text; public WidgetControl(WindowsDriver driver, WindowsElement element) @@ -93,6 +100,61 @@ public void Remove() return RemoveButton; }) .Click(); + } + + public void MakeSmall() + { + Trace.WriteLine($"Changing size to small for widget '{TitleText}'"); + _driver + .RetryUntil(_ => + { + MoreOptionsButton.Click(); + return SmallButton; + }) + .Click(); + } + + public void MakeMedium() + { + Trace.WriteLine($"Changing size to small for widget '{TitleText}'"); + _driver + .RetryUntil(_ => + { + MoreOptionsButton.Click(); + return MediumButton; + }) + .Click(); + } + + public void MakeLarge() + { + Trace.WriteLine($"Changing size to small for widget '{TitleText}'"); + _driver + .RetryUntil(_ => + { + MoreOptionsButton.Click(); + return LargeButton; + }) + .Click(); + } + + public string GetWidgetSize() + { + return _element.Size.Height switch + { + 292 => "Small", + 608 => "Medium", + 924 => "Large", + _ => "Unknown", + }; + } + + public void DragRight() + { + Trace.WriteLine($"Dragging widget '{TitleText}' to the right one spot"); + var action = new Actions(_driver); + action.MoveToElement(_element).ClickAndHold().MoveByOffset(1, 0).MoveByOffset(_element.Size.Width, 0).Build().Perform(); + action.Release().Build().Perform(); // For some reason, mouse release needs to happen on its own line. } } } diff --git a/uitest/Pages/ExtensionsPage.cs b/uitest/Pages/ExtensionsPage.cs new file mode 100644 index 0000000000..82d213df97 --- /dev/null +++ b/uitest/Pages/ExtensionsPage.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Diagnostics; +using OpenQA.Selenium.Appium.Windows; + +namespace DevHome.UITest.Pages; + +public class ExtensionsPage : ApplicationPage +{ + public WindowsElement GetUpdatesButton => Driver.FindElementByAccessibilityId("GetUpdatesButton"); + + public WindowsElement GitHubInstallButton => Driver.FindElementByAccessibilityId("Install_Microsoft.Windows.DevHomeGitHubExtension_8wekyb3d8bbwe"); + + public WindowsElement GitHubMoreOptionsButton => Driver.FindElementByAccessibilityId("MoreOptions_Microsoft.Windows.DevHomeGitHubExtension_8wekyb3d8bbwe"); + + public ExtensionsPage(WindowsDriver driver) + : base(driver) + { + } +} diff --git a/uitest/Pages/IntroducingDevHomePage.cs b/uitest/Pages/IntroducingDevHomePage.cs new file mode 100644 index 0000000000..a16e542c40 --- /dev/null +++ b/uitest/Pages/IntroducingDevHomePage.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Diagnostics; +using OpenQA.Selenium.Appium.Windows; + +namespace DevHome.UITest.Pages; + +public class IntroducingDevHomePage : ApplicationPage +{ + private WindowsElement GetStartedButton => Driver.FindElementByAccessibilityId("WhatsNewPage_GetStartedButton"); + + private WindowsElement ExploreExtensionsButton => Driver.FindElementByAccessibilityId("WhatsNewPage_ExtensionsButton"); + + private WindowsElement PinWidgetsButton => Driver.FindElementByAccessibilityId("WhatsNewPage_DevDashButton"); + + private WindowsElement ConnectAccountsButton => Driver.FindElementByAccessibilityId("WhatsNewPage_DevIdButton"); + + public IntroducingDevHomePage(WindowsDriver driver) + : base(driver) + { + } + + public MachineConfigurationPage ClickGetStarted() + { + Trace.WriteLine("Clicking Get Started"); + GetStartedButton.Click(); + return new MachineConfigurationPage(Driver); + } + + public ExtensionsPage ClickExploreExtensions() + { + Trace.WriteLine("Clicking Explore Extensions"); + ExploreExtensionsButton.Click(); + return new ExtensionsPage(Driver); + } + + public DashboardPage ClickPinWidgets() + { + Trace.WriteLine("Clicking Pin Widgets"); + PinWidgetsButton.Click(); + return new DashboardPage(Driver); + } + + public SettingsAccountsPage ClickConnectAccounts() + { + Trace.WriteLine("Clicking Connect Accounts"); + ConnectAccountsButton.Click(); + return new SettingsAccountsPage(Driver); + } +} diff --git a/uitest/Pages/MachineConfigurationPage.cs b/uitest/Pages/MachineConfigurationPage.cs index 9da2e01ad6..325f9b6ca0 100644 --- a/uitest/Pages/MachineConfigurationPage.cs +++ b/uitest/Pages/MachineConfigurationPage.cs @@ -11,7 +11,7 @@ namespace DevHome.UITest.Pages; /// public class MachineConfigurationPage : ApplicationPage { - private WindowsElement EndToEndSetupButton => Driver.FindElementByAccessibilityId("EndToEndSetupButton"); + public WindowsElement EndToEndSetupButton => Driver.FindElementByAccessibilityId("EndToEndSetupButton"); private WindowsElement DSCConfigurationButton => Driver.FindElementByAccessibilityId("DSCConfigurationButton"); diff --git a/uitest/Pages/PreferencesPage.cs b/uitest/Pages/PreferencesPage.cs new file mode 100644 index 0000000000..95673b0247 --- /dev/null +++ b/uitest/Pages/PreferencesPage.cs @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Diagnostics; +using DevHome.UITest.Common; +using DevHome.UITest.Extensions; +using OpenQA.Selenium.Appium.Windows; + +namespace DevHome.UITest.Pages; + +public class PreferencesPage : ApplicationPage +{ + public WindowsElement ThemeButton => Driver.FindElementByAccessibilityId("ThemeSelectionComboBox"); + + public WindowsElement DefaultThemeButton => Driver.FindElementByAccessibilityId("SettingsThemeDefault"); + + public WindowsElement LightThemeButton => Driver.FindElementByAccessibilityId("SettingsThemeLight"); + + public WindowsElement DarkThemeButton => Driver.FindElementByAccessibilityId("SettingsThemeDark"); + + public PreferencesPage(WindowsDriver driver) + : base(driver) + { + } + + public void DefaultMode() + { + Trace.WriteLine("Setting Default Mode"); + ThemeButton.Click(); + DefaultThemeButton.Click(); + Driver.Wait(3); + } + + public void LightMode() + { + Trace.WriteLine("Setting Light Mode"); + ThemeButton.Click(); + LightThemeButton.Click(); + Driver.Wait(3); + } + + public void DarkMode() + { + Trace.WriteLine("Setting Dark Mode"); + ThemeButton.Click(); + DarkThemeButton.Click(); + Driver.Wait(3); + } +} diff --git a/uitest/Pages/RepoConfigPage.cs b/uitest/Pages/RepoConfigPage.cs index 864fce4972..5099f2d002 100644 --- a/uitest/Pages/RepoConfigPage.cs +++ b/uitest/Pages/RepoConfigPage.cs @@ -9,7 +9,7 @@ public class RepoConfigPage : ApplicationPage { private WindowsElement AddRepoButton => Driver.FindElementByName("AddRepositoriesButton"); - public WindowsElement AddRepoHyperLinkButton => Driver.FindElementByAccessibilityId("AddRepoHyperLinkButton"); + public WindowsElement AddRepoHyperlinkButton => Driver.FindElementByAccessibilityId("AddRepoHyperlinkButton"); public RepoConfigPage(WindowsDriver driver) : base(driver) diff --git a/uitest/Pages/SettingsAccountsPage.cs b/uitest/Pages/SettingsAccountsPage.cs new file mode 100644 index 0000000000..cb8af1be0c --- /dev/null +++ b/uitest/Pages/SettingsAccountsPage.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Diagnostics; +using OpenQA.Selenium.Appium.Windows; + +namespace DevHome.UITest.Pages; + +public class SettingsAccountsPage : ApplicationPage +{ + public WindowsElement AddAccountsButton => Driver.FindElementByAccessibilityId("AddAccountsButton"); + + public SettingsAccountsPage(WindowsDriver driver) + : base(driver) + { + } +} diff --git a/uitest/Pages/SettingsPage.cs b/uitest/Pages/SettingsPage.cs new file mode 100644 index 0000000000..bd37632617 --- /dev/null +++ b/uitest/Pages/SettingsPage.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Diagnostics; +using DevHome.UITest.Common; +using OpenQA.Selenium.Appium.Windows; + +namespace DevHome.UITest.Pages; + +public class SettingsPage : ApplicationPage +{ + public WindowsElement PreferencesButton => Driver.FindElementByAccessibilityId("Preferences"); + + public SettingsPage(WindowsDriver driver) + : base(driver) + { + } + + public PreferencesPage NavigateToPreferencesPage() + { + Trace.WriteLine("Navigating to Preferences"); + PreferencesButton.Click(); + return new(Driver); + } +} diff --git a/uitest/RepoConfigPageUiTests.cs b/uitest/RepoConfigPageUiTests.cs index 9b47b407b1..bac26c0706 100644 --- a/uitest/RepoConfigPageUiTests.cs +++ b/uitest/RepoConfigPageUiTests.cs @@ -16,6 +16,6 @@ public void TestNewRepoConfigPage() var repoConfigPage = machineConfigurationPage.GoToRepoPage(); // This button will be displayed when no repos are selected. - Assert.IsTrue(repoConfigPage.AddRepoHyperLinkButton.Displayed); + Assert.IsTrue(repoConfigPage.AddRepoHyperlinkButton.Displayed); } } diff --git a/uitest/SettingsTest.cs b/uitest/SettingsTest.cs new file mode 100644 index 0000000000..b77d059fbb --- /dev/null +++ b/uitest/SettingsTest.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Drawing; +using System.Formats.Tar; +using DevHome.UITest.Common; +using DevHome.UITest.Dialogs; +using DevHome.UITest.Pages; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace DevHome.Tests.UITest; + +[TestClass] +public class SettingsTest : DevHomeTestBase +{ + [DataTestMethod] + public void ThemeTest() + { + // Arrange + var settings = Application.NavigateToSettingsPage(); + var preferences = settings.NavigateToPreferencesPage(); + + // Act - Set the theme to dark mode + preferences.DarkMode(); + var screenshotsPath = Path.Combine(TestRunDirectory, "Screenshots"); + Directory.CreateDirectory(screenshotsPath); + var fullPath = Path.Combine(screenshotsPath, $"{CurrentTestId}-DarkMode.png"); + Application.TakeScreenshot(fullPath); + var bitmap = new Bitmap(fullPath); + var pixel = bitmap.GetPixel(bitmap.Width / 2, bitmap.Height / 2); + + // Assert - Dark mode + Assert.IsTrue(pixel.R < 100); + Assert.IsTrue(pixel.G < 100); + Assert.IsTrue(pixel.B < 100); + + // Act - Set the theme to light mode + preferences.LightMode(); + Directory.CreateDirectory(screenshotsPath); + fullPath = Path.Combine(screenshotsPath, $"{CurrentTestId}-LightMode.png"); + Application.TakeScreenshot(fullPath); + bitmap = new Bitmap(fullPath); + pixel = bitmap.GetPixel(bitmap.Width / 2, bitmap.Height / 2); + + // Assert - Light mode + Assert.IsTrue(pixel.R > 200); + Assert.IsTrue(pixel.G > 200); + Assert.IsTrue(pixel.B > 200); + + // Resets the theme to default mode + preferences.DefaultMode(); + } +} diff --git a/uitest/WidgetTest.cs b/uitest/WidgetTest.cs index 4b180d78ee..f30f8113cc 100644 --- a/uitest/WidgetTest.cs +++ b/uitest/WidgetTest.cs @@ -47,7 +47,7 @@ public void AddWidgetsTest(string[] widgetTitles) ["CPU"] = dialog => dialog.AddCPUUsageWidget(), ["Network"] = dialog => dialog.AddNetworkUsageWidget(), ["Memory"] = dialog => dialog.AddMemoryWidget(), - ["SSH keychain"] = dialog => dialog.AddSSHWidget(GetTestAssetPath(@"Widgets\EmptySSHConfig")), + ["SSH keychain"] = dialog => dialog.AddSSHWidget(), }; var dashboard = Application.NavigateToDashboardPage(); dashboard.RemoveAllWidgets(); @@ -59,4 +59,56 @@ public void AddWidgetsTest(string[] widgetTitles) Assert.AreEqual(widgetTitles.Length, dashboard.DisplayedWidgets.Count); CollectionAssert.AreEqual(widgetTitles, widgets.Select(w => w.TitleText).ToList()); } + + [DataTestMethod] + public void PersistOnDevHomeRestartTest() + { + // Arrange + var dashboard = Application.NavigateToDashboardPage(); + dashboard.RemoveAllWidgets(); + + // Act + dashboard.ClickAddWidgetButton().AddMemoryWidget(); + RestartDevHome(); + dashboard = Application.NavigateToDashboardPage(); + + // Assert + Assert.AreEqual(1, dashboard.DisplayedWidgets.Count); + } + + [DataTestMethod] + public void PersistCustomizationOnDevHomeRestartTest() + { + // Arrange + var dashboard = Application.NavigateToDashboardPage(); + dashboard.RemoveAllWidgets(); + + // Act + var widget = dashboard.ClickAddWidgetButton().AddMemoryWidget(); + widget.MakeSmall(); + RestartDevHome(); + dashboard = Application.NavigateToDashboardPage(); + + // Assert + Assert.AreEqual("Small", dashboard.DisplayedWidgets.First().GetWidgetSize()); + } + + [DataTestMethod] + public void DragAndDropTest() + { + // Arrange + var dashboard = Application.NavigateToDashboardPage(); + dashboard.RemoveAllWidgets(); + + // Act + var widget = dashboard.ClickAddWidgetButton().AddMemoryWidget(); + dashboard.ClickAddWidgetButton().AddNetworkUsageWidget(); + widget.DragRight(); + RestartDevHome(); + dashboard = Application.NavigateToDashboardPage(); + + // Assert + Assert.AreEqual(2, dashboard.DisplayedWidgets.Count); + Assert.AreEqual("Network", dashboard.DisplayedWidgets.First().TitleText); + } }