From b739a9e1008c208772a72e8a76970664898920ba Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:32:47 +0000 Subject: [PATCH 01/14] Initial plan From f76990a8443e884a9e156d413c9eebe399958fe5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:49:02 +0000 Subject: [PATCH 02/14] Add strongly-typed events with DurableEventAttribute and generator support Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com> --- src/Abstractions/DurableEventAttribute.cs | 34 +++++ src/Generators/DurableTaskSourceGenerator.cs | 122 ++++++++++++++++-- .../Generators.Tests/ClassBasedSyntaxTests.cs | 95 ++++++++++++++ test/Generators.Tests/Utils/TestHelpers.cs | 1 + 4 files changed, 242 insertions(+), 10 deletions(-) create mode 100644 src/Abstractions/DurableEventAttribute.cs diff --git a/src/Abstractions/DurableEventAttribute.cs b/src/Abstractions/DurableEventAttribute.cs new file mode 100644 index 00000000..f8cb18b2 --- /dev/null +++ b/src/Abstractions/DurableEventAttribute.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +namespace Microsoft.DurableTask; + +/// +/// Indicates that the attributed type represents a durable event. +/// +/// +/// This attribute is meant to be used on type definitions to generate strongly-typed +/// external event methods for orchestration contexts. +/// It is used specifically by build-time source generators to generate type-safe methods for waiting +/// for external events in orchestrations. +/// +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)] +public sealed class DurableEventAttribute : Attribute +{ + /// + /// Initializes a new instance of the class. + /// + /// + /// The name of the durable event. If not specified, the type name is used as the implied name of the durable event. + /// + public DurableEventAttribute(string? name = null) + { + // This logic cannot become too complex as code-generator relies on examining the constructor arguments. + this.Name = string.IsNullOrEmpty(name) ? default : new TaskName(name!); + } + + /// + /// Gets the name of the durable event. + /// + public TaskName Name { get; } +} diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index 19a24cc9..9a6818c9 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -49,6 +49,13 @@ public void Initialize(IncrementalGeneratorInitializationContext context) transform: static (ctx, _) => GetDurableTaskTypeInfo(ctx)) .Where(static info => info != null)!; + // Create providers for DurableEvent attributes + IncrementalValuesProvider durableEventAttributes = context.SyntaxProvider + .CreateSyntaxProvider( + predicate: static (node, _) => node is AttributeSyntax, + transform: static (ctx, _) => GetDurableEventTypeInfo(ctx)) + .Where(static info => info != null)!; + // Create providers for Durable Functions IncrementalValuesProvider durableFunctions = context.SyntaxProvider .CreateSyntaxProvider( @@ -57,14 +64,15 @@ public void Initialize(IncrementalGeneratorInitializationContext context) .Where(static func => func != null)!; // Collect all results and check if Durable Functions is referenced - IncrementalValueProvider<(Compilation, ImmutableArray, ImmutableArray)> compilationAndTasks = + IncrementalValueProvider<(Compilation, ImmutableArray, ImmutableArray, ImmutableArray)> compilationAndTasks = durableTaskAttributes.Collect() + .Combine(durableEventAttributes.Collect()) .Combine(durableFunctions.Collect()) .Combine(context.CompilationProvider) - .Select((x, _) => (x.Right, x.Left.Left, x.Left.Right)); + .Select((x, _) => (x.Right, x.Left.Left.Left, x.Left.Left.Right, x.Left.Right)); // Generate the source - context.RegisterSourceOutput(compilationAndTasks, static (spc, source) => Execute(spc, source.Item1, source.Item2, source.Item3)); + context.RegisterSourceOutput(compilationAndTasks, static (spc, source) => Execute(spc, source.Item1, source.Item2, source.Item3, source.Item4)); } static DurableTaskTypeInfo? GetDurableTaskTypeInfo(GeneratorSyntaxContext context) @@ -161,6 +169,46 @@ public void Initialize(IncrementalGeneratorInitializationContext context) return new DurableTaskTypeInfo(className, taskName, inputType, outputType, kind); } + static DurableEventTypeInfo? GetDurableEventTypeInfo(GeneratorSyntaxContext context) + { + AttributeSyntax attribute = (AttributeSyntax)context.Node; + + ITypeSymbol? attributeType = context.SemanticModel.GetTypeInfo(attribute.Name).Type; + if (attributeType?.ToString() != "Microsoft.DurableTask.DurableEventAttribute") + { + return null; + } + + // DurableEventAttribute can be applied to both class and struct (record) + TypeDeclarationSyntax? typeDeclaration = attribute.Parent?.Parent as TypeDeclarationSyntax; + if (typeDeclaration == null) + { + return null; + } + + // Verify that the attribute is being used on a non-abstract type + if (typeDeclaration.Modifiers.Any(SyntaxKind.AbstractKeyword)) + { + return null; + } + + if (context.SemanticModel.GetDeclaredSymbol(typeDeclaration) is not ITypeSymbol eventType) + { + return null; + } + + string typeName = eventType.ToDisplayString(); + string eventName = eventType.Name; + + if (attribute.ArgumentList?.Arguments.Count > 0) + { + ExpressionSyntax expression = attribute.ArgumentList.Arguments[0].Expression; + eventName = context.SemanticModel.GetConstantValue(expression).ToString(); + } + + return new DurableEventTypeInfo(typeName, eventName, eventType); + } + static DurableFunction? GetDurableFunction(GeneratorSyntaxContext context) { MethodDeclarationSyntax method = (MethodDeclarationSyntax)context.Node; @@ -177,9 +225,10 @@ static void Execute( SourceProductionContext context, Compilation compilation, ImmutableArray allTasks, + ImmutableArray allEvents, ImmutableArray allFunctions) { - if (allTasks.IsDefaultOrEmpty && allFunctions.IsDefaultOrEmpty) + if (allTasks.IsDefaultOrEmpty && allEvents.IsDefaultOrEmpty && allFunctions.IsDefaultOrEmpty) { return; } @@ -210,7 +259,7 @@ static void Execute( } } - int found = activities.Count + orchestrators.Count + entities.Count + allFunctions.Length; + int found = activities.Count + orchestrators.Count + entities.Count + allEvents.Length + allFunctions.Length; if (found == 0) { return; @@ -221,6 +270,7 @@ static void Execute( #nullable enable using System; +using System.Threading; using System.Threading.Tasks; using Microsoft.DurableTask.Internal;"); @@ -287,6 +337,12 @@ public static class GeneratedDurableTaskExtensions AddActivityCallMethod(sourceBuilder, function); } + // Generate WaitFor{EventName}Async methods for each event type + foreach (DurableEventTypeInfo eventInfo in allEvents) + { + AddEventWaitMethod(sourceBuilder, eventInfo); + } + if (isDurableFunctions) { if (activities.Count > 0) @@ -299,11 +355,15 @@ public static class GeneratedDurableTaskExtensions else { // ASP.NET Core-specific service registration methods - AddRegistrationMethodForAllTasks( - sourceBuilder, - orchestrators, - activities, - entities); + // Only generate if there are actually tasks to register + if (orchestrators.Count > 0 || activities.Count > 0 || entities.Count > 0) + { + AddRegistrationMethodForAllTasks( + sourceBuilder, + orchestrators, + activities, + entities); + } } sourceBuilder.AppendLine(" }").AppendLine("}"); @@ -376,6 +436,19 @@ static void AddActivityCallMethod(StringBuilder sourceBuilder, DurableFunction a }}"); } + static void AddEventWaitMethod(StringBuilder sourceBuilder, DurableEventTypeInfo eventInfo) + { + sourceBuilder.AppendLine($@" + /// + /// Waits for an external event of type . + /// + /// + public static Task<{eventInfo.TypeName}> WaitFor{eventInfo.EventName}Async(this TaskOrchestrationContext context, CancellationToken cancellationToken = default) + {{ + return context.WaitForExternalEvent<{eventInfo.TypeName}>(""{eventInfo.EventName}"", cancellationToken); + }}"); + } + static void AddActivityFunctionDeclaration(StringBuilder sourceBuilder, DurableTaskTypeInfo activity) { // GeneratedActivityContext is a generated class that we use for each generated activity trigger definition. @@ -533,5 +606,34 @@ static string GetRenderedTypeExpression(ITypeSymbol? symbol) return expression; } } + + class DurableEventTypeInfo + { + public DurableEventTypeInfo(string typeName, string eventName, ITypeSymbol eventType) + { + this.TypeName = GetRenderedTypeExpression(eventType); + this.EventName = eventName; + } + + public string TypeName { get; } + public string EventName { get; } + + static string GetRenderedTypeExpression(ITypeSymbol? symbol) + { + if (symbol == null) + { + return "object"; + } + + string expression = symbol.ToString(); + if (expression.StartsWith("System.", StringComparison.Ordinal) + && symbol.ContainingNamespace.Name == "System") + { + expression = expression.Substring("System.".Length); + } + + return expression; + } + } } } diff --git a/test/Generators.Tests/ClassBasedSyntaxTests.cs b/test/Generators.Tests/ClassBasedSyntaxTests.cs index c3abc6c5..f19b235b 100644 --- a/test/Generators.Tests/ClassBasedSyntaxTests.cs +++ b/test/Generators.Tests/ClassBasedSyntaxTests.cs @@ -511,4 +511,99 @@ internal static DurableTaskRegistry AddAllGeneratedTasks(this DurableTaskRegistr expectedOutput, isDurableFunctions: false); } + + [Fact] + public Task Events_BasicRecord() + { + string code = @" +#nullable enable +using System.Threading.Tasks; +using Microsoft.DurableTask; + +[DurableEvent(nameof(ApprovalEvent))] +public sealed record ApprovalEvent(bool Approved, string? Approver);"; + + string expectedOutput = TestHelpers.WrapAndFormat( + GeneratedClassName, + methodList: @" +/// +/// Waits for an external event of type . +/// +/// +public static Task WaitForApprovalEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default) +{ + return context.WaitForExternalEvent(""ApprovalEvent"", cancellationToken); +}"); + + return TestHelpers.RunTestAsync( + GeneratedFileName, + code, + expectedOutput, + isDurableFunctions: false); + } + + [Fact] + public Task Events_ClassWithExplicitName() + { + string code = @" +using System.Threading.Tasks; +using Microsoft.DurableTask; + +[DurableEvent(""CustomEventName"")] +public class MyEventData +{ + public string Message { get; set; } +}"; + + string expectedOutput = TestHelpers.WrapAndFormat( + GeneratedClassName, + methodList: @" +/// +/// Waits for an external event of type . +/// +/// +public static Task WaitForCustomEventNameAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default) +{ + return context.WaitForExternalEvent(""CustomEventName"", cancellationToken); +}"); + + return TestHelpers.RunTestAsync( + GeneratedFileName, + code, + expectedOutput, + isDurableFunctions: false); + } + + [Fact] + public Task Events_WithNamespace() + { + string code = @" +using System.Threading.Tasks; +using Microsoft.DurableTask; +using MyNS; + +namespace MyNS +{ + [DurableEvent(nameof(DataReceivedEvent))] + public record DataReceivedEvent(int Id, string Data); +}"; + + string expectedOutput = TestHelpers.WrapAndFormat( + GeneratedClassName, + methodList: @" +/// +/// Waits for an external event of type . +/// +/// +public static Task WaitForDataReceivedEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default) +{ + return context.WaitForExternalEvent(""DataReceivedEvent"", cancellationToken); +}"); + + return TestHelpers.RunTestAsync( + GeneratedFileName, + code, + expectedOutput, + isDurableFunctions: false); + } } diff --git a/test/Generators.Tests/Utils/TestHelpers.cs b/test/Generators.Tests/Utils/TestHelpers.cs index 67f030d9..960a525f 100644 --- a/test/Generators.Tests/Utils/TestHelpers.cs +++ b/test/Generators.Tests/Utils/TestHelpers.cs @@ -61,6 +61,7 @@ public static string WrapAndFormat(string generatedClassName, string methodList, string formattedMethodList = IndentLines(spaces: 8, methodList); string usings = @" using System; +using System.Threading; using System.Threading.Tasks; using Microsoft.DurableTask.Internal;"; From e0637653b1064c398c5885fd6d3171ca6304c239 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:57:43 +0000 Subject: [PATCH 03/14] Add EventsSample demonstrating strongly-typed events Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com> --- Microsoft.DurableTask.sln | 365 ++++++++++++++++++++++- samples/EventsSample/Events.cs | 20 ++ samples/EventsSample/EventsSample.csproj | 24 ++ samples/EventsSample/Program.cs | 75 +++++ samples/EventsSample/README.md | 83 ++++++ samples/EventsSample/Tasks.cs | 77 +++++ 6 files changed, 634 insertions(+), 10 deletions(-) create mode 100644 samples/EventsSample/Events.cs create mode 100644 samples/EventsSample/EventsSample.csproj create mode 100644 samples/EventsSample/Program.cs create mode 100644 samples/EventsSample/README.md create mode 100644 samples/EventsSample/Tasks.cs diff --git a/Microsoft.DurableTask.sln b/Microsoft.DurableTask.sln index 0ca1cad1..b13a8fbe 100644 --- a/Microsoft.DurableTask.sln +++ b/Microsoft.DurableTask.sln @@ -99,172 +99,514 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost", "src\In EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost.Tests", "test\InProcessTestHost.Tests\InProcessTestHost.Tests.csproj", "{B894780C-338F-475E-8E84-56AFA8197A06}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventsSample", "samples\EventsSample\EventsSample.csproj", "{36C314FB-20F9-46B4-BC3F-08BA3096908E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{51A52603-541D-DE3F-2825-C80F9EE6C532}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{3B8F957E-7773-4C0C-ACD7-91A1591D9312}" +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 {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x64.Build.0 = Debug|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x86.Build.0 = Debug|Any CPU {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|Any CPU.Build.0 = Release|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x64.ActiveCfg = Release|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x64.Build.0 = Release|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x86.ActiveCfg = Release|Any CPU + {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x86.Build.0 = Release|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x64.Build.0 = Debug|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x86.ActiveCfg = Debug|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x86.Build.0 = Debug|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|Any CPU.Build.0 = Release|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x64.ActiveCfg = Release|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x64.Build.0 = Release|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x86.ActiveCfg = Release|Any CPU + {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x86.Build.0 = Release|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x64.ActiveCfg = Debug|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x64.Build.0 = Debug|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x86.ActiveCfg = Debug|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x86.Build.0 = Debug|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|Any CPU.ActiveCfg = Release|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|Any CPU.Build.0 = Release|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x64.ActiveCfg = Release|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x64.Build.0 = Release|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x86.ActiveCfg = Release|Any CPU + {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x86.Build.0 = Release|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x64.ActiveCfg = Debug|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x64.Build.0 = Debug|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x86.ActiveCfg = Debug|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x86.Build.0 = Debug|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|Any CPU.ActiveCfg = Release|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|Any CPU.Build.0 = Release|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x64.ActiveCfg = Release|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x64.Build.0 = Release|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x86.ActiveCfg = Release|Any CPU + {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x86.Build.0 = Release|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x64.ActiveCfg = Debug|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x64.Build.0 = Debug|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x86.ActiveCfg = Debug|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x86.Build.0 = Debug|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|Any CPU.Build.0 = Release|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x64.ActiveCfg = Release|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x64.Build.0 = Release|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x86.ActiveCfg = Release|Any CPU + {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x86.Build.0 = Release|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x64.ActiveCfg = Debug|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x64.Build.0 = Debug|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x86.ActiveCfg = Debug|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x86.Build.0 = Debug|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|Any CPU.ActiveCfg = Release|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|Any CPU.Build.0 = Release|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x64.ActiveCfg = Release|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x64.Build.0 = Release|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x86.ActiveCfg = Release|Any CPU + {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x86.Build.0 = Release|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x64.ActiveCfg = Debug|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x64.Build.0 = Debug|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x86.ActiveCfg = Debug|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x86.Build.0 = Debug|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|Any CPU.Build.0 = Release|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x64.ActiveCfg = Release|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x64.Build.0 = Release|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x86.ActiveCfg = Release|Any CPU + {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x86.Build.0 = Release|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x64.ActiveCfg = Debug|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x64.Build.0 = Debug|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x86.ActiveCfg = Debug|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x86.Build.0 = Debug|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|Any CPU.ActiveCfg = Release|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|Any CPU.Build.0 = Release|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x64.ActiveCfg = Release|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x64.Build.0 = Release|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x86.ActiveCfg = Release|Any CPU + {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x86.Build.0 = Release|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x64.ActiveCfg = Debug|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x64.Build.0 = Debug|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x86.Build.0 = Debug|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|Any CPU.ActiveCfg = Release|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|Any CPU.Build.0 = Release|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x64.ActiveCfg = Release|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x64.Build.0 = Release|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x86.ActiveCfg = Release|Any CPU + {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x86.Build.0 = Release|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x64.ActiveCfg = Debug|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x64.Build.0 = Debug|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x86.ActiveCfg = Debug|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x86.Build.0 = Debug|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|Any CPU.ActiveCfg = Release|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|Any CPU.Build.0 = Release|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x64.ActiveCfg = Release|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x64.Build.0 = Release|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x86.ActiveCfg = Release|Any CPU + {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x86.Build.0 = Release|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x64.ActiveCfg = Debug|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x64.Build.0 = Debug|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x86.ActiveCfg = Debug|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x86.Build.0 = Debug|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|Any CPU.ActiveCfg = Release|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|Any CPU.Build.0 = Release|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x64.ActiveCfg = Release|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x64.Build.0 = Release|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x86.ActiveCfg = Release|Any CPU + {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x86.Build.0 = Release|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x64.ActiveCfg = Debug|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x64.Build.0 = Debug|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x86.Build.0 = Debug|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|Any CPU.ActiveCfg = Release|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|Any CPU.Build.0 = Release|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x64.ActiveCfg = Release|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x64.Build.0 = Release|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x86.ActiveCfg = Release|Any CPU + {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x86.Build.0 = Release|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x64.Build.0 = Debug|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x86.Build.0 = Debug|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|Any CPU.Build.0 = Release|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x64.ActiveCfg = Release|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x64.Build.0 = Release|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x86.ActiveCfg = Release|Any CPU + {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x86.Build.0 = Release|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x64.ActiveCfg = Debug|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x64.Build.0 = Debug|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x86.ActiveCfg = Debug|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x86.Build.0 = Debug|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|Any CPU.ActiveCfg = Release|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|Any CPU.Build.0 = Release|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x64.ActiveCfg = Release|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x64.Build.0 = Release|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x86.ActiveCfg = Release|Any CPU + {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x86.Build.0 = Release|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x64.ActiveCfg = Debug|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x64.Build.0 = Debug|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x86.ActiveCfg = Debug|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x86.Build.0 = Debug|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|Any CPU.Build.0 = Release|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x64.ActiveCfg = Release|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x64.Build.0 = Release|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x86.ActiveCfg = Release|Any CPU + {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x86.Build.0 = Release|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x64.ActiveCfg = Debug|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x64.Build.0 = Debug|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x86.ActiveCfg = Debug|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x86.Build.0 = Debug|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|Any CPU.Build.0 = Release|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x64.ActiveCfg = Release|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x64.Build.0 = Release|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x86.ActiveCfg = Release|Any CPU + {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x86.Build.0 = Release|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x64.ActiveCfg = Debug|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x64.Build.0 = Debug|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x86.ActiveCfg = Debug|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x86.Build.0 = Debug|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|Any CPU.Build.0 = Release|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x64.ActiveCfg = Release|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x64.Build.0 = Release|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x86.ActiveCfg = Release|Any CPU + {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x86.Build.0 = Release|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x64.ActiveCfg = Debug|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x64.Build.0 = Debug|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x86.ActiveCfg = Debug|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x86.Build.0 = Debug|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|Any CPU.ActiveCfg = Release|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|Any CPU.Build.0 = Release|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x64.ActiveCfg = Release|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x64.Build.0 = Release|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x86.ActiveCfg = Release|Any CPU + {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x86.Build.0 = Release|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x64.Build.0 = Debug|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x86.Build.0 = Debug|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|Any CPU.Build.0 = Release|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x64.ActiveCfg = Release|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x64.Build.0 = Release|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x86.ActiveCfg = Release|Any CPU + {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x86.Build.0 = Release|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|Any CPU.Build.0 = Debug|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x64.ActiveCfg = Debug|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x64.Build.0 = Debug|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x86.ActiveCfg = Debug|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x86.Build.0 = Debug|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|Any CPU.ActiveCfg = Release|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|Any CPU.Build.0 = Release|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x64.ActiveCfg = Release|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x64.Build.0 = Release|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x86.ActiveCfg = Release|Any CPU + {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x86.Build.0 = Release|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x64.ActiveCfg = Debug|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x64.Build.0 = Debug|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x86.ActiveCfg = Debug|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x86.Build.0 = Debug|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|Any CPU.ActiveCfg = Release|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|Any CPU.Build.0 = Release|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x64.ActiveCfg = Release|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x64.Build.0 = Release|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x86.ActiveCfg = Release|Any CPU + {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x86.Build.0 = Release|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x64.ActiveCfg = Debug|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x64.Build.0 = Debug|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x86.ActiveCfg = Debug|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x86.Build.0 = Debug|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|Any CPU.ActiveCfg = Release|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|Any CPU.Build.0 = Release|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x64.ActiveCfg = Release|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x64.Build.0 = Release|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x86.ActiveCfg = Release|Any CPU + {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x86.Build.0 = Release|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x64.Build.0 = Debug|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x86.Build.0 = Debug|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|Any CPU.Build.0 = Release|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x64.ActiveCfg = Release|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x64.Build.0 = Release|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x86.ActiveCfg = Release|Any CPU + {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x86.Build.0 = Release|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|Any CPU.Build.0 = Debug|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x64.ActiveCfg = Debug|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x64.Build.0 = Debug|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x86.ActiveCfg = Debug|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x86.Build.0 = Debug|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|Any CPU.ActiveCfg = Release|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|Any CPU.Build.0 = Release|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x64.ActiveCfg = Release|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x64.Build.0 = Release|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x86.ActiveCfg = Release|Any CPU + {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x86.Build.0 = Release|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x64.ActiveCfg = Debug|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x64.Build.0 = Debug|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x86.ActiveCfg = Debug|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x86.Build.0 = Debug|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|Any CPU.ActiveCfg = Release|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|Any CPU.Build.0 = Release|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x64.ActiveCfg = Release|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x64.Build.0 = Release|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x86.ActiveCfg = Release|Any CPU + {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x86.Build.0 = Release|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x64.ActiveCfg = Debug|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x64.Build.0 = Debug|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x86.ActiveCfg = Debug|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x86.Build.0 = Debug|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|Any CPU.Build.0 = Release|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x64.ActiveCfg = Release|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x64.Build.0 = Release|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x86.ActiveCfg = Release|Any CPU + {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x86.Build.0 = Release|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x64.ActiveCfg = Debug|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x64.Build.0 = Debug|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x86.ActiveCfg = Debug|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x86.Build.0 = Debug|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|Any CPU.Build.0 = Release|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x64.ActiveCfg = Release|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x64.Build.0 = Release|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x86.ActiveCfg = Release|Any CPU + {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x86.Build.0 = Release|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x64.ActiveCfg = Debug|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x64.Build.0 = Debug|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x86.ActiveCfg = Debug|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x86.Build.0 = Debug|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|Any CPU.ActiveCfg = Release|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|Any CPU.Build.0 = Release|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x64.ActiveCfg = Release|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x64.Build.0 = Release|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x86.ActiveCfg = Release|Any CPU + {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x86.Build.0 = Release|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x64.ActiveCfg = Debug|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x64.Build.0 = Debug|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x86.ActiveCfg = Debug|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x86.Build.0 = Debug|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|Any CPU.ActiveCfg = Release|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|Any CPU.Build.0 = Release|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x64.ActiveCfg = Release|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x64.Build.0 = Release|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x86.ActiveCfg = Release|Any CPU + {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x86.Build.0 = Release|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x64.Build.0 = Debug|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x86.Build.0 = Debug|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|Any CPU.Build.0 = Release|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x64.ActiveCfg = Release|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x64.Build.0 = Release|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x86.ActiveCfg = Release|Any CPU + {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x86.Build.0 = Release|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x64.ActiveCfg = Debug|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x64.Build.0 = Debug|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x86.ActiveCfg = Debug|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x86.Build.0 = Debug|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|Any CPU.ActiveCfg = Release|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|Any CPU.Build.0 = Release|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x64.ActiveCfg = Release|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x64.Build.0 = Release|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x86.ActiveCfg = Release|Any CPU + {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x86.Build.0 = Release|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x64.ActiveCfg = Debug|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x64.Build.0 = Debug|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x86.ActiveCfg = Debug|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x86.Build.0 = Debug|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|Any CPU.ActiveCfg = Release|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|Any CPU.Build.0 = Release|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x64.ActiveCfg = Release|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x64.Build.0 = Release|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x86.ActiveCfg = Release|Any CPU + {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x86.Build.0 = Release|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x64.ActiveCfg = Debug|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x64.Build.0 = Debug|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x86.ActiveCfg = Debug|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x86.Build.0 = Debug|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Release|Any CPU.ActiveCfg = Release|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Release|Any CPU.Build.0 = Release|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Release|x64.ActiveCfg = Release|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Release|x64.Build.0 = Release|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Release|x86.ActiveCfg = Release|Any CPU + {69ED743C-D616-4530-87E2-391D249D7368}.Release|x86.Build.0 = Release|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x64.ActiveCfg = Debug|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x64.Build.0 = Debug|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x86.ActiveCfg = Debug|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x86.Build.0 = Debug|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|Any CPU.Build.0 = Release|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x64.ActiveCfg = Release|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x64.Build.0 = Release|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x86.ActiveCfg = Release|Any CPU + {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x86.Build.0 = Release|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x64.Build.0 = Debug|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x86.Build.0 = Debug|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|Any CPU.Build.0 = Release|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x64.ActiveCfg = Release|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x64.Build.0 = Release|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x86.ActiveCfg = Release|Any CPU + {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x86.Build.0 = Release|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x64.Build.0 = Debug|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x86.ActiveCfg = Debug|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x86.Build.0 = Debug|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.Build.0 = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.Build.0 = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.Build.0 = Release|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x64.ActiveCfg = Release|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x64.Build.0 = Release|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x86.ActiveCfg = Release|Any CPU + {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x86.Build.0 = Release|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x64.ActiveCfg = Debug|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x64.Build.0 = Debug|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x86.ActiveCfg = Debug|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x86.Build.0 = Debug|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.Build.0 = Release|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x64.ActiveCfg = Release|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x64.Build.0 = Release|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x86.ActiveCfg = Release|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x86.Build.0 = Release|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x64.ActiveCfg = Debug|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x64.Build.0 = Debug|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x86.ActiveCfg = Debug|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x86.Build.0 = Debug|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.Build.0 = Release|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x64.ActiveCfg = Release|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x64.Build.0 = Release|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x86.ActiveCfg = Release|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x86.Build.0 = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x64.ActiveCfg = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x64.Build.0 = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x86.ActiveCfg = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x86.Build.0 = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.Build.0 = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x64.ActiveCfg = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x64.Build.0 = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x86.ActiveCfg = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x86.Build.0 = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x64.ActiveCfg = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x64.Build.0 = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x86.ActiveCfg = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x86.Build.0 = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.Build.0 = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x64.ActiveCfg = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x64.Build.0 = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x86.ActiveCfg = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x86.Build.0 = Release|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x64.ActiveCfg = Debug|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x64.Build.0 = Debug|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x86.ActiveCfg = Debug|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x86.Build.0 = Debug|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|Any CPU.Build.0 = Release|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x64.ActiveCfg = Release|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x64.Build.0 = Release|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x86.ActiveCfg = Release|Any CPU + {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -310,10 +652,13 @@ Global {A89B766C-987F-4C9F-8937-D0AB9FE640C8} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {100348B5-4D97-4A3F-B777-AB14F276F8FE} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {D2779F32-A548-44F8-B60A-6AC018966C79} = {E5637F81-2FB9-4CD7-900D-455363B142A7} - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} - {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7} {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} + {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7} + {36C314FB-20F9-46B4-BC3F-08BA3096908E} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} + {51A52603-541D-DE3F-2825-C80F9EE6C532} = {1C217BB2-CE16-41CC-9D47-0FC0DB60BDB3} + {3B8F957E-7773-4C0C-ACD7-91A1591D9312} = {5B448FF6-EC42-491D-A22E-1DC8B618E6D5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AB41CB55-35EA-4986-A522-387AB3402E71} diff --git a/samples/EventsSample/Events.cs b/samples/EventsSample/Events.cs new file mode 100644 index 00000000..e284acae --- /dev/null +++ b/samples/EventsSample/Events.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.DurableTask; + +namespace EventsSample; + +/// +/// Example event type annotated with DurableEventAttribute. +/// This generates a strongly-typed WaitForApprovalEventAsync method. +/// +[DurableEvent(nameof(ApprovalEvent))] +public sealed record ApprovalEvent(bool Approved, string? Approver); + +/// +/// Another example event type with custom name. +/// This generates a WaitForDataReceivedAsync method that waits for "DataReceived" event. +/// +[DurableEvent("DataReceived")] +public sealed record DataReceivedEvent(int Id, string Data); diff --git a/samples/EventsSample/EventsSample.csproj b/samples/EventsSample/EventsSample.csproj new file mode 100644 index 00000000..9c8cf843 --- /dev/null +++ b/samples/EventsSample/EventsSample.csproj @@ -0,0 +1,24 @@ + + + + Exe + net6.0;net8.0;net10.0 + enable + + + + + + + + + + + + + + + + diff --git a/samples/EventsSample/Program.cs b/samples/EventsSample/Program.cs new file mode 100644 index 00000000..eb1a3321 --- /dev/null +++ b/samples/EventsSample/Program.cs @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +// This sample demonstrates the use of strongly-typed external events with DurableEventAttribute. + +using EventsSample; +using Microsoft.DurableTask; +using Microsoft.DurableTask.Client; +using Microsoft.DurableTask.Worker; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); + +builder.Services.AddDurableTaskClient().UseGrpc(); +builder.Services.AddDurableTaskWorker() + .AddTasks(tasks => + { + tasks.AddOrchestrator(); + tasks.AddActivity(); + tasks.AddOrchestrator(); + tasks.AddActivity(); + }) + .UseGrpc(); + +IHost host = builder.Build(); +await host.StartAsync(); + +await using DurableTaskClient client = host.Services.GetRequiredService(); + +Console.WriteLine("=== Strongly-Typed Events Sample ==="); +Console.WriteLine(); + +// Example 1: Approval workflow +Console.WriteLine("Starting approval workflow..."); +string approvalInstanceId = await client.ScheduleNewOrchestrationInstanceAsync("ApprovalOrchestrator", "Important Request"); +Console.WriteLine($"Started orchestration with ID: {approvalInstanceId}"); +Console.WriteLine(); + +// Wait a moment for the notification to be sent +await Task.Delay(1000); + +// Simulate approval +Console.WriteLine("Simulating approval event..."); +await client.RaiseEventAsync(approvalInstanceId, "ApprovalEvent", new ApprovalEvent(true, "John Doe")); + +// Wait for completion +OrchestrationMetadata approvalResult = await client.WaitForInstanceCompletionAsync( + approvalInstanceId, + getInputsAndOutputs: true); +Console.WriteLine($"Approval workflow result: {approvalResult.ReadOutputAs()}"); +Console.WriteLine(); + +// Example 2: Data processing workflow +Console.WriteLine("Starting data processing workflow..."); +string dataInstanceId = await client.ScheduleNewOrchestrationInstanceAsync("DataProcessingOrchestrator", "test-input"); +Console.WriteLine($"Started orchestration with ID: {dataInstanceId}"); +Console.WriteLine(); + +// Wait a moment +await Task.Delay(1000); + +// Send data event +Console.WriteLine("Sending data event..."); +await client.RaiseEventAsync(dataInstanceId, "DataReceived", new DataReceivedEvent(123, "Sample Data")); + +// Wait for completion +OrchestrationMetadata dataResult = await client.WaitForInstanceCompletionAsync( + dataInstanceId, + getInputsAndOutputs: true); +Console.WriteLine($"Data processing result: {dataResult.ReadOutputAs()}"); +Console.WriteLine(); + +Console.WriteLine("Sample completed successfully!"); +await host.StopAsync(); diff --git a/samples/EventsSample/README.md b/samples/EventsSample/README.md new file mode 100644 index 00000000..caa05f7f --- /dev/null +++ b/samples/EventsSample/README.md @@ -0,0 +1,83 @@ +# Strongly-Typed Events Sample + +This sample demonstrates the use of strongly-typed external events using the `DurableEventAttribute`. + +## Overview + +The `DurableEventAttribute` allows you to define event types that automatically generate strongly-typed extension methods for waiting on external events in orchestrations. This provides compile-time type safety and better IntelliSense support. + +## Key Features + +1. **Strongly-Typed Event Definitions**: Define event types using records or classes with the `[DurableEvent]` attribute +2. **Generated Extension Methods**: The source generator automatically creates `WaitFor{EventName}Async` methods +3. **Type Safety**: Event payloads are strongly-typed, reducing runtime errors + +## Sample Code + +### Defining an Event + +```csharp +[DurableEvent(nameof(ApprovalEvent))] +public sealed record ApprovalEvent(bool Approved, string? Approver); +``` + +This generates an extension method: + +```csharp +public static Task WaitForApprovalEventAsync( + this TaskOrchestrationContext context, + CancellationToken cancellationToken = default); +``` + +### Using the Generated Method in an Orchestrator + +```csharp +[DurableTask("ApprovalOrchestrator")] +public class ApprovalOrchestrator : TaskOrchestrator +{ + public override async Task RunAsync(TaskOrchestrationContext context, string requestName) + { + // Wait for approval event using the generated strongly-typed method + ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync(); + + if (approvalEvent.Approved) + { + return $"Request approved by {approvalEvent.Approver}"; + } + else + { + return $"Request rejected by {approvalEvent.Approver}"; + } + } +} +``` + +### Raising Events from Client Code + +```csharp +await client.RaiseEventAsync( + instanceId, + "ApprovalEvent", + new ApprovalEvent(true, "John Doe")); +``` + +## Running the Sample + +1. Ensure you have the Durable Task sidecar running (if using gRPC mode) +2. Run the sample: + ```bash + dotnet run + ``` + +The sample will: +1. Start an approval workflow and wait for an approval event +2. Raise an approval event from the client +3. Complete the workflow with the approval result +4. Start a data processing workflow and demonstrate another event type + +## Benefits + +- **Type Safety**: Compile-time checking of event payloads +- **IntelliSense**: Better IDE support for discovering available event methods +- **Less Boilerplate**: No need to manually call `WaitForExternalEvent` with string literals +- **Refactoring Support**: Renaming event types automatically updates generated code diff --git a/samples/EventsSample/Tasks.cs b/samples/EventsSample/Tasks.cs new file mode 100644 index 00000000..5eec54cd --- /dev/null +++ b/samples/EventsSample/Tasks.cs @@ -0,0 +1,77 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.DurableTask; + +namespace EventsSample; + +/// +/// Orchestrator that demonstrates strongly-typed external events. +/// +[DurableTask("ApprovalOrchestrator")] +public class ApprovalOrchestrator : TaskOrchestrator +{ + public override async Task RunAsync(TaskOrchestrationContext context, string requestName) + { + // Send a notification requesting approval + await context.CallNotifyApprovalRequiredAsync(requestName); + + // Wait for approval event using the generated strongly-typed method + // Note: WaitForApprovalEventAsync is generated by the source generator + ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync(); + + if (approvalEvent.Approved) + { + return $"Request '{requestName}' was approved by {approvalEvent.Approver ?? "unknown"}"; + } + else + { + return $"Request '{requestName}' was rejected by {approvalEvent.Approver ?? "unknown"}"; + } + } +} + +/// +/// Activity that simulates sending an approval notification. +/// +[DurableTask("NotifyApprovalRequired")] +public class NotifyApprovalRequiredActivity : TaskActivity +{ + public override Task RunAsync(TaskActivityContext context, string requestName) + { + Console.WriteLine($"[{DateTime.UtcNow:HH:mm:ss}] Approval required for: {requestName}"); + Console.WriteLine($" Instance ID: {context.InstanceId}"); + return Task.FromResult("Notification sent"); + } +} + +/// +/// Orchestrator that demonstrates waiting for multiple event types. +/// +[DurableTask("DataProcessingOrchestrator")] +public class DataProcessingOrchestrator : TaskOrchestrator +{ + public override async Task RunAsync(TaskOrchestrationContext context, string input) + { + // Wait for data using the generated strongly-typed method + DataReceivedEvent dataEvent = await context.WaitForDataReceivedAsync(); + + // Process the data + string result = await context.CallProcessDataAsync(dataEvent.Data); + + return $"Processed data {dataEvent.Id}: {result}"; + } +} + +/// +/// Activity that processes data. +/// +[DurableTask("ProcessData")] +public class ProcessDataActivity : TaskActivity +{ + public override Task RunAsync(TaskActivityContext context, string data) + { + Console.WriteLine($"[{DateTime.UtcNow:HH:mm:ss}] Processing data: {data}"); + return Task.FromResult($"Processed: {data.ToUpper()}"); + } +} From fd94810415e0201c545579dbb6a408d1ca146333 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Dec 2025 19:00:41 +0000 Subject: [PATCH 04/14] Fix null safety in event name extraction Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com> --- src/Generators/DurableTaskSourceGenerator.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index 9a6818c9..144a5407 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -203,7 +203,11 @@ public void Initialize(IncrementalGeneratorInitializationContext context) if (attribute.ArgumentList?.Arguments.Count > 0) { ExpressionSyntax expression = attribute.ArgumentList.Arguments[0].Expression; - eventName = context.SemanticModel.GetConstantValue(expression).ToString(); + Optional constantValue = context.SemanticModel.GetConstantValue(expression); + if (constantValue.HasValue && constantValue.Value is string value) + { + eventName = value; + } } return new DurableEventTypeInfo(typeName, eventName, eventType); From 5233ff4245d41b365cebf27f413ed867db18116e Mon Sep 17 00:00:00 2001 From: wangbill Date: Tue, 16 Dec 2025 15:39:07 -0800 Subject: [PATCH 05/14] Potential fix for pull request finding 'Missed ternary opportunity' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> --- samples/EventsSample/Tasks.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/samples/EventsSample/Tasks.cs b/samples/EventsSample/Tasks.cs index 5eec54cd..4f8756fb 100644 --- a/samples/EventsSample/Tasks.cs +++ b/samples/EventsSample/Tasks.cs @@ -20,14 +20,7 @@ public override async Task RunAsync(TaskOrchestrationContext context, st // Note: WaitForApprovalEventAsync is generated by the source generator ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync(); - if (approvalEvent.Approved) - { - return $"Request '{requestName}' was approved by {approvalEvent.Approver ?? "unknown"}"; - } - else - { - return $"Request '{requestName}' was rejected by {approvalEvent.Approver ?? "unknown"}"; - } + return $"Request '{requestName}' was {(approvalEvent.Approved ? "approved" : "rejected")} by {approvalEvent.Approver ?? "unknown"}"; } } From 8a12d09cdd5bd6cbf0fa853a89524dbfbf93b4fa Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:13:29 -0800 Subject: [PATCH 06/14] remove sln file change --- Microsoft.DurableTask.sln | 372 ++------------------------------------ 1 file changed, 17 insertions(+), 355 deletions(-) diff --git a/Microsoft.DurableTask.sln b/Microsoft.DurableTask.sln index b13a8fbe..837a0ba0 100644 --- a/Microsoft.DurableTask.sln +++ b/Microsoft.DurableTask.sln @@ -93,520 +93,184 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScheduledTasks.Tests", "tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LargePayloadConsoleApp", "samples\LargePayloadConsoleApp\LargePayloadConsoleApp.csproj", "{6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExceptionPropertiesSample", "samples\ExceptionPropertiesSample\ExceptionPropertiesSample.csproj", "{7C3ECBCE-BEFB-4982-842E-B654BB6B6285}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureBlobPayloads", "src\Extensions\AzureBlobPayloads\AzureBlobPayloads.csproj", "{FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost", "src\InProcessTestHost\InProcessTestHost.csproj", "{5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost.Tests", "test\InProcessTestHost.Tests\InProcessTestHost.Tests.csproj", "{B894780C-338F-475E-8E84-56AFA8197A06}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventsSample", "samples\EventsSample\EventsSample.csproj", "{36C314FB-20F9-46B4-BC3F-08BA3096908E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{51A52603-541D-DE3F-2825-C80F9EE6C532}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{3B8F957E-7773-4C0C-ACD7-91A1591D9312}" -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 {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x64.ActiveCfg = Debug|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x64.Build.0 = Debug|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x86.ActiveCfg = Debug|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x86.Build.0 = Debug|Any CPU {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|Any CPU.Build.0 = Release|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x64.ActiveCfg = Release|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x64.Build.0 = Release|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x86.ActiveCfg = Release|Any CPU - {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x86.Build.0 = Release|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x64.ActiveCfg = Debug|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x64.Build.0 = Debug|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x86.ActiveCfg = Debug|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x86.Build.0 = Debug|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|Any CPU.Build.0 = Release|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x64.ActiveCfg = Release|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x64.Build.0 = Release|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x86.ActiveCfg = Release|Any CPU - {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x86.Build.0 = Release|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x64.ActiveCfg = Debug|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x64.Build.0 = Debug|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x86.ActiveCfg = Debug|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x86.Build.0 = Debug|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|Any CPU.ActiveCfg = Release|Any CPU {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|Any CPU.Build.0 = Release|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x64.ActiveCfg = Release|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x64.Build.0 = Release|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x86.ActiveCfg = Release|Any CPU - {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x86.Build.0 = Release|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x64.ActiveCfg = Debug|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x64.Build.0 = Debug|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x86.ActiveCfg = Debug|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x86.Build.0 = Debug|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|Any CPU.ActiveCfg = Release|Any CPU {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|Any CPU.Build.0 = Release|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x64.ActiveCfg = Release|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x64.Build.0 = Release|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x86.ActiveCfg = Release|Any CPU - {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x86.Build.0 = Release|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x64.ActiveCfg = Debug|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x64.Build.0 = Debug|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x86.ActiveCfg = Debug|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x86.Build.0 = Debug|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|Any CPU.ActiveCfg = Release|Any CPU {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|Any CPU.Build.0 = Release|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x64.ActiveCfg = Release|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x64.Build.0 = Release|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x86.ActiveCfg = Release|Any CPU - {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x86.Build.0 = Release|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x64.ActiveCfg = Debug|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x64.Build.0 = Debug|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x86.ActiveCfg = Debug|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x86.Build.0 = Debug|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|Any CPU.ActiveCfg = Release|Any CPU {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|Any CPU.Build.0 = Release|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x64.ActiveCfg = Release|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x64.Build.0 = Release|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x86.ActiveCfg = Release|Any CPU - {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x86.Build.0 = Release|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x64.ActiveCfg = Debug|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x64.Build.0 = Debug|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x86.ActiveCfg = Debug|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x86.Build.0 = Debug|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|Any CPU.Build.0 = Release|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x64.ActiveCfg = Release|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x64.Build.0 = Release|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x86.ActiveCfg = Release|Any CPU - {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x86.Build.0 = Release|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x64.ActiveCfg = Debug|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x64.Build.0 = Debug|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x86.ActiveCfg = Debug|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x86.Build.0 = Debug|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|Any CPU.ActiveCfg = Release|Any CPU {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|Any CPU.Build.0 = Release|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x64.ActiveCfg = Release|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x64.Build.0 = Release|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x86.ActiveCfg = Release|Any CPU - {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x86.Build.0 = Release|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x64.ActiveCfg = Debug|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x64.Build.0 = Debug|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x86.ActiveCfg = Debug|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x86.Build.0 = Debug|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|Any CPU.ActiveCfg = Release|Any CPU {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|Any CPU.Build.0 = Release|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x64.ActiveCfg = Release|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x64.Build.0 = Release|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x86.ActiveCfg = Release|Any CPU - {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x86.Build.0 = Release|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x64.ActiveCfg = Debug|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x64.Build.0 = Debug|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x86.ActiveCfg = Debug|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x86.Build.0 = Debug|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|Any CPU.ActiveCfg = Release|Any CPU {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|Any CPU.Build.0 = Release|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x64.ActiveCfg = Release|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x64.Build.0 = Release|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x86.ActiveCfg = Release|Any CPU - {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x86.Build.0 = Release|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x64.ActiveCfg = Debug|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x64.Build.0 = Debug|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x86.ActiveCfg = Debug|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x86.Build.0 = Debug|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|Any CPU.ActiveCfg = Release|Any CPU {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|Any CPU.Build.0 = Release|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x64.ActiveCfg = Release|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x64.Build.0 = Release|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x86.ActiveCfg = Release|Any CPU - {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x86.Build.0 = Release|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x64.ActiveCfg = Debug|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x64.Build.0 = Debug|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x86.ActiveCfg = Debug|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x86.Build.0 = Debug|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|Any CPU.ActiveCfg = Release|Any CPU {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|Any CPU.Build.0 = Release|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x64.ActiveCfg = Release|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x64.Build.0 = Release|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x86.ActiveCfg = Release|Any CPU - {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x86.Build.0 = Release|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x64.ActiveCfg = Debug|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x64.Build.0 = Debug|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x86.ActiveCfg = Debug|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x86.Build.0 = Debug|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|Any CPU.Build.0 = Release|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x64.ActiveCfg = Release|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x64.Build.0 = Release|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x86.ActiveCfg = Release|Any CPU - {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x86.Build.0 = Release|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x64.ActiveCfg = Debug|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x64.Build.0 = Debug|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x86.ActiveCfg = Debug|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x86.Build.0 = Debug|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|Any CPU.ActiveCfg = Release|Any CPU {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|Any CPU.Build.0 = Release|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x64.ActiveCfg = Release|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x64.Build.0 = Release|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x86.ActiveCfg = Release|Any CPU - {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x86.Build.0 = Release|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x64.ActiveCfg = Debug|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x64.Build.0 = Debug|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x86.ActiveCfg = Debug|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x86.Build.0 = Debug|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|Any CPU.Build.0 = Release|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x64.ActiveCfg = Release|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x64.Build.0 = Release|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x86.ActiveCfg = Release|Any CPU - {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x86.Build.0 = Release|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x64.ActiveCfg = Debug|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x64.Build.0 = Debug|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x86.ActiveCfg = Debug|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x86.Build.0 = Debug|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|Any CPU.Build.0 = Release|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x64.ActiveCfg = Release|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x64.Build.0 = Release|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x86.ActiveCfg = Release|Any CPU - {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x86.Build.0 = Release|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x64.ActiveCfg = Debug|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x64.Build.0 = Debug|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x86.ActiveCfg = Debug|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x86.Build.0 = Debug|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|Any CPU.Build.0 = Release|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x64.ActiveCfg = Release|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x64.Build.0 = Release|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x86.ActiveCfg = Release|Any CPU - {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x86.Build.0 = Release|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x64.ActiveCfg = Debug|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x64.Build.0 = Debug|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x86.ActiveCfg = Debug|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x86.Build.0 = Debug|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|Any CPU.ActiveCfg = Release|Any CPU {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|Any CPU.Build.0 = Release|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x64.ActiveCfg = Release|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x64.Build.0 = Release|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x86.ActiveCfg = Release|Any CPU - {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x86.Build.0 = Release|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x64.Build.0 = Debug|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x86.Build.0 = Debug|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|Any CPU.Build.0 = Release|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x64.ActiveCfg = Release|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x64.Build.0 = Release|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x86.ActiveCfg = Release|Any CPU - {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x86.Build.0 = Release|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|Any CPU.Build.0 = Debug|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x64.ActiveCfg = Debug|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x64.Build.0 = Debug|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x86.ActiveCfg = Debug|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x86.Build.0 = Debug|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|Any CPU.ActiveCfg = Release|Any CPU {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|Any CPU.Build.0 = Release|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x64.ActiveCfg = Release|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x64.Build.0 = Release|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x86.ActiveCfg = Release|Any CPU - {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x86.Build.0 = Release|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x64.ActiveCfg = Debug|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x64.Build.0 = Debug|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x86.ActiveCfg = Debug|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x86.Build.0 = Debug|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|Any CPU.ActiveCfg = Release|Any CPU {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|Any CPU.Build.0 = Release|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x64.ActiveCfg = Release|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x64.Build.0 = Release|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x86.ActiveCfg = Release|Any CPU - {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x86.Build.0 = Release|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|Any CPU.Build.0 = Debug|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x64.ActiveCfg = Debug|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x64.Build.0 = Debug|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x86.ActiveCfg = Debug|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x86.Build.0 = Debug|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|Any CPU.ActiveCfg = Release|Any CPU {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|Any CPU.Build.0 = Release|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x64.ActiveCfg = Release|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x64.Build.0 = Release|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x86.ActiveCfg = Release|Any CPU - {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x86.Build.0 = Release|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x64.ActiveCfg = Debug|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x64.Build.0 = Debug|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x86.Build.0 = Debug|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|Any CPU.Build.0 = Release|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x64.ActiveCfg = Release|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x64.Build.0 = Release|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x86.ActiveCfg = Release|Any CPU - {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x86.Build.0 = Release|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|Any CPU.Build.0 = Debug|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x64.ActiveCfg = Debug|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x64.Build.0 = Debug|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x86.ActiveCfg = Debug|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x86.Build.0 = Debug|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|Any CPU.ActiveCfg = Release|Any CPU {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|Any CPU.Build.0 = Release|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x64.ActiveCfg = Release|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x64.Build.0 = Release|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x86.ActiveCfg = Release|Any CPU - {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x86.Build.0 = Release|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|Any CPU.Build.0 = Debug|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x64.ActiveCfg = Debug|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x64.Build.0 = Debug|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x86.ActiveCfg = Debug|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x86.Build.0 = Debug|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|Any CPU.ActiveCfg = Release|Any CPU {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|Any CPU.Build.0 = Release|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x64.ActiveCfg = Release|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x64.Build.0 = Release|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x86.ActiveCfg = Release|Any CPU - {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x86.Build.0 = Release|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x64.ActiveCfg = Debug|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x64.Build.0 = Debug|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x86.ActiveCfg = Debug|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x86.Build.0 = Debug|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|Any CPU.Build.0 = Release|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x64.ActiveCfg = Release|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x64.Build.0 = Release|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x86.ActiveCfg = Release|Any CPU - {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x86.Build.0 = Release|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x64.ActiveCfg = Debug|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x64.Build.0 = Debug|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x86.ActiveCfg = Debug|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x86.Build.0 = Debug|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|Any CPU.Build.0 = Release|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x64.ActiveCfg = Release|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x64.Build.0 = Release|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x86.ActiveCfg = Release|Any CPU - {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x86.Build.0 = Release|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x64.ActiveCfg = Debug|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x64.Build.0 = Debug|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x86.ActiveCfg = Debug|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x86.Build.0 = Debug|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|Any CPU.ActiveCfg = Release|Any CPU {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|Any CPU.Build.0 = Release|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x64.ActiveCfg = Release|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x64.Build.0 = Release|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x86.ActiveCfg = Release|Any CPU - {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x86.Build.0 = Release|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x64.ActiveCfg = Debug|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x64.Build.0 = Debug|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x86.ActiveCfg = Debug|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x86.Build.0 = Debug|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|Any CPU.ActiveCfg = Release|Any CPU {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|Any CPU.Build.0 = Release|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x64.ActiveCfg = Release|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x64.Build.0 = Release|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x86.ActiveCfg = Release|Any CPU - {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x86.Build.0 = Release|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x64.Build.0 = Debug|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x86.Build.0 = Debug|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|Any CPU.Build.0 = Release|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x64.ActiveCfg = Release|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x64.Build.0 = Release|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x86.ActiveCfg = Release|Any CPU - {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x86.Build.0 = Release|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x64.ActiveCfg = Debug|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x64.Build.0 = Debug|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x86.ActiveCfg = Debug|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x86.Build.0 = Debug|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|Any CPU.ActiveCfg = Release|Any CPU {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|Any CPU.Build.0 = Release|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x64.ActiveCfg = Release|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x64.Build.0 = Release|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x86.ActiveCfg = Release|Any CPU - {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x86.Build.0 = Release|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x64.ActiveCfg = Debug|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x64.Build.0 = Debug|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x86.ActiveCfg = Debug|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x86.Build.0 = Debug|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|Any CPU.ActiveCfg = Release|Any CPU {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|Any CPU.Build.0 = Release|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x64.ActiveCfg = Release|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x64.Build.0 = Release|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x86.ActiveCfg = Release|Any CPU - {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x86.Build.0 = Release|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Debug|Any CPU.Build.0 = Debug|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x64.ActiveCfg = Debug|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x64.Build.0 = Debug|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x86.ActiveCfg = Debug|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x86.Build.0 = Debug|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Release|Any CPU.ActiveCfg = Release|Any CPU {69ED743C-D616-4530-87E2-391D249D7368}.Release|Any CPU.Build.0 = Release|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Release|x64.ActiveCfg = Release|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Release|x64.Build.0 = Release|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Release|x86.ActiveCfg = Release|Any CPU - {69ED743C-D616-4530-87E2-391D249D7368}.Release|x86.Build.0 = Release|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x64.ActiveCfg = Debug|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x64.Build.0 = Debug|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x86.ActiveCfg = Debug|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x86.Build.0 = Debug|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|Any CPU.Build.0 = Release|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x64.ActiveCfg = Release|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x64.Build.0 = Release|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x86.ActiveCfg = Release|Any CPU - {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x86.Build.0 = Release|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x64.ActiveCfg = Debug|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x64.Build.0 = Debug|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x86.ActiveCfg = Debug|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x86.Build.0 = Debug|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|Any CPU.Build.0 = Release|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x64.ActiveCfg = Release|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x64.Build.0 = Release|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x86.ActiveCfg = Release|Any CPU - {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x86.Build.0 = Release|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x64.ActiveCfg = Debug|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x64.Build.0 = Debug|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x86.ActiveCfg = Debug|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x86.Build.0 = Debug|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.Build.0 = Release|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x64.ActiveCfg = Release|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x64.Build.0 = Release|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x86.ActiveCfg = Release|Any CPU - {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x86.Build.0 = Release|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x64.ActiveCfg = Debug|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x64.Build.0 = Debug|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x86.ActiveCfg = Debug|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x86.Build.0 = Debug|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.Build.0 = Release|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x64.ActiveCfg = Release|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x64.Build.0 = Release|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x86.ActiveCfg = Release|Any CPU - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x86.Build.0 = Release|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x64.ActiveCfg = Debug|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x64.Build.0 = Debug|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x86.ActiveCfg = Debug|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x86.Build.0 = Debug|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.Build.0 = Release|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x64.ActiveCfg = Release|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x64.Build.0 = Release|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x86.ActiveCfg = Release|Any CPU - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x86.Build.0 = Release|Any CPU {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x64.ActiveCfg = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x64.Build.0 = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x86.ActiveCfg = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x86.Build.0 = Debug|Any CPU {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.Build.0 = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x64.ActiveCfg = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x64.Build.0 = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x86.ActiveCfg = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x86.Build.0 = Release|Any CPU {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x64.ActiveCfg = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x64.Build.0 = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x86.ActiveCfg = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x86.Build.0 = Debug|Any CPU {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.ActiveCfg = Release|Any CPU {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.Build.0 = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x64.ActiveCfg = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x64.Build.0 = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x86.ActiveCfg = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x86.Build.0 = Release|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x64.ActiveCfg = Debug|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x64.Build.0 = Debug|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x86.ActiveCfg = Debug|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x86.Build.0 = Debug|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|Any CPU.Build.0 = Release|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x64.ActiveCfg = Release|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x64.Build.0 = Release|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x86.ActiveCfg = Release|Any CPU - {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x86.Build.0 = Release|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.Build.0 = Release|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285}.Release|Any CPU.Build.0 = Release|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -652,13 +316,11 @@ Global {A89B766C-987F-4C9F-8937-D0AB9FE640C8} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {100348B5-4D97-4A3F-B777-AB14F276F8FE} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {D2779F32-A548-44F8-B60A-6AC018966C79} = {E5637F81-2FB9-4CD7-900D-455363B142A7} - {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} - {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7} - {36C314FB-20F9-46B4-BC3F-08BA3096908E} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} - {51A52603-541D-DE3F-2825-C80F9EE6C532} = {1C217BB2-CE16-41CC-9D47-0FC0DB60BDB3} - {3B8F957E-7773-4C0C-ACD7-91A1591D9312} = {5B448FF6-EC42-491D-A22E-1DC8B618E6D5} + {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} + {7C3ECBCE-BEFB-4982-842E-B654BB6B6285} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} + {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AB41CB55-35EA-4986-A522-387AB3402E71} From 5f6823a07bbfec49b5627d9617ce48c7d8a8961e Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Wed, 17 Dec 2025 14:18:36 -0800 Subject: [PATCH 07/14] update sln --- Microsoft.DurableTask.sln | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Microsoft.DurableTask.sln b/Microsoft.DurableTask.sln index 837a0ba0..5a5d79b1 100644 --- a/Microsoft.DurableTask.sln +++ b/Microsoft.DurableTask.sln @@ -101,6 +101,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost", "src\In EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost.Tests", "test\InProcessTestHost.Tests\InProcessTestHost.Tests.csproj", "{B894780C-338F-475E-8E84-56AFA8197A06}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventsSample", "samples\EventsSample\EventsSample.csproj", "{34A3EC44-2609-A058-ED30-2F81C3F3A885}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -251,14 +253,6 @@ Global {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|Any CPU.Build.0 = Debug|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.Build.0 = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.Build.0 = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.Build.0 = Release|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -271,6 +265,18 @@ Global {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.Build.0 = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.Build.0 = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.Build.0 = Release|Any CPU + {34A3EC44-2609-A058-ED30-2F81C3F3A885}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34A3EC44-2609-A058-ED30-2F81C3F3A885}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34A3EC44-2609-A058-ED30-2F81C3F3A885}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34A3EC44-2609-A058-ED30-2F81C3F3A885}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -316,11 +322,12 @@ Global {A89B766C-987F-4C9F-8937-D0AB9FE640C8} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {100348B5-4D97-4A3F-B777-AB14F276F8FE} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {D2779F32-A548-44F8-B60A-6AC018966C79} = {E5637F81-2FB9-4CD7-900D-455363B142A7} - {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} - {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7} {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {7C3ECBCE-BEFB-4982-842E-B654BB6B6285} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} + {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B} + {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7} + {34A3EC44-2609-A058-ED30-2F81C3F3A885} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AB41CB55-35EA-4986-A522-387AB3402E71} From 56c0e32ac4fa7c4ac9ca84a86087b28595cad520 Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:57:07 -0800 Subject: [PATCH 08/14] use dts --- samples/EventsSample/EventsSample.csproj | 4 ++-- samples/EventsSample/Program.cs | 20 +++++++++++++++----- samples/EventsSample/README.md | 13 +++++++++---- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/samples/EventsSample/EventsSample.csproj b/samples/EventsSample/EventsSample.csproj index 9c8cf843..7df90c5a 100644 --- a/samples/EventsSample/EventsSample.csproj +++ b/samples/EventsSample/EventsSample.csproj @@ -12,8 +12,8 @@ - - + + +string schedulerConnectionString = builder.Configuration.GetValue("DURABLE_TASK_SCHEDULER_CONNECTION_STRING") + ?? throw new InvalidOperationException("DURABLE_TASK_SCHEDULER_CONNECTION_STRING is not set."); + +builder.Services.AddDurableTaskClient(clientBuilder => clientBuilder.UseDurableTaskScheduler(schedulerConnectionString)); + +builder.Services.AddDurableTaskWorker(workerBuilder => +{ + workerBuilder.AddTasks(tasks => { tasks.AddOrchestrator(); tasks.AddActivity(); tasks.AddOrchestrator(); tasks.AddActivity(); - }) - .UseGrpc(); + }); + + workerBuilder.UseDurableTaskScheduler(schedulerConnectionString); +}); IHost host = builder.Build(); await host.StartAsync(); diff --git a/samples/EventsSample/README.md b/samples/EventsSample/README.md index caa05f7f..a90a3c13 100644 --- a/samples/EventsSample/README.md +++ b/samples/EventsSample/README.md @@ -63,11 +63,16 @@ await client.RaiseEventAsync( ## Running the Sample -1. Ensure you have the Durable Task sidecar running (if using gRPC mode) +This sample is configured to use **Durable Task Scheduler (DTS)** (no local gRPC sidecar required). + +1. Set the DTS connection string: + ```bash + export DURABLE_TASK_SCHEDULER_CONNECTION_STRING="..." + ``` 2. Run the sample: - ```bash - dotnet run - ``` + ```bash + dotnet run + ``` The sample will: 1. Start an approval workflow and wait for an approval event From 810c98ffac6e4889f2ad09d57d2a407f8fdc1bbe Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Thu, 18 Dec 2025 02:16:49 -0800 Subject: [PATCH 09/14] cleanup --- src/Generators/DurableTaskSourceGenerator.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index 144a5407..667bccf9 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -197,7 +197,6 @@ public void Initialize(IncrementalGeneratorInitializationContext context) return null; } - string typeName = eventType.ToDisplayString(); string eventName = eventType.Name; if (attribute.ArgumentList?.Arguments.Count > 0) @@ -210,7 +209,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context) } } - return new DurableEventTypeInfo(typeName, eventName, eventType); + return new DurableEventTypeInfo(eventName, eventType); } static DurableFunction? GetDurableFunction(GeneratorSyntaxContext context) @@ -359,15 +358,11 @@ public static class GeneratedDurableTaskExtensions else { // ASP.NET Core-specific service registration methods - // Only generate if there are actually tasks to register - if (orchestrators.Count > 0 || activities.Count > 0 || entities.Count > 0) - { - AddRegistrationMethodForAllTasks( - sourceBuilder, - orchestrators, - activities, - entities); - } + AddRegistrationMethodForAllTasks( + sourceBuilder, + orchestrators, + activities, + entities); } sourceBuilder.AppendLine(" }").AppendLine("}"); @@ -613,7 +608,7 @@ static string GetRenderedTypeExpression(ITypeSymbol? symbol) class DurableEventTypeInfo { - public DurableEventTypeInfo(string typeName, string eventName, ITypeSymbol eventType) + public DurableEventTypeInfo(string eventName, ITypeSymbol eventType) { this.TypeName = GetRenderedTypeExpression(eventType); this.EventName = eventName; From b495a879825bde792226180ab1caacfce31af042 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 10:30:41 +0000 Subject: [PATCH 10/14] Add strongly-typed events to AzureFunctionsApp sample - Added ApprovalOrchestrator.cs demonstrating DurableEventAttribute usage in Azure Functions - Includes ApprovalEvent record with [DurableEvent] attribute - ApprovalOrchestrator shows waiting for events with generated WaitForApprovalEventAsync - Added HTTP triggers to start orchestration and send approval events - Added NotifyApprovalRequired activity - Included APPROVAL_README.md with usage documentation - Added Abstractions project reference to access DurableEventAttribute - Fixed generator to not emit AddAllGeneratedTasks when only events are present - All 41 generator tests passing Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com> --- samples/AzureFunctionsApp/APPROVAL_README.md | 86 +++++++++++++ .../AzureFunctionsApp/ApprovalOrchestrator.cs | 121 ++++++++++++++++++ .../AzureFunctionsApp.csproj | 2 + src/Generators/DurableTaskSourceGenerator.cs | 14 +- 4 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 samples/AzureFunctionsApp/APPROVAL_README.md create mode 100644 samples/AzureFunctionsApp/ApprovalOrchestrator.cs diff --git a/samples/AzureFunctionsApp/APPROVAL_README.md b/samples/AzureFunctionsApp/APPROVAL_README.md new file mode 100644 index 00000000..33f6e0e8 --- /dev/null +++ b/samples/AzureFunctionsApp/APPROVAL_README.md @@ -0,0 +1,86 @@ +# Approval Orchestrator Sample + +This sample demonstrates the use of strongly-typed external events with Azure Functions using the `DurableEventAttribute`. + +## Overview + +The Approval Orchestrator showcases how to: +1. Define an event type with `[DurableEvent]` attribute +2. Use the generated strongly-typed `WaitFor{EventName}Async` method +3. Raise events from HTTP triggers + +## Files + +- **ApprovalOrchestrator.cs**: Contains the orchestrator, activity, and event definitions + +## Event Definition + +```csharp +[DurableEvent(nameof(ApprovalEvent))] +public sealed record ApprovalEvent(bool Approved, string? Approver); +``` + +The source generator automatically creates: +```csharp +public static Task WaitForApprovalEventAsync( + this TaskOrchestrationContext context, + CancellationToken cancellationToken = default) +``` + +## Usage in Orchestrator + +```csharp +[DurableTask(nameof(ApprovalOrchestrator))] +public class ApprovalOrchestrator : TaskOrchestrator +{ + public override async Task RunAsync(TaskOrchestrationContext context, string requestName) + { + // Send notification + await context.CallNotifyApprovalRequiredAsync(requestName); + + // Wait for approval using strongly-typed method + ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync(); + + if (approvalEvent.Approved) + { + return $"Request '{requestName}' was approved by {approvalEvent.Approver}"; + } + else + { + return $"Request '{requestName}' was rejected by {approvalEvent.Approver}"; + } + } +} +``` + +## Testing the Sample + +1. Start the orchestration: + ```bash + curl -X POST http://localhost:7071/api/StartApprovalOrchestrator \ + -H "Content-Type: text/plain" \ + -d "My Important Request" + ``` + +2. Send an approval event: + ```bash + curl -X POST "http://localhost:7071/api/approval/{instanceId}?approve=true" \ + -H "Content-Type: text/plain" \ + -d "John Doe" + ``` + + Or reject: + ```bash + curl -X POST "http://localhost:7071/api/approval/{instanceId}?approve=false" \ + -H "Content-Type: text/plain" \ + -d "Jane Smith" + ``` + +3. Check the orchestration status using the links returned from the start request. + +## Benefits + +- **Type Safety**: Compile-time checking of event payloads +- **IntelliSense**: IDE support for discovering available event methods +- **Less Boilerplate**: No need for string literals and explicit generic types +- **Refactoring Support**: Renaming event types updates generated code automatically diff --git a/samples/AzureFunctionsApp/ApprovalOrchestrator.cs b/samples/AzureFunctionsApp/ApprovalOrchestrator.cs new file mode 100644 index 00000000..9ecf059a --- /dev/null +++ b/samples/AzureFunctionsApp/ApprovalOrchestrator.cs @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.Azure.Functions.Worker; +using Microsoft.Azure.Functions.Worker.Http; +using Microsoft.DurableTask; +using Microsoft.DurableTask.Client; +using Microsoft.Extensions.Logging; + +namespace AzureFunctionsApp.Approval; + +/// +/// HTTP-triggered function that starts the orchestration. +/// +public static class ApprovalOrchestratorStarter +{ + [Function(nameof(StartApprovalOrchestrator))] + public static async Task StartApprovalOrchestrator( + [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req, + [DurableClient] DurableTaskClient client, + FunctionContext executionContext) + { + ILogger logger = executionContext.GetLogger(nameof(StartApprovalOrchestrator)); + + string? requestName = await req.ReadAsStringAsync(); + if (string.IsNullOrEmpty(requestName)) + { + requestName = "Sample Request"; + } + + // Use the generated type-safe extension method to start the orchestration + string instanceId = await client.ScheduleNewApprovalOrchestratorInstanceAsync(requestName); + logger.LogInformation("Started approval orchestration with instance ID = {instanceId}", instanceId); + + return client.CreateCheckStatusResponse(req, instanceId); + } + + [Function(nameof(SendApprovalEvent))] + public static async Task SendApprovalEvent( + [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "approval/{instanceId}")] HttpRequestData req, + [DurableClient] DurableTaskClient client, + string instanceId, + FunctionContext executionContext) + { + ILogger logger = executionContext.GetLogger(nameof(SendApprovalEvent)); + + string? approverName = await req.ReadAsStringAsync(); + bool isApproved = req.Url.Query.Contains("approve=true"); + + // Raise the ApprovalEvent + await client.RaiseEventAsync(instanceId, "ApprovalEvent", new ApprovalEvent(isApproved, approverName)); + logger.LogInformation("Sent approval event to instance {instanceId}: approved={isApproved}, approver={approverName}", + instanceId, isApproved, approverName); + + var response = req.CreateResponse(System.Net.HttpStatusCode.Accepted); + await response.WriteStringAsync($"Approval event sent to instance {instanceId}"); + return response; + } +} + +/// +/// Example event type for approval workflows. +/// The DurableEventAttribute generates a strongly-typed WaitForApprovalEventAsync method. +/// +[DurableEvent(nameof(ApprovalEvent))] +public sealed record ApprovalEvent(bool Approved, string? Approver); + +/// +/// Orchestrator that demonstrates strongly-typed external events. +/// +[DurableTask(nameof(ApprovalOrchestrator))] +public class ApprovalOrchestrator : TaskOrchestrator +{ + public override async Task RunAsync(TaskOrchestrationContext context, string requestName) + { + ILogger logger = context.CreateReplaySafeLogger(); + logger.LogInformation("Approval request received for: {requestName}", requestName); + + // Send a notification that approval is required + await context.CallNotifyApprovalRequiredAsync(requestName); + + // Wait for approval event using the generated strongly-typed method + // This method is generated by the source generator from the DurableEventAttribute + ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync(); + + string result; + if (approvalEvent.Approved) + { + result = $"Request '{requestName}' was approved by {approvalEvent.Approver ?? "unknown"}"; + logger.LogInformation("Request approved: {result}", result); + } + else + { + result = $"Request '{requestName}' was rejected by {approvalEvent.Approver ?? "unknown"}"; + logger.LogInformation("Request rejected: {result}", result); + } + + return result; + } +} + +/// +/// Activity that simulates sending an approval notification. +/// +[DurableTask(nameof(NotifyApprovalRequired))] +public class NotifyApprovalRequired : TaskActivity +{ + readonly ILogger logger; + + public NotifyApprovalRequired(ILogger logger) + { + this.logger = logger; + } + + public override Task RunAsync(TaskActivityContext context, string requestName) + { + this.logger.LogInformation("Approval required for: {requestName} (Instance: {instanceId})", + requestName, context.InstanceId); + return Task.FromResult("Notification sent"); + } +} diff --git a/samples/AzureFunctionsApp/AzureFunctionsApp.csproj b/samples/AzureFunctionsApp/AzureFunctionsApp.csproj index ad64c303..25d824fa 100644 --- a/samples/AzureFunctionsApp/AzureFunctionsApp.csproj +++ b/samples/AzureFunctionsApp/AzureFunctionsApp.csproj @@ -17,6 +17,8 @@ + + diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index 667bccf9..6ed7b06b 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -358,11 +358,15 @@ public static class GeneratedDurableTaskExtensions else { // ASP.NET Core-specific service registration methods - AddRegistrationMethodForAllTasks( - sourceBuilder, - orchestrators, - activities, - entities); + // Only generate if there are actually tasks to register + if (orchestrators.Count > 0 || activities.Count > 0 || entities.Count > 0) + { + AddRegistrationMethodForAllTasks( + sourceBuilder, + orchestrators, + activities, + entities); + } } sourceBuilder.AppendLine(" }").AppendLine("}"); From 6897ccea402c24b770034ca0db2089cc35f83d52 Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Thu, 18 Dec 2025 02:40:55 -0800 Subject: [PATCH 11/14] cleanuip --- samples/AzureFunctionsApp/APPROVAL_README.md | 86 -------------------- src/Generators/DurableTaskSourceGenerator.cs | 14 ++-- 2 files changed, 5 insertions(+), 95 deletions(-) delete mode 100644 samples/AzureFunctionsApp/APPROVAL_README.md diff --git a/samples/AzureFunctionsApp/APPROVAL_README.md b/samples/AzureFunctionsApp/APPROVAL_README.md deleted file mode 100644 index 33f6e0e8..00000000 --- a/samples/AzureFunctionsApp/APPROVAL_README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Approval Orchestrator Sample - -This sample demonstrates the use of strongly-typed external events with Azure Functions using the `DurableEventAttribute`. - -## Overview - -The Approval Orchestrator showcases how to: -1. Define an event type with `[DurableEvent]` attribute -2. Use the generated strongly-typed `WaitFor{EventName}Async` method -3. Raise events from HTTP triggers - -## Files - -- **ApprovalOrchestrator.cs**: Contains the orchestrator, activity, and event definitions - -## Event Definition - -```csharp -[DurableEvent(nameof(ApprovalEvent))] -public sealed record ApprovalEvent(bool Approved, string? Approver); -``` - -The source generator automatically creates: -```csharp -public static Task WaitForApprovalEventAsync( - this TaskOrchestrationContext context, - CancellationToken cancellationToken = default) -``` - -## Usage in Orchestrator - -```csharp -[DurableTask(nameof(ApprovalOrchestrator))] -public class ApprovalOrchestrator : TaskOrchestrator -{ - public override async Task RunAsync(TaskOrchestrationContext context, string requestName) - { - // Send notification - await context.CallNotifyApprovalRequiredAsync(requestName); - - // Wait for approval using strongly-typed method - ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync(); - - if (approvalEvent.Approved) - { - return $"Request '{requestName}' was approved by {approvalEvent.Approver}"; - } - else - { - return $"Request '{requestName}' was rejected by {approvalEvent.Approver}"; - } - } -} -``` - -## Testing the Sample - -1. Start the orchestration: - ```bash - curl -X POST http://localhost:7071/api/StartApprovalOrchestrator \ - -H "Content-Type: text/plain" \ - -d "My Important Request" - ``` - -2. Send an approval event: - ```bash - curl -X POST "http://localhost:7071/api/approval/{instanceId}?approve=true" \ - -H "Content-Type: text/plain" \ - -d "John Doe" - ``` - - Or reject: - ```bash - curl -X POST "http://localhost:7071/api/approval/{instanceId}?approve=false" \ - -H "Content-Type: text/plain" \ - -d "Jane Smith" - ``` - -3. Check the orchestration status using the links returned from the start request. - -## Benefits - -- **Type Safety**: Compile-time checking of event payloads -- **IntelliSense**: IDE support for discovering available event methods -- **Less Boilerplate**: No need for string literals and explicit generic types -- **Refactoring Support**: Renaming event types updates generated code automatically diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index 6ed7b06b..667bccf9 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -358,15 +358,11 @@ public static class GeneratedDurableTaskExtensions else { // ASP.NET Core-specific service registration methods - // Only generate if there are actually tasks to register - if (orchestrators.Count > 0 || activities.Count > 0 || entities.Count > 0) - { - AddRegistrationMethodForAllTasks( - sourceBuilder, - orchestrators, - activities, - entities); - } + AddRegistrationMethodForAllTasks( + sourceBuilder, + orchestrators, + activities, + entities); } sourceBuilder.AppendLine(" }").AppendLine("}"); From a35614227cef266cfee15f5c6a60d51df81517a3 Mon Sep 17 00:00:00 2001 From: peterstone2017 <12449837+YunchuWang@users.noreply.github.com> Date: Thu, 18 Dec 2025 09:18:04 -0800 Subject: [PATCH 12/14] only register if any tasks to register --- src/Generators/DurableTaskSourceGenerator.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index 667bccf9..9b0ca3ac 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -358,11 +358,15 @@ public static class GeneratedDurableTaskExtensions else { // ASP.NET Core-specific service registration methods - AddRegistrationMethodForAllTasks( - sourceBuilder, - orchestrators, - activities, - entities); + // Only generate if there are actually tasks to register + if (orchestrators.Count > 0 || activities.Count > 0 || entities.Count > 0) + { + AddRegistrationMethodForAllTasks( + sourceBuilder, + orchestrators, + activities, + entities); + } } sourceBuilder.AppendLine(" }").AppendLine("}"); From 6c4db99c4b3cd7fc814c9a2e476ee97c5050b4c2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 20:59:41 +0000 Subject: [PATCH 13/14] Add strongly-typed SendEvent methods for DurableEventAttribute - Added AddEventSendMethod to generate Send{EventName} extension methods - Generated methods provide type-safe way to send events between orchestrations - Updated all 3 event unit tests to verify SendEvent generation - All 41 generator tests passing - AzureFunctionsApp builds successfully with new methods Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com> --- src/Generators/DurableTaskSourceGenerator.cs | 14 ++++++++++ .../Generators.Tests/ClassBasedSyntaxTests.cs | 27 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index 9b0ca3ac..c4999375 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -344,6 +344,7 @@ public static class GeneratedDurableTaskExtensions foreach (DurableEventTypeInfo eventInfo in allEvents) { AddEventWaitMethod(sourceBuilder, eventInfo); + AddEventSendMethod(sourceBuilder, eventInfo); } if (isDurableFunctions) @@ -452,6 +453,19 @@ static void AddEventWaitMethod(StringBuilder sourceBuilder, DurableEventTypeInfo }}"); } + static void AddEventSendMethod(StringBuilder sourceBuilder, DurableEventTypeInfo eventInfo) + { + sourceBuilder.AppendLine($@" + /// + /// Sends an external event of type to another orchestration instance. + /// + /// + public static void Send{eventInfo.EventName}(this TaskOrchestrationContext context, string instanceId, {eventInfo.TypeName} eventData) + {{ + context.SendEvent(instanceId, ""{eventInfo.EventName}"", eventData); + }}"); + } + static void AddActivityFunctionDeclaration(StringBuilder sourceBuilder, DurableTaskTypeInfo activity) { // GeneratedActivityContext is a generated class that we use for each generated activity trigger definition. diff --git a/test/Generators.Tests/ClassBasedSyntaxTests.cs b/test/Generators.Tests/ClassBasedSyntaxTests.cs index f19b235b..638d5a26 100644 --- a/test/Generators.Tests/ClassBasedSyntaxTests.cs +++ b/test/Generators.Tests/ClassBasedSyntaxTests.cs @@ -533,6 +533,15 @@ public sealed record ApprovalEvent(bool Approved, string? Approver);"; public static Task WaitForApprovalEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default) { return context.WaitForExternalEvent(""ApprovalEvent"", cancellationToken); +} + +/// +/// Sends an external event of type to another orchestration instance. +/// +/// +public static void SendApprovalEvent(this TaskOrchestrationContext context, string instanceId, ApprovalEvent eventData) +{ + context.SendEvent(instanceId, ""ApprovalEvent"", eventData); }"); return TestHelpers.RunTestAsync( @@ -565,6 +574,15 @@ public class MyEventData public static Task WaitForCustomEventNameAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default) { return context.WaitForExternalEvent(""CustomEventName"", cancellationToken); +} + +/// +/// Sends an external event of type to another orchestration instance. +/// +/// +public static void SendCustomEventName(this TaskOrchestrationContext context, string instanceId, MyEventData eventData) +{ + context.SendEvent(instanceId, ""CustomEventName"", eventData); }"); return TestHelpers.RunTestAsync( @@ -598,6 +616,15 @@ public record DataReceivedEvent(int Id, string Data); public static Task WaitForDataReceivedEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default) { return context.WaitForExternalEvent(""DataReceivedEvent"", cancellationToken); +} + +/// +/// Sends an external event of type to another orchestration instance. +/// +/// +public static void SendDataReceivedEvent(this TaskOrchestrationContext context, string instanceId, MyNS.DataReceivedEvent eventData) +{ + context.SendEvent(instanceId, ""DataReceivedEvent"", eventData); }"); return TestHelpers.RunTestAsync( From fc99572dbf4ae2a67b99583a12b2da24e0bc49cc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 18 Dec 2025 22:57:33 +0000 Subject: [PATCH 14/14] Add explanatory comments for Roslyn tuple unpacking syntax - Added inline comments explaining the nested tuple structure from .Combine() - Clarified what each part of the unpacking represents (Compilation, Tasks, Events, Functions) - Improves code readability and maintainability for future developers Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com> --- src/Generators/DurableTaskSourceGenerator.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs index c4999375..0b4e717e 100644 --- a/src/Generators/DurableTaskSourceGenerator.cs +++ b/src/Generators/DurableTaskSourceGenerator.cs @@ -69,6 +69,12 @@ public void Initialize(IncrementalGeneratorInitializationContext context) .Combine(durableEventAttributes.Collect()) .Combine(durableFunctions.Collect()) .Combine(context.CompilationProvider) + // Roslyn's IncrementalValueProvider.Combine creates nested tuple pairs: ((Left, Right), Right) + // After multiple .Combine() calls, we unpack the nested structure: + // x.Right = Compilation + // x.Left.Left.Left = DurableTaskAttributes (orchestrators, activities, entities) + // x.Left.Left.Right = DurableEventAttributes (events) + // x.Left.Right = DurableFunctions (Azure Functions metadata) .Select((x, _) => (x.Right, x.Left.Left.Left, x.Left.Left.Right, x.Left.Right)); // Generate the source