diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 00000000..476dd7c3 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "fantomas": { + "version": "7.0.3", + "commands": [ + "fantomas" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index de329fa9..1cc6785c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,4 +4,6 @@ root = true insert_final_newline = false trim_trailing_whitespace = true indent_style = space + +[*.{xml,slnx,fsproj,csproj,xaml}] indent_size = 2 \ No newline at end of file diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 2bd7c2e4..52372b8f 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -21,13 +21,13 @@ jobs: 6.0.x - name: Restore - run: dotnet restore src/Elmish.WPF.sln + run: dotnet restore Elmish.WPF.sln - name: Build - run: dotnet build --no-restore --configuration Release src/Elmish.WPF.sln + run: dotnet build --no-restore --configuration Release Elmish.WPF.sln - name: Test - run: dotnet test --no-build --configuration Release src/Elmish.WPF.Tests/Elmish.WPF.Tests.fsproj + run: dotnet test --no-build --configuration Release tests/Elmish.WPF.Tests/Elmish.WPF.Tests.fsproj - name: Publish NuGet uses: alirezanet/publish-nuget@v3.0.4 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 28bddc2a..fc8187b3 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -23,10 +23,10 @@ jobs: 6.0.x - name: Restore - run: dotnet restore src/Elmish.WPF.sln + run: dotnet restore Elmish.WPF.sln - name: Build - run: dotnet build --no-restore --configuration Release src/Elmish.WPF.sln + run: dotnet build --no-restore --configuration Release Elmish.WPF.sln - name: Test - run: dotnet test --no-build --configuration Release src/Elmish.WPF.Tests/Elmish.WPF.Tests.fsproj + run: dotnet test --no-build --configuration Release tests/Elmish.WPF.Tests/Elmish.WPF.Tests.fsproj diff --git a/.gitignore b/.gitignore index 9f0c5275..d0581198 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,9 @@ BenchmarkDotNet.Artifacts/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ +# Claude AI local settings +.claude/ + ### VS Code ### .vscode/* !.vscode/settings.json diff --git a/Elmish.WPF.sln b/Elmish.WPF.sln new file mode 100644 index 00000000..1e82b5d2 --- /dev/null +++ b/Elmish.WPF.sln @@ -0,0 +1,1100 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Elmish.WPF", "src\Elmish.WPF\Elmish.WPF.fsproj", "{ED67A1EA-E467-4ABC-B627-8D8A184E20E9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Elmish.WPF.Benchmarks", "tests\Elmish.WPF.Benchmarks\Elmish.WPF.Benchmarks.fsproj", "{06B21109-54A2-47FD-B701-C5B572059F88}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Elmish.WPF.Tests", "tests\Elmish.WPF.Tests\Elmish.WPF.Tests.fsproj", "{603D8145-0AD4-44BE-A730-678B9BE015E1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{D1B4CF99-7947-DD6C-81D0-5B5B3989814C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dynamic", "Dynamic", "{D93CAD63-3252-5A7F-9C37-FCA27F08B606}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Capabilities", "src\Samples\Dynamic\Capabilities\Capabilities.csproj", "{F905EB30-20A0-42F6-9035-98C27D1CCF81}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Capabilities.Core", "src\Samples\Dynamic\Capabilities.Core\Capabilities.Core.fsproj", "{EBC55A44-EF7F-4D3E-8E94-8848C00C3059}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventBindingsAndBehaviors", "src\Samples\Dynamic\EventBindingsAndBehaviors\EventBindingsAndBehaviors.csproj", "{CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "EventBindingsAndBehaviors.Core", "src\Samples\Dynamic\EventBindingsAndBehaviors.Core\EventBindingsAndBehaviors.Core.fsproj", "{C1E54278-5FE4-4370-AA98-AB20F037AD6A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileDialogs", "src\Samples\Dynamic\FileDialogs\FileDialogs.csproj", "{1982CF30-6D02-45F6-808A-C35A75623343}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FileDialogs.Core", "src\Samples\Dynamic\FileDialogs.Core\FileDialogs.Core.fsproj", "{ABCDCFAB-666F-40FA-906F-AFC3916E25D3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileDialogsCmdMsg", "src\Samples\Dynamic\FileDialogsCmdMsg\FileDialogsCmdMsg.csproj", "{69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FileDialogsCmdMsg.Core", "src\Samples\Dynamic\FileDialogsCmdMsg.Core\FileDialogsCmdMsg.Core.fsproj", "{FAD8476C-AE4E-4298-9F08-044ED3C0BA08}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Multiselect", "src\Samples\Dynamic\Multiselect\Multiselect.csproj", "{02668954-D273-4140-9FD2-1BDE615A401E}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Multiselect.Core", "src\Samples\Dynamic\Multiselect.Core\Multiselect.Core.fsproj", "{8565CE50-713C-4336-88AD-EAC732DC921A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NewWindow", "src\Samples\Dynamic\NewWindow\NewWindow.csproj", "{5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "NewWindow.Core", "src\Samples\Dynamic\NewWindow.Core\NewWindow.Core.fsproj", "{F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OneWaySeq", "src\Samples\Dynamic\OneWaySeq\OneWaySeq.csproj", "{239809C7-5679-4A85-AC76-254AB83C1DF0}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "OneWaySeq.Core", "src\Samples\Dynamic\OneWaySeq.Core\OneWaySeq.Core.fsproj", "{7B1997D7-7E82-4094-97FF-F267AB1E628E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SingleCounter", "src\Samples\Dynamic\SingleCounter\SingleCounter.csproj", "{464B25D1-BF6F-4F52-B8C1-2F783A4865AE}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SingleCounter.Core", "src\Samples\Dynamic\SingleCounter.Core\SingleCounter.Core.fsproj", "{74BE5736-B441-4371-AB5B-F1C7A61341C2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sticky", "src\Samples\Dynamic\Sticky\Sticky.csproj", "{54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sticky.Core", "src\Samples\Dynamic\Sticky.Core\Sticky.Core.fsproj", "{F30FD499-8F88-4613-8B15-C06AA649881F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModel", "src\Samples\Dynamic\SubModel\SubModel.csproj", "{220CFDCE-5B3B-49C7-A340-C19B7C28BF79}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModel.Core", "src\Samples\Dynamic\SubModel.Core\SubModel.Core.fsproj", "{D17190BB-8C0E-4CC3-8644-F0B120EDBD55}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModelOpt", "src\Samples\Dynamic\SubModelOpt\SubModelOpt.csproj", "{6A489E6B-CD18-442D-A856-89DDE710B009}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModelOpt.Core", "src\Samples\Dynamic\SubModelOpt.Core\SubModelOpt.Core.fsproj", "{E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModelSelectedItem", "src\Samples\Dynamic\SubModelSelectedItem\SubModelSelectedItem.csproj", "{86B65707-7652-4ED0-8B0A-6C4907E8FF86}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModelSelectedItem.Core", "src\Samples\Dynamic\SubModelSelectedItem.Core\SubModelSelectedItem.Core.fsproj", "{686BA896-BD38-490A-88C1-A8D0B48D05E6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModelSeq", "src\Samples\Dynamic\SubModelSeq\SubModelSeq.csproj", "{A737F617-3916-4AC1-AEEE-69585FF89838}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModelSeq.Core", "src\Samples\Dynamic\SubModelSeq.Core\SubModelSeq.Core.fsproj", "{A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Threading", "src\Samples\Dynamic\Threading\Threading.csproj", "{335C2372-CB51-4569-B04D-CE8AFC8EC755}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Threading.Core", "src\Samples\Dynamic\Threading.Core\Threading.Core.fsproj", "{59976F36-A8F0-425E-9620-FA78E68E145F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UiBoundCmdParam", "src\Samples\Dynamic\UiBoundCmdParam\UiBoundCmdParam.csproj", "{3D4E6246-667E-4243-B2F3-B9CE12743B8D}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "UiBoundCmdParam.Core", "src\Samples\Dynamic\UiBoundCmdParam.Core\UiBoundCmdParam.Core.fsproj", "{BBC09072-9D08-454F-90BF-FD754CD60B93}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Validation", "src\Samples\Dynamic\Validation\Validation.csproj", "{43CF5F69-38A8-493E-960A-0877E248996F}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Validation.Core", "src\Samples\Dynamic\Validation.Core\Validation.Core.fsproj", "{C7D0416E-9785-40A1-921D-C92A56A9848F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Typed", "Typed", "{1740D47D-DA94-6415-017E-48203BA1C52C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModelStatic", "src\Samples\Typed\SubModelStatic\SubModelStatic.csproj", "{2A113076-21F0-4F11-A1CF-D0E4A1D14503}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModelStatic.Core", "src\Samples\Typed\SubModelStatic.Core\SubModelStatic.Core.fsproj", "{A7BA896C-1D7E-4336-BE50-032BF8E62D81}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SingleCounter.Core", "src\Samples\Typed\SingleCounter.Core\SingleCounter.Core.fsproj", "{F964D761-6542-4A3C-8ADC-41F5B8F77529}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SingleCounter", "src\Samples\Typed\SingleCounter\SingleCounter.csproj", "{148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Validation.Core", "src\Samples\Typed\Validation.Core\Validation.Core.fsproj", "{6455B74A-6CB8-4DC3-9329-3D9CBB56173A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Validation", "src\Samples\Typed\Validation\Validation.csproj", "{84AF37C1-52A8-4F3F-8F2C-E7394E789523}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModelSeq.Core", "src\Samples\Typed\SubModelSeq.Core\SubModelSeq.Core.fsproj", "{75110CC0-5A94-4491-BA7E-234ACC39106D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModelSeq", "src\Samples\Typed\SubModelSeq\SubModelSeq.csproj", "{8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModelOpt.Core", "src\Samples\Typed\SubModelOpt.Core\SubModelOpt.Core.fsproj", "{A57D4155-3F27-4BDA-900E-1A39B022BE00}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModelOpt", "src\Samples\Typed\SubModelOpt\SubModelOpt.csproj", "{86E04393-86E7-4BBF-A9EF-9433B91E4988}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Sticky.Core", "src\Samples\Typed\Sticky.Core\Sticky.Core.fsproj", "{B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sticky", "src\Samples\Typed\Sticky\Sticky.csproj", "{435B3E59-C5B2-412A-86DC-795F1E52C223}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "OneWaySeq.Core", "src\Samples\Typed\OneWaySeq.Core\OneWaySeq.Core.fsproj", "{6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OneWaySeq", "src\Samples\Typed\OneWaySeq\OneWaySeq.csproj", "{CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "UiBoundCmdParam.Core", "src\Samples\Typed\UiBoundCmdParam.Core\UiBoundCmdParam.Core.fsproj", "{A3D2D2D1-413E-4367-B1D5-0AEEB1551240}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UiBoundCmdParam", "src\Samples\Typed\UiBoundCmdParam\UiBoundCmdParam.csproj", "{03FA4F94-962D-4324-B71E-D36E638D13D7}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "EventBindingsAndBehaviors.Core", "src\Samples\Typed\EventBindingsAndBehaviors.Core\EventBindingsAndBehaviors.Core.fsproj", "{197B01F2-1974-46A1-9C40-7303E405BFA7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventBindingsAndBehaviors", "src\Samples\Typed\EventBindingsAndBehaviors\EventBindingsAndBehaviors.csproj", "{0C0BBD9A-1AC7-4B54-B725-03535AE033F1}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FileDialogs.Core", "src\Samples\Typed\FileDialogs.Core\FileDialogs.Core.fsproj", "{1093E8A9-77C3-43A0-ACA2-E0857EC19AED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileDialogs", "src\Samples\Typed\FileDialogs\FileDialogs.csproj", "{FC2045E2-A48F-4389-9F72-90EDE8918FCC}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FileDialogsCmdMsg.Core", "src\Samples\Typed\FileDialogsCmdMsg.Core\FileDialogsCmdMsg.Core.fsproj", "{9B3D5A8F-16CD-4644-A239-EC2519195C80}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileDialogsCmdMsg", "src\Samples\Typed\FileDialogsCmdMsg\FileDialogsCmdMsg.csproj", "{BB30719A-3461-493E-972F-F6CEF534163E}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Threading.Core", "src\Samples\Typed\Threading.Core\Threading.Core.fsproj", "{9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Threading", "src\Samples\Typed\Threading\Threading.csproj", "{E6476EE0-71CA-4E5D-BE05-E57825E8AECB}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Multiselect.Core", "src\Samples\Typed\Multiselect.Core\Multiselect.Core.fsproj", "{984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Multiselect", "src\Samples\Typed\Multiselect\Multiselect.csproj", "{20D9470B-F39E-4E67-A00D-9714D6E857DE}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SubModelSelectedItem.Core", "src\Samples\Typed\SubModelSelectedItem.Core\SubModelSelectedItem.Core.fsproj", "{5D54DD79-59AA-4C85-8ECA-CAC59D86F251}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubModelSelectedItem", "src\Samples\Typed\SubModelSelectedItem\SubModelSelectedItem.csproj", "{F10A1DEA-545F-4C9F-AFA1-A115726BD415}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "NewWindow.Core", "src\Samples\Typed\NewWindow.Core\NewWindow.Core.fsproj", "{0330D3D5-5A97-4F6D-AE22-993256ABDFEE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NewWindow", "src\Samples\Typed\NewWindow\NewWindow.csproj", "{565FC442-5E49-42AD-AC33-14AD14E11961}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Capabilities.Core", "src\Samples\Typed\Capabilities.Core\Capabilities.Core.fsproj", "{F6BB74C6-971A-44D7-BC10-3B37B74DE264}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Capabilities", "src\Samples\Typed\Capabilities\Capabilities.csproj", "{8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Navigation", "src\Samples\Typed\Navigation\Navigation.csproj", "{1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Navigation.Core", "src\Samples\Typed\Navigation.Core\Navigation.Core.fsproj", "{46397A4D-287C-410E-BDE9-1F09D7E64EF0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Navigation", "src\Samples\Dynamic\Navigation\Navigation.csproj", "{12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Navigation.Core", "src\Samples\Dynamic\Navigation.Core\Navigation.Core.fsproj", "{D6BDA325-9615-42F5-8D42-EEF27F9E7339}" +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 + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Debug|x64.ActiveCfg = Debug|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Debug|x64.Build.0 = Debug|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Debug|x86.ActiveCfg = Debug|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Debug|x86.Build.0 = Debug|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Release|Any CPU.Build.0 = Release|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Release|x64.ActiveCfg = Release|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Release|x64.Build.0 = Release|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Release|x86.ActiveCfg = Release|Any CPU + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9}.Release|x86.Build.0 = Release|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Debug|x64.ActiveCfg = Debug|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Debug|x64.Build.0 = Debug|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Debug|x86.ActiveCfg = Debug|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Debug|x86.Build.0 = Debug|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Release|Any CPU.Build.0 = Release|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Release|x64.ActiveCfg = Release|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Release|x64.Build.0 = Release|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Release|x86.ActiveCfg = Release|Any CPU + {06B21109-54A2-47FD-B701-C5B572059F88}.Release|x86.Build.0 = Release|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Debug|x64.ActiveCfg = Debug|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Debug|x64.Build.0 = Debug|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Debug|x86.ActiveCfg = Debug|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Debug|x86.Build.0 = Debug|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Release|Any CPU.Build.0 = Release|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Release|x64.ActiveCfg = Release|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Release|x64.Build.0 = Release|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Release|x86.ActiveCfg = Release|Any CPU + {603D8145-0AD4-44BE-A730-678B9BE015E1}.Release|x86.Build.0 = Release|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Debug|x64.ActiveCfg = Debug|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Debug|x64.Build.0 = Debug|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Debug|x86.ActiveCfg = Debug|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Debug|x86.Build.0 = Debug|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Release|Any CPU.Build.0 = Release|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Release|x64.ActiveCfg = Release|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Release|x64.Build.0 = Release|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Release|x86.ActiveCfg = Release|Any CPU + {F905EB30-20A0-42F6-9035-98C27D1CCF81}.Release|x86.Build.0 = Release|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Debug|x64.ActiveCfg = Debug|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Debug|x64.Build.0 = Debug|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Debug|x86.ActiveCfg = Debug|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Debug|x86.Build.0 = Debug|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Release|Any CPU.Build.0 = Release|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Release|x64.ActiveCfg = Release|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Release|x64.Build.0 = Release|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Release|x86.ActiveCfg = Release|Any CPU + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059}.Release|x86.Build.0 = Release|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Debug|x64.ActiveCfg = Debug|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Debug|x64.Build.0 = Debug|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Debug|x86.ActiveCfg = Debug|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Debug|x86.Build.0 = Debug|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Release|Any CPU.Build.0 = Release|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Release|x64.ActiveCfg = Release|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Release|x64.Build.0 = Release|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Release|x86.ActiveCfg = Release|Any CPU + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F}.Release|x86.Build.0 = Release|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Debug|x64.ActiveCfg = Debug|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Debug|x64.Build.0 = Debug|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Debug|x86.ActiveCfg = Debug|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Debug|x86.Build.0 = Debug|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Release|Any CPU.Build.0 = Release|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Release|x64.ActiveCfg = Release|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Release|x64.Build.0 = Release|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Release|x86.ActiveCfg = Release|Any CPU + {C1E54278-5FE4-4370-AA98-AB20F037AD6A}.Release|x86.Build.0 = Release|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Debug|x64.ActiveCfg = Debug|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Debug|x64.Build.0 = Debug|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Debug|x86.ActiveCfg = Debug|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Debug|x86.Build.0 = Debug|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Release|Any CPU.Build.0 = Release|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Release|x64.ActiveCfg = Release|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Release|x64.Build.0 = Release|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Release|x86.ActiveCfg = Release|Any CPU + {1982CF30-6D02-45F6-808A-C35A75623343}.Release|x86.Build.0 = Release|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Debug|x64.ActiveCfg = Debug|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Debug|x64.Build.0 = Debug|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Debug|x86.ActiveCfg = Debug|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Debug|x86.Build.0 = Debug|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Release|Any CPU.Build.0 = Release|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Release|x64.ActiveCfg = Release|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Release|x64.Build.0 = Release|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Release|x86.ActiveCfg = Release|Any CPU + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3}.Release|x86.Build.0 = Release|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Debug|x64.ActiveCfg = Debug|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Debug|x64.Build.0 = Debug|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Debug|x86.ActiveCfg = Debug|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Debug|x86.Build.0 = Debug|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Release|Any CPU.Build.0 = Release|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Release|x64.ActiveCfg = Release|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Release|x64.Build.0 = Release|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Release|x86.ActiveCfg = Release|Any CPU + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9}.Release|x86.Build.0 = Release|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Debug|x64.ActiveCfg = Debug|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Debug|x64.Build.0 = Debug|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Debug|x86.ActiveCfg = Debug|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Debug|x86.Build.0 = Debug|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Release|Any CPU.Build.0 = Release|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Release|x64.ActiveCfg = Release|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Release|x64.Build.0 = Release|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Release|x86.ActiveCfg = Release|Any CPU + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08}.Release|x86.Build.0 = Release|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Debug|x64.ActiveCfg = Debug|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Debug|x64.Build.0 = Debug|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Debug|x86.ActiveCfg = Debug|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Debug|x86.Build.0 = Debug|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Release|Any CPU.Build.0 = Release|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Release|x64.ActiveCfg = Release|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Release|x64.Build.0 = Release|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Release|x86.ActiveCfg = Release|Any CPU + {02668954-D273-4140-9FD2-1BDE615A401E}.Release|x86.Build.0 = Release|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Debug|x64.ActiveCfg = Debug|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Debug|x64.Build.0 = Debug|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Debug|x86.ActiveCfg = Debug|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Debug|x86.Build.0 = Debug|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Release|Any CPU.Build.0 = Release|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Release|x64.ActiveCfg = Release|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Release|x64.Build.0 = Release|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Release|x86.ActiveCfg = Release|Any CPU + {8565CE50-713C-4336-88AD-EAC732DC921A}.Release|x86.Build.0 = Release|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Debug|x64.ActiveCfg = Debug|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Debug|x64.Build.0 = Debug|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Debug|x86.ActiveCfg = Debug|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Debug|x86.Build.0 = Debug|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Release|Any CPU.Build.0 = Release|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Release|x64.ActiveCfg = Release|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Release|x64.Build.0 = Release|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Release|x86.ActiveCfg = Release|Any CPU + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5}.Release|x86.Build.0 = Release|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Debug|x64.ActiveCfg = Debug|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Debug|x64.Build.0 = Debug|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Debug|x86.ActiveCfg = Debug|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Debug|x86.Build.0 = Debug|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Release|Any CPU.Build.0 = Release|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Release|x64.ActiveCfg = Release|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Release|x64.Build.0 = Release|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Release|x86.ActiveCfg = Release|Any CPU + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E}.Release|x86.Build.0 = Release|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Debug|x64.ActiveCfg = Debug|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Debug|x64.Build.0 = Debug|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Debug|x86.ActiveCfg = Debug|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Debug|x86.Build.0 = Debug|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Release|Any CPU.Build.0 = Release|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Release|x64.ActiveCfg = Release|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Release|x64.Build.0 = Release|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Release|x86.ActiveCfg = Release|Any CPU + {239809C7-5679-4A85-AC76-254AB83C1DF0}.Release|x86.Build.0 = Release|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Debug|x64.ActiveCfg = Debug|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Debug|x64.Build.0 = Debug|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Debug|x86.ActiveCfg = Debug|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Debug|x86.Build.0 = Debug|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Release|Any CPU.Build.0 = Release|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Release|x64.ActiveCfg = Release|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Release|x64.Build.0 = Release|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Release|x86.ActiveCfg = Release|Any CPU + {7B1997D7-7E82-4094-97FF-F267AB1E628E}.Release|x86.Build.0 = Release|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Debug|x64.ActiveCfg = Debug|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Debug|x64.Build.0 = Debug|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Debug|x86.Build.0 = Debug|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Release|Any CPU.Build.0 = Release|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Release|x64.ActiveCfg = Release|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Release|x64.Build.0 = Release|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Release|x86.ActiveCfg = Release|Any CPU + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE}.Release|x86.Build.0 = Release|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Debug|x64.ActiveCfg = Debug|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Debug|x64.Build.0 = Debug|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Debug|x86.ActiveCfg = Debug|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Debug|x86.Build.0 = Debug|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Release|Any CPU.Build.0 = Release|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Release|x64.ActiveCfg = Release|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Release|x64.Build.0 = Release|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Release|x86.ActiveCfg = Release|Any CPU + {74BE5736-B441-4371-AB5B-F1C7A61341C2}.Release|x86.Build.0 = Release|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Debug|x64.ActiveCfg = Debug|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Debug|x64.Build.0 = Debug|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Debug|x86.ActiveCfg = Debug|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Debug|x86.Build.0 = Debug|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Release|Any CPU.Build.0 = Release|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Release|x64.ActiveCfg = Release|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Release|x64.Build.0 = Release|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Release|x86.ActiveCfg = Release|Any CPU + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0}.Release|x86.Build.0 = Release|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Debug|x64.ActiveCfg = Debug|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Debug|x64.Build.0 = Debug|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Debug|x86.ActiveCfg = Debug|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Debug|x86.Build.0 = Debug|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Release|Any CPU.Build.0 = Release|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Release|x64.ActiveCfg = Release|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Release|x64.Build.0 = Release|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Release|x86.ActiveCfg = Release|Any CPU + {F30FD499-8F88-4613-8B15-C06AA649881F}.Release|x86.Build.0 = Release|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Debug|x64.ActiveCfg = Debug|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Debug|x64.Build.0 = Debug|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Debug|x86.ActiveCfg = Debug|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Debug|x86.Build.0 = Debug|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Release|Any CPU.ActiveCfg = Release|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Release|Any CPU.Build.0 = Release|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Release|x64.ActiveCfg = Release|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Release|x64.Build.0 = Release|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Release|x86.ActiveCfg = Release|Any CPU + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79}.Release|x86.Build.0 = Release|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Debug|x64.ActiveCfg = Debug|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Debug|x64.Build.0 = Debug|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Debug|x86.ActiveCfg = Debug|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Debug|x86.Build.0 = Debug|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Release|Any CPU.Build.0 = Release|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Release|x64.ActiveCfg = Release|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Release|x64.Build.0 = Release|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Release|x86.ActiveCfg = Release|Any CPU + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55}.Release|x86.Build.0 = Release|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Debug|x64.ActiveCfg = Debug|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Debug|x64.Build.0 = Debug|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Debug|x86.ActiveCfg = Debug|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Debug|x86.Build.0 = Debug|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Release|Any CPU.Build.0 = Release|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Release|x64.ActiveCfg = Release|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Release|x64.Build.0 = Release|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Release|x86.ActiveCfg = Release|Any CPU + {6A489E6B-CD18-442D-A856-89DDE710B009}.Release|x86.Build.0 = Release|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Debug|x64.ActiveCfg = Debug|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Debug|x64.Build.0 = Debug|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Debug|x86.ActiveCfg = Debug|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Debug|x86.Build.0 = Debug|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Release|Any CPU.Build.0 = Release|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Release|x64.ActiveCfg = Release|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Release|x64.Build.0 = Release|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Release|x86.ActiveCfg = Release|Any CPU + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6}.Release|x86.Build.0 = Release|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Debug|x64.ActiveCfg = Debug|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Debug|x64.Build.0 = Debug|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Debug|x86.ActiveCfg = Debug|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Debug|x86.Build.0 = Debug|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Release|Any CPU.Build.0 = Release|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Release|x64.ActiveCfg = Release|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Release|x64.Build.0 = Release|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Release|x86.ActiveCfg = Release|Any CPU + {86B65707-7652-4ED0-8B0A-6C4907E8FF86}.Release|x86.Build.0 = Release|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Debug|x64.ActiveCfg = Debug|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Debug|x64.Build.0 = Debug|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Debug|x86.ActiveCfg = Debug|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Debug|x86.Build.0 = Debug|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Release|Any CPU.Build.0 = Release|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Release|x64.ActiveCfg = Release|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Release|x64.Build.0 = Release|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Release|x86.ActiveCfg = Release|Any CPU + {686BA896-BD38-490A-88C1-A8D0B48D05E6}.Release|x86.Build.0 = Release|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Debug|x64.ActiveCfg = Debug|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Debug|x64.Build.0 = Debug|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Debug|x86.ActiveCfg = Debug|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Debug|x86.Build.0 = Debug|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Release|Any CPU.Build.0 = Release|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Release|x64.ActiveCfg = Release|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Release|x64.Build.0 = Release|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Release|x86.ActiveCfg = Release|Any CPU + {A737F617-3916-4AC1-AEEE-69585FF89838}.Release|x86.Build.0 = Release|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Debug|x64.ActiveCfg = Debug|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Debug|x64.Build.0 = Debug|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Debug|x86.ActiveCfg = Debug|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Debug|x86.Build.0 = Debug|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Release|Any CPU.Build.0 = Release|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Release|x64.ActiveCfg = Release|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Release|x64.Build.0 = Release|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Release|x86.ActiveCfg = Release|Any CPU + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4}.Release|x86.Build.0 = Release|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Debug|Any CPU.Build.0 = Debug|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Debug|x64.ActiveCfg = Debug|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Debug|x64.Build.0 = Debug|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Debug|x86.ActiveCfg = Debug|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Debug|x86.Build.0 = Debug|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Release|Any CPU.ActiveCfg = Release|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Release|Any CPU.Build.0 = Release|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Release|x64.ActiveCfg = Release|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Release|x64.Build.0 = Release|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Release|x86.ActiveCfg = Release|Any CPU + {335C2372-CB51-4569-B04D-CE8AFC8EC755}.Release|x86.Build.0 = Release|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Debug|x64.ActiveCfg = Debug|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Debug|x64.Build.0 = Debug|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Debug|x86.ActiveCfg = Debug|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Debug|x86.Build.0 = Debug|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Release|Any CPU.Build.0 = Release|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Release|x64.ActiveCfg = Release|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Release|x64.Build.0 = Release|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Release|x86.ActiveCfg = Release|Any CPU + {59976F36-A8F0-425E-9620-FA78E68E145F}.Release|x86.Build.0 = Release|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Debug|x64.ActiveCfg = Debug|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Debug|x64.Build.0 = Debug|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Debug|x86.Build.0 = Debug|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Release|Any CPU.Build.0 = Release|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Release|x64.ActiveCfg = Release|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Release|x64.Build.0 = Release|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Release|x86.ActiveCfg = Release|Any CPU + {3D4E6246-667E-4243-B2F3-B9CE12743B8D}.Release|x86.Build.0 = Release|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Debug|x64.ActiveCfg = Debug|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Debug|x64.Build.0 = Debug|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Debug|x86.ActiveCfg = Debug|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Debug|x86.Build.0 = Debug|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Release|Any CPU.Build.0 = Release|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Release|x64.ActiveCfg = Release|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Release|x64.Build.0 = Release|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Release|x86.ActiveCfg = Release|Any CPU + {BBC09072-9D08-454F-90BF-FD754CD60B93}.Release|x86.Build.0 = Release|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Debug|x64.ActiveCfg = Debug|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Debug|x64.Build.0 = Debug|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Debug|x86.ActiveCfg = Debug|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Debug|x86.Build.0 = Debug|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Release|Any CPU.Build.0 = Release|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Release|x64.ActiveCfg = Release|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Release|x64.Build.0 = Release|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Release|x86.ActiveCfg = Release|Any CPU + {43CF5F69-38A8-493E-960A-0877E248996F}.Release|x86.Build.0 = Release|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Debug|x64.ActiveCfg = Debug|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Debug|x64.Build.0 = Debug|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Debug|x86.ActiveCfg = Debug|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Debug|x86.Build.0 = Debug|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Release|Any CPU.Build.0 = Release|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Release|x64.ActiveCfg = Release|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Release|x64.Build.0 = Release|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Release|x86.ActiveCfg = Release|Any CPU + {C7D0416E-9785-40A1-921D-C92A56A9848F}.Release|x86.Build.0 = Release|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Debug|x64.ActiveCfg = Debug|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Debug|x64.Build.0 = Debug|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Debug|x86.ActiveCfg = Debug|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Debug|x86.Build.0 = Debug|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Release|Any CPU.Build.0 = Release|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Release|x64.ActiveCfg = Release|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Release|x64.Build.0 = Release|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Release|x86.ActiveCfg = Release|Any CPU + {2A113076-21F0-4F11-A1CF-D0E4A1D14503}.Release|x86.Build.0 = Release|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Debug|x64.ActiveCfg = Debug|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Debug|x64.Build.0 = Debug|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Debug|x86.ActiveCfg = Debug|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Debug|x86.Build.0 = Debug|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Release|Any CPU.Build.0 = Release|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Release|x64.ActiveCfg = Release|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Release|x64.Build.0 = Release|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Release|x86.ActiveCfg = Release|Any CPU + {A7BA896C-1D7E-4336-BE50-032BF8E62D81}.Release|x86.Build.0 = Release|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Debug|x64.ActiveCfg = Debug|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Debug|x64.Build.0 = Debug|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Debug|x86.ActiveCfg = Debug|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Debug|x86.Build.0 = Debug|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Release|Any CPU.Build.0 = Release|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Release|x64.ActiveCfg = Release|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Release|x64.Build.0 = Release|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Release|x86.ActiveCfg = Release|Any CPU + {F964D761-6542-4A3C-8ADC-41F5B8F77529}.Release|x86.Build.0 = Release|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Debug|x64.ActiveCfg = Debug|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Debug|x64.Build.0 = Debug|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Debug|x86.ActiveCfg = Debug|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Debug|x86.Build.0 = Debug|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Release|Any CPU.Build.0 = Release|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Release|x64.ActiveCfg = Release|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Release|x64.Build.0 = Release|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Release|x86.ActiveCfg = Release|Any CPU + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9}.Release|x86.Build.0 = Release|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Debug|x64.ActiveCfg = Debug|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Debug|x64.Build.0 = Debug|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Debug|x86.ActiveCfg = Debug|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Debug|x86.Build.0 = Debug|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Release|Any CPU.Build.0 = Release|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Release|x64.ActiveCfg = Release|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Release|x64.Build.0 = Release|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Release|x86.ActiveCfg = Release|Any CPU + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A}.Release|x86.Build.0 = Release|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Debug|x64.ActiveCfg = Debug|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Debug|x64.Build.0 = Debug|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Debug|x86.ActiveCfg = Debug|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Debug|x86.Build.0 = Debug|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Release|Any CPU.Build.0 = Release|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Release|x64.ActiveCfg = Release|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Release|x64.Build.0 = Release|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Release|x86.ActiveCfg = Release|Any CPU + {84AF37C1-52A8-4F3F-8F2C-E7394E789523}.Release|x86.Build.0 = Release|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Debug|x64.ActiveCfg = Debug|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Debug|x64.Build.0 = Debug|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Debug|x86.ActiveCfg = Debug|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Debug|x86.Build.0 = Debug|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Release|Any CPU.Build.0 = Release|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Release|x64.ActiveCfg = Release|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Release|x64.Build.0 = Release|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Release|x86.ActiveCfg = Release|Any CPU + {75110CC0-5A94-4491-BA7E-234ACC39106D}.Release|x86.Build.0 = Release|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Debug|x64.ActiveCfg = Debug|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Debug|x64.Build.0 = Debug|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Debug|x86.ActiveCfg = Debug|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Debug|x86.Build.0 = Debug|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Release|Any CPU.Build.0 = Release|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Release|x64.ActiveCfg = Release|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Release|x64.Build.0 = Release|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Release|x86.ActiveCfg = Release|Any CPU + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD}.Release|x86.Build.0 = Release|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Debug|x64.ActiveCfg = Debug|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Debug|x64.Build.0 = Debug|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Debug|x86.ActiveCfg = Debug|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Debug|x86.Build.0 = Debug|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Release|Any CPU.Build.0 = Release|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Release|x64.ActiveCfg = Release|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Release|x64.Build.0 = Release|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Release|x86.ActiveCfg = Release|Any CPU + {A57D4155-3F27-4BDA-900E-1A39B022BE00}.Release|x86.Build.0 = Release|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Debug|x64.ActiveCfg = Debug|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Debug|x64.Build.0 = Debug|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Debug|x86.ActiveCfg = Debug|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Debug|x86.Build.0 = Debug|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Release|Any CPU.Build.0 = Release|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Release|x64.ActiveCfg = Release|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Release|x64.Build.0 = Release|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Release|x86.ActiveCfg = Release|Any CPU + {86E04393-86E7-4BBF-A9EF-9433B91E4988}.Release|x86.Build.0 = Release|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Debug|x64.Build.0 = Debug|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Debug|x86.Build.0 = Debug|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Release|Any CPU.Build.0 = Release|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Release|x64.ActiveCfg = Release|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Release|x64.Build.0 = Release|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Release|x86.ActiveCfg = Release|Any CPU + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F}.Release|x86.Build.0 = Release|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Debug|Any CPU.Build.0 = Debug|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Debug|x64.ActiveCfg = Debug|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Debug|x64.Build.0 = Debug|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Debug|x86.ActiveCfg = Debug|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Debug|x86.Build.0 = Debug|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Release|Any CPU.ActiveCfg = Release|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Release|Any CPU.Build.0 = Release|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Release|x64.ActiveCfg = Release|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Release|x64.Build.0 = Release|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Release|x86.ActiveCfg = Release|Any CPU + {435B3E59-C5B2-412A-86DC-795F1E52C223}.Release|x86.Build.0 = Release|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Debug|x64.ActiveCfg = Debug|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Debug|x64.Build.0 = Debug|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Debug|x86.ActiveCfg = Debug|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Debug|x86.Build.0 = Debug|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Release|Any CPU.Build.0 = Release|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Release|x64.ActiveCfg = Release|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Release|x64.Build.0 = Release|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Release|x86.ActiveCfg = Release|Any CPU + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643}.Release|x86.Build.0 = Release|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Debug|x64.Build.0 = Debug|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Debug|x86.ActiveCfg = Debug|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Debug|x86.Build.0 = Debug|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Release|Any CPU.Build.0 = Release|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Release|x64.ActiveCfg = Release|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Release|x64.Build.0 = Release|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Release|x86.ActiveCfg = Release|Any CPU + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6}.Release|x86.Build.0 = Release|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Debug|x64.ActiveCfg = Debug|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Debug|x64.Build.0 = Debug|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Debug|x86.ActiveCfg = Debug|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Debug|x86.Build.0 = Debug|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Release|Any CPU.Build.0 = Release|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Release|x64.ActiveCfg = Release|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Release|x64.Build.0 = Release|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Release|x86.ActiveCfg = Release|Any CPU + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240}.Release|x86.Build.0 = Release|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Debug|x64.ActiveCfg = Debug|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Debug|x64.Build.0 = Debug|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Debug|x86.ActiveCfg = Debug|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Debug|x86.Build.0 = Debug|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Release|Any CPU.Build.0 = Release|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Release|x64.ActiveCfg = Release|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Release|x64.Build.0 = Release|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Release|x86.ActiveCfg = Release|Any CPU + {03FA4F94-962D-4324-B71E-D36E638D13D7}.Release|x86.Build.0 = Release|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Debug|x64.Build.0 = Debug|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Debug|x86.Build.0 = Debug|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Release|Any CPU.Build.0 = Release|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Release|x64.ActiveCfg = Release|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Release|x64.Build.0 = Release|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Release|x86.ActiveCfg = Release|Any CPU + {197B01F2-1974-46A1-9C40-7303E405BFA7}.Release|x86.Build.0 = Release|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Debug|x64.Build.0 = Debug|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Debug|x86.ActiveCfg = Debug|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Debug|x86.Build.0 = Debug|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Release|Any CPU.Build.0 = Release|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Release|x64.ActiveCfg = Release|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Release|x64.Build.0 = Release|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Release|x86.ActiveCfg = Release|Any CPU + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1}.Release|x86.Build.0 = Release|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Debug|x64.ActiveCfg = Debug|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Debug|x64.Build.0 = Debug|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Debug|x86.ActiveCfg = Debug|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Debug|x86.Build.0 = Debug|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Release|Any CPU.Build.0 = Release|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Release|x64.ActiveCfg = Release|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Release|x64.Build.0 = Release|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Release|x86.ActiveCfg = Release|Any CPU + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED}.Release|x86.Build.0 = Release|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Debug|x64.ActiveCfg = Debug|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Debug|x64.Build.0 = Debug|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Debug|x86.ActiveCfg = Debug|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Debug|x86.Build.0 = Debug|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Release|Any CPU.Build.0 = Release|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Release|x64.ActiveCfg = Release|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Release|x64.Build.0 = Release|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Release|x86.ActiveCfg = Release|Any CPU + {FC2045E2-A48F-4389-9F72-90EDE8918FCC}.Release|x86.Build.0 = Release|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Debug|x64.ActiveCfg = Debug|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Debug|x64.Build.0 = Debug|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Debug|x86.ActiveCfg = Debug|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Debug|x86.Build.0 = Debug|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Release|Any CPU.Build.0 = Release|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Release|x64.ActiveCfg = Release|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Release|x64.Build.0 = Release|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Release|x86.ActiveCfg = Release|Any CPU + {9B3D5A8F-16CD-4644-A239-EC2519195C80}.Release|x86.Build.0 = Release|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Debug|x64.ActiveCfg = Debug|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Debug|x64.Build.0 = Debug|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Debug|x86.ActiveCfg = Debug|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Debug|x86.Build.0 = Debug|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Release|Any CPU.Build.0 = Release|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Release|x64.ActiveCfg = Release|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Release|x64.Build.0 = Release|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Release|x86.ActiveCfg = Release|Any CPU + {BB30719A-3461-493E-972F-F6CEF534163E}.Release|x86.Build.0 = Release|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Debug|x64.ActiveCfg = Debug|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Debug|x64.Build.0 = Debug|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Debug|x86.ActiveCfg = Debug|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Debug|x86.Build.0 = Debug|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Release|Any CPU.Build.0 = Release|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Release|x64.ActiveCfg = Release|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Release|x64.Build.0 = Release|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Release|x86.ActiveCfg = Release|Any CPU + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A}.Release|x86.Build.0 = Release|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Debug|x64.ActiveCfg = Debug|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Debug|x64.Build.0 = Debug|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Debug|x86.Build.0 = Debug|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Release|Any CPU.Build.0 = Release|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Release|x64.ActiveCfg = Release|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Release|x64.Build.0 = Release|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Release|x86.ActiveCfg = Release|Any CPU + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB}.Release|x86.Build.0 = Release|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Debug|x64.ActiveCfg = Debug|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Debug|x64.Build.0 = Debug|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Debug|x86.ActiveCfg = Debug|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Debug|x86.Build.0 = Debug|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Release|Any CPU.Build.0 = Release|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Release|x64.ActiveCfg = Release|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Release|x64.Build.0 = Release|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Release|x86.ActiveCfg = Release|Any CPU + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8}.Release|x86.Build.0 = Release|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Debug|x64.Build.0 = Debug|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Debug|x86.Build.0 = Debug|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Release|Any CPU.Build.0 = Release|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Release|x64.ActiveCfg = Release|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Release|x64.Build.0 = Release|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Release|x86.ActiveCfg = Release|Any CPU + {20D9470B-F39E-4E67-A00D-9714D6E857DE}.Release|x86.Build.0 = Release|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Debug|x64.ActiveCfg = Debug|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Debug|x64.Build.0 = Debug|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Debug|x86.ActiveCfg = Debug|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Debug|x86.Build.0 = Debug|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Release|Any CPU.Build.0 = Release|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Release|x64.ActiveCfg = Release|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Release|x64.Build.0 = Release|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Release|x86.ActiveCfg = Release|Any CPU + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251}.Release|x86.Build.0 = Release|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Debug|x64.ActiveCfg = Debug|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Debug|x64.Build.0 = Debug|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Debug|x86.ActiveCfg = Debug|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Debug|x86.Build.0 = Debug|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Release|Any CPU.Build.0 = Release|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Release|x64.ActiveCfg = Release|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Release|x64.Build.0 = Release|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Release|x86.ActiveCfg = Release|Any CPU + {F10A1DEA-545F-4C9F-AFA1-A115726BD415}.Release|x86.Build.0 = Release|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Debug|x64.ActiveCfg = Debug|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Debug|x64.Build.0 = Debug|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Debug|x86.ActiveCfg = Debug|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Debug|x86.Build.0 = Debug|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Release|Any CPU.Build.0 = Release|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Release|x64.ActiveCfg = Release|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Release|x64.Build.0 = Release|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Release|x86.ActiveCfg = Release|Any CPU + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE}.Release|x86.Build.0 = Release|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Debug|Any CPU.Build.0 = Debug|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Debug|x64.ActiveCfg = Debug|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Debug|x64.Build.0 = Debug|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Debug|x86.ActiveCfg = Debug|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Debug|x86.Build.0 = Debug|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Release|Any CPU.ActiveCfg = Release|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Release|Any CPU.Build.0 = Release|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Release|x64.ActiveCfg = Release|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Release|x64.Build.0 = Release|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Release|x86.ActiveCfg = Release|Any CPU + {565FC442-5E49-42AD-AC33-14AD14E11961}.Release|x86.Build.0 = Release|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Debug|x64.ActiveCfg = Debug|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Debug|x64.Build.0 = Debug|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Debug|x86.ActiveCfg = Debug|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Debug|x86.Build.0 = Debug|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Release|Any CPU.Build.0 = Release|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Release|x64.ActiveCfg = Release|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Release|x64.Build.0 = Release|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Release|x86.ActiveCfg = Release|Any CPU + {F6BB74C6-971A-44D7-BC10-3B37B74DE264}.Release|x86.Build.0 = Release|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Debug|x64.Build.0 = Debug|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Debug|x86.Build.0 = Debug|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Release|Any CPU.Build.0 = Release|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Release|x64.ActiveCfg = Release|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Release|x64.Build.0 = Release|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Release|x86.ActiveCfg = Release|Any CPU + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8}.Release|x86.Build.0 = Release|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Debug|x64.ActiveCfg = Debug|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Debug|x64.Build.0 = Debug|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Debug|x86.ActiveCfg = Debug|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Debug|x86.Build.0 = Debug|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Release|Any CPU.Build.0 = Release|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Release|x64.ActiveCfg = Release|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Release|x64.Build.0 = Release|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Release|x86.ActiveCfg = Release|Any CPU + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0}.Release|x86.Build.0 = Release|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Debug|x64.ActiveCfg = Debug|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Debug|x64.Build.0 = Debug|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Debug|x86.ActiveCfg = Debug|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Debug|x86.Build.0 = Debug|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Release|Any CPU.Build.0 = Release|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Release|x64.ActiveCfg = Release|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Release|x64.Build.0 = Release|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Release|x86.ActiveCfg = Release|Any CPU + {46397A4D-287C-410E-BDE9-1F09D7E64EF0}.Release|x86.Build.0 = Release|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Debug|x64.ActiveCfg = Debug|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Debug|x64.Build.0 = Debug|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Debug|x86.ActiveCfg = Debug|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Debug|x86.Build.0 = Debug|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Release|Any CPU.Build.0 = Release|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Release|x64.ActiveCfg = Release|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Release|x64.Build.0 = Release|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Release|x86.ActiveCfg = Release|Any CPU + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487}.Release|x86.Build.0 = Release|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Debug|x64.ActiveCfg = Debug|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Debug|x64.Build.0 = Debug|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Debug|x86.ActiveCfg = Debug|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Debug|x86.Build.0 = Debug|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Release|Any CPU.Build.0 = Release|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Release|x64.ActiveCfg = Release|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Release|x64.Build.0 = Release|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Release|x86.ActiveCfg = Release|Any CPU + {D6BDA325-9615-42F5-8D42-EEF27F9E7339}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {ED67A1EA-E467-4ABC-B627-8D8A184E20E9} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {06B21109-54A2-47FD-B701-C5B572059F88} = {0AB3BF05-4346-4AA6-1389-037BE0695223} + {603D8145-0AD4-44BE-A730-678B9BE015E1} = {0AB3BF05-4346-4AA6-1389-037BE0695223} + {D1B4CF99-7947-DD6C-81D0-5B5B3989814C} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {D93CAD63-3252-5A7F-9C37-FCA27F08B606} = {D1B4CF99-7947-DD6C-81D0-5B5B3989814C} + {F905EB30-20A0-42F6-9035-98C27D1CCF81} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {EBC55A44-EF7F-4D3E-8E94-8848C00C3059} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {CE4B62D4-26FD-4C6A-B1C4-6871A057CE3F} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {C1E54278-5FE4-4370-AA98-AB20F037AD6A} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {1982CF30-6D02-45F6-808A-C35A75623343} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {ABCDCFAB-666F-40FA-906F-AFC3916E25D3} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {69C45190-79DC-4F2F-B0D2-0FD84B77F8A9} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {FAD8476C-AE4E-4298-9F08-044ED3C0BA08} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {02668954-D273-4140-9FD2-1BDE615A401E} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {8565CE50-713C-4336-88AD-EAC732DC921A} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {5D83CDEA-106C-4002-BCC9-1F2BBB63EBE5} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {F884FA9A-2A79-48AB-938C-A34E8A8BCF3E} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {239809C7-5679-4A85-AC76-254AB83C1DF0} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {7B1997D7-7E82-4094-97FF-F267AB1E628E} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {464B25D1-BF6F-4F52-B8C1-2F783A4865AE} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {74BE5736-B441-4371-AB5B-F1C7A61341C2} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {54B7ACB9-F2CD-4B30-ABA6-191C37E336A0} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {F30FD499-8F88-4613-8B15-C06AA649881F} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {220CFDCE-5B3B-49C7-A340-C19B7C28BF79} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {D17190BB-8C0E-4CC3-8644-F0B120EDBD55} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {6A489E6B-CD18-442D-A856-89DDE710B009} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {E060A98E-50F0-45B0-AB5C-D33A90ADC1E6} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {86B65707-7652-4ED0-8B0A-6C4907E8FF86} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {686BA896-BD38-490A-88C1-A8D0B48D05E6} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {A737F617-3916-4AC1-AEEE-69585FF89838} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {A1B60C73-0FAC-43EF-93F9-4E6AD121F9D4} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {335C2372-CB51-4569-B04D-CE8AFC8EC755} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {59976F36-A8F0-425E-9620-FA78E68E145F} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {3D4E6246-667E-4243-B2F3-B9CE12743B8D} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {BBC09072-9D08-454F-90BF-FD754CD60B93} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {43CF5F69-38A8-493E-960A-0877E248996F} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {C7D0416E-9785-40A1-921D-C92A56A9848F} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {1740D47D-DA94-6415-017E-48203BA1C52C} = {D1B4CF99-7947-DD6C-81D0-5B5B3989814C} + {2A113076-21F0-4F11-A1CF-D0E4A1D14503} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {A7BA896C-1D7E-4336-BE50-032BF8E62D81} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {F964D761-6542-4A3C-8ADC-41F5B8F77529} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {148B26DF-05B6-44D6-890D-8AFBFAD9F7D9} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {6455B74A-6CB8-4DC3-9329-3D9CBB56173A} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {84AF37C1-52A8-4F3F-8F2C-E7394E789523} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {75110CC0-5A94-4491-BA7E-234ACC39106D} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {8F1471D6-CEFA-4B4F-84C5-FB4B5CB035BD} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {A57D4155-3F27-4BDA-900E-1A39B022BE00} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {86E04393-86E7-4BBF-A9EF-9433B91E4988} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {B9C9B2A4-562B-45BB-BD91-CE5027F41C3F} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {435B3E59-C5B2-412A-86DC-795F1E52C223} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {6E4E4453-36C8-42FC-9B8A-C8FEBCC6A643} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {CAD2DE5B-A359-4E51-8138-A02FDCA8E2A6} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {A3D2D2D1-413E-4367-B1D5-0AEEB1551240} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {03FA4F94-962D-4324-B71E-D36E638D13D7} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {197B01F2-1974-46A1-9C40-7303E405BFA7} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {0C0BBD9A-1AC7-4B54-B725-03535AE033F1} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {1093E8A9-77C3-43A0-ACA2-E0857EC19AED} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {FC2045E2-A48F-4389-9F72-90EDE8918FCC} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {9B3D5A8F-16CD-4644-A239-EC2519195C80} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {BB30719A-3461-493E-972F-F6CEF534163E} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {9ECB1F3B-3076-4C98-9ECA-6ACE8C8CAB2A} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {E6476EE0-71CA-4E5D-BE05-E57825E8AECB} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {984CD20C-0F0A-4458-A3ED-6CC9BE2A1DC8} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {20D9470B-F39E-4E67-A00D-9714D6E857DE} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {5D54DD79-59AA-4C85-8ECA-CAC59D86F251} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {F10A1DEA-545F-4C9F-AFA1-A115726BD415} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {0330D3D5-5A97-4F6D-AE22-993256ABDFEE} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {565FC442-5E49-42AD-AC33-14AD14E11961} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {F6BB74C6-971A-44D7-BC10-3B37B74DE264} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {8B54C3E2-5F8B-471B-83DF-26239DF1C5C8} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {1C8C9F58-A63E-4ED6-A185-F26F672EEDE0} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {46397A4D-287C-410E-BDE9-1F09D7E64EF0} = {1740D47D-DA94-6415-017E-48203BA1C52C} + {12E352F9-40EE-4C12-BD9D-5B4ABDEB5487} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + {D6BDA325-9615-42F5-8D42-EEF27F9E7339} = {D93CAD63-3252-5A7F-9C37-FCA27F08B606} + EndGlobalSection +EndGlobal diff --git a/Elmish.WPF.slnx b/Elmish.WPF.slnx new file mode 100644 index 00000000..f9bc0077 --- /dev/null +++ b/Elmish.WPF.slnx @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index e3497c09..afe21462 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,25 @@ WPF done the Elmish Way [![NuGet version](https://img.shields.io/nuget/v/Elmish.WPF.svg)](https://www.nuget.org/packages/Elmish.WPF) [![NuGet downloads](https://img.shields.io/nuget/dt/Elmish.WPF.svg)](https://www.nuget.org/packages/Elmish.WPF) [![Build status](https://github.com/elmish/Elmish.WPF/actions/workflows/continuous_integration.yml/badge.svg)](https://github.com/elmish/Elmish.WPF/actions/workflows/continuous_integration.yml) -**The good parts of MVVM (the data bindings) with the simplicity and robustness of an MVU architecture for the rest of your app. Never write an overly-complex ViewModel class again!** +**The good parts of MVVM (the data bindings) with the simplicity and robustness of an MVU architecture for the rest of +your app. Choose between dynamic bindings for flexibility or statically-typed ViewModels for safety and tooling support! +** ### Elevator pitch -Elmish.WPF is a **production-ready** library that allows you to write WPF apps with the robust, simple, well-known, and battle-tested MVU architecture, while still allowing you to use all your XAML knowledge and tooling to create UIs. +Elmish.WPF is a **production-ready** library that allows you to write WPF apps with the robust, simple, well-known, and +battle-tested MVU architecture, while still allowing you to use all your XAML knowledge and tooling to create UIs. -Some benefits of MVU you’ll get with Elmish.WPF include: +**Two powerful approaches in one library:** + +- **Dynamic Bindings**: Flexible, functional approach with runtime binding definitions +- **Statically-Typed ViewModels**: Compile-time safety with full IntelliSense and design-time support + +Choose **Dynamic Bindings** for rapid prototyping, simple apps, or when you prefer functional composition. Choose * +*Statically-Typed ViewModels** for large applications, when working with designers, or when you want compile-time +validation and superior tooling support. + +Some benefits of MVU you'll get with Elmish.WPF include: * Simple-to-understand, unidirectional data flow * Single source of truth for all the state in your app @@ -22,7 +34,10 @@ Some benefits of MVU you’ll get with Elmish.WPF include: * Simple optimization * 78% more rockets 🚀 -Even with static views, your central model/update code can follow an idiomatic Elmish/MVU architecture. You could, if you wanted, use the same model/update code to implement an app using a dynamic UI library such as [Fabulous](https://github.com/fsprojects/Fabulous) or [Fable.React](https://github.com/fable-compiler/fable-react), by just rewriting the “U” part of MVU. +Even with static views, your central model/update code can follow an idiomatic Elmish/MVU architecture. You could, if +you wanted, use the same model/update code to implement an app using a dynamic UI library such +as [Fabulous](https://github.com/fsprojects/Fabulous) or [Fable.React](https://github.com/fable-compiler/fable-react), +by just rewriting the “U” part of MVU. **Static XAML views is a feature, not a limitation. See the FAQ for several unique benefits to this approach!** @@ -34,28 +49,47 @@ Big thanks to [@MrMattSim](https://github.com/MrMattSim) for the wonderful logo! [![JetBrains logo](jetbrains.svg)](https://www.jetbrains.com/?from=Elmish.WPF) -Thanks to JetBrains for sponsoring Elmish.WPF with [OSS licenses](https://www.jetbrains.com/community/opensource/#support)! +Thanks to JetBrains for sponsoring Elmish.WPF +with [OSS licenses](https://www.jetbrains.com/community/opensource/#support)! Recommended resources --------------------- -* The [Elmish.WPF tutorial](https://github.com/elmish/Elmish.WPF/blob/master/TUTORIAL.md) explains how to use Elmish.WPF, starting with general Elmish/MVU concepts and ending with complex optimizations. -* The [Elmish.WPF binding reference](https://github.com/elmish/Elmish.WPF/blob/master/REFERENCE.md) explains Elmish.WPF's bindings and library functions for modifying bindings. +* The [Elmish.WPF tutorial](https://github.com/elmish/Elmish.WPF/blob/master/TUTORIAL.md) explains how to use + Elmish.WPF, starting with general Elmish/MVU concepts and ending with complex optimizations. +* The [Elmish.WPF binding reference](https://github.com/elmish/Elmish.WPF/blob/master/REFERENCE.md) explains + Elmish.WPF's bindings and library functions for modifying bindings. * The [Elmish docs site](https://elmish.github.io/elmish) also explains the general MVU architecture and principles. -* The [Elmish.WPF samples](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples) provide many concrete usage examples. +* The [Elmish.WPF samples](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples) provide many concrete usage + examples, organized into [Dynamic](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic) + and [Typed](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Typed) approaches. * Blog posts: - * [Getting Elmish in .NET with Elmish.WPF](https://medium.com/swlh/getting-elmish-in-net-with-elmish-wpf-cd44e3eddc27) ("getting started" guide by Matt Eland) -* Elm resources may also provide some guidance, but note that not everything is relevant. A significant difference between “normal” Elm architecture and Elmish.WPF is that in Elmish.WPF, the views are statically defined using XAML, and the “view” function does not render views, but set up bindings. See the [tutorial](https://github.com/elmish/Elmish.WPF/blob/master/TUTORIAL.md) for details. - * [Official Elm guide](https://guide.elm-lang.org) - * Two talks: [Summarising Elm scaling strategy](https://dev.to/elmupdate/summarising-elm-scaling-strategy-1bjn) - * Reddit: [Resources regarding scaling Elm apps](https://www.reddit.com/r/elm/comments/65s0g4/resources_regarding_scaling_elm_apps/) - * Reddit: [How to structure Elm with multiple models](https://www.reddit.com/r/elm/comments/5jd2xn/how_to_structure_elm_with_multiple_models/dbuu0m4/) - * Reddit: [Elm Architecture with a Redux-like store pattern](https://www.reddit.com/r/elm/comments/5xdl9z/elm_architecture_with_a_reduxlike_store_pattern/) + * [Getting Elmish in .NET with Elmish.WPF](https://medium.com/swlh/getting-elmish-in-net-with-elmish-wpf-cd44e3eddc27) (" + getting started" guide by Matt Eland) +* Elm resources may also provide some guidance, but note that not everything is relevant. A significant difference + between “normal” Elm architecture and Elmish.WPF is that in Elmish.WPF, the views are statically defined using XAML, + and the “view” function does not render views, but set up bindings. See + the [tutorial](https://github.com/elmish/Elmish.WPF/blob/master/TUTORIAL.md) for details. + * [Official Elm guide](https://guide.elm-lang.org) + * Two talks: [Summarising Elm scaling strategy](https://dev.to/elmupdate/summarising-elm-scaling-strategy-1bjn) + * + Reddit: [Resources regarding scaling Elm apps](https://www.reddit.com/r/elm/comments/65s0g4/resources_regarding_scaling_elm_apps/) + * + Reddit: [How to structure Elm with multiple models](https://www.reddit.com/r/elm/comments/5jd2xn/how_to_structure_elm_with_multiple_models/dbuu0m4/) + * + Reddit: [Elm Architecture with a Redux-like store pattern](https://www.reddit.com/r/elm/comments/5xdl9z/elm_architecture_with_a_reduxlike_store_pattern/) Getting started with Elmish.WPF ------------------------------- -See the [SingleCounter](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples) sample for a very simple app. The central points are (assuming up-to-date VS2019): +Elmish.WPF offers two approaches for creating bindings. Choose the one that best fits your needs: + +**Quick Start**: See +the [Dynamic SingleCounter](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic/SingleCounter) +or [Typed SingleCounter](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Typed/SingleCounter) samples for +very simple apps demonstrating each approach. + +The central points are (assuming up-to-date Visual Studio): 1. Create an F# Class Library. If targeting .NET 5 or .NET Core, the project file should look like this: @@ -109,9 +143,16 @@ See the [SingleCounter](https://github.com/elmish/Elmish.WPF/tree/master/src/Sam | SetStepSize x -> { m with StepSize = x } ``` -6. Define the “view” function using the `Bindings` module. This is the central public API of Elmish.WPF. +6. Define your bindings using either the **Dynamic** or **Typed** approach: + +### Approach A: Dynamic Bindings + +Define the "view" function using the `Bindings` module. This is the central public API of Elmish.WPF. - Normally in Elm/Elmish this function is called `view` and would take a model and a dispatch function (to dispatch new messages to the update loop) and return the UI (e.g. a HTML DOM to be rendered), but in Elmish.WPF this function is in general only run once and simply sets up bindings that XAML-defined views can use. Therefore, let’s call it `bindings` instead of `view`. +Normally in Elm/Elmish this function is called `view` and would take a model and a dispatch function (to dispatch new +messages to the update loop) and return the UI (e.g. a HTML DOM to be rendered), but in Elmish.WPF this function is +in general only run once and simply sets up bindings that XAML-defined views can use. Therefore, let's call it +`bindings` instead of `view`. ```F# open Elmish.WPF @@ -127,52 +168,73 @@ See the [SingleCounter](https://github.com/elmish/Elmish.WPF/tree/master/src/Sam ] ``` - The strings identify the binding names to be used in the XAML views. The Binding module has many functions to create various types of bindings. +The strings identify the binding names to be used in the XAML views. The Binding module has many functions to create +various types of bindings. +### Approach B: Statically-Typed ViewModels - Alternatively, use statically-typed view models in order to get better IDE support in the XAML. +Use statically-typed view models to get better IDE support in XAML, compile-time safety, and superior design-time +experience. ```f# open Elmish.WPF + [] type CounterViewModel(args) = inherit ViewModelBase(args) - member _.CounterValue = base.Get() (Binding.OneWayT.id >> Binding.mapModel (fun m -> m.Count)) - member _.Increment = base.Get() (Binding.CmdT.setAlways Counter.Increment) - member _.Decrement = base.Get() (Binding.CmdT.setAlways Counter.Decrement) - member _.StepSize - with get() = base.Get() (Binding.OneWayT.id >> Binding.mapModel (fun m -> m.StepSize)) - and set(v) = base.Set(v) (Binding.OneWayToSourceT.id >> Binding.mapMsg Counter.Msg.SetStepSize) + member _.CounterValue = + base.Get () (Binding.OneWayT.id >> Binding.mapModel (fun m -> m.Count)) + + member _.Increment = + base.Get () (Binding.CmdT.setAlways Increment) + + member _.Decrement = + base.Get () (Binding.CmdT.setAlways Decrement) + + let stepSizeBinding = + Binding.TwoWayT.id + >> Binding.mapModel (fun m -> float m.StepSize) + >> Binding.mapMsg (int >> SetStepSize) + + member this.StepSize + with get () = base.Get () stepSizeBinding + and set (value) = base.Set (value) stepSizeBinding ``` -7. Create a function that accepts the app’s main window (to be created) and configures and starts the Elmish loop for the window with your `init`, `update` and `bindings`: +7. Create a function that configures and starts the Elmish loop: + +### For Dynamic Bindings: ```F# open Elmish.WPF let main window = - Program.mkSimple init update bindings - |> Program.runElmishLoop window + WpfProgram.mkSimple init update bindings + |> WpfProgram.startElmishLoop window ``` - Alternatively, use a statically-typed view model at the top level. +### For Typed ViewModels: ```F# open Elmish.WPF let main window = - Program.mkSimpleT init update CounterViewModel - |> Program.runElmishLoop window + WpfProgram.mkSimpleT init update CounterViewModel + |> WpfProgram.startElmishLoop window ``` - In the code above, `Program.runElmishLoop` will set the window’s `DataContext` to the specified bindings and start the Elmish dispatch loop for the window. +In both cases, `WpfProgram.startElmishLoop` will set the window's `DataContext` and start the Elmish dispatch loop. -8. Create a WPF app project (using the Visual Studio template called `WPF App (.NET)`). This will be your entry point and contain the XAML views. Add a reference to the F# project, and make the following changes in the `csproj` file: +8. Create a WPF app project (using the Visual Studio template called `WPF App (.NET)`). This will be your entry point + and contain the XAML views. Add a reference to the F# project, and make the following changes in the `csproj` file: - * Currently, the core Elmish logs are only output to the console. If you want a console window for displaying Elmish logs, change `WinExe` to `Exe` and add `true`. - * If the project file starts with the now legacy ``, change it to `` - * Change the target framework to match the one used in the F# project (e.g. `net5.0-windows`). + * Currently, the core Elmish logs are only output to the console. If you want a console window for displaying Elmish + logs, change `WinExe` to `Exe` and add + `true`. + * If the project file starts with the now legacy ``, change it to + `` + * Change the target framework to match the one used in the F# project (e.g. `net5.0-windows`). Make the following changes to `App.xaml.cs` to initialize Elmish when the app starts: @@ -214,58 +276,131 @@ See the [SingleCounter](https://github.com/elmish/Elmish.WPF/tree/master/src/Sam Further resources: -* The [Elmish.WPF tutorial](https://github.com/elmish/Elmish.WPF/blob/master/TUTORIAL.md) provides information on general MVU/Elmish concepts and how they apply to Elmish.WPF, as well as the various Elmish.WPF bindings. -* The [samples](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples) are complete, working mini-apps demonstrating selected aspects of Elmish.WPF. -* If you'd like to contribute, please read and follow the [Contributor guidelines](https://github.com/elmish/Elmish.WPF/blob/master/.github/CONTRIBUTING.md). +* The [Elmish.WPF tutorial](https://github.com/elmish/Elmish.WPF/blob/master/TUTORIAL.md) provides information on + general MVU/Elmish concepts and how they apply to Elmish.WPF, as well as the various Elmish.WPF bindings. +* The [samples](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples) are complete, working mini-apps + demonstrating selected aspects of Elmish.WPF. Browse + the [Dynamic samples](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic) for traditional functional + bindings or the [Typed samples](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Typed) for + statically-typed ViewModels. +* If you'd like to contribute, please read and follow + the [Contributor guidelines](https://github.com/elmish/Elmish.WPF/blob/master/.github/CONTRIBUTING.md). FAQ --- -#### Static views in MVU? Isn’t that just a half-baked solution that only exists due to a lack of better alternatives? +#### Should I use Dynamic Bindings or Statically-Typed ViewModels? + +**Use Dynamic Bindings when:** + +- Rapid prototyping or building simple applications +- You prefer functional composition over object-oriented patterns +- Working alone or in small teams familiar with F# +- You need maximum flexibility in binding definitions +- Building MVU-style applications where the view layer should be minimal + +**Use Statically-Typed ViewModels when:** + +- Building large, complex applications +- Working with designers who need design-time data and IntelliSense +- You want compile-time validation of binding names and types +- Integrating with existing WPF/MVVM codebases +- Multiple developers need clear contracts between view and model layers +- You require superior tooling support in Visual Studio + +Both approaches use the same underlying MVU architecture and can coexist in the same application. + +#### How do I migrate between Dynamic and Typed approaches? + +**Dynamic to Typed:** + +1. Create a class inheriting from `ViewModelBase<'model, 'msg>` +2. Convert each binding in your `bindings()` function to a property +3. Use `Binding.OneWayT`, `Binding.CmdT`, etc. instead of the non-T variants +4. For TwoWay bindings, create a binding variable and implement getter/setter properties +5. Update your program creation to use `WpfProgram.mkSimpleT` + +**Typed to Dynamic:** + +1. Extract all properties into a `bindings()` function returning `Binding<'model, 'msg> list` +2. Convert property names to string-keyed bindings +3. Use `Binding.oneWay`, `Binding.cmd`, etc. instead of the T variants +4. Update your program creation to use `WpfProgram.mkSimple` + +#### Static views in MVU? Isn't that just a half-baked solution that only exists due to a lack of better alternatives? Not at all! 🙂 -It’s true that static views aren’t as composable as dynamic views. It’s also true that at the time of writing, there are no solid, production-ready dynamic UI libraries for WPF (though there are no lack of half-finished attempts or proof-of-concepts: [Elmish.WPF.Dynamic](https://github.com/cmeeren/Elmish.WPF.Dynamic), [Fabulous.WPF](https://github.com/TimLariviere/Fabulous.WPF), [Skylight](https://github.com/gerardtoconnor/Skylight), [Uil](https://github.com/elmish/Uil)). Heck, it’s even true that Elmish.WPF was originally created with static views due to the difficulty of creating a dynamic UI library, as described in [issue #1](https://github.com/elmish/Elmish.WPF/issues/1). +It’s true that static views aren’t as composable as dynamic views. It’s also true that at the time of writing, there are +no solid, production-ready dynamic UI libraries for WPF (though there are no lack of half-finished attempts or +proof-of-concepts: [Elmish.WPF.Dynamic](https://github.com/cmeeren/Elmish.WPF.Dynamic), [Fabulous.WPF](https://github.com/TimLariviere/Fabulous.WPF), [Skylight](https://github.com/gerardtoconnor/Skylight), [Uil](https://github.com/elmish/Uil)). +Heck, it’s even true that Elmish.WPF was originally created with static views due to the difficulty of creating a +dynamic UI library, as described in [issue #1](https://github.com/elmish/Elmish.WPF/issues/1). However, Elmish.WPF’s static-view-based solution has several unique benefits: -- You can use your existing XAML and MVVM knowledge (that is, the best part of MVVM – the UI bindings – without having to deal with `NavigationService`s, `ViewModelLocator`s, state synchronization, `INotifyPropertyChanged`, etc.) -- Huge mindshare – there are tons of relevant XAML and MVVM resources on the net which can help with the UI and data binding part if you get stuck -- Automatic support for all 3rd party WPF UI libraries like [MaterialDesignInXamlToolkit](https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit), since it just uses XAML and bindings (support for 3rd party libraries is commonly a major pain point for dynamic UI solutions) +- You can use your existing XAML and MVVM knowledge (that is, the best part of MVVM – the UI bindings – without having + to deal with `NavigationService`s, `ViewModelLocator`s, state synchronization, `INotifyPropertyChanged`, etc.) +- Huge mindshare – there are tons of relevant XAML and MVVM resources on the net which can help with the UI and data + binding part if you get stuck +- Automatic support for all 3rd party WPF UI libraries + like [MaterialDesignInXamlToolkit](https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit), since it just + uses XAML and bindings (support for 3rd party libraries is commonly a major pain point for dynamic UI solutions) - You can use the XAML designer (including design-time data binding) -- Automatically puts all the power of WPF at your fingertips, whereas dynamic UI solutions have [inherent limitations](https://github.com/cmeeren/Elmish.WPF.Dynamic/tree/e9f04b6e330754f045df093368fa4917c892399d#current-limitations) that are not easy to work around +- Automatically puts all the power of WPF at your fingertips, whereas dynamic UI solutions + have [inherent limitations](https://github.com/cmeeren/Elmish.WPF.Dynamic/tree/e9f04b6e330754f045df093368fa4917c892399d#current-limitations) + that are not easy to work around In short, for WPF apps, a solution based on static XAML views is currently the way to go. #### Do I have to use the project structure outlined above? -Not at all. The above example, as well as the samples, keep all non-UI code in a single project for simplicity, and all the XAML in a C# project for better tooling. +Not at all. The above example, as well as the samples, keep all non-UI code in a single project for simplicity, and all +the XAML in a C# project for better tooling. -An alternative with a clearer separation of UI and core logic can be implemented by splitting the F# project into two projects: +An alternative with a clearer separation of UI and core logic can be implemented by splitting the F# project into two +projects: * A core library containing the model definitions and `update` functions. - * This library can include a reference to Elmish (e.g. for the `Cmd` module helpers), but not to Elmish.WPF, which depends on WPF and has a UI-centered API (specifying bindings). This will ensure your core logic (such as the `update` function) is free from any UI concerns, and allow you to re-use the core library should you want to port your app to another Elmish-based solution (e.g. Fable.React). + * This library can include a reference to Elmish (e.g. for the `Cmd` module helpers), but not to Elmish.WPF, which + depends on WPF and has a UI-centered API (specifying bindings). This will ensure your core logic (such as the + `update` function) is free from any UI concerns, and allow you to re-use the core library should you want to port + your app to another Elmish-based solution (e.g. Fable.React). * An Elmish.WPF project that contains the `bindings` (or `view`) function and the call to `Program.runElmishLoop`. - * This project would reference the core library and `Elmish.WPF`. + * This project would reference the core library and `Elmish.WPF`. -Another alternative is to turn the sample code on its head and have the F# project be a console app containing your entry point (with a call to `Program.runWindow`) and referencing the C#/XAML project (instead of the other way around, as demonstrated above). +Another alternative is to turn the sample code on its head and have the F# project be a console app containing your +entry point (with a call to `Program.runWindow`) and referencing the C#/XAML project (instead of the other way around, +as demonstrated above). In general, you have a large amount of freedom in how you structure your solution and what kind of entry point you use. #### How can I test commands? What is the CmdMsg pattern? -Since the commands (`Cmd`) returned by `init` and `update` are lists of functions, they are not particularly testable. A general pattern to get around this is to replace the commands with pure data that are transformed to the actual commands elsewhere: +Since the commands (`Cmd`) returned by `init` and `update` are lists of functions, they are not particularly +testable. A general pattern to get around this is to replace the commands with pure data that are transformed to the +actual commands elsewhere: * Create a `CmdMsg` union type with cases for each command you want to execute in the app. -* Make `init` and `update` return `model * CmdMsg list` instead of `model * Cmd`. Since `init` and `update` now return data, they are much easier to test. +* Make `init` and `update` return `model * CmdMsg list` instead of `model * Cmd`. Since `init` and `update` now + return data, they are much easier to test. * Create a trivial/too-boring-to-test `cmdMsgToCmd` function that transforms a `CmdMsg` to the corresponding `Cmd`. -* Finally, create “normal” versions of `init` and `update` that you can use when creating `Program`. Elmish.WPF provides `Program.mkProgramWpfWithCmdMsg` that does this for you (but there’s no magic going on – it’s really easy to do yourself). +* Finally, create “normal” versions of `init` and `update` that you can use when creating `Program`. Elmish.WPF provides + `Program.mkProgramWpfWithCmdMsg` that does this for you (but there’s no magic going on – it’s really easy to do + yourself). -The [FileDialogsCmdMsg sample](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples) demonstrates this approach. For more information, see the [Fabulous documentation](https://fsprojects.github.io/Fabulous/Fabulous.XamarinForms/update.html#replacing-commands-with-command-messages-for-better-testability). For reference, here is [the discussion that led to this pattern](https://github.com/fsprojects/Fabulous/pull/320#issuecomment-491522737). +The [FileDialogsCmdMsg sample](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic/FileDialogsCmdMsg) +demonstrates this approach. +For more information, see +the [Fabulous documentation](https://fsprojects.github.io/Fabulous/Fabulous.XamarinForms/update.html#replacing-commands-with-command-messages-for-better-testability). +For reference, here +is [the discussion that led to this pattern](https://github.com/fsprojects/Fabulous/pull/320#issuecomment-491522737). #### Can I use design-time view models? -Yes. Assuming you have a C# XAML and entry point project referencing the F# project, simply use `ViewModel.designInstance` (e.g. in the F# project) to create a view model instance that your XAML can use at design-time: +Yes. Assuming you have a C# XAML and entry point project referencing the F# project, simply use +`ViewModel.designInstance` (e.g. in the F# project) to create a view model instance that your XAML can use at +design-time: ```F# module MyAssembly.DesignViewModels @@ -286,14 +421,15 @@ Then use the following attributes wherever you need a design-time VM: When targeting legacy .NET Framework, “Project code” must be enabled in the XAML designer for this to work. -If you are using static view models, make sure that the View Model type is in a namespace and add a default constructor that passes a model into `ViewModelArgs.simple`: +If you are using static view models, make sure that the View Model type is in a namespace and add a default constructor +that passes a model into `ViewModelArgs.simple`: ```F# namespace ViewModels type [] AppViewModel (args) = inherit ViewModelBase(args) - + new() = AppViewModel(App.init () |> ViewModelArgs.simple) ``` @@ -311,7 +447,11 @@ Then use the following attributes just like you would in a normal C# MVVM projec ##### .NET Core 3 workaround -When targeting .NET Core 3, a bug in the XAML designer causes design-time data to not be displayed through `DataContext` bindings. See [this issue](https://developercommunity.visualstudio.com/content/problem/1133390/design-time-data-in-datacontext-binding-not-displa.html) for details. One workaround is to add a `d:DataContext` binding alongside your normal `DataContext` binding. Another workaround is to change +When targeting .NET Core 3, a bug in the XAML designer causes design-time data to not be displayed through `DataContext` +bindings. +See [this issue](https://developercommunity.visualstudio.com/content/problem/1133390/design-time-data-in-datacontext-binding-not-displa.html) +for details. One workaround is to add a `d:DataContext` binding alongside your normal `DataContext` binding. Another +workaround is to change ```xaml @@ -326,21 +466,29 @@ to RelativeSource={RelativeSource AncestorType=T}}" /> ``` -where `T` is the type of the parent object that contains `local:MyControl` (or a more distant ancestor, though there are issues with using `Window` as the type). +where `T` is the type of the parent object that contains `local:MyControl` (or a more distant ancestor, though there are +issues with using `Window` as the type). #### Can I open new windows/dialogs? -Sure! Just use `Binding.subModelWin`. It works like `Binding.subModel`, but has a `WindowState` wrapper around the returned model to control whether the window is closed, hidden, or visible. You can use both modal and non-modal windows/dialogs, and everything is a part of the Elmish core loop. Check out the [NewWindow sample](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples). +Sure! Just use `Binding.subModelWin`. It works like `Binding.subModel`, but has a `WindowState` wrapper around the +returned model to control whether the window is closed, hidden, or visible. You can use both modal and non-modal +windows/dialogs, and everything is a part of the Elmish core loop. Check out +the [NewWindow sample](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic/NewWindow) ([Dynamic](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic/NewWindow) | [Typed](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Typed/NewWindow)). -Note that if you use `App.xaml` startup, you may want to set `ShutdownMode="OnMainWindowClose"` in `App.xaml` if that’s the desired behavior. +Note that if you use `App.xaml` startup, you may want to set `ShutdownMode="OnMainWindowClose"` in `App.xaml` if that’s +the desired behavior. #### Can I bind to events and use behaviors? -Sure! Check out the [EventBindingsAndBehaviors sample](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples). Note that you have to install the NuGet package `Microsoft.Xaml.Behaviors.Wpf`. +Sure! Check out +the [EventBindingsAndBehaviors sample](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic/EventBindingsAndBehaviors) ([Dynamic](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Dynamic/EventBindingsAndBehaviors) | [Typed](https://github.com/elmish/Elmish.WPF/tree/master/src/Samples/Typed/EventBindingsAndBehaviors)). +Note that you have to install the NuGet package `Microsoft.Xaml.Behaviors.Wpf`. #### How can I control logging? -Elmish.WPF uses `Microsoft.Extensions.Logging`. To see Elmish.WPF output in your favorite logging framework, use `WpfProgram.withLogger` to pass an `ILoggerFactory`: +Elmish.WPF uses `Microsoft.Extensions.Logging`. To see Elmish.WPF output in your favorite logging framework, use +`WpfProgram.withLogger` to pass an `ILoggerFactory`: ```f# WpfProgram.mkSimple init update bindings @@ -348,15 +496,22 @@ WpfProgram.mkSimple init update bindings |> WpfProgram.runWindow window ``` -For example, in Serilog, you need to install Serilog.Extensions.Logging and instantiate `SerilogLoggerFactory`. The samples demonstrate this. +For example, in Serilog, you need to install Serilog.Extensions.Logging and instantiate `SerilogLoggerFactory`. The +samples demonstrate this. Elmish.WPF logs to these categories: * `Elmish.WPF.Update`: Logs exceptions (Error level) and messages/models (Trace/Verbose level) during `update`. -* `Elmish.WPF.Bindings`: Logs events related to bindings. Some logging is done at the Error level (e.g. developer errors such as duplicated binding names, using non-existent bindings in XAML, etc.), but otherwise it’s generally just Trace/Verbose for when you really want to see everything that’s happening (triggering `PropertyChanged`, WPF getting/setting bindings, etc.) -* `Elmish.WPF.Performance`: Logs the performance of the functions you pass when creating bindings (`get`, `set`, `map`, `equals`, etc.) at the Trace/Verbose level. Use `WpfProgram.withPerformanceLogThreshold` to set the minimum duration to log. - -The specific method of controlling what Elmish.WPF logs depends on your logging framework. For Serilog you can use `.MinimumLevel.Override(...)` to specify the minimum log level per category, like this: +* `Elmish.WPF.Bindings`: Logs events related to bindings. Some logging is done at the Error level (e.g. developer errors + such as duplicated binding names, using non-existent bindings in XAML, etc.), but otherwise it’s generally just + Trace/Verbose for when you really want to see everything that’s happening (triggering `PropertyChanged`, WPF + getting/setting bindings, etc.) +* `Elmish.WPF.Performance`: Logs the performance of the functions you pass when creating bindings (`get`, `set`, `map`, + `equals`, etc.) at the Trace/Verbose level. Use `WpfProgram.withPerformanceLogThreshold` to set the minimum duration + to log. + +The specific method of controlling what Elmish.WPF logs depends on your logging framework. For Serilog you can use +`.MinimumLevel.Override(...)` to specify the minimum log level per category, like this: ```f# myLoggerConfiguration diff --git a/REFERENCE.md b/REFERENCE.md index 5a0dae42..d9a3aa18 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -5,39 +5,46 @@ Table of contents ----------------- * [The Elmish.WPF bindings](#the-elmishwpf-bindings) - + [One-way bindings](#one-way-bindings) - - [Binding to option-wrapped values](#binding-to-option-wrapped-values) - + [Two-way bindings](#two-way-bindings) - - [Binding to option-wrapped values](#binding-to-option-wrapped-values-1) - - [Using validation with two-way bindings](#using-validation-with-two-way-bindings) - + [Command bindings](#command-bindings) - - [Conditional commands (where you control `CanExecute`)](#conditional-commands-where-you-control-canexecute) - - [Using the `CommandParameter`](#using-the-commandparameter) - + [Sub-model bindings](#sub-model-bindings) - - [Level 1: No separate message type or customization of model for sub-bindings](#level-1-no-separate-message-type-or-customization-of-model-for-sub-bindings) - - [Level 2: Separate message type but no customization of model for sub-bindings](#level-2-separate-message-type-but-no-customization-of-model-for-sub-bindings) - - [Level 3: Separate message type and arbitrary customization of model for sub-bindings](#level-3-separate-message-type-and-arbitrary-customization-of-model-for-sub-bindings) - - [Optional and “sticky” sub-model bindings](#optional-and-sticky-sub-model-bindings) - + [Sub-model window bindings](#sub-model-window-bindings) - + [Sub-model sequence bindings](#sub-model-sequence-bindings) - + [Other bindings](#other-bindings) - - [`subModelSelectedItem`](#submodelselecteditem) - - [`oneWaySeq`](#onewayseq) - + [Lazy bindings](#lazy-bindings) + + [One-way bindings](#one-way-bindings) + - [Binding to option-wrapped values](#binding-to-option-wrapped-values) + + [Two-way bindings](#two-way-bindings) + - [Binding to option-wrapped values](#binding-to-option-wrapped-values-1) + - [Using validation with two-way bindings](#using-validation-with-two-way-bindings) + + [Command bindings](#command-bindings) + - [Conditional commands (where you control `CanExecute`)](#conditional-commands-where-you-control-canexecute) + - [Using the `CommandParameter`](#using-the-commandparameter) + + [Sub-model bindings](#sub-model-bindings) + - [Level 1: No separate message type or customization of model for sub-bindings](#level-1-no-separate-message-type-or-customization-of-model-for-sub-bindings) + - [Level 2: Separate message type but no customization of model for sub-bindings](#level-2-separate-message-type-but-no-customization-of-model-for-sub-bindings) + - [Level 3: Separate message type and arbitrary customization of model for sub-bindings](#level-3-separate-message-type-and-arbitrary-customization-of-model-for-sub-bindings) + - [Optional and “sticky” sub-model bindings](#optional-and-sticky-sub-model-bindings) + + [Sub-model window bindings](#sub-model-window-bindings) + + [Sub-model sequence bindings](#sub-model-sequence-bindings) + + [Other bindings](#other-bindings) + - [`subModelSelectedItem`](#submodelselecteditem) + - [`oneWaySeq`](#onewayseq) + + [Lazy bindings](#lazy-bindings) * [Modifying bindings](#modifying-bindings) - + [Lazy updating](#lazy-updating) - + [Caching](#caching) - + [Mapping bindings](#mapping-bindings) - - [Example use of `mapModel` and `mapMsg`](#example-use-of-mapModel-and-mapMsg) - - [Theory behind `mapModel` and `mapMsg`](#theory-behind-mapModel-and-mapMsg) + + [Lazy updating](#lazy-updating) + + [Caching](#caching) + + [Mapping bindings](#mapping-bindings) + - [Example use of `mapModel` and `mapMsg`](#example-use-of-mapModel-and-mapMsg) + - [Theory behind `mapModel` and `mapMsg`](#theory-behind-mapModel-and-mapMsg) +* [Choosing Your Binding Approach](#choosing-your-binding-approach) + + [Dynamic Bindings vs Statically-Typed ViewModels](#dynamic-bindings-vs-statically-typed-viewmodels) + + [Migration Between Approaches](#migration-between-approaches) * [Statically-typed view models](#statically-typed-view-models) - + [Inherit from `ViewModelBase<'model, 'msg>`](#inherit-from-viewmodelbasemodel-msg) - + [Typed Bindings](#typed-bindings) - - [Typed One-way Bindings](#typed-one-way-bindings) - - [Typed SubModel Bindings](#typed-submodel-bindings) - - [Typed WpfProgram Bindings](#typed-wpfprogram-bindings) - - [Mixing and matching bindings](#mixing-and-matching-bindings) - + + [Inherit from `ViewModelBase<'model, 'msg>`](#inherit-from-viewmodelbasemodel-msg) + + [Advantages of Statically-Typed ViewModels](#advantages-of-statically-typed-viewmodels) + + [Basic Typed ViewModel Structure](#basic-typed-viewmodel-structure) + + [Typed Bindings](#typed-bindings) + - [Typed One-way Bindings](#typed-one-way-bindings) + - [Typed TwoWay Bindings](#typed-twoway-bindings) + - [Typed TwoWay Bindings with Validation](#typed-twoway-bindings-with-validation) + - [Typed SubModel Bindings](#typed-submodel-bindings) + - [Typed SubModel Sequence Bindings](#typed-submodel-sequence-bindings) + - [Typed WpfProgram Bindings](#typed-wpfprogram-bindings) + - [Mixing and matching bindings](#mixing-and-matching-bindings) The Elmish.WPF bindings ---------------------------- @@ -45,19 +52,25 @@ The Elmish.WPF bindings The Elmish.WPF bindings can be categorized into the following types: - **One-way bindings**, for when you want to bind to a simple value. -- **Two-way bindings**, for when you want to bind to a simple value as well as update this value by dispatching a message. Used for inputs, checkboxes, sliders, etc. Can optionally support validation (e.g. provide an error message using `INotifyDataErrorInfo` that can be displayed when an input is not valid). +- **Two-way bindings**, for when you want to bind to a simple value as well as update this value by dispatching a + message. Used for inputs, checkboxes, sliders, etc. Can optionally support validation (e.g. provide an error message + using `INotifyDataErrorInfo` that can be displayed when an input is not valid). - **Command bindings**, for when you want a message to be dispatched when something happens (e.g. a button is clicked). - **Sub-model bindings**, for when you want to bind to a complex object that has its own bindings. - **Sub-model window bindings**, for when you want to control the opening/closing/hiding of new windows. -- **Sub-model sequence bindings**, for when you want to bind to a collection of complex objects, each of which has its own bindings. +- **Sub-model sequence bindings**, for when you want to bind to a collection of complex objects, each of which has its + own bindings. - **Other bindings** not fitting into the categories above -- **Lazy bindings**, optimizations of various other bindings that allow skipping potentially expensive computations if the input is unchanged +- **Lazy bindings**, optimizations of various other bindings that allow skipping potentially expensive computations if + the input is unchanged -Additionally, there is a section explaining how most dispatching bindings allow you to wrap the dispatcher to support debouncing/throttling etc. +Additionally, there is a section explaining how most dispatching bindings allow you to wrap the dispatcher to support +debouncing/throttling etc. ### One-way bindings -*Relevant sample: SingleCounter - ([XAML views](src/Samples/SingleCounter) and [F# core](src/Samples/SingleCounter.Core))* +*Relevant sample: +SingleCounter - ([Dynamic](src/Samples/Dynamic/SingleCounter) | [Typed](src/Samples/Typed/SingleCounter))* One-way bindings are used when you want to bind to a simple value. @@ -77,13 +90,22 @@ A one-way binding simply accepts a function `get: 'model -> 'a` that retrieves t #### Binding to option-wrapped values -In F#, it’s common to model missing values using the `Option` type. However, WPF uses `null` and doesn’t know how to handle the F# `Option` type. You could simply convert from `Option` to `null` (or `Nullable<_>`) in the `get` function using `Option.toObj` (or `Option.toNullable`), but this is such a common scenario that Elmish.WPF has a variant of the one-way binding called `oneWayOpt` with this behavior built-in. The `oneWayOpt` binding accepts a function `get: 'model -> 'a option`. If it returns `None`, the UI will receive `null`. If it returns `Some`, the UI will receive the inner value. +In F#, it’s common to model missing values using the `Option` type. However, WPF uses `null` and doesn’t know how to +handle the F# `Option` type. You could simply convert from `Option` to `null` (or `Nullable<_>`) in the `get` function +using `Option.toObj` (or `Option.toNullable`), but this is such a common scenario that Elmish.WPF has a variant of the +one-way binding called `oneWayOpt` with this behavior built-in. The `oneWayOpt` binding accepts a function +`get: 'model -> 'a option`. If it returns `None`, the UI will receive `null`. If it returns `Some`, the UI will receive +the inner value. ### Two-way bindings -*Relevant sample: SingleCounter - ([XAML views](src/Samples/SingleCounter) and [F# core](src/Samples/SingleCounter.Core))* +*Relevant sample: +SingleCounter - ([Dynamic](src/Samples/Dynamic/SingleCounter) | [Typed](src/Samples/Typed/SingleCounter))* -Two-way bindings are commonly used for any kind of input (textboxes, checkboxes, sliders, etc.). The two-way bindings accept two functions: A function `get: 'model -> 'a` just like the one-way binding, and a function `set: 'a -> 'model -> 'msg` that accepts the UI value to be set and the current model, and returns the message to be dispatched. +Two-way bindings are commonly used for any kind of input (textboxes, checkboxes, sliders, etc.). The two-way bindings +accept two functions: A function `get: 'model -> 'a` just like the one-way binding, and a function +`set: 'a -> 'model -> 'msg` that accepts the UI value to be set and the current model, and returns the message to be +dispatched. In the counter example above, the two-way binding to the slider value may look like this: @@ -105,11 +127,17 @@ The corresponding XAML may look like this: IsSnapToTickEnabled="True" /> ``` -The WPF slider’s value is a `float`, but in the model we use an `int`. Therefore the binding’s `get` function must convert the model’s integer to a float, and conversely, the binding’s “setter” must convert the UI value from a float to an int. +The WPF slider’s value is a `float`, but in the model we use an `int`. Therefore the binding’s `get` function must +convert the model’s integer to a float, and conversely, the binding’s “setter” must convert the UI value from a float to +an int. -You might think that the `get` function doesn’t have to cast to `float`. However, `'a` is the same in both `get` and `set`, and if you return `int` in `get`, then Elmish.WPF expects the value coming from the UI (which is `obj`) to also be `int`, and will try to unbox it to `int` when being set. Since it actually is a `float`, this will fail. +You might think that the `get` function doesn’t have to cast to `float`. However, `'a` is the same in both `get` and +`set`, and if you return `int` in `get`, then Elmish.WPF expects the value coming from the UI (which is `obj`) to also +be `int`, and will try to unbox it to `int` when being set. Since it actually is a `float`, this will fail. -It’s common for the `set` function to rely only on the value to be set, not on the model. Therefore, the two-way binding also has an overload where the `set` function accepts only the value, not the model. This allows a more shorthand notation: +It’s common for the `set` function to rely only on the value to be set, not on the model. Therefore, the two-way binding +also has an overload where the `set` function accepts only the value, not the model. This allows a more shorthand +notation: ```f# "StepSize" |> Binding.twoWay( @@ -120,39 +148,54 @@ It’s common for the `set` function to rely only on the value to be set, not on #### Binding to option-wrapped values -Just like one-way bindings, there is a variant of the two-way binding for `option`-wrapped values. The `option` wrapping is used in both `get` and `set`. Elmish.WPF will convert both ways between a possibly `null` raw value and an `option`-wrapped value. +Just like one-way bindings, there is a variant of the two-way binding for `option`-wrapped values. The `option` wrapping +is used in both `get` and `set`. Elmish.WPF will convert both ways between a possibly `null` raw value and an `option` +-wrapped value. #### Using validation with two-way bindings -*Relevant sample: Validation - ([XAML views](src/Samples/Validation) and [F# core](src/Samples/Validation.Core))* +*Relevant sample: Validation - ([Dynamic](src/Samples/Dynamic/Validation) | [Typed](src/Samples/Typed/Validation))* -You might want to display validation errors when the input is invalid. The best way to do this in WPF is through `INotifyDataErrorInfo`. Elmish.WPF supports this directly through the `twoWayValidate` bindings. In addition to `get` and `set`, this binding also accepts a third parameter that returns the error string to be displayed. This can be returned as `string option` (where `None` indicates no error), or `Result<_, string>` (where `Ok` indicates no error; this variant might allow you to easily reuse existing validation functions you have). +You might want to display validation errors when the input is invalid. The best way to do this in WPF is through +`INotifyDataErrorInfo`. Elmish.WPF supports this directly through the `twoWayValidate` bindings. In addition to `get` +and `set`, this binding also accepts a third parameter that returns the error string to be displayed. This can be +returned as `string option` (where `None` indicates no error), or `Result<_, string>` (where `Ok` indicates no error; +this variant might allow you to easily reuse existing validation functions you have). -Keep in mind that by default, WPF controls do not display errors. To display errors, either use 3rd party controls/styles (such as [MaterialDesignInXamlToolkit](https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit)) or add your own styles (the `Validation` sample in this repo demonstrates this). +Keep in mind that by default, WPF controls do not display errors. To display errors, either use 3rd party +controls/styles (such +as [MaterialDesignInXamlToolkit](https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit)) or add your own +styles (the `Validation` sample in this repo demonstrates this). There are also variants of the two-way validating bindings for option-wrapped values. ### Command bindings -*Relevant sample: SingleCounter - ([XAML views](src/Samples/SingleCounter) and [F# core](src/Samples/SingleCounter.Core))* +*Relevant sample: +SingleCounter - ([Dynamic](src/Samples/Dynamic/SingleCounter) | [Typed](src/Samples/Typed/SingleCounter))* Command bindings are used whenever you use `Command`/`CommandParameter` in XAML, such as for button clicks. -For example, for the counter app we have been looking at, the XAML binding to execute a command when the “Increment” button is clicked might look like this: +For example, for the counter app we have been looking at, the XAML binding to execute a command when the “Increment” +button is clicked might look like this: ```xaml