diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 2c9bb1e67..b9365ef64 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -295,6 +295,9 @@ + + + @@ -1142,6 +1145,25 @@ + + + + + + + + + + + + + + + + + + + @@ -1795,9 +1817,11 @@ + + diff --git a/DiscImageChef.Database/DTOs/SyncDTO.cs b/DiscImageChef.Database/DTOs/SyncDTO.cs new file mode 100644 index 000000000..05ce250e5 --- /dev/null +++ b/DiscImageChef.Database/DTOs/SyncDTO.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using DiscImageChef.Database.Models; + +namespace DiscImageChef.Database.DTOs +{ + public class SyncDTO + { + List UsbProducts; + List UsbVendors; + } +} \ No newline at end of file diff --git a/DiscImageChef.Database/DiscImageChef.Database.csproj b/DiscImageChef.Database/DiscImageChef.Database.csproj index f0b4713a7..46a2a5218 100644 --- a/DiscImageChef.Database/DiscImageChef.Database.csproj +++ b/DiscImageChef.Database/DiscImageChef.Database.csproj @@ -58,6 +58,7 @@ + diff --git a/DiscImageChef.Database/Models/CdOffset.cs b/DiscImageChef.Database/Models/CdOffset.cs index b9b4a3a6b..970b4059a 100644 --- a/DiscImageChef.Database/Models/CdOffset.cs +++ b/DiscImageChef.Database/Models/CdOffset.cs @@ -49,6 +49,16 @@ namespace DiscImageChef.Database.Models AddedWhen = ModifiedWhen = DateTime.UtcNow; } + public CdOffset(CommonTypes.Metadata.CdOffset offset) + { + Manufacturer = offset.Manufacturer; + Model = offset.Model; + Offset = offset.Offset; + Submissions = offset.Submissions; + Agreement = offset.Agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + public int Id { get; set; } public DateTime AddedWhen { get; set; } [Index] diff --git a/DiscImageChef.Database/Models/UsbProduct.cs b/DiscImageChef.Database/Models/UsbProduct.cs index 29bd1805e..62aa98139 100644 --- a/DiscImageChef.Database/Models/UsbProduct.cs +++ b/DiscImageChef.Database/Models/UsbProduct.cs @@ -42,6 +42,7 @@ namespace DiscImageChef.Database.Models public UsbProduct(ushort vendorId, ushort id, string product) { + VendorId = vendorId; ProductId = id; Product = product; AddedWhen = ModifiedWhen = DateTime.UtcNow; diff --git a/DiscImageChef.Dto/CdOffsetDto.cs b/DiscImageChef.Dto/CdOffsetDto.cs new file mode 100644 index 000000000..c5af8f04f --- /dev/null +++ b/DiscImageChef.Dto/CdOffsetDto.cs @@ -0,0 +1,53 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : CdOffset.cs +// Author(s) : Natalia Portillo +// +// Component : Database. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing Compact Disc read offsets in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using DiscImageChef.CommonTypes.Metadata; + +namespace DiscImageChef.Dto +{ + public class CdOffsetDto : CdOffset + { + public CdOffsetDto() { } + + public CdOffsetDto(CdOffset offset, int id) + { + Manufacturer = offset.Manufacturer; + Model = offset.Model; + Offset = offset.Offset; + Submissions = offset.Submissions; + Agreement = offset.Agreement; + Id = id; + } + + public int Id { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Dto/DeviceDto.cs b/DiscImageChef.Dto/DeviceDto.cs new file mode 100644 index 000000000..cddb798d2 --- /dev/null +++ b/DiscImageChef.Dto/DeviceDto.cs @@ -0,0 +1,225 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Device.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing processed device reports in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System.Collections.Generic; +using DiscImageChef.CommonTypes.Metadata; + +// ReSharper disable VirtualMemberCallInConstructor + +namespace DiscImageChef.Server.Models +{ + public class DeviceDto : DeviceReportV2 + { + public DeviceDto(DeviceReportV2 report) + { + ATA = report.ATA; + ATAPI = report.ATAPI; + CompactFlash = report.CompactFlash; + FireWire = report.FireWire; + MultiMediaCard = report.MultiMediaCard; + PCMCIA = report.PCMCIA; + SCSI = report.SCSI; + SecureDigital = report.SecureDigital; + USB = report.USB; + Manufacturer = report.Manufacturer; + Model = report.Model; + Revision = report.Revision; + Type = report.Type; + } + + public DeviceDto(DeviceReportV2 report, int id) + { + ATA = report.ATA; + ATAPI = report.ATAPI; + CompactFlash = report.CompactFlash; + FireWire = report.FireWire; + MultiMediaCard = report.MultiMediaCard; + PCMCIA = report.PCMCIA; + SCSI = report.SCSI; + SecureDigital = report.SecureDigital; + USB = report.USB; + Manufacturer = report.Manufacturer; + Model = report.Model; + Revision = report.Revision; + Type = report.Type; + + if(ATA != null) + { + ATA.Identify = null; + ATA.ReadCapabilities = ClearBinaries(ATA.ReadCapabilities); + if(ATA.RemovableMedias != null) + { + TestedMedia[] medias = ATA.RemovableMedias.ToArray(); + ATA.RemovableMedias = new List(); + foreach(TestedMedia media in medias) ATA.RemovableMedias.Add(ClearBinaries(media)); + } + } + + if(ATAPI != null) + { + ATAPI.Identify = null; + ATAPI.ReadCapabilities = ClearBinaries(ATAPI.ReadCapabilities); + if(ATAPI.RemovableMedias != null) + { + TestedMedia[] medias = ATAPI.RemovableMedias.ToArray(); + ATAPI.RemovableMedias = new List(); + foreach(TestedMedia media in medias) ATAPI.RemovableMedias.Add(ClearBinaries(media)); + } + } + + if(PCMCIA != null) + { + PCMCIA.AdditionalInformation = null; + PCMCIA.CIS = null; + } + + MultiMediaCard = null; + SecureDigital = null; + + if(SCSI != null) + { + SCSI.EVPDPages = null; + SCSI.InquiryData = null; + SCSI.ModeSense6Data = null; + SCSI.ModeSense10Data = null; + SCSI.ReadCapabilities = ClearBinaries(SCSI.ReadCapabilities); + + if(SCSI.ModeSense != null) + { + SCSI.ModeSense.BlockDescriptors = null; + SCSI.ModeSense.ModePages = null; + } + + if(SCSI.RemovableMedias != null) + { + TestedMedia[] medias = SCSI.RemovableMedias.ToArray(); + SCSI.RemovableMedias = new List(); + foreach(TestedMedia media in medias) SCSI.RemovableMedias.Add(ClearBinaries(media)); + } + + if(SCSI.MultiMediaDevice != null) + { + SCSI.MultiMediaDevice.ModeSense2AData = null; + + if(SCSI.MultiMediaDevice.Features != null) SCSI.MultiMediaDevice.Features.BinaryData = null; + + if(SCSI.MultiMediaDevice.TestedMedia != null) + { + TestedMedia[] medias = SCSI.MultiMediaDevice.TestedMedia.ToArray(); + SCSI.MultiMediaDevice.TestedMedia = new List(); + foreach(TestedMedia media in medias) + SCSI.MultiMediaDevice.TestedMedia.Add(ClearBinaries(media)); + } + } + + SCSI.SequentialDevice = null; + } + + if(USB != null) USB.Descriptors = null; + + Id = id; + } + + public new int Id { get; set; } + + static TestedMedia ClearBinaries(TestedMedia media) + { + if(media is null) return null; + + media.AdipData = null; + media.AtipData = null; + media.BluBcaData = null; + media.BluDdsData = null; + media.BluDiData = null; + media.BluPacData = null; + media.BluSaiData = null; + media.C2PointersData = null; + media.CmiData = null; + media.CorrectedSubchannelData = null; + media.CorrectedSubchannelWithC2Data = null; + media.DcbData = null; + media.DmiData = null; + media.DvdAacsData = null; + media.DvdBcaData = null; + media.DvdDdsData = null; + media.DvdLayerData = null; + media.DvdSaiData = null; + media.EmbossedPfiData = null; + media.FullTocData = null; + media.HdCmiData = null; + media.HLDTSTReadRawDVDData = null; + media.IdentifyData = null; + media.LeadInData = null; + media.LeadOutData = null; + media.ModeSense6Data = null; + media.ModeSense10Data = null; + media.NecReadCddaData = null; + media.PfiData = null; + media.PioneerReadCddaData = null; + media.PioneerReadCddaMsfData = null; + media.PlextorReadCddaData = null; + media.PlextorReadRawDVDData = null; + media.PmaData = null; + media.PQSubchannelData = null; + media.PQSubchannelWithC2Data = null; + media.PriData = null; + media.Read6Data = null; + media.Read10Data = null; + media.Read12Data = null; + media.Read16Data = null; + media.ReadCdData = null; + media.ReadCdFullData = null; + media.ReadCdMsfData = null; + media.ReadCdMsfFullData = null; + media.ReadDmaData = null; + media.ReadDmaLba48Data = null; + media.ReadDmaLbaData = null; + media.ReadDmaRetryData = null; + media.ReadLba48Data = null; + media.ReadLbaData = null; + media.ReadLong10Data = null; + media.ReadLong16Data = null; + media.ReadLongData = null; + media.ReadLongLbaData = null; + media.ReadLongRetryData = null; + media.ReadLongRetryLbaData = null; + media.ReadRetryLbaData = null; + media.ReadSectorsData = null; + media.ReadSectorsRetryData = null; + media.RWSubchannelData = null; + media.RWSubchannelWithC2Data = null; + media.TocData = null; + media.Track1PregapData = null; + return media; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Dto/DiscImageChef.Dto.csproj b/DiscImageChef.Dto/DiscImageChef.Dto.csproj new file mode 100644 index 000000000..99049d1e1 --- /dev/null +++ b/DiscImageChef.Dto/DiscImageChef.Dto.csproj @@ -0,0 +1,77 @@ + + + + Debug + AnyCPU + 2.0 + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2} + Library + DiscImageChef.Dto + DiscImageChef.Dto + $(Version) + false + true + 4.5.99.1693 + Claunia.com + Copyright © 2011-2019 Natalia Portillo + The Disc Image Chef + DiscImageChef.Dto + $(Version) + net461;netstandard2.0 + + + $(Version)-{chash:8} built by {mname} in $(Configuration){!:, modified} + true + true + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + false + + + full + true + bin\Release + prompt + 4 + false + + + + + + + LICENSE.LGPL + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DiscImageChef.Dto/SyncDto.cs b/DiscImageChef.Dto/SyncDto.cs new file mode 100644 index 000000000..ce3186d6a --- /dev/null +++ b/DiscImageChef.Dto/SyncDto.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using DiscImageChef.Server.Models; + +namespace DiscImageChef.Dto +{ + public class SyncDto + { + public List UsbVendors { get; set; } + public List UsbProducts { get; set; } + public List Offsets { get; set; } + public List Devices { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Dto/UsbProductDto.cs b/DiscImageChef.Dto/UsbProductDto.cs new file mode 100644 index 000000000..e6f2daf4e --- /dev/null +++ b/DiscImageChef.Dto/UsbProductDto.cs @@ -0,0 +1,42 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UsbProduct.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing USB product identifiers in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Dto +{ + public class UsbProductDto + { + public int Id { get; set; } + public ushort ProductId { get; set; } + public string Product { get; set; } + public ushort VendorId { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Dto/UsbVendorDto.cs b/DiscImageChef.Dto/UsbVendorDto.cs new file mode 100644 index 000000000..56f6424b8 --- /dev/null +++ b/DiscImageChef.Dto/UsbVendorDto.cs @@ -0,0 +1,40 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UsbVendor.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Model for storing USB vendor identifiers in database. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +namespace DiscImageChef.Dto +{ + public class UsbVendorDto + { + public ushort VendorId { get; set; } + public string Vendor { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Controllers/UpdateController.cs b/DiscImageChef.Server/Controllers/UpdateController.cs new file mode 100644 index 000000000..7892f8059 --- /dev/null +++ b/DiscImageChef.Server/Controllers/UpdateController.cs @@ -0,0 +1,98 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : UploadReportController.cs +// Author(s) : Natalia Portillo +// +// Component : DiscImageChef Server. +// +// --[ Description ] ---------------------------------------------------------- +// +// Handles report uploads. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Web.Http; +using DiscImageChef.CommonTypes.Metadata; +using DiscImageChef.Dto; +using DiscImageChef.Server.Models; +using Newtonsoft.Json; + +namespace DiscImageChef.Server.Controllers +{ + public class UpdateController : ApiController + { + /// + /// Receives a report from DiscImageChef.Core, verifies it's in the correct format and stores it on the server + /// + /// HTTP response + [Route("api/update")] + [HttpGet] + public HttpResponseMessage UploadReport(long timestamp) + { + DicServerContext ctx = new DicServerContext(); + + SyncDto sync = new SyncDto(); + DateTime lastSync = DateHandlers.UnixToDateTime(timestamp); + + sync.UsbVendors = new List(); + foreach(UsbVendor vendor in ctx.UsbVendors.Where(v => v.ModifiedWhen > lastSync)) + sync.UsbVendors.Add(new UsbVendorDto {VendorId = (ushort)vendor.VendorId, Vendor = vendor.Vendor}); + + sync.UsbProducts = new List(); + foreach(UsbProduct product in ctx.UsbProducts.Where(p => p.ModifiedWhen > lastSync)) + sync.UsbProducts.Add(new UsbProductDto + { + Id = product.Id, + Product = product.Product, + ProductId = (ushort)product.ProductId, + VendorId = (ushort)product.VendorId + }); + + sync.Offsets = new List(); + foreach(CompactDiscOffset offset in ctx.CdOffsets.Where(o => o.ModifiedWhen > lastSync)) + sync.Offsets.Add(new CdOffsetDto(offset, offset.Id)); + + sync.Devices = new List(); + foreach(Device device in ctx.Devices.Where(d => d.ModifiedWhen > lastSync).ToList()) + sync.Devices.Add(new + DeviceDto(JsonConvert.DeserializeObject(JsonConvert.SerializeObject(device)), + device.Id)); + + JsonSerializer js = JsonSerializer.Create(); + StringWriter sw = new StringWriter(); + js.Serialize(sw, sync); + + return new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(sw.ToString(), Encoding.UTF8, "application/json") + }; + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj index 3617349ab..54497b3b6 100644 --- a/DiscImageChef.Server/DiscImageChef.Server.csproj +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -210,6 +210,7 @@ + @@ -336,6 +337,10 @@ {0beb3088-b634-4289-ae17-cdf2d25d00d5} DiscImageChef.Decoders + + {f4399ff5-9bd0-475a-9ea7-3dae45291fe2} + DiscImageChef.Dto + {f8bdf57b-1571-4cd0-84b3-b422088d359a} DiscImageChef.Helpers @@ -376,6 +381,9 @@ 201812252219066_StoreReadResultsInReportDatabase.cs + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) diff --git a/DiscImageChef.Server/Models/CdOffset.cs b/DiscImageChef.Server/Models/CdOffset.cs index dfb8d1050..b17c858a1 100644 --- a/DiscImageChef.Server/Models/CdOffset.cs +++ b/DiscImageChef.Server/Models/CdOffset.cs @@ -51,6 +51,16 @@ namespace DiscImageChef.Server.Models AddedWhen = ModifiedWhen = DateTime.UtcNow; } + public CompactDiscOffset(CdOffset offset) + { + Manufacturer = offset.Manufacturer; + Model = offset.Model; + Offset = offset.Offset; + Submissions = offset.Submissions; + Agreement = offset.Agreement; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + public int Id { get; set; } public DateTime AddedWhen { get; set; } [Index] diff --git a/DiscImageChef.Server/Models/UsbProduct.cs b/DiscImageChef.Server/Models/UsbProduct.cs index b19582324..5ac8948d9 100644 --- a/DiscImageChef.Server/Models/UsbProduct.cs +++ b/DiscImageChef.Server/Models/UsbProduct.cs @@ -33,6 +33,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; namespace DiscImageChef.Server.Models { @@ -57,7 +58,8 @@ namespace DiscImageChef.Server.Models [Index] public DateTime ModifiedWhen { get; set; } [Index] - public int VendorId { get; set; } + public int VendorId { get; set; } + [JsonIgnore] public virtual UsbVendor Vendor { get; set; } } } \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbVendor.cs b/DiscImageChef.Server/Models/UsbVendor.cs index 571e8c3e2..3ad9766c1 100644 --- a/DiscImageChef.Server/Models/UsbVendor.cs +++ b/DiscImageChef.Server/Models/UsbVendor.cs @@ -34,6 +34,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Newtonsoft.Json; namespace DiscImageChef.Server.Models { @@ -57,6 +58,7 @@ namespace DiscImageChef.Server.Models [Index] public DateTime ModifiedWhen { get; set; } + [JsonIgnore] public virtual ICollection Products { get; set; } } } \ No newline at end of file diff --git a/DiscImageChef.sln b/DiscImageChef.sln index 5c54bf4ca..b1594c9da 100644 --- a/DiscImageChef.sln +++ b/DiscImageChef.sln @@ -45,6 +45,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Server", "Dis EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Server.Task", "DiscImageChef.Server.Task\DiscImageChef.Server.Task.csproj", "{79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscImageChef.Dto", "DiscImageChef.Dto\DiscImageChef.Dto.csproj", "{F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -221,6 +223,14 @@ Global {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Release|Any CPU.Build.0 = Release|Any CPU {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Release|x86.ActiveCfg = Release|Any CPU {79D6A54E-47B6-4D0A-ABEB-4FA7B5ADF4B2}.Release|x86.Build.0 = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Debug|x86.Build.0 = Debug|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|Any CPU.Build.0 = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|x86.ActiveCfg = Release|Any CPU + {F4399FF5-9BD0-475A-9EA7-3DAE45291FE2}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE