diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b794026 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/SuperMarketApp/.vs/SuperMarketApp/v16/TestStore/0/000.testlog +/SuperMarketApp/.vs/SuperMarketApp/v16/TestStore/0/testlog.manifest +/SuperMarketApp/.vs/SuperMarketApp/DesignTimeBuild/.dtbcache.v2 +/SuperMarketApp/.vs/SuperMarketApp/v16/TestStore/0/001.testlog +*.testlog diff --git a/SuperMarketApp/.gitignore b/SuperMarketApp/.gitignore new file mode 100644 index 0000000..9b956f9 --- /dev/null +++ b/SuperMarketApp/.gitignore @@ -0,0 +1,133 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.svclog +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml +*.azurePubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +packages/ +## TODO: If the tool you use requires repositories.config, also uncomment the next line +!packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +![Ss]tyle[Cc]op.targets +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml + +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store + +_NCrunch* \ No newline at end of file diff --git a/SuperMarketApp/IntegrationTests/Init.cs b/SuperMarketApp/IntegrationTests/Init.cs new file mode 100644 index 0000000..ad2e0e3 --- /dev/null +++ b/SuperMarketApp/IntegrationTests/Init.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; +using Service.Interfaces; +using Service.Services; + +namespace Service.IntegrationTests +{ + public class Init + { + protected ICalculateProductPrice CalculateProductPrice; + protected ICalculateCartPrice CalculateCartPrice; + protected IRegisterService RegisterService; + + [SetUp] + public void SetUp() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddScoped(); + serviceCollection.AddScoped(); + serviceCollection.AddScoped(); + var serviceProvider = serviceCollection.BuildServiceProvider(); + + CalculateProductPrice = serviceProvider.GetService(); + CalculateCartPrice = serviceProvider.GetService(); + RegisterService = serviceProvider.GetService(); + } + } +} diff --git a/SuperMarketApp/IntegrationTests/Service.IntegrationTests.csproj b/SuperMarketApp/IntegrationTests/Service.IntegrationTests.csproj new file mode 100644 index 0000000..8548ce9 --- /dev/null +++ b/SuperMarketApp/IntegrationTests/Service.IntegrationTests.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + + false + + + + + + + + + + + + + + diff --git a/SuperMarketApp/IntegrationTests/ServiceTests.cs b/SuperMarketApp/IntegrationTests/ServiceTests.cs new file mode 100644 index 0000000..96474e0 --- /dev/null +++ b/SuperMarketApp/IntegrationTests/ServiceTests.cs @@ -0,0 +1,67 @@ +using NUnit.Framework; +using Service.Enum; +using Service.Models; + +namespace Service.IntegrationTests +{ + public class ServiceTests : Init + { + private Cart _cart; + + [Test] + public void CalculateCart_NoDiscount_ShouldBeCorrectPrice() + { + // Assemble + _cart = new Cart(); + _cart.AddToCart(new Product("Kaas", 156734, 4.99)); + _cart.AddToCart(new Product("Ham", 579843, 1.49)); + _cart.AddToCart(new Product("Melk", 378941, 0.99)); + _cart.AddToCart(new Product("Pizza", 739214, 4.59)); + _cart.AddToCart(new Product("WC papier", 798234, 1.12)); + + // Act + var price = CalculateCartPrice.Calculate(_cart); + + // Assert + Assert.AreEqual(13.18, price); + } + + [Test] + public void CalculateCart_WithBonusAndExpiryDiscount_ShouldBeCorrectPrice() + { + _cart = new Cart(); + _cart.AddToCart(new Product("Kaas", 156734, 4.99, Discount.Bonus)); + _cart.AddToCart(new Product("Ham", 579843, 1.49)); + _cart.AddToCart(new Product("Melk", 378941, 0.99, Discount.Expiry)); + _cart.AddToCart(new Product("Pizza", 739214, 4.59)); + _cart.AddToCart(new Product("WC papier", 798234, 1.12, Discount.Bonus)); + + // Act + var price = CalculateCartPrice.Calculate(_cart); + + // Assert + Assert.AreEqual(11.61, price); + } + + [Test] + public void CartWithProduct_CheckOut_ShouldPrintCorrectReceipt() + { + // Assemble + _cart = new Cart(); + _cart.AddToCart(new Product("Kaas", 156734, 4.99)); + _cart.AddToCart(new Product("Ham", 579843, 1.49)); + _cart.AddToCart(new Product("Melk", 378941, 0.99)); + _cart.AddToCart(new Product("Pizza", 739214, 4.59)); + _cart.AddToCart(new Product("WC papier", 798234, 1.12)); + + // Assign + var expectedPrice = 13.18; + + // Act + var receipt = RegisterService.CheckOut(_cart); + + // Assert + Assert.That(receipt.Contains(expectedPrice.ToString())); + } + } +} \ No newline at end of file diff --git a/SuperMarketApp/Service.Tests/CalculateCartPriceTests.cs b/SuperMarketApp/Service.Tests/CalculateCartPriceTests.cs new file mode 100644 index 0000000..913f738 --- /dev/null +++ b/SuperMarketApp/Service.Tests/CalculateCartPriceTests.cs @@ -0,0 +1,84 @@ +using Moq; +using NUnit.Framework; +using Service.Interfaces; +using Service.Models; +using Service.Services; + +namespace Service.Tests +{ + public class CalculateCartPriceTests + { + private Mock _calculateProductPriceMock; + + private Cart _cart; + + [SetUp] + public void Setup() + { + _calculateProductPriceMock = new Mock(); + + _cart = new Cart(); + _cart.AddToCart(new Product("Kaas", 156734, 4.99)); + _cart.AddToCart(new Product("Ham", 579843, 1.49)); + _cart.AddToCart(new Product("Melk", 378941, 0.99)); + _cart.AddToCart(new Product("Pizza", 739214, 4.59)); + _cart.AddToCart(new Product("WC papier", 798234, 1.12)); + } + + [Test] + public void CalculatePrice_ShouldReturnCorrectDouble_WhenGivenCartNoDiscount() + { + // Assemble + _calculateProductPriceMock.Setup(mock => mock.Calculate(_cart.Products[0])).Returns(_cart.Products[0].Price); + _calculateProductPriceMock.Setup(mock => mock.Calculate(_cart.Products[1])).Returns(_cart.Products[1].Price); + _calculateProductPriceMock.Setup(mock => mock.Calculate(_cart.Products[2])).Returns(_cart.Products[2].Price); + _calculateProductPriceMock.Setup(mock => mock.Calculate(_cart.Products[3])).Returns(_cart.Products[3].Price); + _calculateProductPriceMock.Setup(mock => mock.Calculate(_cart.Products[4])).Returns(_cart.Products[4].Price); + + var calculatePriceService = new CalculateCartPrice(_calculateProductPriceMock.Object); + + // Assign + var expectedPrice = 13.18; + + // Act + var price = calculatePriceService.Calculate(_cart); + + // Assert + Assert.AreEqual(expectedPrice, price); + } + + [Test] + public void CalculatePrice_ShouldRoundUp_WhenGivenThreeDecimals() + { + // Assemble + _calculateProductPriceMock.Setup(mock => mock.Calculate(_cart.Products[0])).Returns(5.495); + var calculatePriceService = new CalculateCartPrice(_calculateProductPriceMock.Object); + + // Assign + var expectedPrice = 5.50; + + // Act + var price = calculatePriceService.Calculate(_cart); + + // Assert + Assert.AreEqual(expectedPrice, price); + } + + [Test] + public void CalculatePrice_ShouldRoundDown_WhenGivenThreeDecimals() + { + // Assemble + _calculateProductPriceMock.Setup(mock => mock.Calculate(_cart.Products[0])).Returns(5.494); + var calculatePriceService = new CalculateCartPrice(_calculateProductPriceMock.Object); + + // Assign + var expectedPrice = 5.49; + + // Act + var price = calculatePriceService.Calculate(_cart); + + // Assert + Assert.AreEqual(expectedPrice, price); + } + } +} diff --git a/SuperMarketApp/Service.Tests/CalculateProductPriceTests.cs b/SuperMarketApp/Service.Tests/CalculateProductPriceTests.cs new file mode 100644 index 0000000..e0223cb --- /dev/null +++ b/SuperMarketApp/Service.Tests/CalculateProductPriceTests.cs @@ -0,0 +1,75 @@ +using NUnit.Framework; +using Service.Enum; +using Service.Interfaces; +using Service.Models; +using Service.Services; +using System; + +namespace Service.Tests +{ + public class CalculateProductPriceTests + { + private ICalculateProductPrice _calculateProductPrice; + + [SetUp] + public void SetUp() + { + _calculateProductPrice = new CalculateProductPrice(); + } + + [Test] + public void CalculateProductPrice_ShouldReturnProductPrice_WhenNoDiscount() + { + // Assemble + var product = new Product("Kaaaas", 123, 5.49, Discount.NoDiscount); + + // Act + var price = _calculateProductPrice.Calculate(product); + + // Assert + Assert.AreEqual(product.Price, price); + } + + [Test] + public void CalculateProductPrice_ShouldReturnPriceWithBonusDiscount_WhenGivenBonusDiscount() + { + // Assemble + var product = new Product("Kaaaas", 123, 5.49, Discount.Bonus); + + // Assign + var expectedPrice = product.Price * Constants.BonusDiscount; + + // Act + var price = _calculateProductPrice.Calculate(product); + + // Assert + Assert.AreEqual(expectedPrice, price); + } + + [Test] + public void CalculateProductPrice_ShouldReturnPriceWithExpiryDiscount_WhenGivenExpiryDiscount() + { + // Assemble + var product = new Product("Kaaaas", 123, 5.49, Discount.Expiry); + + // Assign + var expectedPrice = product.Price * Constants.ExpiryDiscount; + + // Act + var price = _calculateProductPrice.Calculate(product); + + // Assert + Assert.AreEqual(expectedPrice, price); + } + + [Test] + public void CalculateProductPrice_ShouldThrowNullReferenceExpcetion_WhenGivenNullProduct() + { + Exception ex = Assert.Throws(delegate + { + _calculateProductPrice.Calculate(null); + }); + Assert.AreEqual("given product is null!", ex.Message.ToLower()); + } + } +} diff --git a/SuperMarketApp/Service.Tests/RegisterServiceTests.cs b/SuperMarketApp/Service.Tests/RegisterServiceTests.cs new file mode 100644 index 0000000..669e928 --- /dev/null +++ b/SuperMarketApp/Service.Tests/RegisterServiceTests.cs @@ -0,0 +1,42 @@ +using Moq; +using NUnit.Framework; +using Service.Interfaces; +using Service.Models; +using Service.Services; + +namespace Service.Tests +{ + public class RegisterServiceTests + { + private Mock _calculatePriceServiceMock; + + private Cart _cart; + + [SetUp] + public void Setup() + { + _calculatePriceServiceMock = new Mock(); + + _cart = new Cart(); + _cart.AddToCart(new Product("Kaas", 156734, 4.99)); + _cart.AddToCart(new Product("Ham", 579843, 1.49)); + _cart.AddToCart(new Product("Melk", 378941, 0.99)); + _cart.AddToCart(new Product("Pizza", 739214, 4.59)); + _cart.AddToCart(new Product("WC papier", 798234, 1.12)); + } + + [Test] + public void Register_ShouldPass_WhenCheckOut() + { + // Assemble + _calculatePriceServiceMock.Setup(mock => mock.Calculate(_cart)); + var registerService = new RegisterService(_calculatePriceServiceMock.Object); + + // Act + registerService.CheckOut(_cart); + + // Assert + _calculatePriceServiceMock.Verify(mock => mock.Calculate(_cart), Times.Once); + } + } +} \ No newline at end of file diff --git a/SuperMarketApp/Service.Tests/Service.Tests.csproj b/SuperMarketApp/Service.Tests/Service.Tests.csproj new file mode 100644 index 0000000..710cc66 --- /dev/null +++ b/SuperMarketApp/Service.Tests/Service.Tests.csproj @@ -0,0 +1,20 @@ + + + + netcoreapp3.1 + + false + + + + + + + + + + + + + + diff --git a/SuperMarketApp/Service/Constants.cs b/SuperMarketApp/Service/Constants.cs new file mode 100644 index 0000000..d451e3a --- /dev/null +++ b/SuperMarketApp/Service/Constants.cs @@ -0,0 +1,8 @@ +namespace Service +{ + public static class Constants + { + public const double BonusDiscount = 0.8; + public const double ExpiryDiscount = 0.65; + } +} diff --git a/SuperMarketApp/Service/Enum/Discount.cs b/SuperMarketApp/Service/Enum/Discount.cs new file mode 100644 index 0000000..9f18f04 --- /dev/null +++ b/SuperMarketApp/Service/Enum/Discount.cs @@ -0,0 +1,9 @@ +namespace Service.Enum +{ + public enum Discount + { + NoDiscount, + Bonus, + Expiry + } +} diff --git a/SuperMarketApp/Service/Interfaces/ICalculateCartPrice.cs b/SuperMarketApp/Service/Interfaces/ICalculateCartPrice.cs new file mode 100644 index 0000000..136600c --- /dev/null +++ b/SuperMarketApp/Service/Interfaces/ICalculateCartPrice.cs @@ -0,0 +1,9 @@ +using Service.Models; + +namespace Service.Interfaces +{ + public interface ICalculateCartPrice + { + double Calculate(Cart cart); + } +} diff --git a/SuperMarketApp/Service/Interfaces/ICalculateProductPrice.cs b/SuperMarketApp/Service/Interfaces/ICalculateProductPrice.cs new file mode 100644 index 0000000..f58f974 --- /dev/null +++ b/SuperMarketApp/Service/Interfaces/ICalculateProductPrice.cs @@ -0,0 +1,9 @@ +using Service.Models; + +namespace Service.Interfaces +{ + public interface ICalculateProductPrice + { + double Calculate(Product product); + } +} diff --git a/SuperMarketApp/Service/Interfaces/IRegisterService.cs b/SuperMarketApp/Service/Interfaces/IRegisterService.cs new file mode 100644 index 0000000..1540bec --- /dev/null +++ b/SuperMarketApp/Service/Interfaces/IRegisterService.cs @@ -0,0 +1,9 @@ +using Service.Models; + +namespace Service.Interfaces +{ + public interface IRegisterService + { + string CheckOut(Cart cart); + } +} diff --git a/SuperMarketApp/Service/Models/Cart.cs b/SuperMarketApp/Service/Models/Cart.cs new file mode 100644 index 0000000..21447e0 --- /dev/null +++ b/SuperMarketApp/Service/Models/Cart.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace Service.Models +{ + public class Cart + { + public List Products { get; set; } = new List(); + + public void AddToCart(Product product) => Products.Add(product); + } +} diff --git a/SuperMarketApp/Service/Models/Product.cs b/SuperMarketApp/Service/Models/Product.cs new file mode 100644 index 0000000..7c51df1 --- /dev/null +++ b/SuperMarketApp/Service/Models/Product.cs @@ -0,0 +1,20 @@ +using Service.Enum; + +namespace Service.Models +{ + public class Product + { + public string Name { get; set; } + public int Barcode { get; set; } + public double Price { get; set; } + public Discount Discount { get; set; } + + public Product(string name, int barcode, double price, Discount discount = Discount.NoDiscount) + { + Name = name; + Barcode = barcode; + Price = price; + Discount = discount; + } + } +} diff --git a/SuperMarketApp/Service/Register.cs b/SuperMarketApp/Service/Register.cs new file mode 100644 index 0000000..a41ad00 --- /dev/null +++ b/SuperMarketApp/Service/Register.cs @@ -0,0 +1,16 @@ +using Microsoft.Extensions.DependencyInjection; +using Service.Interfaces; +using Service.Services; + +namespace Service +{ + public class Register + { + public void ConfigureServices(IServiceCollection serviceColletion) + { + serviceColletion.AddScoped(); + serviceColletion.AddScoped(); + serviceColletion.AddScoped(); + } + } +} diff --git a/SuperMarketApp/Service/Service.csproj b/SuperMarketApp/Service/Service.csproj new file mode 100644 index 0000000..bfb1318 --- /dev/null +++ b/SuperMarketApp/Service/Service.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.0 + + + + + + + diff --git a/SuperMarketApp/Service/Services/CalculateCartPrice.cs b/SuperMarketApp/Service/Services/CalculateCartPrice.cs new file mode 100644 index 0000000..16cf1ff --- /dev/null +++ b/SuperMarketApp/Service/Services/CalculateCartPrice.cs @@ -0,0 +1,29 @@ +using Service.Interfaces; +using Service.Models; +using System; + +namespace Service.Services +{ + public class CalculateCartPrice : ICalculateCartPrice + { + private readonly ICalculateProductPrice _calculateProductPrice; + + public CalculateCartPrice(ICalculateProductPrice calculateProductPrice) + { + _calculateProductPrice = calculateProductPrice; + } + + public double Calculate(Cart cart) + { + double totalPrice = new double(); + + foreach (var product in cart.Products) + { + totalPrice += _calculateProductPrice.Calculate(product); + } + + totalPrice = Math.Round(totalPrice, 2); + return totalPrice; + } + } +} diff --git a/SuperMarketApp/Service/Services/CalculateProductPrice.cs b/SuperMarketApp/Service/Services/CalculateProductPrice.cs new file mode 100644 index 0000000..36ff06b --- /dev/null +++ b/SuperMarketApp/Service/Services/CalculateProductPrice.cs @@ -0,0 +1,33 @@ +using Service.Enum; +using Service.Interfaces; +using Service.Models; +using System; + +namespace Service.Services +{ + public class CalculateProductPrice : ICalculateProductPrice + { + public double Calculate(Product product) + { + if (product == null) + { + throw new NullReferenceException("Given product is null!"); + } + + switch (product.Discount) + { + case Discount.NoDiscount: + return product.Price; + + case Discount.Bonus: + return product.Price * Constants.BonusDiscount; + + case Discount.Expiry: + return product.Price * Constants.ExpiryDiscount; + + default: + throw new ArgumentOutOfRangeException($"Incorrect enum received. Actual: {product.Discount}"); + } + } + } +} diff --git a/SuperMarketApp/Service/Services/RegisterService.cs b/SuperMarketApp/Service/Services/RegisterService.cs new file mode 100644 index 0000000..76f7b57 --- /dev/null +++ b/SuperMarketApp/Service/Services/RegisterService.cs @@ -0,0 +1,24 @@ +using Service.Interfaces; +using Service.Models; +using System; + +namespace Service.Services +{ + public class RegisterService : IRegisterService + { + private readonly ICalculateCartPrice _calculateCartPriceService; + + public RegisterService(ICalculateCartPrice calculatePriceService) + { + _calculateCartPriceService = calculatePriceService; + } + + public string CheckOut(Cart cart) + { + var totalPrice = _calculateCartPriceService.Calculate(cart); + var receipt = $"Totaalbedrag: {totalPrice}"; + Console.WriteLine(receipt); + return receipt; + } + } +} diff --git a/SuperMarketApp/SuperMarketApp.sln b/SuperMarketApp/SuperMarketApp.sln new file mode 100644 index 0000000..357169f --- /dev/null +++ b/SuperMarketApp/SuperMarketApp.sln @@ -0,0 +1,42 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30523.141 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Service", "Service\Service.csproj", "{FDEFC02D-18CD-47D9-A9AC-94FE71047AA4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{466BD4C1-9182-4347-B426-371830266249}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Service.Tests", "Service.Tests\Service.Tests.csproj", "{84DDE245-68B9-4BA1-B758-2E907BF69762}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Service.IntegrationTests", "IntegrationTests\Service.IntegrationTests.csproj", "{81FC6458-DA07-496A-BCB5-D62A8516B157}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FDEFC02D-18CD-47D9-A9AC-94FE71047AA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDEFC02D-18CD-47D9-A9AC-94FE71047AA4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDEFC02D-18CD-47D9-A9AC-94FE71047AA4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDEFC02D-18CD-47D9-A9AC-94FE71047AA4}.Release|Any CPU.Build.0 = Release|Any CPU + {84DDE245-68B9-4BA1-B758-2E907BF69762}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84DDE245-68B9-4BA1-B758-2E907BF69762}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84DDE245-68B9-4BA1-B758-2E907BF69762}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84DDE245-68B9-4BA1-B758-2E907BF69762}.Release|Any CPU.Build.0 = Release|Any CPU + {81FC6458-DA07-496A-BCB5-D62A8516B157}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81FC6458-DA07-496A-BCB5-D62A8516B157}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81FC6458-DA07-496A-BCB5-D62A8516B157}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81FC6458-DA07-496A-BCB5-D62A8516B157}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A08FAFC0-9D12-4317-A70F-93D7D2AA2402} + EndGlobalSection +EndGlobal