diff --git a/src/AcceptanceTesting/AcceptanceTesting.csproj b/src/AcceptanceTesting/AcceptanceTesting.csproj index 74e9dc9..2a23923 100644 --- a/src/AcceptanceTesting/AcceptanceTesting.csproj +++ b/src/AcceptanceTesting/AcceptanceTesting.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/AcceptanceTesting/Infrastructure/EndpointTemplates/ConfigureExtensions.cs b/src/AcceptanceTesting/Infrastructure/EndpointTemplates/ConfigureExtensions.cs index b877925..b957db1 100644 --- a/src/AcceptanceTesting/Infrastructure/EndpointTemplates/ConfigureExtensions.cs +++ b/src/AcceptanceTesting/Infrastructure/EndpointTemplates/ConfigureExtensions.cs @@ -1,11 +1,37 @@ namespace NServiceBus.AcceptanceTests.EndpointTemplates { + using Configuration.AdvancedExtensibility; + using Transport; using System.Threading.Tasks; - using AcceptanceTesting.Support; - using ObjectBuilder; + using NServiceBus.AcceptanceTesting.Support; public static class ConfigureExtensions { + public static RoutingSettings ConfigureRouting(this EndpointConfiguration configuration) => + new RoutingSettings(configuration.GetSettings()); + + // This is kind of a hack because the acceptance testing framework doesn't give any access to the transport definition to individual tests. + public static TransportDefinition ConfigureTransport(this EndpointConfiguration configuration) => + configuration.GetSettings().Get(); + + public static TTransportDefinition ConfigureTransport( + this EndpointConfiguration configuration) + where TTransportDefinition : TransportDefinition => + (TTransportDefinition)configuration.GetSettings().Get(); + + public static async Task DefineTransport(this EndpointConfiguration config, RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointCustomizationConfiguration) + { + var transportConfiguration = TestSuiteConstraints.Current.CreateTransportConfiguration(); + await transportConfiguration.Configure(endpointCustomizationConfiguration.EndpointName, config, runDescriptor.Settings, endpointCustomizationConfiguration.PublisherMetadata); + runDescriptor.OnTestCompleted(_ => transportConfiguration.Cleanup()); + } + + public static async Task DefineTransport(this EndpointConfiguration config, IConfigureEndpointTestExecution transportConfiguration, RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointCustomizationConfiguration) + { + await transportConfiguration.Configure(endpointCustomizationConfiguration.EndpointName, config, runDescriptor.Settings, endpointCustomizationConfiguration.PublisherMetadata); + runDescriptor.OnTestCompleted(_ => transportConfiguration.Cleanup()); + } + public static async Task DefinePersistence(this EndpointConfiguration config, RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointCustomizationConfiguration) { var persistenceConfiguration = TestSuiteConstraints.Current.CreatePersistenceConfiguration(); @@ -13,19 +39,10 @@ public static async Task DefinePersistence(this EndpointConfiguration config, Ru runDescriptor.OnTestCompleted(_ => persistenceConfiguration.Cleanup()); } - public static void RegisterComponentsAndInheritanceHierarchy(this EndpointConfiguration builder, RunDescriptor runDescriptor) + public static async Task DefinePersistence(this EndpointConfiguration config, IConfigureEndpointTestExecution persistenceConfiguration, RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointCustomizationConfiguration) { - builder.RegisterComponents(r => { RegisterInheritanceHierarchyOfContextOnContainer(runDescriptor, r); }); - } - - static void RegisterInheritanceHierarchyOfContextOnContainer(RunDescriptor runDescriptor, IConfigureComponents r) - { - var type = runDescriptor.ScenarioContext.GetType(); - while (type != typeof(object)) - { - r.RegisterSingleton(type, runDescriptor.ScenarioContext); - type = type.BaseType; - } + await persistenceConfiguration.Configure(endpointCustomizationConfiguration.EndpointName, config, runDescriptor.Settings, endpointCustomizationConfiguration.PublisherMetadata); + runDescriptor.OnTestCompleted(_ => persistenceConfiguration.Cleanup()); } } } \ No newline at end of file diff --git a/src/AcceptanceTesting/Infrastructure/EndpointTemplates/DefaultServer.cs b/src/AcceptanceTesting/Infrastructure/EndpointTemplates/DefaultServer.cs index 3c52b48..79ff357 100644 --- a/src/AcceptanceTesting/Infrastructure/EndpointTemplates/DefaultServer.cs +++ b/src/AcceptanceTesting/Infrastructure/EndpointTemplates/DefaultServer.cs @@ -1,58 +1,35 @@ namespace NServiceBus.AcceptanceTests.EndpointTemplates { using System; - using System.Collections.Generic; using System.Threading.Tasks; using AcceptanceTesting.Customization; using AcceptanceTesting.Support; - using Configuration.AdvancedExtensibility; - using Features; public class DefaultServer : IEndpointSetupTemplate { - public DefaultServer() - { - typesToInclude = new List(); - } - - public DefaultServer(List typesToInclude) - { - this.typesToInclude = typesToInclude; - } + public IConfigureEndpointTestExecution TransportConfiguration { get; set; } = TestSuiteConstraints.Current.CreateTransportConfiguration(); -#pragma warning disable CS0618 - public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, Action configurationBuilderCustomization) -#pragma warning restore CS0618 + public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, Func configurationBuilderCustomization) { - var types = endpointConfiguration.GetTypesScopedByTestClass(); - - typesToInclude.AddRange(types); - - var configuration = new EndpointConfiguration(endpointConfiguration.EndpointName); - - configuration.TypesToIncludeInScan(typesToInclude); - configuration.EnableInstallers(); - - configuration.DisableFeature(); - - var recoverability = configuration.Recoverability(); - recoverability.Delayed(delayed => delayed.NumberOfRetries(0)); - recoverability.Immediate(immediate => immediate.NumberOfRetries(0)); - configuration.SendFailedMessagesTo("error"); - configuration.UseSerialization(); + var builder = new EndpointConfiguration(endpointConfiguration.EndpointName); + builder.EnableInstallers(); - configuration.RegisterComponentsAndInheritanceHierarchy(runDescriptor); + builder.Recoverability() + .Delayed(delayed => delayed.NumberOfRetries(0)) + .Immediate(immediate => immediate.NumberOfRetries(0)); + builder.SendFailedMessagesTo("error"); + builder.UseSerialization(); - await configuration.DefinePersistence(runDescriptor, endpointConfiguration).ConfigureAwait(false); + await builder.DefineTransport(TransportConfiguration, runDescriptor, endpointConfiguration).ConfigureAwait(false); - configuration.GetSettings().SetDefault("ScaleOut.UseSingleBrokerQueue", true); - configurationBuilderCustomization(configuration); + await configurationBuilderCustomization(builder).ConfigureAwait(false); - configuration.Pipeline.Register(new TestRunMarker(runDescriptor.ScenarioContext.TestRunId.ToString()), "Marks messages with test run ID."); + builder.Pipeline.Register(new TestRunMarker(runDescriptor.ScenarioContext.TestRunId.ToString()), "Marks messages with test run ID."); - return configuration; - } + // scan types at the end so that all types used by the configuration have been loaded into the AppDomain + builder.ScanTypesForTest(endpointConfiguration); - List typesToInclude; + return builder; + } } } \ No newline at end of file diff --git a/src/LoadTests.Receiver/LoadTests.Receiver.csproj b/src/LoadTests.Receiver/LoadTests.Receiver.csproj index bb0ef1b..82ad736 100644 --- a/src/LoadTests.Receiver/LoadTests.Receiver.csproj +++ b/src/LoadTests.Receiver/LoadTests.Receiver.csproj @@ -2,7 +2,7 @@ Exe - net461 + net48 latest @@ -10,9 +10,10 @@ - - - + + + + diff --git a/src/LoadTests.Receiver/Program.cs b/src/LoadTests.Receiver/Program.cs index 1ce4799..3b7e173 100644 --- a/src/LoadTests.Receiver/Program.cs +++ b/src/LoadTests.Receiver/Program.cs @@ -3,8 +3,8 @@ using System; using System.Threading.Tasks; using Metrics; + using Microsoft.Extensions.DependencyInjection; using NServiceBus; - using NServiceBus.Transport.SQLServer; class Program { @@ -18,26 +18,25 @@ static void Main(string[] args) static async Task Start() { var config = new EndpointConfiguration("Receiver"); - config.UseSerialization(); + config.UseSerialization(); config.SendFailedMessagesTo("error"); config.EnableInstallers(); - config.UsePersistence(); + config.UsePersistence(); Metric.Config.WithReporting(r => { r.WithCSVReports(".", TimeSpan.FromSeconds(5)); }); - config.RegisterComponents(c => c.RegisterSingleton(new Statistics())); + config.RegisterComponents(c => c.AddSingleton(new Statistics())); var connectionString = SettingsReader.Read("SqlConnectionString", "data source=(local); initial catalog=loadtest; integrated security=true"); - var senderTransport = config.UseTransport(); - senderTransport.UseNativeDelayedDelivery().DisableTimeoutManagerCompatibility(); - senderTransport.ConnectionString(connectionString); - senderTransport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); + var transport = new SqlServerTransport(connectionString); + transport.TransportTransactionMode = TransportTransactionMode.SendsAtomicWithReceive; + var routing = config.UseTransport(transport); - senderTransport.Routing().RouteToEndpoint(typeof(ProcessingReport), "Sender"); + routing.RouteToEndpoint(typeof(ProcessingReport), "Sender"); endpointInstance = await Endpoint.Start(config); Console.WriteLine("Press to exit."); diff --git a/src/LoadTests.Receiver/ReportProcessingStatistics.cs b/src/LoadTests.Receiver/ReportProcessingStatistics.cs index 7cc71b3..a2e313c 100644 --- a/src/LoadTests.Receiver/ReportProcessingStatistics.cs +++ b/src/LoadTests.Receiver/ReportProcessingStatistics.cs @@ -15,7 +15,7 @@ public ReportProcessingStatistics(Statistics statistics) this.statistics = statistics; } - protected override Task OnStart(IMessageSession session) + protected override Task OnStart(IMessageSession session, CancellationToken token) { tokenSource = new CancellationTokenSource(); reportTask = Task.Run(async () => @@ -40,7 +40,7 @@ protected override Task OnStart(IMessageSession session) return Task.CompletedTask; } - protected override async Task OnStop(IMessageSession session) + protected override async Task OnStop(IMessageSession session, CancellationToken token) { tokenSource?.Cancel(); if (reportTask != null) diff --git a/src/LoadTests.Shared/LoadTests.Shared.csproj b/src/LoadTests.Shared/LoadTests.Shared.csproj index 6dbf6d8..9ea6529 100644 --- a/src/LoadTests.Shared/LoadTests.Shared.csproj +++ b/src/LoadTests.Shared/LoadTests.Shared.csproj @@ -1,18 +1,10 @@  - net461 - - - - 7.1 - - - - 7.1 + net48 - + diff --git a/src/NServiceBus.Router.AcceptanceTests/Infrastructure/DefaultServer.cs b/src/NServiceBus.Router.AcceptanceTests/Infrastructure/DefaultServer.cs index 21e5600..7a0e096 100644 --- a/src/NServiceBus.Router.AcceptanceTests/Infrastructure/DefaultServer.cs +++ b/src/NServiceBus.Router.AcceptanceTests/Infrastructure/DefaultServer.cs @@ -34,7 +34,8 @@ public virtual async Task GetConfiguration(RunDescriptor await configurationBuilderCustomization(builder).ConfigureAwait(false); // scan types at the end so that all types used by the configuration have been loaded into the AppDomain - builder.TypesToIncludeInScan(endpointConfiguration.GetTypesScopedByTestClass()); + builder.ScanTypesForTest(endpointConfiguration); + //builder.TypesToIncludeInScan(endpointConfiguration.GetTypesScopedByTestClass()); return builder; } diff --git a/src/NServiceBus.Router.AcceptanceTests/Infrastructure/InMemorySubscriptionStorage.cs b/src/NServiceBus.Router.AcceptanceTests/Infrastructure/InMemorySubscriptionStorage.cs index eeceb8f..e990a57 100644 --- a/src/NServiceBus.Router.AcceptanceTests/Infrastructure/InMemorySubscriptionStorage.cs +++ b/src/NServiceBus.Router.AcceptanceTests/Infrastructure/InMemorySubscriptionStorage.cs @@ -34,9 +34,6 @@ public class InMemorySubscriptionPersistence : Feature { internal InMemorySubscriptionPersistence() { -#pragma warning disable 618 - DependsOn(); -#pragma warning restore 618 } protected override void Setup(FeatureConfigurationContext context) diff --git a/src/NServiceBus.Router.AcceptanceTests/NServiceBus.Router.AcceptanceTests.csproj b/src/NServiceBus.Router.AcceptanceTests/NServiceBus.Router.AcceptanceTests.csproj index e401955..171a262 100644 --- a/src/NServiceBus.Router.AcceptanceTests/NServiceBus.Router.AcceptanceTests.csproj +++ b/src/NServiceBus.Router.AcceptanceTests/NServiceBus.Router.AcceptanceTests.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_publishing_from_message_driven_endpoint_auto.cs b/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_publishing_from_message_driven_endpoint_auto.cs index f7bbd68..1c2ee14 100644 --- a/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_publishing_from_message_driven_endpoint_auto.cs +++ b/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_publishing_from_message_driven_endpoint_auto.cs @@ -21,7 +21,7 @@ public async Task It_should_deliver_the_message_to_both_subscribers() a.Broker().Alpha(); var b = cfg.AddInterface("B", false); - b.EnableMessageDrivenPublishSubscribe(alphaSubscriptionStore); + b.EnableMessageDrivenPublishSubscribe(bravoSubscriptionStore); b.Broker().Bravo(); cfg.AddInterface("C").Broker().Yankee(); @@ -73,7 +73,7 @@ public Publisher() var routing = c.ConfigureRouting(); routing.ConnectToRouter("Router", false, true); - }); + }).IncludeType(); } } @@ -89,7 +89,7 @@ public BaseEventSubscriber() var routing = c.ConfigureRouting(); routing.ConnectToRouter("Router", true, false); - }); + }).IncludeType(); } class BaseEventHandler : IHandleMessages diff --git a/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_subscribing_from_native_and_message_driven_endpoints.cs b/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_subscribing_from_native_and_message_driven.cs similarity index 97% rename from src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_subscribing_from_native_and_message_driven_endpoints.cs rename to src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_subscribing_from_native_and_message_driven.cs index 7090ec7..dada1a6 100644 --- a/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_subscribing_from_native_and_message_driven_endpoints.cs +++ b/src/NServiceBus.Router.AcceptanceTests/SingleRouter/When_subscribing_from_native_and_message_driven.cs @@ -7,12 +7,12 @@ namespace NServiceBus.Router.AcceptanceTests.SingleRouter using AcceptanceTesting.Customization; [TestFixture] - public class When_subscribing_from_native_and_message_driven_endpoints : NServiceBusAcceptanceTest + public class When_subscribing_from_native_and_message_driven : NServiceBusAcceptanceTest { static string PublisherEndpoint => Conventions.EndpointNamingConvention(typeof(Publisher)); [Test] - public async Task It_should_deliver_the_message_to_both_subscribers() + public async Task It_should_deliver_the_message_to_both() { var result = await Scenario.Define() .WithRouter("Router", cfg => @@ -25,7 +25,7 @@ public async Task It_should_deliver_the_message_to_both_subscribers() var a = cfg.AddInterface("A", false); a.Broker().Alpha(); - //DerivedEventSubscriber - Broker C` + //DerivedEventSubscriber - Broker C cfg.AddInterface("C").Broker().Zulu(); var routeTable = cfg.UseStaticRoutingProtocol(); diff --git a/src/NServiceBus.Router.Connector/RouterConnectionFeature.cs b/src/NServiceBus.Router.Connector/RouterConnectionFeature.cs index 1db09be..e2e1bfb 100644 --- a/src/NServiceBus.Router.Connector/RouterConnectionFeature.cs +++ b/src/NServiceBus.Router.Connector/RouterConnectionFeature.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Runtime; using Microsoft.Extensions.DependencyInjection; using NServiceBus; using NServiceBus.Features; @@ -30,7 +31,7 @@ protected override void Setup(FeatureConfigurationContext context) unicastRouteTable.AddOrReplaceRoutes("NServiceBus.Router_"+connection.RouterAddress, routes); } - if (!nativePubSub) + if (!nativePubSub || (context.Settings.TryGet("NServiceBus.Subscriptions.EnableMigrationMode", out bool enabled) && enabled)) { //Register the auto-publish-to-router behavior diff --git a/src/NServiceBus.Router.sln b/src/NServiceBus.Router.sln index 20653f1..a1223af 100644 --- a/src/NServiceBus.Router.sln +++ b/src/NServiceBus.Router.sln @@ -16,22 +16,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Directory.Build.targets = Directory.Build.targets EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AcceptanceTesting", "AcceptanceTesting\AcceptanceTesting.csproj", "{0F1838F0-4870-45B0-A85C-9197104C6F05}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{3A44ACF0-10D4-4322-976E-364B8ED98602}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LoadTests", "LoadTests", "{8FAB9D0C-AE8E-4183-A2C5-77464A300549}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LoadTests.Sender", "LoadTests.Sender\LoadTests.Sender.csproj", "{B9C2D1F0-CA82-4778-BAF3-594C2726A4F1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LoadTests.Sender.Router", "LoadTests.Sender.Router\LoadTests.Sender.Router.csproj", "{A7C137C2-F867-4BEB-8079-E77A21A8AE55}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LoadTests.Receiver", "LoadTests.Receiver\LoadTests.Receiver.csproj", "{82432CCF-502A-423B-871B-B86ABFBAE47B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LoadTests.Receiver.Router", "LoadTests.Receiver.Router\LoadTests.Receiver.Router.csproj", "{6D01212B-3BBC-4C11-A5C7-C608ECE12186}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LoadTests.Shared", "LoadTests.Shared\LoadTests.Shared.csproj", "{33DE78E8-D222-4F04-885A-47A5BDD23A4A}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -54,30 +40,6 @@ Global {27325DEC-0BD0-4260-84B5-E0F3D6FCA519}.Debug|Any CPU.Build.0 = Debug|Any CPU {27325DEC-0BD0-4260-84B5-E0F3D6FCA519}.Release|Any CPU.ActiveCfg = Release|Any CPU {27325DEC-0BD0-4260-84B5-E0F3D6FCA519}.Release|Any CPU.Build.0 = Release|Any CPU - {0F1838F0-4870-45B0-A85C-9197104C6F05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F1838F0-4870-45B0-A85C-9197104C6F05}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F1838F0-4870-45B0-A85C-9197104C6F05}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F1838F0-4870-45B0-A85C-9197104C6F05}.Release|Any CPU.Build.0 = Release|Any CPU - {B9C2D1F0-CA82-4778-BAF3-594C2726A4F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9C2D1F0-CA82-4778-BAF3-594C2726A4F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9C2D1F0-CA82-4778-BAF3-594C2726A4F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9C2D1F0-CA82-4778-BAF3-594C2726A4F1}.Release|Any CPU.Build.0 = Release|Any CPU - {A7C137C2-F867-4BEB-8079-E77A21A8AE55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7C137C2-F867-4BEB-8079-E77A21A8AE55}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7C137C2-F867-4BEB-8079-E77A21A8AE55}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7C137C2-F867-4BEB-8079-E77A21A8AE55}.Release|Any CPU.Build.0 = Release|Any CPU - {82432CCF-502A-423B-871B-B86ABFBAE47B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {82432CCF-502A-423B-871B-B86ABFBAE47B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {82432CCF-502A-423B-871B-B86ABFBAE47B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {82432CCF-502A-423B-871B-B86ABFBAE47B}.Release|Any CPU.Build.0 = Release|Any CPU - {6D01212B-3BBC-4C11-A5C7-C608ECE12186}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6D01212B-3BBC-4C11-A5C7-C608ECE12186}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6D01212B-3BBC-4C11-A5C7-C608ECE12186}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D01212B-3BBC-4C11-A5C7-C608ECE12186}.Release|Any CPU.Build.0 = Release|Any CPU - {33DE78E8-D222-4F04-885A-47A5BDD23A4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33DE78E8-D222-4F04-885A-47A5BDD23A4A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33DE78E8-D222-4F04-885A-47A5BDD23A4A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33DE78E8-D222-4F04-885A-47A5BDD23A4A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -85,12 +47,6 @@ Global GlobalSection(NestedProjects) = preSolution {96687744-B1E0-4B98-AD61-ED385014E7AD} = {3A44ACF0-10D4-4322-976E-364B8ED98602} {0D2C045B-B55B-4738-B580-58F259690DF0} = {3A44ACF0-10D4-4322-976E-364B8ED98602} - {0F1838F0-4870-45B0-A85C-9197104C6F05} = {3A44ACF0-10D4-4322-976E-364B8ED98602} - {B9C2D1F0-CA82-4778-BAF3-594C2726A4F1} = {8FAB9D0C-AE8E-4183-A2C5-77464A300549} - {A7C137C2-F867-4BEB-8079-E77A21A8AE55} = {8FAB9D0C-AE8E-4183-A2C5-77464A300549} - {82432CCF-502A-423B-871B-B86ABFBAE47B} = {8FAB9D0C-AE8E-4183-A2C5-77464A300549} - {6D01212B-3BBC-4C11-A5C7-C608ECE12186} = {8FAB9D0C-AE8E-4183-A2C5-77464A300549} - {33DE78E8-D222-4F04-885A-47A5BDD23A4A} = {8FAB9D0C-AE8E-4183-A2C5-77464A300549} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F146A5AC-8618-4967-A758-8FB3980BC90F}