From b6b35e160d5256fd65f3e288a4d8e5a8564d24a4 Mon Sep 17 00:00:00 2001 From: Philippe Birbaum Date: Tue, 1 Oct 2019 09:47:00 +0200 Subject: [PATCH] Initial support for Azure Blobs & Queues (#13) --- global.json | 5 + .../AzureStorage.Tests.csproj | 28 ++ .../AzureStorageBlobResourceTests.cs | 37 +++ .../AzureStorageQueueResourceTests.cs | 37 +++ src/AzureStorage.Tests/xunit.runner.json | 4 + src/AzureStorage/AzureStorage.csproj | 36 +++ .../Blob/AzureStorageBlobImageSettings.cs | 24 ++ .../Blob/AzureStorageBlobResource.cs | 44 +++ .../Blob/AzureStorageBlobStatus.cs | 41 +++ .../CloudStorageAccountBuilder.cs | 29 ++ .../Queue/AzureStorageQueueImageSettings.cs | 24 ++ .../Queue/AzureStorageQueueResource.cs | 46 +++ .../Queue/AzureStorageQueueStatus.cs | 42 +++ src/Core.Tests/xunit.runner.json | 4 +- src/Core/Core.csproj | 1 + src/Core/DockerManager.cs | 2 +- src/Core/DockerModelsExtensions.cs | 1 + src/Core/IImageSettings.cs | 1 + src/Core/Initializer.cs | 4 +- src/Squadron.sln | 296 ++++++++++-------- 20 files changed, 567 insertions(+), 139 deletions(-) create mode 100644 global.json create mode 100644 src/AzureStorage.Tests/AzureStorage.Tests.csproj create mode 100644 src/AzureStorage.Tests/AzureStorageBlobResourceTests.cs create mode 100644 src/AzureStorage.Tests/AzureStorageQueueResourceTests.cs create mode 100644 src/AzureStorage.Tests/xunit.runner.json create mode 100644 src/AzureStorage/AzureStorage.csproj create mode 100644 src/AzureStorage/Blob/AzureStorageBlobImageSettings.cs create mode 100644 src/AzureStorage/Blob/AzureStorageBlobResource.cs create mode 100644 src/AzureStorage/Blob/AzureStorageBlobStatus.cs create mode 100644 src/AzureStorage/CloudStorageAccountBuilder.cs create mode 100644 src/AzureStorage/Queue/AzureStorageQueueImageSettings.cs create mode 100644 src/AzureStorage/Queue/AzureStorageQueueResource.cs create mode 100644 src/AzureStorage/Queue/AzureStorageQueueStatus.cs diff --git a/global.json b/global.json new file mode 100644 index 0000000..3d26ee6 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "2.2.401" + } +} diff --git a/src/AzureStorage.Tests/AzureStorage.Tests.csproj b/src/AzureStorage.Tests/AzureStorage.Tests.csproj new file mode 100644 index 0000000..2bc7bb4 --- /dev/null +++ b/src/AzureStorage.Tests/AzureStorage.Tests.csproj @@ -0,0 +1,28 @@ + + + + netcoreapp2.2 + false + Squadron.AzureStorage.Tests + Squadron.AzureStorage.Tests + + + + + + + + + + + + + + + + + Always + + + + diff --git a/src/AzureStorage.Tests/AzureStorageBlobResourceTests.cs b/src/AzureStorage.Tests/AzureStorageBlobResourceTests.cs new file mode 100644 index 0000000..9c0d6d7 --- /dev/null +++ b/src/AzureStorage.Tests/AzureStorageBlobResourceTests.cs @@ -0,0 +1,37 @@ +using System.Text; +using System.Threading.Tasks; +using FluentAssertions; +using Microsoft.Azure.Storage.Blob; +using Xunit; + +namespace Squadron.AzureStorage.Tests +{ + public class AzureStorageBlobResourceTests : IClassFixture + { + private readonly AzureStorageBlobResource _azureStorageResource; + + public AzureStorageBlobResourceTests(AzureStorageBlobResource azureStorageResource) + { + _azureStorageResource = azureStorageResource; + } + + [Fact] + public async Task CreateBlobClient_UploadFile_ContentMatch() + { + //Arrange + CloudBlobClient blobClient = _azureStorageResource.CreateBlobClient(); + CloudBlobContainer container = blobClient.GetContainerReference("foo"); + await container.CreateIfNotExistsAsync(); + string inputText = "Hello_AzureStorage"; + var data = Encoding.UTF8.GetBytes(inputText); + + //Act + CloudBlockBlob textFile = container.GetBlockBlobReference("test.txt"); + await textFile.UploadFromByteArrayAsync(data, 0, data.Length); + + //Assert + string downloaded = await textFile.DownloadTextAsync(); + downloaded.Should().Be(inputText); + } + } +} diff --git a/src/AzureStorage.Tests/AzureStorageQueueResourceTests.cs b/src/AzureStorage.Tests/AzureStorageQueueResourceTests.cs new file mode 100644 index 0000000..ce1770e --- /dev/null +++ b/src/AzureStorage.Tests/AzureStorageQueueResourceTests.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; +using FluentAssertions; +using Microsoft.Azure.Storage.Queue; +using Xunit; + +namespace Squadron.AzureStorage.Tests +{ + public class AzureStorageQueueResourceTests : IClassFixture + { + private readonly AzureStorageQueueResource _azureStorageResource; + + public AzureStorageQueueResourceTests(AzureStorageQueueResource azureStorageResource) + { + _azureStorageResource = azureStorageResource; + } + + [Fact] + public async Task CreateQueueClient_AddMessage_Peeked() + { + //Arrange + CloudQueueClient queueClient = _azureStorageResource.CreateQueueClient(); + CloudQueue queue = queueClient.GetQueueReference("foo"); + string messageText = "Hello_AzureStorage"; + + await queue.CreateIfNotExistsAsync(); + var message = new CloudQueueMessage(messageText); + + //Act + queue.AddMessage(message); + + //Assert + CloudQueueMessage peekedMessage = await queue.PeekMessageAsync(); + peekedMessage.AsString.Should().Be(messageText); + } + + } +} diff --git a/src/AzureStorage.Tests/xunit.runner.json b/src/AzureStorage.Tests/xunit.runner.json new file mode 100644 index 0000000..bd5fcdd --- /dev/null +++ b/src/AzureStorage.Tests/xunit.runner.json @@ -0,0 +1,4 @@ +{ + "appDomain": "denied", + "parallelizeAssembly": true +} \ No newline at end of file diff --git a/src/AzureStorage/AzureStorage.csproj b/src/AzureStorage/AzureStorage.csproj new file mode 100644 index 0000000..181d119 --- /dev/null +++ b/src/AzureStorage/AzureStorage.csproj @@ -0,0 +1,36 @@ + + + + netstandard2.0 + Squadron + Squadron.AzureStorage + true + + + + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + + + + Full + true + + + + pdbonly + true + + + + + + + + + + + + + + + diff --git a/src/AzureStorage/Blob/AzureStorageBlobImageSettings.cs b/src/AzureStorage/Blob/AzureStorageBlobImageSettings.cs new file mode 100644 index 0000000..38d8a75 --- /dev/null +++ b/src/AzureStorage/Blob/AzureStorageBlobImageSettings.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; + +namespace Squadron +{ + public class AzureStorageBlobImageSettings : IImageSettings + { + public AzureStorageBlobImageSettings() + { + EnvironmentVariable = + new List(); + } + + public string Name { get; } = ContainerName.Create(); + public string Image { get; } = "mcr.microsoft.com/azure-storage/azurite"; + public long ContainerPort { get; } = 10000; + public long HostPort { get; set; } + public string ContainerId { get; set; } + public string ContainerAddress { get; set; } + public string Username { get; } = string.Empty; + public string Password { get; } = string.Empty; + public List EnvironmentVariable { get; } + public string Logs { get; set; } + } +} diff --git a/src/AzureStorage/Blob/AzureStorageBlobResource.cs b/src/AzureStorage/Blob/AzureStorageBlobResource.cs new file mode 100644 index 0000000..03c4ac7 --- /dev/null +++ b/src/AzureStorage/Blob/AzureStorageBlobResource.cs @@ -0,0 +1,44 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Azure.Storage; +using Microsoft.Azure.Storage.Blob; +using Xunit; + +namespace Squadron +{ + /// + /// Represents a AzureStorage blob resource that can be used by unit tests. + /// Currenty Blob and Queues are supported by this resource + /// + /// + public class AzureStorageBlobResource + : ResourceBase, IAsyncLifetime + { + CloudStorageAccount _storageAccount = null; + + public async Task InitializeAsync() + { + await StartContainerAsync(); + + _storageAccount = CloudStorageAccountBuilder.GetForBlob(Settings); + + await Initializer.WaitAsync( + new AzureStorageBlobStatus(_storageAccount), Settings); + } + + /// + /// Creates a Blob client + /// + /// + public CloudBlobClient CreateBlobClient() + { + return _storageAccount.CreateCloudBlobClient(); + } + + /// + public async Task DisposeAsync() + { + await StopContainerAsync(); + } + } +} diff --git a/src/AzureStorage/Blob/AzureStorageBlobStatus.cs b/src/AzureStorage/Blob/AzureStorageBlobStatus.cs new file mode 100644 index 0000000..badcda2 --- /dev/null +++ b/src/AzureStorage/Blob/AzureStorageBlobStatus.cs @@ -0,0 +1,41 @@ +using System.Threading.Tasks; +using Microsoft.Azure.Storage; +using Microsoft.Azure.Storage.Blob; +using Microsoft.Azure.Storage.Shared.Protocol; + +namespace Squadron +{ + /// + /// Status checker for AzureStorage Blob + /// + /// + public class AzureStorageBlobStatus : IResourceStatusProvider + { + private readonly CloudStorageAccount _account; + + /// + /// Initializes a new instance of the class. + /// + public AzureStorageBlobStatus(CloudStorageAccount account) + { + _account = account; + } + + /// + /// Determines whether Azure Blob is ready + /// + public async Task IsReadyAsync() + { + CloudBlobClient blobClient = _account.CreateCloudBlobClient(); + ServiceProperties serviceProperties = + await blobClient.GetServicePropertiesAsync( + new BlobRequestOptions(), + default); + return new Status + { + IsReady = serviceProperties != null, + Message = _account.BlobStorageUri.ToString() + }; + } + } +} diff --git a/src/AzureStorage/CloudStorageAccountBuilder.cs b/src/AzureStorage/CloudStorageAccountBuilder.cs new file mode 100644 index 0000000..74e9138 --- /dev/null +++ b/src/AzureStorage/CloudStorageAccountBuilder.cs @@ -0,0 +1,29 @@ +using Microsoft.Azure.Storage; + +namespace Squadron +{ + internal static class CloudStorageAccountBuilder + { + internal static CloudStorageAccount GetForBlob(IImageSettings settings) + { + return GetAccountByEndpoint("BlobEndpoint", settings); + } + + internal static CloudStorageAccount GetForQueue(IImageSettings settings) + { + return GetAccountByEndpoint("QueueEndpoint", settings); + } + + private static CloudStorageAccount GetAccountByEndpoint( + string endpoint, + IImageSettings settings) + { + CloudStorageAccount dev = CloudStorageAccount.DevelopmentStorageAccount; + return CloudStorageAccount.Parse( + $"DefaultEndpointsProtocol=http;AccountName={dev.Credentials.AccountName};" + + $"AccountKey={dev.Credentials.ExportBase64EncodedKey()};" + + $"{endpoint}=http://{settings.ContainerAddress}:{settings.HostPort}/" + + $"{dev.Credentials.AccountName};"); + } + } +} diff --git a/src/AzureStorage/Queue/AzureStorageQueueImageSettings.cs b/src/AzureStorage/Queue/AzureStorageQueueImageSettings.cs new file mode 100644 index 0000000..b713b0f --- /dev/null +++ b/src/AzureStorage/Queue/AzureStorageQueueImageSettings.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; + +namespace Squadron +{ + public class AzureStorageQueueImageSettings : IImageSettings + { + public AzureStorageQueueImageSettings() + { + EnvironmentVariable = + new List(); + } + + public string Name { get; } = ContainerName.Create(); + public string Image { get; } = "mcr.microsoft.com/azure-storage/azurite"; + public long ContainerPort { get; } = 10001; + public long HostPort { get; set; } + public string ContainerId { get; set; } + public string ContainerAddress { get; set; } + public string Username { get; } = string.Empty; + public string Password { get; } = string.Empty; + public List EnvironmentVariable { get; } + public string Logs { get; set; } + } +} diff --git a/src/AzureStorage/Queue/AzureStorageQueueResource.cs b/src/AzureStorage/Queue/AzureStorageQueueResource.cs new file mode 100644 index 0000000..7d244e1 --- /dev/null +++ b/src/AzureStorage/Queue/AzureStorageQueueResource.cs @@ -0,0 +1,46 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Azure.Storage; +using Microsoft.Azure.Storage.Blob; +using Microsoft.Azure.Storage.Queue; +using Xunit; + +namespace Squadron +{ + /// + /// Represents a AzureStorage queue resource that can be used by unit tests. + /// Currenty Blob and Queues are supported by this resource + /// + /// + public class AzureStorageQueueResource + : ResourceBase, IAsyncLifetime + { + CloudStorageAccount _storageAccount = null; + + public async Task InitializeAsync() + { + await StartContainerAsync(); + + _storageAccount = CloudStorageAccountBuilder.GetForQueue(Settings); + + await Initializer.WaitAsync( + new AzureStorageQueueStatus(_storageAccount), Settings); + } + + + /// + /// Creates a Queue client + /// + /// + public CloudQueueClient CreateQueueClient() + { + return _storageAccount.CreateCloudQueueClient(); + } + + /// + public async Task DisposeAsync() + { + await StopContainerAsync(); + } + } +} diff --git a/src/AzureStorage/Queue/AzureStorageQueueStatus.cs b/src/AzureStorage/Queue/AzureStorageQueueStatus.cs new file mode 100644 index 0000000..c00a34b --- /dev/null +++ b/src/AzureStorage/Queue/AzureStorageQueueStatus.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; +using Microsoft.Azure.Storage; +using Microsoft.Azure.Storage.Blob; +using Microsoft.Azure.Storage.Queue; +using Microsoft.Azure.Storage.Shared.Protocol; + +namespace Squadron +{ + /// + /// Status checker for AzureStorage Queues + /// + /// + public class AzureStorageQueueStatus : IResourceStatusProvider + { + private readonly CloudStorageAccount _account; + + /// + /// Initializes a new instance of the class. + /// + public AzureStorageQueueStatus(CloudStorageAccount account) + { + _account = account; + } + + /// + /// Determines whether Azure Queue is ready + /// + public async Task IsReadyAsync() + { + CloudQueueClient blobClient = _account.CreateCloudQueueClient(); + ServiceProperties serviceProperties = + await blobClient.GetServicePropertiesAsync( + new QueueRequestOptions(), + default); + return new Status + { + IsReady = serviceProperties != null, + Message = _account.QueueStorageUri.ToString() + }; + } + } +} diff --git a/src/Core.Tests/xunit.runner.json b/src/Core.Tests/xunit.runner.json index bd5fcdd..e07cdab 100644 --- a/src/Core.Tests/xunit.runner.json +++ b/src/Core.Tests/xunit.runner.json @@ -1,4 +1,4 @@ -{ +{ "appDomain": "denied", "parallelizeAssembly": true -} \ No newline at end of file +} diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 78edc7f..bf0d291 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -6,6 +6,7 @@ Squadron Squadron.Core true + 8.0 diff --git a/src/Core/DockerManager.cs b/src/Core/DockerManager.cs index dc51e40..976ca1f 100644 --- a/src/Core/DockerManager.cs +++ b/src/Core/DockerManager.cs @@ -74,7 +74,7 @@ public static async Task CreateAndStartContainer( "Docker container creation/startup failed."); } - settings.Logs = await ConsumeLogs(settings, TimeSpan.FromSeconds(15)); + settings.Logs = await ConsumeLogs(settings, TimeSpan.FromSeconds(10)); var success = await ResolveContainerAddress(settings) && await ResolveHostPort(settings); diff --git a/src/Core/DockerModelsExtensions.cs b/src/Core/DockerModelsExtensions.cs index c5db2f4..a2b7eb6 100644 --- a/src/Core/DockerModelsExtensions.cs +++ b/src/Core/DockerModelsExtensions.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using Docker.DotNet.Models; namespace Squadron diff --git a/src/Core/IImageSettings.cs b/src/Core/IImageSettings.cs index 99e6746..cdb5a76 100644 --- a/src/Core/IImageSettings.cs +++ b/src/Core/IImageSettings.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace Squadron diff --git a/src/Core/Initializer.cs b/src/Core/Initializer.cs index d90af37..310937d 100644 --- a/src/Core/Initializer.cs +++ b/src/Core/Initializer.cs @@ -38,8 +38,8 @@ internal static async Task WaitAsync( { // We are not interested in any client errors } - - await Task.Delay(TimeSpan.FromSeconds(2)); + if (!status.IsReady) + await Task.Delay(TimeSpan.FromSeconds(2)); } if (!status.IsReady) diff --git a/src/Squadron.sln b/src/Squadron.sln index 329d322..b720897 100644 --- a/src/Squadron.sln +++ b/src/Squadron.sln @@ -1,134 +1,162 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29009.5 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "Core\Core.csproj", "{CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Tests", "Core.Tests\Core.Tests.csproj", "{AD08DDBA-3CFC-47C8-B225-CD64673262DB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo", "Mongo\Mongo.csproj", "{A46FA6B1-4521-4C53-9D38-5369470FB3D4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Tests", "Mongo.Tests\Mongo.Tests.csproj", "{9A9BBEA0-1206-423F-B62F-E4ADA728E472}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elasticsearch", "Elasticsearch\Elasticsearch.csproj", "{0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elasticsearch.Tests", "Elasticsearch.Tests\Elasticsearch.Tests.csproj", "{3156BBFC-6475-4229-8B32-B1FCCCD0F385}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlServer", "SqlServer\SqlServer.csproj", "{1D2119F0-0EE5-462A-B921-5624037417AF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlServer.Tests", "SqlServer.Tests\SqlServer.Tests.csproj", "{20780AE0-885D-41C9-9451-3C7946CCC279}" -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 - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x64.ActiveCfg = Debug|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x64.Build.0 = Debug|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x86.ActiveCfg = Debug|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x86.Build.0 = Debug|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|Any CPU.Build.0 = Release|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x64.ActiveCfg = Release|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x64.Build.0 = Release|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x86.ActiveCfg = Release|Any CPU - {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x86.Build.0 = Release|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x64.ActiveCfg = Debug|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x64.Build.0 = Debug|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x86.ActiveCfg = Debug|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x86.Build.0 = Debug|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|Any CPU.Build.0 = Release|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x64.ActiveCfg = Release|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x64.Build.0 = Release|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x86.ActiveCfg = Release|Any CPU - {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x86.Build.0 = Release|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x64.ActiveCfg = Debug|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x64.Build.0 = Debug|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x86.ActiveCfg = Debug|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x86.Build.0 = Debug|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|Any CPU.Build.0 = Release|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x64.ActiveCfg = Release|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x64.Build.0 = Release|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x86.ActiveCfg = Release|Any CPU - {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x86.Build.0 = Release|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x64.ActiveCfg = Debug|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x64.Build.0 = Debug|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x86.ActiveCfg = Debug|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x86.Build.0 = Debug|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|Any CPU.Build.0 = Release|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x64.ActiveCfg = Release|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x64.Build.0 = Release|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x86.ActiveCfg = Release|Any CPU - {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x86.Build.0 = Release|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x64.ActiveCfg = Debug|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x64.Build.0 = Debug|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x86.ActiveCfg = Debug|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x86.Build.0 = Debug|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|Any CPU.Build.0 = Release|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x64.ActiveCfg = Release|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x64.Build.0 = Release|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x86.ActiveCfg = Release|Any CPU - {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x86.Build.0 = Release|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x64.ActiveCfg = Debug|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x64.Build.0 = Debug|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x86.ActiveCfg = Debug|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x86.Build.0 = Debug|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|Any CPU.Build.0 = Release|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x64.ActiveCfg = Release|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x64.Build.0 = Release|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x86.ActiveCfg = Release|Any CPU - {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x86.Build.0 = Release|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x64.ActiveCfg = Debug|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x64.Build.0 = Debug|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x86.ActiveCfg = Debug|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x86.Build.0 = Debug|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|Any CPU.Build.0 = Release|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x64.ActiveCfg = Release|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x64.Build.0 = Release|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x86.ActiveCfg = Release|Any CPU - {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x86.Build.0 = Release|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|Any CPU.Build.0 = Debug|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x64.ActiveCfg = Debug|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x64.Build.0 = Debug|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x86.ActiveCfg = Debug|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x86.Build.0 = Debug|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|Any CPU.ActiveCfg = Release|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|Any CPU.Build.0 = Release|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x64.ActiveCfg = Release|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x64.Build.0 = Release|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x86.ActiveCfg = Release|Any CPU - {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {68767DE6-FA2A-4A9F-A7D3-AF07328CB620} - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29009.5 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "Core\Core.csproj", "{CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Tests", "Core.Tests\Core.Tests.csproj", "{AD08DDBA-3CFC-47C8-B225-CD64673262DB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo", "Mongo\Mongo.csproj", "{A46FA6B1-4521-4C53-9D38-5369470FB3D4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mongo.Tests", "Mongo.Tests\Mongo.Tests.csproj", "{9A9BBEA0-1206-423F-B62F-E4ADA728E472}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elasticsearch", "Elasticsearch\Elasticsearch.csproj", "{0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elasticsearch.Tests", "Elasticsearch.Tests\Elasticsearch.Tests.csproj", "{3156BBFC-6475-4229-8B32-B1FCCCD0F385}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlServer", "SqlServer\SqlServer.csproj", "{1D2119F0-0EE5-462A-B921-5624037417AF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SqlServer.Tests", "SqlServer.Tests\SqlServer.Tests.csproj", "{20780AE0-885D-41C9-9451-3C7946CCC279}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureStorage", "AzureStorage\AzureStorage.csproj", "{5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureStorage.Tests", "AzureStorage.Tests\AzureStorage.Tests.csproj", "{AB4DC29E-2F8A-410A-8BFF-CD120515BA80}" +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 + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x64.Build.0 = Debug|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x86.ActiveCfg = Debug|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Debug|x86.Build.0 = Debug|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|Any CPU.Build.0 = Release|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x64.ActiveCfg = Release|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x64.Build.0 = Release|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x86.ActiveCfg = Release|Any CPU + {CA387BA6-9CD2-4988-BF75-75D5DB15DA0F}.Release|x86.Build.0 = Release|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x64.ActiveCfg = Debug|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x64.Build.0 = Debug|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Debug|x86.Build.0 = Debug|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|Any CPU.Build.0 = Release|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x64.ActiveCfg = Release|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x64.Build.0 = Release|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x86.ActiveCfg = Release|Any CPU + {AD08DDBA-3CFC-47C8-B225-CD64673262DB}.Release|x86.Build.0 = Release|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x64.ActiveCfg = Debug|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x64.Build.0 = Debug|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x86.ActiveCfg = Debug|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Debug|x86.Build.0 = Debug|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|Any CPU.Build.0 = Release|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x64.ActiveCfg = Release|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x64.Build.0 = Release|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x86.ActiveCfg = Release|Any CPU + {A46FA6B1-4521-4C53-9D38-5369470FB3D4}.Release|x86.Build.0 = Release|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x64.Build.0 = Debug|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Debug|x86.Build.0 = Debug|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|Any CPU.Build.0 = Release|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x64.ActiveCfg = Release|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x64.Build.0 = Release|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x86.ActiveCfg = Release|Any CPU + {9A9BBEA0-1206-423F-B62F-E4ADA728E472}.Release|x86.Build.0 = Release|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x64.ActiveCfg = Debug|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x64.Build.0 = Debug|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x86.ActiveCfg = Debug|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Debug|x86.Build.0 = Debug|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|Any CPU.Build.0 = Release|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x64.ActiveCfg = Release|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x64.Build.0 = Release|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x86.ActiveCfg = Release|Any CPU + {0AF1B2A1-1BA5-478C-A18D-7481C7A1DAD7}.Release|x86.Build.0 = Release|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x64.ActiveCfg = Debug|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x64.Build.0 = Debug|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x86.ActiveCfg = Debug|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Debug|x86.Build.0 = Debug|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|Any CPU.Build.0 = Release|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x64.ActiveCfg = Release|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x64.Build.0 = Release|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x86.ActiveCfg = Release|Any CPU + {3156BBFC-6475-4229-8B32-B1FCCCD0F385}.Release|x86.Build.0 = Release|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x64.ActiveCfg = Debug|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x64.Build.0 = Debug|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x86.ActiveCfg = Debug|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Debug|x86.Build.0 = Debug|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|Any CPU.Build.0 = Release|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x64.ActiveCfg = Release|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x64.Build.0 = Release|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x86.ActiveCfg = Release|Any CPU + {1D2119F0-0EE5-462A-B921-5624037417AF}.Release|x86.Build.0 = Release|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x64.ActiveCfg = Debug|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x64.Build.0 = Debug|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x86.ActiveCfg = Debug|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Debug|x86.Build.0 = Debug|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|Any CPU.Build.0 = Release|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x64.ActiveCfg = Release|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x64.Build.0 = Release|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x86.ActiveCfg = Release|Any CPU + {20780AE0-885D-41C9-9451-3C7946CCC279}.Release|x86.Build.0 = Release|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Debug|x64.ActiveCfg = Debug|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Debug|x64.Build.0 = Debug|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Debug|x86.ActiveCfg = Debug|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Debug|x86.Build.0 = Debug|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Release|Any CPU.Build.0 = Release|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Release|x64.ActiveCfg = Release|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Release|x64.Build.0 = Release|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Release|x86.ActiveCfg = Release|Any CPU + {5FBD7383-0AA3-4C25-A4CF-AE884BF4221E}.Release|x86.Build.0 = Release|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Debug|x64.ActiveCfg = Debug|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Debug|x64.Build.0 = Debug|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Debug|x86.ActiveCfg = Debug|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Debug|x86.Build.0 = Debug|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Release|Any CPU.Build.0 = Release|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Release|x64.ActiveCfg = Release|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Release|x64.Build.0 = Release|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Release|x86.ActiveCfg = Release|Any CPU + {AB4DC29E-2F8A-410A-8BFF-CD120515BA80}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {68767DE6-FA2A-4A9F-A7D3-AF07328CB620} + EndGlobalSection +EndGlobal