diff --git a/.editorconfig b/.editorconfig index 58328a89..70747a32 100644 --- a/.editorconfig +++ b/.editorconfig @@ -175,6 +175,7 @@ csharp_style_prefer_method_group_conversion = true:silent csharp_style_prefer_top_level_statements = true:silent csharp_style_prefer_null_check_over_type_check = true:suggestion csharp_style_prefer_local_over_anonymous_function = true:suggestion +csharp_style_prefer_primary_constructors = true:suggestion #### Naming styles #### [*.{cs,vb}] @@ -370,4 +371,5 @@ tab_width = 4 indent_size = 4 end_of_line = crlf dotnet_style_namespace_match_folder = true:suggestion +dotnet_style_prefer_collection_expression = true:suggestion diff --git a/.github/workflows/JGUZDV.WebApiHost.yml b/.github/workflows/JGUZDV.WebApiHost.yml new file mode 100644 index 00000000..f2b14c8d --- /dev/null +++ b/.github/workflows/JGUZDV.WebApiHost.yml @@ -0,0 +1,23 @@ +name: JGUZDV.WebApiHost + +on: + workflow_dispatch: + inputs: + push-to-nuget: + description: Push package to NuGet + type: boolean + + pull_request: + branches: + - main + paths: + - libraries/JGUZDV.WebApiHost/** + +jobs: + call_default_build: + uses: ./.github/workflows/default_build.yml + with: + library-name: JGUZDV.WebApiHost + push-to-nuget: ${{ inputs.push-to-nuget != '' && inputs.push-to-nuget }} + secrets: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} \ No newline at end of file diff --git a/AddLibrary.ps1 b/AddLibrary.ps1 new file mode 100644 index 00000000..e6c052b1 --- /dev/null +++ b/AddLibrary.ps1 @@ -0,0 +1,19 @@ +param( + [Parameter(Mandatory = $true, ValueFromPipeline=$true)] + [string] $LibraryName, + + [Parameter()] + [string] $Template = 'classlib' +) + +process { + Push-Location $PSScriptRoot + + Invoke-Expression "dotnet new $Template -n $LibraryName -o ./libraries/$LibraryName/src" + Invoke-Expression "dotnet new xunit -n $LibraryName.Tests -o ./libraries/$LibraryName/test" + + Invoke-Expression "dotnet sln . add ./libraries/$LibraryName/src" + Invoke-Expression "dotnet sln . add ./libraries/$LibraryName/test" + + Pop-Location +} \ No newline at end of file diff --git a/NuGet-Packages.sln b/NuGet-Packages.sln index 1e4b055d..54ff87b3 100644 --- a/NuGet-Packages.sln +++ b/NuGet-Packages.sln @@ -7,6 +7,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig .gitignore = .gitignore + AddLibrary.ps1 = AddLibrary.ps1 LICENSE = LICENSE EndProjectSection EndProject @@ -15,294 +16,766 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libraries", "libraries", "{ libraries\Directory.Build.props = libraries\Directory.Build.props EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.ActiveDirectory.ClaimProvider", "JGUZDV.ActiveDirectory.ClaimProvider", "{FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{50252EFB-8629-4B1D-AC2F-5F29CB6F684D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\src\JGUZDV.ActiveDirectory.ClaimProvider.csproj", "{675D258E-525C-4048-8E88-97C5E78ED819}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging", "libraries\JGUZDV.AspNetCore.Logging\src\JGUZDV.AspNetCore.Logging.csproj", "{311DE251-20A2-42C0-BD6C-2A327221D3C3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider.Tests", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\test\JGUZDV.ActiveDirectory.ClaimProvider.Tests.csproj", "{5CE38D63-D07F-46F1-9008-8206AB6F4231}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging.Tests", "libraries\JGUZDV.AspNetCore.Logging\test\JGUZDV.AspNetCore.Logging.Tests.csproj", "{6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.AspNetCore.Authentication.Cookies", "JGUZDV.AspNetCore.Authentication.Cookies", "{ED0A40A7-2790-42F3-822E-C475F021D7D8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection", "libraries\JGUZDV.AspNetCore.DataProtection\src\JGUZDV.AspNetCore.DataProtection.csproj", "{F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\src\JGUZDV.AspNetCore.Authentication.Cookies.csproj", "{3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection.Tests", "libraries\JGUZDV.AspNetCore.DataProtection\test\JGUZDV.AspNetCore.DataProtection.Tests.csproj", "{97B58430-AAA3-4283-85FC-2BA1ED37514E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies.Tests", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\test\JGUZDV.AspNetCore.Authentication.Cookies.Tests.csproj", "{FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq", "libraries\JGUZDV.Linq\src\JGUZDV.Linq.csproj", "{C551EE51-B06E-4554-9114-763150B8908E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.AspNetCore.DataProtection", "JGUZDV.AspNetCore.DataProtection", "{F86B6B96-D027-4FF4-931D-69AA0891F539}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq.Tests", "libraries\JGUZDV.Linq\test\JGUZDV.Linq.Tests.csproj", "{07AAE83F-56C7-4A9A-9972-7F9BE53D031A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection", "libraries\JGUZDV.AspNetCore.DataProtection\src\JGUZDV.AspNetCore.DataProtection.csproj", "{29CE7134-3831-4E4A-A502-C84233D1ED35}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS", "libraries\JGUZDV.CQRS\src\JGUZDV.CQRS.csproj", "{A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection.Tests", "libraries\JGUZDV.AspNetCore.DataProtection\test\JGUZDV.AspNetCore.DataProtection.Tests.csproj", "{20E70A44-016E-470C-947D-C1FC4161D1FB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.Tests", "libraries\JGUZDV.CQRS\test\JGUZDV.CQRS.Tests.csproj", "{7372528E-F5B9-49C6-8EC4-8F793DFC081D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.AspNetCore.Logging", "JGUZDV.AspNetCore.Logging", "{458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore", "libraries\JGUZDV.CQRS.AspNetCore\src\JGUZDV.CQRS.AspNetCore.csproj", "{A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging", "libraries\JGUZDV.AspNetCore.Logging\src\JGUZDV.AspNetCore.Logging.csproj", "{5D5F2C2A-24CD-4C27-902D-FA439E84AD13}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore.Tests", "libraries\JGUZDV.CQRS.AspNetCore\test\JGUZDV.CQRS.AspNetCore.Tests.csproj", "{4B50EE32-BF4F-4FE4-918D-3B35695CD829}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging.Tests", "libraries\JGUZDV.AspNetCore.Logging\test\JGUZDV.AspNetCore.Logging.Tests.csproj", "{88A3D096-F763-47DB-A94B-040D416746E8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging", "libraries\JGUZDV.Extensions.Logging\src\JGUZDV.Extensions.Logging.csproj", "{AB284655-5FE2-4DF9-BCF9-87A8962C086E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.Components", "JGUZDV.Blazor.Components", "{DD6389E2-3940-4E3A-AB5F-3B041AFDCAED}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging.Tests", "libraries\JGUZDV.Extensions.Logging\test\JGUZDV.Extensions.Logging.Tests.csproj", "{EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Samples", "libraries\JGUZDV.Blazor.Components\samples\JGUZDV.Blazor.Components.Samples.csproj", "{FB3900A8-72B4-4186-90A8-9FA9F585C20E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n", "libraries\JGUZDV.L10n\src\JGUZDV.L10n.csproj", "{175E14F2-E526-4DEA-9E05-AA87E48DBD7D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components", "libraries\JGUZDV.Blazor.Components\src\JGUZDV.Blazor.Components.csproj", "{73A3EE19-DEE8-4F79-85F5-DE42FE638F16}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.Tests", "libraries\JGUZDV.L10n\test\JGUZDV.L10n.Tests.csproj", "{D95B0932-CC64-440A-A956-D9D9EF9E1A99}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Tests", "libraries\JGUZDV.Blazor.Components\test\JGUZDV.Blazor.Components.Tests.csproj", "{ADADE7CE-4766-4220-AF7B-F51B5C1F334B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework", "libraries\JGUZDV.L10n.EntityFramework\src\JGUZDV.L10n.EntityFramework.csproj", "{9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.Components.ClaimRequirements", "JGUZDV.Blazor.Components.ClaimRequirements", "{CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework.Tests", "libraries\JGUZDV.L10n.EntityFramework\test\JGUZDV.L10n.EntityFramework.Tests.csproj", "{AECC9062-83E1-4B62-906D-1055E61E71DE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.ClaimRequirements", "libraries\JGUZDV.Blazor.Components.ClaimRequirements\src\JGUZDV.Blazor.Components.ClaimRequirements.csproj", "{662FB941-E473-401D-B856-BC6564101B5D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization", "libraries\JGUZDV.Extensions.Authorization\src\JGUZDV.Extensions.Authorization.csproj", "{3DFED352-5E7E-4688-8371-8B55EB800705}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.ClaimRequirements.Tests", "libraries\JGUZDV.Blazor.Components.ClaimRequirements\test\JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj", "{8E600186-574C-41F7-AC0F-B8BC61ED03F7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization.Tests", "libraries\JGUZDV.Extensions.Authorization\test\JGUZDV.Extensions.Authorization.Tests.csproj", "{793F6A63-30B3-44BC-A205-50031E27E31C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.Components.L10n", "JGUZDV.Blazor.Components.L10n", "{51FA04BB-81A2-4EA7-B722-CF4A16BA75E8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{AA0D0715-5EAE-437A-ABF5-D596B127544B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.L10n", "libraries\JGUZDV.Blazor.Components.L10n\src\JGUZDV.Blazor.Components.L10n.csproj", "{C806F47E-41BF-47D8-975B-A19C8EC14E39}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Samples", "libraries\JGUZDV.Blazor.Components\samples\JGUZDV.Blazor.Components.Samples.csproj", "{4AAFE071-EC5E-4F28-961C-7BB1259DC452}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.L10n.Tests", "libraries\JGUZDV.Blazor.Components.L10n\test\JGUZDV.Blazor.Components.L10n.Tests.csproj", "{76CE3554-41C4-402F-805E-C7C90387B8DD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components", "libraries\JGUZDV.Blazor.Components\src\JGUZDV.Blazor.Components.csproj", "{E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.StateManagement", "JGUZDV.Blazor.StateManagement", "{31F5F80A-A66E-4443-BA0B-052D5B836CD6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Tests", "libraries\JGUZDV.Blazor.Components\test\JGUZDV.Blazor.Components.Tests.csproj", "{B39492DF-D142-4F68-BAE9-2862D4B2E865}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.StateManagement", "libraries\JGUZDV.Blazor.StateManagement\src\JGUZDV.Blazor.StateManagement.csproj", "{2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json", "libraries\JGUZDV.Extensions.Json\src\JGUZDV.Extensions.Json.csproj", "{17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.StateManagement.Tests", "libraries\JGUZDV.Blazor.StateManagement\test\JGUZDV.Blazor.StateManagement.Tests.csproj", "{26405220-3D38-4D2E-867E-DC53130B0FEB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json.Tests", "libraries\JGUZDV.Extensions.Json\test\JGUZDV.Extensions.Json.Tests.csproj", "{E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.WasmServerHost", "JGUZDV.Blazor.WasmServerHost", "{1645F9F0-9447-4249-B15C-790FF70E1968}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage", "libraries\JGUZDV.ClientStorage\src\JGUZDV.ClientStorage.csproj", "{5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost", "libraries\JGUZDV.Blazor.WasmServerHost\src\JGUZDV.Blazor.WasmServerHost.csproj", "{4CD5DE24-C829-4038-8875-1C8B63C96EB7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage.Tests", "libraries\JGUZDV.ClientStorage\test\JGUZDV.ClientStorage.Tests.csproj", "{BB820FE9-4253-428E-A65A-95CF269022E9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost.Tests", "libraries\JGUZDV.Blazor.WasmServerHost\test\JGUZDV.Blazor.WasmServerHost.Tests.csproj", "{DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider.Tests", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\test\JGUZDV.ActiveDirectory.ClaimProvider.Tests.csproj", "{3B8F0A74-D7DD-4FA7-A6DF-568640868A24}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.ClientStorage", "JGUZDV.ClientStorage", "{BEE249C5-60E0-43AE-BE52-F65A736BCF32}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\src\JGUZDV.ActiveDirectory.ClaimProvider.csproj", "{1DE8AF4D-4D46-4766-844E-819757AC4E4C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage", "libraries\JGUZDV.ClientStorage\src\JGUZDV.ClientStorage.csproj", "{5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\src\JGUZDV.AspNetCore.Authentication.Cookies.csproj", "{D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage.Tests", "libraries\JGUZDV.ClientStorage\test\JGUZDV.ClientStorage.Tests.csproj", "{9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies.Tests", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\test\JGUZDV.AspNetCore.Authentication.Cookies.Tests.csproj", "{AADC7783-3155-4905-9524-61EE2E5E01C2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.CQRS", "JGUZDV.CQRS", "{D2EEC902-ED1E-419F-9BDA-E91C35498B9A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager", "libraries\JGUZDV.OpenIddict.KeyManager\src\JGUZDV.OpenIddict.KeyManager.csproj", "{115784A8-B2A6-4790-99D3-C41049CBC1C9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS", "libraries\JGUZDV.CQRS\src\JGUZDV.CQRS.csproj", "{70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager.Tests", "libraries\JGUZDV.OpenIddict.KeyManager\test\JGUZDV.OpenIddict.KeyManager.Tests.csproj", "{397C9A29-83DB-4944-9D4E-93159CDA60B6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.Tests", "libraries\JGUZDV.CQRS\test\JGUZDV.CQRS.Tests.csproj", "{86427769-9110-4A15-894E-264601C062BD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost", "libraries\JGUZDV.Blazor.WasmServerHost\src\JGUZDV.Blazor.WasmServerHost.csproj", "{68E91C38-4D95-4DCE-9BC2-4AE71236B289}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.CQRS.AspNetCore", "JGUZDV.CQRS.AspNetCore", "{449665D2-57FF-4DFC-BB3A-6E397C49CE72}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost.Tests", "libraries\JGUZDV.Blazor.WasmServerHost\test\JGUZDV.Blazor.WasmServerHost.Tests.csproj", "{A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore", "libraries\JGUZDV.CQRS.AspNetCore\src\JGUZDV.CQRS.AspNetCore.csproj", "{D8484887-7778-4307-B7A1-4E7CDA711E91}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy", "libraries\JGUZDV.YARP.SimpleReverseProxy\src\JGUZDV.YARP.SimpleReverseProxy.csproj", "{7D6C1BB8-4E00-4DB0-9063-859A98C69927}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore.Tests", "libraries\JGUZDV.CQRS.AspNetCore\test\JGUZDV.CQRS.AspNetCore.Tests.csproj", "{F00F6E41-A1E5-45DA-A579-EA17696CC19A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy.Tests", "libraries\JGUZDV.YARP.SimpleReverseProxy\test\JGUZDV.YARP.SimpleReverseProxy.Tests.csproj", "{2E589423-3B93-4444-830B-8742E6BF8FD1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Extensions.Authorization", "JGUZDV.Extensions.Authorization", "{06DEFC5F-DBE4-4B79-B025-08E097216E5A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost", "libraries\JGUZDV.JobHost\src\JGUZDV.JobHost.csproj", "{02F83C77-C526-41D5-853B-1E40EF7F5CDA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization", "libraries\JGUZDV.Extensions.Authorization\src\JGUZDV.Extensions.Authorization.csproj", "{F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost.Tests", "libraries\JGUZDV.JobHost\test\JGUZDV.JobHost.Tests.csproj", "{E081A3D2-23D1-4C02-80F0-2832DCB502EF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization.Tests", "libraries\JGUZDV.Extensions.Authorization\test\JGUZDV.Extensions.Authorization.Tests.csproj", "{64994378-C809-4702-BF71-9CACEFEB47E5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage.Blazor", "libraries\JGUZDV.ClientStorage.Blazor\JGUZDV.ClientStorage.Blazor.csproj", "{FD6D3808-5542-458E-88C0-4918F074D8A3}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Extensions.Json", "JGUZDV.Extensions.Json", "{47CC715C-603B-4C1A-88B5-14562727C6E0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json", "libraries\JGUZDV.Extensions.Json\src\JGUZDV.Extensions.Json.csproj", "{A3E254D9-8D81-4EC3-B52C-55D9354E9955}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json.Tests", "libraries\JGUZDV.Extensions.Json\test\JGUZDV.Extensions.Json.Tests.csproj", "{F05F64E2-8906-4AD1-89E5-5F40A30F55BB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Extensions.Logging", "JGUZDV.Extensions.Logging", "{D9C7551A-2F65-4D5F-9D4E-A42704D850B5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging", "libraries\JGUZDV.Extensions.Logging\src\JGUZDV.Extensions.Logging.csproj", "{0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging.Tests", "libraries\JGUZDV.Extensions.Logging\test\JGUZDV.Extensions.Logging.Tests.csproj", "{130E8BF8-97A3-468C-80A8-92247DCBFF51}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.JobHost", "JGUZDV.JobHost", "{B06ACF77-B0EF-42F4-BA33-776F7496E2E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost", "libraries\JGUZDV.JobHost\src\JGUZDV.JobHost.csproj", "{57FBEC02-58DA-435C-82FC-BE9EEC064362}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost.Tests", "libraries\JGUZDV.JobHost\test\JGUZDV.JobHost.Tests.csproj", "{A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.L10n", "JGUZDV.L10n", "{D93740E7-7EAB-4B4C-957E-E21CD73AA1BA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n", "libraries\JGUZDV.L10n\src\JGUZDV.L10n.csproj", "{B385CC10-A10B-4986-8BF3-443658D5C46B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.Tests", "libraries\JGUZDV.L10n\test\JGUZDV.L10n.Tests.csproj", "{F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.L10n.EntityFramework", "JGUZDV.L10n.EntityFramework", "{E5F92691-2BEB-491C-9219-CBA30A54A3E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework", "libraries\JGUZDV.L10n.EntityFramework\src\JGUZDV.L10n.EntityFramework.csproj", "{67E30962-CD08-4700-B1F8-8E7C029F40CF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework.Tests", "libraries\JGUZDV.L10n.EntityFramework\test\JGUZDV.L10n.EntityFramework.Tests.csproj", "{49AA7C6A-AB52-457C-BB9E-C927082DBA34}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Linq", "JGUZDV.Linq", "{4F001AAE-FC38-4071-94B2-DC33FE5C3735}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq", "libraries\JGUZDV.Linq\src\JGUZDV.Linq.csproj", "{33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq.Tests", "libraries\JGUZDV.Linq\test\JGUZDV.Linq.Tests.csproj", "{228AB90A-19B5-4678-802C-ECA16AA848ED}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.OpenIddict.KeyManager", "JGUZDV.OpenIddict.KeyManager", "{FAB5A604-6D92-46FA-9B3C-AF6165ED8042}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager", "libraries\JGUZDV.OpenIddict.KeyManager\src\JGUZDV.OpenIddict.KeyManager.csproj", "{6813FD87-FAA4-4572-ABF5-3730726E214B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager.Tests", "libraries\JGUZDV.OpenIddict.KeyManager\test\JGUZDV.OpenIddict.KeyManager.Tests.csproj", "{C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.YARP.SimpleReverseProxy", "JGUZDV.YARP.SimpleReverseProxy", "{B264316F-1CF0-4CF2-9D21-CB908688960D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy", "libraries\JGUZDV.YARP.SimpleReverseProxy\src\JGUZDV.YARP.SimpleReverseProxy.csproj", "{2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy.Tests", "libraries\JGUZDV.YARP.SimpleReverseProxy\test\JGUZDV.YARP.SimpleReverseProxy.Tests.csproj", "{2DB861F2-5DEA-481B-BECD-6F00EC8C6802}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.WebApiHost", "JGUZDV.WebApiHost", "{4AADAD6A-4BA0-427E-9EA1-4AFE211C1200}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.WebApiHost", "libraries\JGUZDV.WebApiHost\src\JGUZDV.WebApiHost.csproj", "{53D9AE20-2981-411C-87CD-5DCD71D181B4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.WebApiHost.Tests", "libraries\JGUZDV.WebApiHost\test\JGUZDV.WebApiHost.Tests.csproj", "{892EA5E4-A98F-4A36-B901-8A1FAB27623E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Release|Any CPU.Build.0 = Release|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Release|Any CPU.Build.0 = Release|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Release|Any CPU.Build.0 = Release|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Release|Any CPU.Build.0 = Release|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Release|Any CPU.Build.0 = Release|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Release|Any CPU.Build.0 = Release|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Release|Any CPU.Build.0 = Release|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Release|Any CPU.Build.0 = Release|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Release|Any CPU.Build.0 = Release|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Release|Any CPU.Build.0 = Release|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Release|Any CPU.Build.0 = Release|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Release|Any CPU.Build.0 = Release|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Release|Any CPU.Build.0 = Release|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Release|Any CPU.Build.0 = Release|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Release|Any CPU.Build.0 = Release|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Release|Any CPU.Build.0 = Release|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Release|Any CPU.Build.0 = Release|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Release|Any CPU.Build.0 = Release|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Release|Any CPU.Build.0 = Release|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Release|Any CPU.Build.0 = Release|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Release|Any CPU.Build.0 = Release|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Debug|Any CPU.Build.0 = Debug|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Release|Any CPU.ActiveCfg = Release|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Release|Any CPU.Build.0 = Release|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Release|Any CPU.Build.0 = Release|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Release|Any CPU.Build.0 = Release|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Release|Any CPU.Build.0 = Release|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Release|Any CPU.Build.0 = Release|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Release|Any CPU.Build.0 = Release|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Release|Any CPU.Build.0 = Release|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Release|Any CPU.Build.0 = Release|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Release|Any CPU.Build.0 = Release|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Release|Any CPU.Build.0 = Release|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Release|Any CPU.Build.0 = Release|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Release|Any CPU.Build.0 = Release|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Release|Any CPU.Build.0 = Release|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Release|Any CPU.Build.0 = Release|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Release|Any CPU.Build.0 = Release|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Release|Any CPU.Build.0 = Release|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Release|Any CPU.Build.0 = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|Any CPU.Build.0 = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x64.ActiveCfg = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x64.Build.0 = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x86.ActiveCfg = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x86.Build.0 = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|Any CPU.ActiveCfg = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|Any CPU.Build.0 = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x64.ActiveCfg = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x64.Build.0 = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x86.ActiveCfg = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x86.Build.0 = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x64.ActiveCfg = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x64.Build.0 = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x86.ActiveCfg = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x86.Build.0 = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|Any CPU.Build.0 = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x64.ActiveCfg = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x64.Build.0 = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x86.ActiveCfg = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x86.Build.0 = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x64.ActiveCfg = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x64.Build.0 = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x86.ActiveCfg = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x86.Build.0 = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|Any CPU.Build.0 = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x64.ActiveCfg = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x64.Build.0 = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x86.ActiveCfg = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x86.Build.0 = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x64.ActiveCfg = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x64.Build.0 = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x86.ActiveCfg = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x86.Build.0 = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|Any CPU.Build.0 = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x64.ActiveCfg = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x64.Build.0 = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x86.ActiveCfg = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x86.Build.0 = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x64.ActiveCfg = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x64.Build.0 = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x86.ActiveCfg = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x86.Build.0 = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|Any CPU.Build.0 = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x64.ActiveCfg = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x64.Build.0 = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x86.ActiveCfg = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x86.Build.0 = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x64.ActiveCfg = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x64.Build.0 = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x86.ActiveCfg = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x86.Build.0 = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|Any CPU.Build.0 = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x64.ActiveCfg = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x64.Build.0 = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x86.ActiveCfg = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x86.Build.0 = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x64.ActiveCfg = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x64.Build.0 = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x86.ActiveCfg = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x86.Build.0 = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|Any CPU.Build.0 = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x64.ActiveCfg = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x64.Build.0 = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x86.ActiveCfg = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x86.Build.0 = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x64.ActiveCfg = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x64.Build.0 = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x86.ActiveCfg = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x86.Build.0 = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|Any CPU.Build.0 = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x64.ActiveCfg = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x64.Build.0 = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x86.ActiveCfg = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x86.Build.0 = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x64.Build.0 = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x86.Build.0 = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|Any CPU.Build.0 = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x64.ActiveCfg = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x64.Build.0 = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x86.ActiveCfg = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x86.Build.0 = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x64.ActiveCfg = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x64.Build.0 = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x86.ActiveCfg = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x86.Build.0 = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|Any CPU.Build.0 = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x64.ActiveCfg = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x64.Build.0 = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x86.ActiveCfg = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x86.Build.0 = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x64.ActiveCfg = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x64.Build.0 = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x86.ActiveCfg = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x86.Build.0 = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|Any CPU.Build.0 = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x64.ActiveCfg = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x64.Build.0 = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x86.ActiveCfg = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x86.Build.0 = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x64.ActiveCfg = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x64.Build.0 = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x86.ActiveCfg = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x86.Build.0 = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|Any CPU.Build.0 = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x64.ActiveCfg = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x64.Build.0 = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x86.ActiveCfg = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x86.Build.0 = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x64.ActiveCfg = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x64.Build.0 = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x86.ActiveCfg = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x86.Build.0 = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|Any CPU.Build.0 = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x64.ActiveCfg = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x64.Build.0 = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x86.ActiveCfg = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x86.Build.0 = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x64.ActiveCfg = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x64.Build.0 = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x86.ActiveCfg = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x86.Build.0 = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|Any CPU.Build.0 = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x64.ActiveCfg = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x64.Build.0 = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x86.ActiveCfg = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x86.Build.0 = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x64.ActiveCfg = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x64.Build.0 = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x86.ActiveCfg = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x86.Build.0 = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|Any CPU.Build.0 = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x64.ActiveCfg = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x64.Build.0 = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x86.ActiveCfg = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x86.Build.0 = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x64.ActiveCfg = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x64.Build.0 = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x86.ActiveCfg = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x86.Build.0 = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|Any CPU.Build.0 = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x64.ActiveCfg = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x64.Build.0 = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x86.ActiveCfg = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x86.Build.0 = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x64.ActiveCfg = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x64.Build.0 = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x86.ActiveCfg = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x86.Build.0 = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|Any CPU.Build.0 = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x64.ActiveCfg = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x64.Build.0 = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x86.ActiveCfg = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x86.Build.0 = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x64.ActiveCfg = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x64.Build.0 = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x86.ActiveCfg = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x86.Build.0 = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|Any CPU.Build.0 = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x64.ActiveCfg = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x64.Build.0 = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x86.ActiveCfg = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x86.Build.0 = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x64.Build.0 = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x86.Build.0 = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|Any CPU.Build.0 = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x64.ActiveCfg = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x64.Build.0 = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x86.ActiveCfg = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x86.Build.0 = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x64.ActiveCfg = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x64.Build.0 = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x86.ActiveCfg = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x86.Build.0 = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|Any CPU.Build.0 = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x64.ActiveCfg = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x64.Build.0 = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x86.ActiveCfg = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x86.Build.0 = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x64.Build.0 = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x86.Build.0 = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|Any CPU.Build.0 = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x64.ActiveCfg = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x64.Build.0 = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x86.ActiveCfg = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x86.Build.0 = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x64.ActiveCfg = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x64.Build.0 = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x86.ActiveCfg = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x86.Build.0 = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|Any CPU.Build.0 = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x64.ActiveCfg = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x64.Build.0 = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x86.ActiveCfg = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x86.Build.0 = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x64.ActiveCfg = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x64.Build.0 = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x86.ActiveCfg = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x86.Build.0 = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|Any CPU.Build.0 = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x64.ActiveCfg = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x64.Build.0 = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x86.ActiveCfg = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x86.Build.0 = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x64.Build.0 = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x86.ActiveCfg = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x86.Build.0 = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|Any CPU.Build.0 = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x64.ActiveCfg = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x64.Build.0 = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x86.ActiveCfg = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x86.Build.0 = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x64.ActiveCfg = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x64.Build.0 = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x86.ActiveCfg = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x86.Build.0 = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|Any CPU.Build.0 = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x64.ActiveCfg = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x64.Build.0 = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x86.ActiveCfg = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x86.Build.0 = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x64.ActiveCfg = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x64.Build.0 = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x86.ActiveCfg = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x86.Build.0 = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|Any CPU.Build.0 = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x64.ActiveCfg = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x64.Build.0 = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x86.ActiveCfg = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x86.Build.0 = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x64.ActiveCfg = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x64.Build.0 = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x86.ActiveCfg = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x86.Build.0 = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|Any CPU.Build.0 = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x64.ActiveCfg = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x64.Build.0 = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x86.ActiveCfg = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x86.Build.0 = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x64.ActiveCfg = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x64.Build.0 = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x86.ActiveCfg = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x86.Build.0 = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|Any CPU.Build.0 = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x64.ActiveCfg = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x64.Build.0 = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x86.ActiveCfg = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x86.Build.0 = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x64.ActiveCfg = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x64.Build.0 = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x86.ActiveCfg = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x86.Build.0 = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|Any CPU.Build.0 = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x64.ActiveCfg = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x64.Build.0 = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x86.ActiveCfg = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x86.Build.0 = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x64.ActiveCfg = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x64.Build.0 = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x86.ActiveCfg = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x86.Build.0 = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|Any CPU.Build.0 = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x64.ActiveCfg = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x64.Build.0 = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x86.ActiveCfg = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x86.Build.0 = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x64.ActiveCfg = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x64.Build.0 = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x86.ActiveCfg = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x86.Build.0 = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|Any CPU.Build.0 = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x64.ActiveCfg = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x64.Build.0 = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x86.ActiveCfg = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x86.Build.0 = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x64.ActiveCfg = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x64.Build.0 = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x86.ActiveCfg = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x86.Build.0 = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|Any CPU.Build.0 = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x64.ActiveCfg = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x64.Build.0 = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x86.ActiveCfg = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x86.Build.0 = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x64.ActiveCfg = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x64.Build.0 = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x86.ActiveCfg = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x86.Build.0 = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|Any CPU.Build.0 = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x64.ActiveCfg = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x64.Build.0 = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x86.ActiveCfg = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x86.Build.0 = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x64.ActiveCfg = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x64.Build.0 = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x86.Build.0 = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|Any CPU.Build.0 = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x64.ActiveCfg = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x64.Build.0 = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x86.ActiveCfg = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x86.Build.0 = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x64.ActiveCfg = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x64.Build.0 = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x86.ActiveCfg = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x86.Build.0 = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|Any CPU.Build.0 = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x64.ActiveCfg = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x64.Build.0 = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x86.ActiveCfg = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x86.Build.0 = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x64.ActiveCfg = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x64.Build.0 = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x86.ActiveCfg = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x86.Build.0 = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|Any CPU.Build.0 = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x64.ActiveCfg = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x64.Build.0 = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x86.ActiveCfg = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x86.Build.0 = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x64.ActiveCfg = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x64.Build.0 = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x86.ActiveCfg = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x86.Build.0 = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|Any CPU.Build.0 = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x64.ActiveCfg = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x64.Build.0 = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x86.ActiveCfg = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x86.Build.0 = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x64.ActiveCfg = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x64.Build.0 = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x86.ActiveCfg = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x86.Build.0 = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|Any CPU.Build.0 = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x64.ActiveCfg = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x64.Build.0 = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x86.ActiveCfg = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x86.Build.0 = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x64.ActiveCfg = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x64.Build.0 = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x86.ActiveCfg = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x86.Build.0 = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|Any CPU.Build.0 = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x64.ActiveCfg = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x64.Build.0 = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x86.ActiveCfg = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x86.Build.0 = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x64.ActiveCfg = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x64.Build.0 = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x86.ActiveCfg = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x86.Build.0 = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|Any CPU.Build.0 = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x64.ActiveCfg = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x64.Build.0 = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x86.ActiveCfg = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x86.Build.0 = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x64.Build.0 = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x86.ActiveCfg = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x86.Build.0 = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|Any CPU.Build.0 = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x64.ActiveCfg = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x64.Build.0 = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x86.ActiveCfg = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x86.Build.0 = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x64.ActiveCfg = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x64.Build.0 = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x86.ActiveCfg = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x86.Build.0 = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|Any CPU.Build.0 = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x64.ActiveCfg = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x64.Build.0 = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x86.ActiveCfg = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x86.Build.0 = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x64.ActiveCfg = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x64.Build.0 = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x86.ActiveCfg = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x86.Build.0 = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|Any CPU.Build.0 = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x64.ActiveCfg = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x64.Build.0 = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x86.ActiveCfg = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x86.Build.0 = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x64.ActiveCfg = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x64.Build.0 = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x86.ActiveCfg = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x86.Build.0 = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|Any CPU.Build.0 = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x64.ActiveCfg = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x64.Build.0 = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x86.ActiveCfg = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x86.Build.0 = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x64.ActiveCfg = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x64.Build.0 = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x86.ActiveCfg = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x86.Build.0 = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|Any CPU.Build.0 = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x64.ActiveCfg = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x64.Build.0 = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x86.ActiveCfg = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} - {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} - {311DE251-20A2-42C0-BD6C-2A327221D3C3} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {97B58430-AAA3-4283-85FC-2BA1ED37514E} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {C551EE51-B06E-4554-9114-763150B8908E} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {7372528E-F5B9-49C6-8EC4-8F793DFC081D} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {4B50EE32-BF4F-4FE4-918D-3B35695CD829} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {AB284655-5FE2-4DF9-BCF9-87A8962C086E} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {D95B0932-CC64-440A-A956-D9D9EF9E1A99} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {AECC9062-83E1-4B62-906D-1055E61E71DE} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {3DFED352-5E7E-4688-8371-8B55EB800705} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {793F6A63-30B3-44BC-A205-50031E27E31C} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {AA0D0715-5EAE-437A-ABF5-D596B127544B} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} - {4AAFE071-EC5E-4F28-961C-7BB1259DC452} = {AA0D0715-5EAE-437A-ABF5-D596B127544B} - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {B39492DF-D142-4F68-BAE9-2862D4B2E865} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {BB820FE9-4253-428E-A65A-95CF269022E9} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {1DE8AF4D-4D46-4766-844E-819757AC4E4C} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {AADC7783-3155-4905-9524-61EE2E5E01C2} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {115784A8-B2A6-4790-99D3-C41049CBC1C9} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {397C9A29-83DB-4944-9D4E-93159CDA60B6} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {68E91C38-4D95-4DCE-9BC2-4AE71236B289} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {7D6C1BB8-4E00-4DB0-9063-859A98C69927} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {2E589423-3B93-4444-830B-8742E6BF8FD1} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {02F83C77-C526-41D5-853B-1E40EF7F5CDA} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {E081A3D2-23D1-4C02-80F0-2832DCB502EF} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {FD6D3808-5542-458E-88C0-4918F074D8A3} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} + {FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {675D258E-525C-4048-8E88-97C5E78ED819} = {FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467} + {5CE38D63-D07F-46F1-9008-8206AB6F4231} = {FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467} + {ED0A40A7-2790-42F3-822E-C475F021D7D8} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C} = {ED0A40A7-2790-42F3-822E-C475F021D7D8} + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0} = {ED0A40A7-2790-42F3-822E-C475F021D7D8} + {F86B6B96-D027-4FF4-931D-69AA0891F539} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {29CE7134-3831-4E4A-A502-C84233D1ED35} = {F86B6B96-D027-4FF4-931D-69AA0891F539} + {20E70A44-016E-470C-947D-C1FC4161D1FB} = {F86B6B96-D027-4FF4-931D-69AA0891F539} + {458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13} = {458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B} + {88A3D096-F763-47DB-A94B-040D416746E8} = {458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B} + {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {FB3900A8-72B4-4186-90A8-9FA9F585C20E} = {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16} = {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B} = {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} + {CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {662FB941-E473-401D-B856-BC6564101B5D} = {CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8} + {8E600186-574C-41F7-AC0F-B8BC61ED03F7} = {CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8} + {51FA04BB-81A2-4EA7-B722-CF4A16BA75E8} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {C806F47E-41BF-47D8-975B-A19C8EC14E39} = {51FA04BB-81A2-4EA7-B722-CF4A16BA75E8} + {76CE3554-41C4-402F-805E-C7C90387B8DD} = {51FA04BB-81A2-4EA7-B722-CF4A16BA75E8} + {31F5F80A-A66E-4443-BA0B-052D5B836CD6} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB} = {31F5F80A-A66E-4443-BA0B-052D5B836CD6} + {26405220-3D38-4D2E-867E-DC53130B0FEB} = {31F5F80A-A66E-4443-BA0B-052D5B836CD6} + {1645F9F0-9447-4249-B15C-790FF70E1968} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {4CD5DE24-C829-4038-8875-1C8B63C96EB7} = {1645F9F0-9447-4249-B15C-790FF70E1968} + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7} = {1645F9F0-9447-4249-B15C-790FF70E1968} + {BEE249C5-60E0-43AE-BE52-F65A736BCF32} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556} = {BEE249C5-60E0-43AE-BE52-F65A736BCF32} + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B} = {BEE249C5-60E0-43AE-BE52-F65A736BCF32} + {D2EEC902-ED1E-419F-9BDA-E91C35498B9A} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0} = {D2EEC902-ED1E-419F-9BDA-E91C35498B9A} + {86427769-9110-4A15-894E-264601C062BD} = {D2EEC902-ED1E-419F-9BDA-E91C35498B9A} + {449665D2-57FF-4DFC-BB3A-6E397C49CE72} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {D8484887-7778-4307-B7A1-4E7CDA711E91} = {449665D2-57FF-4DFC-BB3A-6E397C49CE72} + {F00F6E41-A1E5-45DA-A579-EA17696CC19A} = {449665D2-57FF-4DFC-BB3A-6E397C49CE72} + {06DEFC5F-DBE4-4B79-B025-08E097216E5A} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B} = {06DEFC5F-DBE4-4B79-B025-08E097216E5A} + {64994378-C809-4702-BF71-9CACEFEB47E5} = {06DEFC5F-DBE4-4B79-B025-08E097216E5A} + {47CC715C-603B-4C1A-88B5-14562727C6E0} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {A3E254D9-8D81-4EC3-B52C-55D9354E9955} = {47CC715C-603B-4C1A-88B5-14562727C6E0} + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB} = {47CC715C-603B-4C1A-88B5-14562727C6E0} + {D9C7551A-2F65-4D5F-9D4E-A42704D850B5} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80} = {D9C7551A-2F65-4D5F-9D4E-A42704D850B5} + {130E8BF8-97A3-468C-80A8-92247DCBFF51} = {D9C7551A-2F65-4D5F-9D4E-A42704D850B5} + {B06ACF77-B0EF-42F4-BA33-776F7496E2E6} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {57FBEC02-58DA-435C-82FC-BE9EEC064362} = {B06ACF77-B0EF-42F4-BA33-776F7496E2E6} + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5} = {B06ACF77-B0EF-42F4-BA33-776F7496E2E6} + {D93740E7-7EAB-4B4C-957E-E21CD73AA1BA} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {B385CC10-A10B-4986-8BF3-443658D5C46B} = {D93740E7-7EAB-4B4C-957E-E21CD73AA1BA} + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018} = {D93740E7-7EAB-4B4C-957E-E21CD73AA1BA} + {E5F92691-2BEB-491C-9219-CBA30A54A3E6} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {67E30962-CD08-4700-B1F8-8E7C029F40CF} = {E5F92691-2BEB-491C-9219-CBA30A54A3E6} + {49AA7C6A-AB52-457C-BB9E-C927082DBA34} = {E5F92691-2BEB-491C-9219-CBA30A54A3E6} + {4F001AAE-FC38-4071-94B2-DC33FE5C3735} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD} = {4F001AAE-FC38-4071-94B2-DC33FE5C3735} + {228AB90A-19B5-4678-802C-ECA16AA848ED} = {4F001AAE-FC38-4071-94B2-DC33FE5C3735} + {FAB5A604-6D92-46FA-9B3C-AF6165ED8042} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {6813FD87-FAA4-4572-ABF5-3730726E214B} = {FAB5A604-6D92-46FA-9B3C-AF6165ED8042} + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5} = {FAB5A604-6D92-46FA-9B3C-AF6165ED8042} + {B264316F-1CF0-4CF2-9D21-CB908688960D} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010} = {B264316F-1CF0-4CF2-9D21-CB908688960D} + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802} = {B264316F-1CF0-4CF2-9D21-CB908688960D} + {4AADAD6A-4BA0-427E-9EA1-4AFE211C1200} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {53D9AE20-2981-411C-87CD-5DCD71D181B4} = {4AADAD6A-4BA0-427E-9EA1-4AFE211C1200} + {892EA5E4-A98F-4A36-B901-8A1FAB27623E} = {4AADAD6A-4BA0-427E-9EA1-4AFE211C1200} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution + RESX_SortFileContentOnSave = True + RESX_NeutralResourcesLanguage = de-DE SolutionGuid = {46ECC226-1874-4539-8589-8B2029909C4A} EndGlobalSection EndGlobal diff --git a/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs b/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs index 4a0131e9..23d9afe7 100644 --- a/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs +++ b/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs @@ -1,6 +1,12 @@ namespace JGUZDV.AspNetCore.DataProtection; +/// <summary> +/// Public constants for this package +/// </summary> public static class Constants { + /// <summary> + /// Default section name for the configuration + /// </summary> public const string DefaultSectionName = "JGUZDV:DataProtection"; } diff --git a/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs b/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs index c09929a8..980d25f5 100644 --- a/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs +++ b/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs @@ -7,9 +7,14 @@ namespace JGUZDV.AspNetCore.DataProtection; +/// <summary> +/// Extension methods for configuring data protection. +/// </summary> public static class DataProtectionBuilderExtensions { - + /// <summary> + /// Configures the data protection system with the specified configuration. + /// </summary> public static IDataProtectionBuilder UseDataProtectionConfig(this IDataProtectionBuilder builder, IConfigurationSection configuration, IWebHostEnvironment? environment) { var config = new Configuration(); diff --git a/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs b/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs index e3063509..ca7272c3 100644 --- a/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs +++ b/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs @@ -6,14 +6,28 @@ namespace Microsoft.Extensions.DependencyInjection; +/// <summary> +/// Extension methods for configuring data protection. +/// </summary> public static class JGUZDVDataProtectionExtensions { + /// <summary> + /// Adds data protection to the application using the specified configuration. + /// </summary> public static IDataProtectionBuilder AddJGUZDVDataProtection(this IServiceCollection services, IConfigurationSection configurationSection, IWebHostEnvironment? environment = null) => services.AddDataProtection().UseDataProtectionConfig(configurationSection, environment); + + /// <summary> + /// Adds data protection to the application using the specified configuration. + /// </summary> public static IDataProtectionBuilder AddJGUZDVDataProtection(this IServiceCollection services, IConfiguration config, IWebHostEnvironment? environment = null) => services.AddJGUZDVDataProtection(config.GetSection(Constants.DefaultSectionName), environment); + + /// <summary> + /// Adds data protection to the application using the specified configuration. + /// </summary> public static IDataProtectionBuilder AddJGUZDVDataProtection(this WebApplicationBuilder builder, string sectionName = Constants.DefaultSectionName) => builder.Services.AddJGUZDVDataProtection(builder.Configuration.GetSection(sectionName), builder.Environment); } diff --git a/libraries/JGUZDV.AspNetCore.Logging/src/Constants.cs b/libraries/JGUZDV.AspNetCore.Logging/src/Constants.cs deleted file mode 100644 index dcd5563a..00000000 --- a/libraries/JGUZDV.AspNetCore.Logging/src/Constants.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace JGUZDV.AspNetCore.Logging -{ - public class Constants - { - public const string DefaultSectionName = "Logging"; - public const string DefaultEventLogSource = ".NET Runtime"; - } -} diff --git a/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs b/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs index 0467e0e6..6c76a0a4 100644 --- a/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs +++ b/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs @@ -1,11 +1,16 @@ -using JGUZDV.AspNetCore.Logging; -using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder; namespace Microsoft.Extensions.DependencyInjection; +/// <summary> +/// Extension methods for configuring logging. +/// </summary> public static class JGUZDVLoggingExtensions { - public static WebApplicationBuilder UseJGUZDVLogging(this WebApplicationBuilder builder, string configSectionName = Constants.DefaultSectionName) + /// <summary> + /// Configures the web host to use the default logging configuration. + /// </summary> + public static WebApplicationBuilder UseJGUZDVLogging(this WebApplicationBuilder builder, string configSectionName = JGUZDV.Extensions.Logging.Constants.DefaultSectionName) { builder.Host.UseJGUZDVLogging(configSectionName); return builder; diff --git a/libraries/JGUZDV.Blazor.Components.ClaimRequirements/src/Resources/ClaimRequirementsStrings.fr.resx b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/src/Resources/ClaimRequirementsStrings.fr.resx new file mode 100644 index 00000000..e1fbef44 --- /dev/null +++ b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/src/Resources/ClaimRequirementsStrings.fr.resx @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <data name="AddButton.AddClaimRequirement" xml:space="preserve"> + <value>Ajouter une règle de type/valeur</value> + </data> + <data name="AddButton.AddClaimRequirementCollection" xml:space="preserve"> + <value>Ajouter un ensemble de règles</value> + </data> + <data name="ClaimRequirement.ClaimType" xml:space="preserve"> + <value>Taper</value> + </data> + <data name="ClaimRequirement.ClaimValue" xml:space="preserve"> + <value>Valeur</value> + </data> + <data name="CollectionEditor.ChooseMatching" xml:space="preserve"> + <value>Sélectionner un raccourci</value> + </data> + <data name="CollectionEditor.MatchAll" xml:space="preserve"> + <value>Tous (ET)</value> + </data> + <data name="CollectionEditor.MatchAny" xml:space="preserve"> + <value>Au moins un (OU)</value> + </data> + <data name="Editor.Delete" xml:space="preserve"> + <value>Supprimer</value> + </data> + <data name="Editor.Discard" xml:space="preserve"> + <value>jeter</value> + </data> + <data name="Editor.Save" xml:space="preserve"> + <value>Sauvegarder</value> + </data> + <data name="ValueEditor.ClaimTypeStringComparison" xml:space="preserve"> + <value>Comparaison type pour type</value> + </data> + <data name="ValueEditor.ClaimValueStringComparison" xml:space="preserve"> + <value>Type de comparaison pour la valeur</value> + </data> + <data name="ValueEditor.NoWildcardMatch" xml:space="preserve"> + <value>Désactivez le caractère générique (*)</value> + </data> + <data name="Viewer.And" xml:space="preserve"> + <value>ET</value> + </data> + <data name="Viewer.ClaimUndefined" xml:space="preserve"> + <value>Aucune règle n'a été définie.</value> + </data> + <data name="Viewer.ComparisonType" xml:space="preserve"> + <value>Type de comparaison</value> + </data> + <data name="Viewer.ComparisonTypes" xml:space="preserve"> + <value>Types de comparaison</value> + </data> + <data name="Viewer.Or" xml:space="preserve"> + <value>OU</value> + </data> +</root> \ No newline at end of file diff --git a/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj index 0204de92..1a0b8568 100644 --- a/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj +++ b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj @@ -9,17 +9,4 @@ <IsTestProject>true</IsTestProject> </PropertyGroup> - <ItemGroup> - <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.1" /> - <PackageReference Include="xunit" Version="2.4.2" /> - <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> - <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> - <PrivateAssets>all</PrivateAssets> - </PackageReference> - <PackageReference Include="coverlet.collector" Version="3.2.0"> - <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> - <PrivateAssets>all</PrivateAssets> - </PackageReference> - </ItemGroup> - </Project> diff --git a/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj b/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj index 6587a399..253c0b9c 100644 --- a/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj +++ b/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj @@ -23,8 +23,8 @@ </ItemGroup> <ItemGroup> - <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="[7.0.0,)" /> - <PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="[7.0.0,)" /> + <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="[7.0.14,)" /> + <PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="[7.0.14,)" /> <PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="[7.0.0,)" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="[7.0.0,)" /> <PackageReference Include="Microsoft.Bcl.TimeProvider" Version="[8.0.0,)" /> diff --git a/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj b/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj index 93704c1e..b8c24d4d 100644 --- a/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj +++ b/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj @@ -22,7 +22,7 @@ </ItemGroup> <ItemGroup> - <PackageReference Include="Microsoft.AspNetCore.Components" Version="[7.0.0,)" /> + <PackageReference Include="Microsoft.AspNetCore.Components" Version="[7.0.14,)" /> </ItemGroup> </Project> diff --git a/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj b/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj index 9be4e2ab..ca492cd2 100644 --- a/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj +++ b/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj @@ -6,21 +6,12 @@ <Nullable>enable</Nullable> <IsPackable>false</IsPackable> + <IsTestProject>true</IsTestProject> </PropertyGroup> <ItemGroup> <PackageReference Include="bunit" Version="1.24.10" /> <PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.1" /> - <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" /> - <PackageReference Include="xunit" Version="2.4.2" /> - <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> - <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> - <PrivateAssets>all</PrivateAssets> - </PackageReference> - <PackageReference Include="coverlet.collector" Version="3.1.2"> - <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> - <PrivateAssets>all</PrivateAssets> - </PackageReference> </ItemGroup> <ItemGroup> diff --git a/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs b/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs index 037d853a..3efbf4bf 100644 --- a/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs +++ b/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs @@ -2,7 +2,7 @@ { /// <summary> /// Flags a class as a "Decorator". - /// Decorators won't be automatically registered as ICommandHandler<> or IQueryHandler<> during DI setup. + /// Decorators won't be automatically registered as ICommandHandler<> or IQueryHandler<> during DI setup. /// </summary> [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] public sealed class CQRSDecoratorAttribute : Attribute { } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs index 86963f63..07c439b3 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs @@ -4,17 +4,32 @@ namespace JGUZDV.Extensions.Authorization; +/// <summary> +/// Represents a requirement that can be satisfied by a set of claims or a claims principal. +/// </summary> [JsonDerivedType(typeof(ClaimValueRequirement), typeDiscriminator: "Value")] [JsonDerivedType(typeof(ClaimRequirementCollection), typeDiscriminator: "List")] [JsonDerivedType(typeof(NullRequirement), typeDiscriminator: "Null")] public abstract class ClaimRequirement : IEquatable<ClaimRequirement> { + /// <summary> + /// Determines if the requirement is satisfied by the specified principal. + /// </summary> public virtual bool IsSatisfiedBy(ClaimsPrincipal? principal) => IsSatisfiedBy(principal?.Claims); + /// <summary> + /// Determines if the requirement is satisfied by the specified claims. + /// </summary> public abstract bool IsSatisfiedBy(IEnumerable<Claim>? claims); + /// <summary> + /// Deep clones the requirement. + /// </summary> public abstract ClaimRequirement Clone(); + /// <summary> + /// Determines if the requirement is equal to the specified requirement. + /// </summary> public abstract bool Equals(ClaimRequirement? other); } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs index ff9b932f..819436b5 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs @@ -3,8 +3,14 @@ namespace JGUZDV.Extensions.Authorization; +/// <summary> +/// Represents a collection of requrements that can be combined with either or or and as combination logic. +/// </summary> public sealed class ClaimRequirementCollection : ClaimRequirement { + /// <summary> + /// Initializes a new instance of the <see cref="ClaimRequirementCollection"/> class. + /// </summary> [JsonConstructor] public ClaimRequirementCollection(List<ClaimRequirement> requirements, RequirementCollectionMatchType matchType) { @@ -12,16 +18,26 @@ public ClaimRequirementCollection(List<ClaimRequirement> requirements, Requireme MatchType = matchType; } + /// <summary> + /// Initializes a new instance of the <see cref="ClaimRequirementCollection"/> class. + /// </summary> public ClaimRequirementCollection(RequirementCollectionMatchType matchType, params ClaimRequirement[] requirements) { Requirements = requirements.ToList(); MatchType = matchType; } + /// <summary> + /// Gets the requirements in the collection. + /// </summary> public List<ClaimRequirement> Requirements { get; } - public RequirementCollectionMatchType MatchType { get; } + /// <summary> + /// Gets the match type for the collection. + /// </summary> + public RequirementCollectionMatchType MatchType { get; } + /// <inheritdoc/> public override bool IsSatisfiedBy(IEnumerable<Claim>? claims) => claims != null && Requirements.Any() && MatchType switch @@ -31,7 +47,7 @@ public override bool IsSatisfiedBy(IEnumerable<Claim>? claims) _ => false }; - + /// <inheritdoc/> public sealed override ClaimRequirementCollection Clone() { var requirements = new List<ClaimRequirement>(); @@ -43,6 +59,7 @@ public sealed override ClaimRequirementCollection Clone() return result; } + /// <inheritdoc/> public sealed override bool Equals(ClaimRequirement? other) { if (other is not ClaimRequirementCollection c) @@ -54,8 +71,18 @@ public sealed override bool Equals(ClaimRequirement? other) } } +/// <summary> +/// Represents the match type for a collection of requirements. +/// </summary> public enum RequirementCollectionMatchType { + /// <summary> + /// Requirment can be satisfied if all requirements are satisfied (AND). + /// </summary> MatchAll, + + /// <summary> + /// Requirement can be satisfied if any requirement is satisfied (OR). + /// </summary> MatchAny } \ No newline at end of file diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs index 6feefd80..0b88fc07 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs @@ -3,22 +3,56 @@ namespace JGUZDV.Extensions.Authorization; +/// <summary> +/// Represents a requirement compatible with the aspnet core options pattern. +/// </summary> public class ClaimRequirementOptions : IValidatableObject { + /// <summary> + /// Gets or sets the match type for the collection (use with Requirements to create a ClaimRequirementCollection). + /// </summary> public RequirementCollectionMatchType MatchType { get; set; } = RequirementCollectionMatchType.MatchAny; + + /// <summary> + /// Gets or sets the requirements in the collection (use with MatchType to create a ClaimRequirementCollection). + /// </summary> public List<ClaimRequirementOptions>? Requirements { get; set; } + /// <summary> + /// Gets or sets a single claim type (use with ClaimValue to create a ClaimValueRequirement). + /// </summary> public string? ClaimType { get; set; } + + /// <summary> + /// Gets or sets a single claim value (use with ClaimType to create a ClaimValueRequirement). + /// </summary> public string? ClaimValue { get; set; } + /// <summary> + /// Gets or sets a value indicating whether wildcard matching is disabled. + /// </summary> public bool DisableWildcardMatch { get; set; } = false; + + /// <summary> + /// Gets or sets the comparison type for the claim type. + /// </summary> public StringComparison ClaimTypeComparison { get; set; } = StringComparison.OrdinalIgnoreCase; + + /// <summary> + /// Gets or sets the comparison type for the claim value. + /// </summary> public StringComparison ClaimValueComparison { get; set; } = StringComparison.Ordinal; private ClaimRequirement? _claimRequirement; + + /// <summary> + /// Gets the claim requirement represented by the options. + /// - Either a ClaimRequirementCollection, if Requirements are defined + /// - Or a ClaimValueRequirement, if ClaimType and ClaimValue are defined + /// </summary> public ClaimRequirement ClaimRequirement { get { @@ -45,9 +79,14 @@ public ClaimRequirement ClaimRequirement { } } + /// <summary> + /// Determines if the requirement is satisfied by the specified principal. + /// </summary> public bool SatisfiesRequirement(ClaimsPrincipal principal) => ClaimRequirement.IsSatisfiedBy(principal); - + /// <summary> + /// Validates the options. + /// </summary> public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (Requirements != null) { diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs index 1ebd1a3a..f6423429 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs @@ -3,8 +3,14 @@ namespace JGUZDV.Extensions.Authorization; +/// <summary> +/// Represents a requirement that is satisfied by a specific claim value and type. +/// </summary> public sealed class ClaimValueRequirement : ClaimRequirement { + /// <summary> + /// Initializes a new instance of the <see cref="ClaimValueRequirement"/> class. + /// </summary> [JsonConstructor] public ClaimValueRequirement(string claimType, string claimValue, bool disableWildcardMatch, @@ -21,19 +27,44 @@ public ClaimValueRequirement(string claimType, string claimValue, ClaimValueComparison = claimValueComparison; } + /// <summary> + /// Initializes a new instance of the <see cref="ClaimValueRequirement"/> class. + /// </summary> public ClaimValueRequirement(string claimType, string claimValue) : this(claimType, claimValue, false) { } + /// <summary> + /// Initializes a new instance of the <see cref="ClaimValueRequirement"/> class. + /// </summary> public ClaimValueRequirement(string claimType, string claimValue, bool disableWildcardMatch) : this(claimType, claimValue, disableWildcardMatch, StringComparison.OrdinalIgnoreCase, StringComparison.Ordinal) { } + /// <summary> + /// Gets the claim type that the requirement is satisfied by. + /// </summary> public string ClaimType { get; } + + /// <summary> + /// Gets the claim value that the requirement is satisfied by. + /// </summary> public string ClaimValue { get; } + + /// <summary> + /// Gets a value indicating whether wildcard matching is disabled (allows * in ClaimValue or ClaimType). + /// </summary> public bool DisableWildcardMatch { get; } + + /// <summary> + /// Gets the comparison type for the claim type. + /// </summary> public StringComparison ClaimTypeComparison { get; } - public StringComparison ClaimValueComparison { get; } + /// <summary> + /// Gets the comparison type for the claim value. + /// </summary> + public StringComparison ClaimValueComparison { get; } + /// <inheritdoc/> public sealed override bool IsSatisfiedBy(IEnumerable<Claim>? claims) => claims?.Any() == true && claims.Any(c => (c.Type.Equals(ClaimType, ClaimTypeComparison) || (!DisableWildcardMatch && ClaimType.Equals("*"))) && @@ -41,7 +72,7 @@ public sealed override bool IsSatisfiedBy(IEnumerable<Claim>? claims) ); - + /// <inheritdoc/> public sealed override ClaimValueRequirement Clone() { return new ClaimValueRequirement( @@ -50,6 +81,7 @@ public sealed override ClaimValueRequirement Clone() ClaimTypeComparison, ClaimValueComparison); } + /// <inheritdoc/> public sealed override bool Equals(ClaimRequirement? other) { if (other is not ClaimValueRequirement c) @@ -62,6 +94,9 @@ public sealed override bool Equals(ClaimRequirement? other) ClaimValueComparison == c.ClaimValueComparison; } + /// <summary> + /// Creates a new instance of the <see cref="ClaimValueRequirement"/> class from the specified claim. + /// </summary> public static ClaimValueRequirement FromClaim(Claim claim, bool allowWildcard = false) => new(claim.Type, claim.Value, !allowWildcard, StringComparison.Ordinal, StringComparison.Ordinal); } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs index 7ca1c832..30e6f632 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs @@ -2,8 +2,14 @@ namespace JGUZDV.Extensions.Authorization { + /// <summary> + /// Extension methods for <see cref="ClaimsPrincipal"/>. + /// </summary> public static class ClaimsPrincipalExtension { + /// <summary> + /// Determines if the current user satisfies the specified requirement. + /// </summary> public static bool SatisfiesRequirement(this ClaimsPrincipal currentUser, ClaimRequirement requirement) => requirement.IsSatisfiedBy(currentUser); } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs b/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs index 04b6009c..191f73cb 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs @@ -2,16 +2,27 @@ namespace JGUZDV.Extensions.Authorization { + /// <summary> + /// Represents a requirement that is never satisfied. + /// </summary> public class NullRequirement : ClaimRequirement { + /// <summary> + /// Gets a singleton instance of the requirement. + /// </summary> public static NullRequirement Instance { get; } = new NullRequirement(); + /// <inheritdoc /> public override NullRequirement Clone() => new NullRequirement(); + /// <inheritdoc /> public override bool Equals(ClaimRequirement? other) => other is NullRequirement; + /// <summary> + /// Will always return false for the null requirement. + /// </summary> public override bool IsSatisfiedBy(IEnumerable<Claim>? principal) => false; } diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs index ed95dcaa..33ab15af 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs @@ -4,8 +4,12 @@ namespace JGUZDV.Extensions.Json.Converters { + /// <summary> + /// Converts a <see cref="ClaimsPrincipal"/> to and from JSON. + /// </summary> public class ClaimsPrincipalConverter : JsonConverter<ClaimsPrincipal> { + /// <inheritdoc/> public override ClaimsPrincipal? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType is JsonTokenType.Null) @@ -157,7 +161,7 @@ private static Claim ReadClaim(ref Utf8JsonReader reader) } - + /// <inheritdoc/> public override void Write(Utf8JsonWriter writer, ClaimsPrincipal value, JsonSerializerOptions options) { writer.WriteStartObject(); diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs index fd3ac1f1..e24d0d14 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs @@ -4,8 +4,12 @@ namespace JGUZDV.Extensions.Json.Converters; +/// <summary> +/// Converts a <see cref="DateOnly"/> to and from JSON. +/// </summary> public class DateOnlyConverter : JsonConverter<DateOnly> { + /// <inheritdoc/> public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); @@ -15,6 +19,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso return DateOnly.ParseExact(value, "yyyy'-'MM'-'dd"); } + /// <inheritdoc/> public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString("yyyy'-'MM'-'dd")); diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs index 743c314e..69f955ae 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs @@ -3,21 +3,30 @@ namespace JGUZDV.Extensions.Json.Converters; +/// <summary> +/// Converts a <see cref="string"/> to and from JSON, trimming the value. +/// </summary> public class StringTrimmingJsonConverter : JsonConverter<string> { private readonly bool _trimToNull; + /// <summary> + /// Initializes a new instance of the <see cref="StringTrimmingJsonConverter"/> class. + /// </summary> + /// <param name="trimToNull">Decide, if emtpy strings should be replaced with null.</param> public StringTrimmingJsonConverter(bool trimToNull = true) { _trimToNull = trimToNull; } + /// <inheritdoc/> public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); return Trim(value); } + /// <inheritdoc/> public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(Trim(value)); diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs index 6146d3e3..13108ca0 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs @@ -4,8 +4,12 @@ namespace JGUZDV.Extensions.Json.Converters; +/// <summary> +/// Converts a <see cref="TimeOnly"/> to and from JSON. +/// </summary> public class TimeOnlyConverter : JsonConverter<TimeOnly> { + /// <inheritdoc/> public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); @@ -15,6 +19,7 @@ public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso return TimeOnly.ParseExact(value, "HH:mm:ss"); } + /// <inheritdoc/> public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString("HH:mm:ss")); diff --git a/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs b/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs index f1425559..a03a2d13 100644 --- a/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs +++ b/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs @@ -4,14 +4,17 @@ namespace JGUZDV.Extensions.Json; +/// <summary> +/// Extension methods for <see cref="JsonSerializerOptions"/>. +/// </summary> public static class JsonSerializerOptionsExtensions { /// <summary> /// This will set some default behaviour to JsonSerializerOptions: -#if NET6_0 - /// - Add DateOnlyConverter - /// - Add TimeOnlyConverter -#endif + /// - if NET6_0: + /// - Add DateOnlyConverter + /// - Add TimeOnlyConverter + /// - always: /// - Add StringTrimmingJsonConverter /// - Set DefaultIgnoreCondition to "WhenWritingNull" /// - PropertyNamingPolicy to 'null' diff --git a/libraries/JGUZDV.Extensions.Logging/src/Constants.cs b/libraries/JGUZDV.Extensions.Logging/src/Constants.cs index ccaa043d..f85c541b 100644 --- a/libraries/JGUZDV.Extensions.Logging/src/Constants.cs +++ b/libraries/JGUZDV.Extensions.Logging/src/Constants.cs @@ -1,8 +1,18 @@ namespace JGUZDV.Extensions.Logging { + /// <summary> + /// Constants used by the logging extensions. + /// </summary> public class Constants { + /// <summary> + /// The default section name for logging configuration. + /// </summary> public const string DefaultSectionName = "Logging"; + + /// <summary> + /// The default event log source. + /// </summary> public const string DefaultEventLogSource = ".NET Runtime"; } } diff --git a/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs b/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs index 6d5c0499..16f3149b 100644 --- a/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs +++ b/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs @@ -4,25 +4,20 @@ namespace Microsoft.Extensions.DependencyInjection; +/// <summary> +/// Extension methods for configuring logging. +/// </summary> public static class JGUZDVHostBuilderLoggingExtensions { + /// <summary> + /// Configures the host builder to use the default logging configuration. + /// </summary> public static IHostBuilder UseJGUZDVLogging(this IHostBuilder hostBuilder) => hostBuilder.UseJGUZDVLogging(Constants.DefaultSectionName); + /// <summary> + /// Configures the host builder to use the specified logging configuration. + /// </summary> public static IHostBuilder UseJGUZDVLogging(this IHostBuilder hostBuilder, string configSectionName) => hostBuilder.UseSerilog((ctx, logger) => logger.BuildSerilogLogger(ctx.HostingEnvironment, ctx.Configuration, configSectionName)); - -/* -#if NET7_0_OR_GREATER - public static HostApplicationBuilder UseJGUZDVLogging(this HostApplicationBuilder applicationBuilder) - => applicationBuilder.UseJGUZDVLogging(Constants.DefaultSectionName); - - public static HostApplicationBuilder UseJGUZDVLogging(this HostApplicationBuilder applicationBuilder, string configSectionName) - { - applicationBuilder - applicationBuilder.UseSerilog((ctx, logger) => logger.BuildSerilogLogger(ctx.HostingEnvironment, ctx.Configuration, configSectionName)); - } - -#endif -*/ } \ No newline at end of file diff --git a/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs b/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs index 1f5d612f..d77c670b 100644 --- a/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs +++ b/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs @@ -8,7 +8,7 @@ namespace JGUZDV.Extensions.Logging; -public static class SerilogHelpers +internal static class SerilogHelpers { internal static void BuildSerilogLogger(this LoggerConfiguration logger, IHostEnvironment hostEnvironment, IConfiguration configuration, string configSectionName) { diff --git a/libraries/JGUZDV.WebApiHost/src/Controllers/FeatureManager.cs b/libraries/JGUZDV.WebApiHost/src/Controllers/FeatureManager.cs new file mode 100644 index 00000000..6433223e --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/Controllers/FeatureManager.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.FeatureManagement; + +namespace JGUZDV.WebApiHost.Controllers +{ + /// <summary> + /// Controller for feauture flags + /// </summary> + [ApiController] + public class FeatureManager : ControllerBase + { + private readonly IFeatureManager _featureManager; + + /// <summary> + /// .ctor + /// </summary> + public FeatureManager(IFeatureManager featureManager) + { + _featureManager = featureManager; + } + + /// <summary> + /// Returns a list of all features and their status for the current user. + /// </summary> + [HttpGet("app/features")] + [Produces<FeatureList>] + public async Task<IActionResult> GetFeatures() + { + var result = new List<Feature>(); + + var featureNames = _featureManager.GetFeatureNamesAsync(); + await foreach(var featureName in featureNames) + { + var isEnabled = await _featureManager.IsEnabledAsync(featureName); + result.Add(new Feature(featureName, isEnabled)); + } + + return Ok(new FeatureList(result)); + } + + /// <summary> + /// Represents a feature and its status + /// </summary> + public record Feature(string Name, bool IsEnabled); + + /// <summary> + /// Represents a list of features and their status + /// </summary> + public record FeatureList(IEnumerable<Feature> Features); + } +} diff --git a/libraries/JGUZDV.WebApiHost/src/Extensions/ConfigurationExtensions.cs b/libraries/JGUZDV.WebApiHost/src/Extensions/ConfigurationExtensions.cs new file mode 100644 index 00000000..df658385 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/Extensions/ConfigurationExtensions.cs @@ -0,0 +1,10 @@ +using Microsoft.Extensions.Configuration; + +namespace JGUZDV.Blazor.WasmServerHost.Extensions +{ + internal static class ConfigurationExtensions + { + public static bool HasConfigSection(this IConfiguration configuration, string configSection) + => configuration.GetSection(configSection).Exists(); + } +} diff --git a/libraries/JGUZDV.WebApiHost/src/FeatureManagement/ClaimRequirementFeatureFilter.cs b/libraries/JGUZDV.WebApiHost/src/FeatureManagement/ClaimRequirementFeatureFilter.cs new file mode 100644 index 00000000..15cf7fed --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/FeatureManagement/ClaimRequirementFeatureFilter.cs @@ -0,0 +1,33 @@ +using JGUZDV.Extensions.Authorization; + +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.FeatureManagement; + +namespace JGUZDV.WebApiHost.FeatureManagement +{ + [FilterAlias(nameof(ClaimRequirement))] + internal class ClaimRequirementFeatureFilter : IFeatureFilter + { + private readonly IHttpContextAccessor _httpContextAccessor; + + public ClaimRequirementFeatureFilter(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context) + { + var user = _httpContextAccessor.HttpContext?.User; + if(user == null) + { + return Task.FromResult(false); + } + + var requirementOptions = new ClaimRequirementOptions(); + context.Parameters.Bind(requirementOptions); + + return Task.FromResult(user.SatisfiesRequirement(requirementOptions.ClaimRequirement)); + } + } +} diff --git a/libraries/JGUZDV.WebApiHost/src/JGUZDV.WebApiHost.csproj b/libraries/JGUZDV.WebApiHost/src/JGUZDV.WebApiHost.csproj new file mode 100644 index 00000000..a911b67a --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/JGUZDV.WebApiHost.csproj @@ -0,0 +1,38 @@ +<Project Sdk="Microsoft.NET.Sdk.Web"> + + <PropertyGroup> + <TargetFrameworks>net8.0</TargetFrameworks> + <OutputType>Library</OutputType> + + <Nullable>enable</Nullable> + <ImplicitUsings>enable</ImplicitUsings> + + <NeutralLanguage>de</NeutralLanguage> + <RootNamespace>JGUZDV.WebApiHost</RootNamespace> + + <PackageId>JGUZDV.WebApiHost</PackageId> + <IsPackable>true</IsPackable> + <Version>1.0.0-beta</Version> + <Authors>Thomas Ottenhus</Authors> + <Company>Zentrum für Datenverarbeitung - JGU Mainz</Company> + <PackageDescription>Host for WebApi Applications based on our other packages</PackageDescription> + + <AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder> + + <OpenApiGenerateDocuments>false</OpenApiGenerateDocuments> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="[8.0.0,)" /> + <PackageReference Include="Microsoft.Extensions.Caching.SqlServer" Version="[8.0.0,)" /> + <PackageReference Include="Microsoft.FeatureManagement.AspNetCore" Version="4.0.0-preview" /> + <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\..\JGUZDV.AspNetCore.DataProtection\src\JGUZDV.AspNetCore.DataProtection.csproj" /> + <ProjectReference Include="..\..\JGUZDV.AspNetCore.Logging\src\JGUZDV.AspNetCore.Logging.csproj" /> + <ProjectReference Include="..\..\JGUZDV.Extensions.Authorization\src\JGUZDV.Extensions.Authorization.csproj" /> + <ProjectReference Include="..\..\JGUZDV.Extensions.Json\src\JGUZDV.Extensions.Json.csproj" /> + </ItemGroup> +</Project> diff --git a/libraries/JGUZDV.WebApiHost/src/Properties/launchSettings.json b/libraries/JGUZDV.WebApiHost/src/Properties/launchSettings.json new file mode 100644 index 00000000..adad8cbb --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "JGUZDV.WebApiHost": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:52061;http://localhost:52062" + } + } +} \ No newline at end of file diff --git a/libraries/JGUZDV.WebApiHost/src/README.md b/libraries/JGUZDV.WebApiHost/src/README.md new file mode 100644 index 00000000..20ff013c --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/README.md @@ -0,0 +1,67 @@ +# JGUZDV.Blazor.WasmServerHost + +This package is intended to be used as a helper to configure services and the request +pipeline needed to host a AspNetCore WebAPI application. +It's highly opinionated and will use our other packeges to provide a default configuration. + +## Usage + +**Program.cs** +```csharp +var builder = WebApplicationBuilder.Create(args); +builder.ConfigureWebApiHost(); // You can extend this by using the provided actions + +var app = builder.Build(); + +app.ConfigureWebApiHost(); +app.Run(); +``` + +To use all features, you need to have configuration sections, each referring to a specific feature: + +**appsettings.json** +```json +{ + "Logging": { + ... // see https://nuget.org/jguzdv/JGUZDV.AspNetCore.Logging + }, + + "JGUZDV":{ + "DataProtection": { + ... // see https://nuget.org/jguzdv/JGUZDV.AspNetCore.DataProtection + }, + }, + + "Authentication": { + "JwtBearer": { + "Authority": "https://example.com", + "Audience": "example", + "RequiredScopes": [ "scope1", "scope2" ] + "ScopeType": "ClaimTypeOfScopes" // "scope" if empty + } + }, + + "DistributedCache": { // Omit if not needed + "ConnectionString": "...", + "SchemaName": "...", + "TableName": "..." + }, + + "FeatureManagement": { + "Feature1": true, + "Feature2": false, + "Feature3": { + "EnabledFor": [ + { + "Name": "ClaimRequirement", + "Parameters": { + "ClaimType": "custom-claim", + "ClaimValue": "value + + ... // see https://nuget.org/jguzdv/JGUZDV.Extensions.Authorization + } + } + } + }, +} +``` \ No newline at end of file diff --git a/libraries/JGUZDV.WebApiHost/src/WebApiHost.cs b/libraries/JGUZDV.WebApiHost/src/WebApiHost.cs new file mode 100644 index 00000000..260bfea8 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/WebApiHost.cs @@ -0,0 +1,283 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Text.Json.Serialization; + +using JGUZDV.Blazor.WasmServerHost.Extensions; +using JGUZDV.Extensions.Json; +using JGUZDV.WebApiHost.FeatureManagement; + +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Http.Json; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.FeatureManagement; +using Microsoft.IdentityModel.Logging; + +namespace JGUZDV.WebApiHost; + +/// <summary> +/// WebApiHost is a helper class to configure a WebApiHost with common services and features. +/// </summary> +public static partial class WebApiHost +{ + /// <summary> + /// Default Config Sections for WebApiHost + /// </summary> + public static class ConfigSections + { +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + public const string Authentication = "Authentication"; + public const string DataProtection = AspNetCore.DataProtection.Constants.DefaultSectionName; + public const string DistributedCache = "DistributedCache"; + public const string FeatureManagement = "FeatureManagement"; + public const string Telemetry = "ApplicationInsights"; +#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + } + + /// <summary> + /// Configures services of the WebApplicationBuilder: + /// - Adds JGUZDVLogging + /// - Adds ApiExplorer and Swagger + /// - Adds ProblemDetails + /// - Adds MVC controllers and sets default JsonOptions (minimal API as well as MVC) + /// - Adds RequestLocalization ("de", "en" as default) + /// - Adds Distributed Cache + /// - Adds Data Protection + /// - Adds Authentication and Authorization + /// - Adds Feature Management + /// - Adds Telemetry + /// - Adds HealthChecks + /// </summary> + public static WebApplicationBuilder ConfigureWebApiHostServices( + this WebApplicationBuilder builder, + Action<AuthenticationBuilder>? authenticationBuilderAction = null, + Action<IDataProtectionBuilder>? dataProtectionBuilderAction = null, + Action<IFeatureManagementBuilder>? featureManagementBuilderAction = null, + Action<IMvcBuilder>? mvcBuilderAction = null + ) + { + var services = builder.Services; + var config = builder.Configuration; + var environment = builder.Environment; + + JwtSecurityTokenHandler.DefaultMapInboundClaims = false; + IdentityModelEventSource.ShowPII = builder.Configuration.GetValue<bool>("ShowPII", false); + + builder.UseJGUZDVLogging(); + + var sp = services.BuildServiceProvider(); + var loggerFactory = sp.GetService<ILoggerFactory>(); + + try + { + var logger = loggerFactory?.CreateLogger(nameof(WebApiHost)) ?? NullLogger.Instance; + + // Enable ApiExplorer + services.AddEndpointsApiExplorer(); + services.AddSwaggerGen(); + + // Enable Problem Details + services.AddProblemDetails(); + + // Enable MVC controllers + var mvcBuilder = services.AddControllers(); + mvcBuilderAction?.Invoke(mvcBuilder); + mvcBuilder.AddJsonOptions(opt => + { + opt.JsonSerializerOptions.SetJGUZDVDefaults(); + opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); + }); + + // Set json options for minimal API + services.Configure<JsonOptions>(opt => + { + opt.SerializerOptions.SetJGUZDVDefaults(); + opt.SerializerOptions.Converters.Add(new JsonStringEnumConverter()); + }); + + + // Add Localization for DE, EN and RequestLocaltization + services.AddLocalization(); + var locales = config + .GetSection("RequestLocalization:Cultures") + .Get<string[]>() ?? ["de", "en"]; + + services.AddRequestLocalization(opt => opt + .AddSupportedCultures(locales) + .AddSupportedUICultures(locales) + .SetDefaultCulture(locales[0]) + ); + + + // Add distributed cache + if (environment.IsProduction() && config.HasConfigSection(ConfigSections.DistributedCache)) + { + services.AddDistributedSqlServerCache(opt => config.GetSection(ConfigSections.DistributedCache).Bind(opt)); + } + else + { + services.AddDistributedMemoryCache(); + } + + if (!config.HasConfigSection(ConfigSections.DistributedCache)) + Log.MissingConfig(logger, ConfigSections.DistributedCache); + + + // Add data protection + IDataProtectionBuilder dataProtectionBuilder = + environment.IsProduction() && config.HasConfigSection(ConfigSections.DataProtection) + ? services.AddJGUZDVDataProtection(config, environment) + : services.AddDataProtection(); + + dataProtectionBuilderAction?.Invoke(dataProtectionBuilder); + + if (!config.HasConfigSection(ConfigSections.DataProtection)) + Log.MissingConfig(logger, ConfigSections.DataProtection); + + + // Add authentication and authorization + if (config.HasConfigSection(ConfigSections.Authentication)) + { + var configSection = config.GetSection($"{ConfigSections.Authentication}:JwtBearer"); + + var authBuilder = services + .AddAuthentication(opt => opt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(opt => + { + var validAudiences = configSection.GetSection("ValidAudiences").Get<ICollection<string>?>() ?? []; + var validateAudience = validAudiences?.Count > 0; + + opt.TokenValidationParameters.ValidateAudience = validateAudience; + opt.TokenValidationParameters.ValidAudiences = validAudiences; + + config.GetSection(ConfigSections.Authentication).Bind(opt); + + if (opt.TokenValidationParameters.ValidAudiences?.Any() != true) + Log.NoValidAudiences(logger); + }); + + authenticationBuilderAction?.Invoke(authBuilder); + + services.AddAuthorization(opt => + { + var scopes = configSection.GetSection("RequiredScopes").Get<ICollection<string>?>() ?? []; + if (scopes.Count == 0) + { + Log.NoRequiredScopes(logger); + } + else + { + var scopeClaimType = configSection["ScopeType"] ?? "scope"; + + opt.AddPolicy("ScopedDefault", p => + { + p.RequireAuthenticatedUser(); + p.RequireClaim("scope", scopes); + + }); + opt.DefaultPolicy = opt.GetPolicy("ScopedDefault")!; + } + }); + } + else + { + Log.MissingConfig(logger, ConfigSections.Authentication); + } + + + // Feature Management + if (config.HasConfigSection(ConfigSections.FeatureManagement)) + { + var featureManagementBuilder = services.AddScopedFeatureManagement( + config.GetSection(ConfigSections.FeatureManagement) + ) + .AddFeatureFilter<ClaimRequirementFeatureFilter>(); + + featureManagementBuilderAction?.Invoke(featureManagementBuilder); + } + else + { + Log.MissingConfig(logger, ConfigSections.FeatureManagement); + } + + + // Telemetry + if (config.HasConfigSection(ConfigSections.Telemetry)) + { + // TODO: Add default calls for Telemetry and Healthchecks + services.AddHealthChecks(); + } + else + { + Log.MissingConfig(logger, ConfigSections.Telemetry); + services.AddHealthChecks(); + } + + return builder; + } + finally + { + loggerFactory?.Dispose(); + } + } + + + /// <summary> + /// Configures the web application pipeline: + /// - Adds DeveloperExceptionPage (in Development) + /// - Adds Routing + /// - Adds Authentication and Authorization + /// - Adds RequestLocalization + /// - Adds Controllers + /// - Adds HealthChecks + /// - Adds Swagger + /// - Adds SwaggerUI + /// </summary> + /// <param name="app"></param> + /// <returns></returns> + public static WebApplication ConfigureWebApiHost(this WebApplication app) + { + var conf = app.Configuration; + var env = app.Environment; + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + + app.UseRouting(); + + app.UseAuthentication(); + app.UseAuthorization(); + + app.UseRequestLocalization(); + + app.MapControllers(); + + app.MapHealthChecks("/health"); + app.MapGet("/docs", ctx => + { + ctx.Response.Redirect("/swagger"); + return Task.CompletedTask; + }); + + app.MapSwagger(); + app.UseSwaggerUI(); + + return app; + } + + + private partial class Log + { + [LoggerMessage(LogLevel.Information, "Could not find config {configSection}. The corresponding feature will not be added to services or pipeline.")] + public static partial void MissingConfig(ILogger logger, string configSection); + + [LoggerMessage(LogLevel.Information, "Could not find config Authentication:JwtBearer:ValidAudiences, audiences will not be considered.")] + public static partial void NoValidAudiences(ILogger logger); + + [LoggerMessage(LogLevel.Warning, "Could not find config Authentication:JwtBearer:RequiredScopes, consider addings required scopes to validate the token is meant for us.")] + public static partial void NoRequiredScopes(ILogger logger); + } +} diff --git a/libraries/JGUZDV.WebApiHost/test/GlobalUsings.cs b/libraries/JGUZDV.WebApiHost/test/GlobalUsings.cs new file mode 100644 index 00000000..8c927eb7 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/test/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/libraries/JGUZDV.WebApiHost/test/JGUZDV.WebApiHost.Tests.csproj b/libraries/JGUZDV.WebApiHost/test/JGUZDV.WebApiHost.Tests.csproj new file mode 100644 index 00000000..5d14fd61 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/test/JGUZDV.WebApiHost.Tests.csproj @@ -0,0 +1,16 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + + <IsPackable>false</IsPackable> + <IsTestProject>true</IsTestProject> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\src\JGUZDV.WebApiHost.csproj" /> + </ItemGroup> + +</Project> diff --git a/libraries/JGUZDV.WebApiHost/test/UnitTest1.cs b/libraries/JGUZDV.WebApiHost/test/UnitTest1.cs new file mode 100644 index 00000000..22244696 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/test/UnitTest1.cs @@ -0,0 +1,6 @@ +namespace JGUZDV.WebApiHost.Tests; + +public class UnitTest1 +{ + // TODO: Testability noch unklar +} \ No newline at end of file