diff --git a/Accounting.BLI/Accounting.BLI.csproj b/Accounting.BLI/Accounting.BLI.csproj
new file mode 100644
index 0000000..d6224ca
--- /dev/null
+++ b/Accounting.BLI/Accounting.BLI.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/Accounting.BLI/IAccountRecords.cs b/Accounting.BLI/IAccountRecords.cs
new file mode 100644
index 0000000..fcf9096
--- /dev/null
+++ b/Accounting.BLI/IAccountRecords.cs
@@ -0,0 +1,16 @@
+using Accounting.Models;
+
+namespace Accounting.BLI
+{
+ public interface IAccountRecords
+ {
+ bool AddAccountRecord(AccountRecord record);
+ AccountRecord SaveAcountRecord(AccountRecord record);
+ bool DeleteAccountRecord(AccountRecord record);
+ bool DeleteAllAccountRecords();
+ IEnumerable GetAllAccBetweenDates(DateTime dateFrom, DateTime dateTo);
+ IEnumerable GetAllAccounts();
+ AccountRecord GetAccount(int id);
+ AccountRecord GetAccountByDateBelKonto(DateTime _date, double _belopp, string _konto);
+ }
+}
diff --git a/Accounting.BLI/IExcellent.cs b/Accounting.BLI/IExcellent.cs
new file mode 100644
index 0000000..d62590f
--- /dev/null
+++ b/Accounting.BLI/IExcellent.cs
@@ -0,0 +1,13 @@
+namespace Accounting.BLI
+{
+ public interface IExcellent
+ {
+ int Columns { get; set; }
+ string DataType { get; set; }
+ int Rows { get; set; }
+
+ void Dispose();
+ void ExcellentStart(string path, int Sheet);
+ string ReadCell(int i, int j);
+ }
+}
diff --git a/Accounting.BLI/IReadingIn.cs b/Accounting.BLI/IReadingIn.cs
new file mode 100644
index 0000000..439aec5
--- /dev/null
+++ b/Accounting.BLI/IReadingIn.cs
@@ -0,0 +1,11 @@
+using Accounting.Models;
+
+namespace Accounting.BLI
+{
+ public interface IReadingIn
+ {
+ bool ReadAndSaveInvoices(string fullFileName);
+ IEnumerable readXLS(string FilePath);
+ void Dispose();
+ }
+}
diff --git a/Accounting.BLR/AccountRecords.cs b/Accounting.BLR/AccountRecords.cs
new file mode 100644
index 0000000..fa5d5b1
--- /dev/null
+++ b/Accounting.BLR/AccountRecords.cs
@@ -0,0 +1,139 @@
+using Accounting.BLI;
+using Accounting.DAL;
+using Accounting.Models;
+using Microsoft.Extensions.Logging;
+
+namespace Accounting.BLR
+{
+ public class AccountRecords : IAccountRecords
+ {
+ private readonly DataContext _dataContext;
+ private readonly ILogger _logger;
+
+ public AccountRecords(DataContext dataContext, ILogger logger)
+ {
+ _dataContext = dataContext;
+ _logger = logger;
+ }
+
+
+ public bool AddAccountRecord(AccountRecord record)
+ {
+ try
+ {
+ _dataContext.AccountRecords.Add(record);
+ _dataContext.SaveChanges();
+ return true;
+ }
+ catch (Exception e)
+ {
+ _logger.LogError("Error occured in AddAccountRecord :-->{iMessage}", e.Message);
+ }
+ return false;
+
+ }
+
+ public AccountRecord SaveAcountRecord(AccountRecord record)
+ {
+ try
+ {
+ var entity = (from account in _dataContext.AccountRecords
+ where account.Id == record.Id
+ select account).FirstOrDefault();
+ if (entity == null)
+ {
+ entity = new AccountRecord();
+ _dataContext.AccountRecords.Add(entity);
+ }
+ else
+ {
+ entity.Stored = record.Stored;
+ }
+
+ entity.Avisering = record.Avisering;
+ entity.BetalDatum = record.BetalDatum;
+ entity.Belopp = record.Belopp;
+ entity.Konto = record.Konto;
+ entity.Mottagare = record.Mottagare;
+
+ _dataContext.SaveChanges();
+
+ record.Id = entity.Id;
+
+ return entity;
+ }
+ catch (Exception e)
+ {
+ _logger.LogError("Error occured in SaveAccountRecord :-->{iMessage}", e.Message);
+ return null;
+ }
+
+ }
+
+ public bool DeleteAccountRecord(AccountRecord record)
+ {
+ try
+ {
+ _dataContext.AccountRecords.Remove(record);
+ _dataContext.SaveChanges();
+ return true;
+ }
+ catch (Exception e)
+ {
+ _logger.LogError("Error occured in DeleteAccountRecord :-->{iMessage}", e.Message);
+ }
+ return false;
+ }
+
+ public bool DeleteAllAccountRecords()
+ {
+ try
+ {
+ var all = from c in _dataContext.AccountRecords select c;
+ _dataContext.AccountRecords.RemoveRange(all);
+ _dataContext.SaveChanges();
+ return true;
+ }
+ catch (Exception e)
+ {
+ _logger.LogError("Error occured in DeleteAllAccountRecord :-->{iMessage}", e.Message);
+ }
+ return false;
+ }
+ public IEnumerable GetAllAccBetweenDates(DateTime dateFrom, DateTime dateTo)
+ {
+ IEnumerable result = null;
+ result = (from acc in _dataContext.AccountRecords
+ where acc.BetalDatum > dateFrom && acc.BetalDatum < dateTo
+ orderby acc.Mottagare, acc.BetalDatum descending
+ select new AccountRecord
+ {
+ Id = acc.Id,
+ BetalDatum = acc.BetalDatum,
+ Mottagare = acc.Mottagare,
+ Avisering = acc.Avisering,
+ Belopp = acc.Belopp,
+ Konto = acc.Konto,
+ Stored = acc.Stored
+ }).ToList();
+ return result;
+ }
+
+ public IEnumerable GetAllAccounts()
+ {
+ return _dataContext.AccountRecords;
+ }
+
+ public AccountRecord GetAccount(int id)
+ {
+ var accountRec = _dataContext.AccountRecords.FirstOrDefault(a => a.Id == id);
+ return accountRec;
+ }
+
+ public AccountRecord GetAccountByDateBelKonto(DateTime _date, double _belopp, string _konto)
+ {
+ var accountRec = _dataContext.AccountRecords.FirstOrDefault(a => a.BetalDatum == _date && a.Belopp == _belopp && a.Konto == _konto);
+ return accountRec;
+ }
+ }
+}
diff --git a/Accounting.BLR/Accounting.BLR.csproj b/Accounting.BLR/Accounting.BLR.csproj
new file mode 100644
index 0000000..41c9ddd
--- /dev/null
+++ b/Accounting.BLR/Accounting.BLR.csproj
@@ -0,0 +1,26 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+ tlbimp
+ 9
+ 1
+ 00020813-0000-0000-c000-000000000046
+ 0
+ false
+ true
+
+
+
+
+
+
+
+
+
diff --git a/Accounting.BLR/Excellent.cs b/Accounting.BLR/Excellent.cs
new file mode 100644
index 0000000..d849484
--- /dev/null
+++ b/Accounting.BLR/Excellent.cs
@@ -0,0 +1,61 @@
+using Accounting.BLI;
+using Microsoft.Extensions.Logging;
+using Microsoft.Office.Interop.Excel;
+using _Excel = Microsoft.Office.Interop.Excel;
+
+namespace Accounting.BLR
+{
+ public class Excellent : IDisposable, IExcellent
+ {
+ string path = string.Empty;
+ _Application excel = new _Excel.Application();
+ Workbook wb;
+ Worksheet ws;
+ private readonly ILogger _logger;
+ public int Columns { get; set; }
+ public int Rows { get; set; }
+ public string DataType { get; set; }
+
+ public Excellent(ILogger logger)
+ {
+ _logger = logger;
+ }
+ public void ExcellentStart(string path, int Sheet)
+ {
+ if (wb != null)
+ {
+ wb.Close();
+ }
+ this.path = path;
+ wb = excel.Workbooks.Open(path);
+ ws = wb.Worksheets[Sheet];
+ _Excel.Range usedRange = ws.UsedRange;
+ Columns = usedRange.Columns.Count;
+ Rows = usedRange.Rows.Count;
+ }
+
+ public string ReadCell(int i, int j)
+ {
+ i++;
+ j++;
+ if (ws.Cells[i, j].Value2 != null)
+ {
+ _Excel.Range cell = ws.Cells[i, j];
+ object value = cell.get_Value(Type.Missing);
+ if (value != null)
+ {
+ Type type = value.GetType();
+ DataType = type.Name;
+ //Console.WriteLine($"Cell ({i},{j}) contains value of type {DataType}");
+ }
+ return Convert.ToString(ws.Cells[i, j].Value2);
+ }
+ return string.Empty;
+ }
+
+ public void Dispose()
+ {
+ excel.Workbooks.Close();
+ }
+ }
+}
diff --git a/Accounting.BLR/ReadingIn.cs b/Accounting.BLR/ReadingIn.cs
new file mode 100644
index 0000000..c6d2b13
--- /dev/null
+++ b/Accounting.BLR/ReadingIn.cs
@@ -0,0 +1,169 @@
+using Accounting.BLI;
+using Accounting.Models;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+
+namespace Accounting.BLR
+{
+ public class ReadingIn : IReadingIn, IDisposable
+ {
+ private readonly IConfiguration _configuration;
+ private readonly ILogger _logger;
+ private readonly IAccountRecords _accountRecords;
+ private readonly IExcellent _excellent;
+
+ public ReadingIn(
+ IConfiguration configuration,
+ ILogger logger,
+ IAccountRecords accountRecords,
+ IExcellent excellent)
+ {
+ _configuration = configuration;
+ _logger = logger;
+ _accountRecords = accountRecords;
+ _excellent = excellent;
+ }
+
+ public IEnumerable readXLS(string FilePath)
+ {
+ List records = new List();
+ AccountRecord? record = null;
+ FileInfo existingFile = new FileInfo(FilePath);
+ var fieldNr = 0;
+
+ _excellent.ExcellentStart(existingFile.FullName, 1); ;
+
+ //get the first worksheet in the workbook
+ int colCount = _excellent.Columns;
+ int rowCount = _excellent.Rows; //get row count
+ bool prt = false;
+ for (int row = 0; row <= rowCount; row++)
+ {
+ if (prt)
+ {
+ //Console.WriteLine();
+ record.Id = row;
+ _logger.LogInformation(record.ToString());
+ record.Id = 0;
+ records.Add(record);
+ }
+ prt = false;
+ for (int col = 0; col <= colCount; col++)
+ {
+ var x = _excellent.ReadCell(row, col);
+
+ if (_excellent.ReadCell(row, col) == null)
+ {
+ // Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + "null");
+ }
+ else
+ {
+ if (col == 0 && _excellent.DataType == "DateTime")
+ {
+ prt = true;
+ record = new AccountRecord();
+ fieldNr = 0;
+ }
+ else
+ {
+ if (col == 0)
+ {
+ col = colCount;
+ }
+ }
+ //Console.WriteLine(" Row:" + row + " column:" + col + " Value:" + worksheet.Cells[row, col].Value.ToString().Trim());
+ if (prt)
+ {
+ if (x == "") { }
+ else
+ {
+ fieldNr++;
+
+ // _logger.LogInformation($"{exObject.ReadCell(row, col).ToString().Trim()}/t");
+ switch (fieldNr)
+ {
+ case 1:
+ {
+ record.BetalDatum = DateTime.FromOADate(double.Parse(_excellent.ReadCell(row, col)));
+ break;
+ }
+ case 2:
+ {
+ record.Mottagare = _excellent.ReadCell(row, col).ToString().Trim();
+ break;
+ }
+ case 3:
+ {
+ record.Konto = _excellent.ReadCell(row, col).ToString().Trim();
+ if (record.Konto.ToLower().StartsWith("bg")
+ || record.Konto.ToLower().StartsWith("pg")
+ || record.Konto.ToLower().StartsWith("hs")) { }
+ else
+ {
+ prt = false;
+ col = colCount;
+ }
+ break;
+ }
+ case 4:
+ {
+ record.Belopp = double.Parse(_excellent.ReadCell(row, col).ToString().Trim());
+ break;
+ }
+ case 5:
+ {
+ record.Avisering = _excellent.ReadCell(row, col).ToString().Trim();
+ break;
+ }
+
+ }
+ }
+ }
+ }
+ }
+ }
+ return records;
+ }
+ public bool ReadAndSaveInvoices(string fullFileName)
+ {
+ var result = true;
+ var restab = readXLS(fullFileName);
+ if (restab != null)
+ {
+ //restab.ToList().ForEach(x =>
+ //{
+ // _logger.LogInformation(x.ToString());
+ //});
+
+ try
+ {
+
+ restab.ToList().ForEach(x =>
+ {
+ if (_accountRecords.GetAccountByDateBelKonto(x.BetalDatum, x.Belopp, x.Konto) == null)
+ _accountRecords.AddAccountRecord(x);
+ else { };
+ });
+
+ // restab.ToList().ForEach(x => { _accountRecordRepository.AddAccountRecord(x); });
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError("MassUppdatering misslyckat: -->{iMessage}", ex.Message);
+ result = false;
+ }
+ }
+
+ return result;
+ }
+
+ public void Dispose()
+ {
+ _excellent.Dispose();
+ }
+
+
+
+
+ }
+}
diff --git a/Accounting.DAL/Accounting.DAL.csproj b/Accounting.DAL/Accounting.DAL.csproj
new file mode 100644
index 0000000..60052cf
--- /dev/null
+++ b/Accounting.DAL/Accounting.DAL.csproj
@@ -0,0 +1,23 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
diff --git a/Accounting/Data/DataContext.cs b/Accounting.DAL/DataContext.cs
similarity index 66%
rename from Accounting/Data/DataContext.cs
rename to Accounting.DAL/DataContext.cs
index 8172735..bc9e802 100644
--- a/Accounting/Data/DataContext.cs
+++ b/Accounting.DAL/DataContext.cs
@@ -1,4 +1,7 @@
-namespace Accounting.Data;
+using Accounting.Models;
+using Microsoft.EntityFrameworkCore;
+
+namespace Accounting.DAL;
public class DataContext : DbContext
{
diff --git a/Accounting/Migrations/20240429161713_Initial.Designer.cs b/Accounting.DAL/Migrations/20240429161713_Initial.Designer.cs
similarity index 98%
rename from Accounting/Migrations/20240429161713_Initial.Designer.cs
rename to Accounting.DAL/Migrations/20240429161713_Initial.Designer.cs
index 342a9c8..664d816 100644
--- a/Accounting/Migrations/20240429161713_Initial.Designer.cs
+++ b/Accounting.DAL/Migrations/20240429161713_Initial.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Accounting.Data;
+using Accounting.DAL;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
diff --git a/Accounting/Migrations/20240429161713_Initial.cs b/Accounting.DAL/Migrations/20240429161713_Initial.cs
similarity index 100%
rename from Accounting/Migrations/20240429161713_Initial.cs
rename to Accounting.DAL/Migrations/20240429161713_Initial.cs
diff --git a/Accounting/Migrations/DataContextModelSnapshot.cs b/Accounting.DAL/Migrations/DataContextModelSnapshot.cs
similarity index 98%
rename from Accounting/Migrations/DataContextModelSnapshot.cs
rename to Accounting.DAL/Migrations/DataContextModelSnapshot.cs
index 360c2a8..4c404a9 100644
--- a/Accounting/Migrations/DataContextModelSnapshot.cs
+++ b/Accounting.DAL/Migrations/DataContextModelSnapshot.cs
@@ -1,6 +1,6 @@
//
using System;
-using Accounting.Data;
+using Accounting.DAL;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
diff --git a/Accounting/Entities/AccountRecord.cs b/Accounting.Models/AccountRecord.cs
similarity index 85%
rename from Accounting/Entities/AccountRecord.cs
rename to Accounting.Models/AccountRecord.cs
index e89b329..cacb4e9 100644
--- a/Accounting/Entities/AccountRecord.cs
+++ b/Accounting.Models/AccountRecord.cs
@@ -1,4 +1,5 @@
-namespace Accounting.Entities;
+using Accounting.Models.Common;
+namespace Accounting.Models;
public class AccountRecord : BaseEntity
{
diff --git a/Accounting.Models/Accounting.Models.csproj b/Accounting.Models/Accounting.Models.csproj
new file mode 100644
index 0000000..fa71b7a
--- /dev/null
+++ b/Accounting.Models/Accounting.Models.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/Accounting.Models/Common/BaseEntity.cs b/Accounting.Models/Common/BaseEntity.cs
new file mode 100644
index 0000000..3815aa0
--- /dev/null
+++ b/Accounting.Models/Common/BaseEntity.cs
@@ -0,0 +1,8 @@
+using System.ComponentModel.DataAnnotations;
+namespace Accounting.Models.Common;
+
+public abstract class BaseEntity
+{
+ [Key]
+ public int Id { get; set; }
+}
diff --git a/Accounting/Accounting.csproj b/Accounting/Accounting.csproj
index b96965f..e7c0a4f 100644
--- a/Accounting/Accounting.csproj
+++ b/Accounting/Accounting.csproj
@@ -13,8 +13,15 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
diff --git a/Accounting/Controllers/AccountingController.cs b/Accounting/Controllers/AccountingController.cs
index 8a2c0a7..390394c 100644
--- a/Accounting/Controllers/AccountingController.cs
+++ b/Accounting/Controllers/AccountingController.cs
@@ -1,4 +1,5 @@
-using Accounting.Data;
+using Accounting.DAL;
+using Accounting.Models;
using Newtonsoft.Json;
diff --git a/Accounting/Entities/Common/BaseEntity.cs b/Accounting/Entities/Common/BaseEntity.cs
deleted file mode 100644
index 8808847..0000000
--- a/Accounting/Entities/Common/BaseEntity.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Accounting.Entities.Common;
-
-public abstract class BaseEntity
-{
- [Key]
- public int Id { get; set; }
-}
diff --git a/Accounting/GlobalUsings.cs b/Accounting/GlobalUsings.cs
index 4a3daa7..6801a17 100644
--- a/Accounting/GlobalUsings.cs
+++ b/Accounting/GlobalUsings.cs
@@ -1,8 +1,6 @@
-global using Accounting.Entities;
-global using Accounting.Entities.Common;
+
global using Microsoft.AspNetCore.Mvc;
global using Microsoft.EntityFrameworkCore;
-global using System.ComponentModel.DataAnnotations;
namespace Accounting;
diff --git a/Accounting/Program.cs b/Accounting/Program.cs
index e957dde..769d7b1 100644
--- a/Accounting/Program.cs
+++ b/Accounting/Program.cs
@@ -1,4 +1,5 @@
-using Accounting.Data;
+
+using Accounting.DAL;
var builder = WebApplication.CreateBuilder(args);
@@ -14,6 +15,9 @@ builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});
+
+
+
var app = builder.Build();
// Configure the HTTP request pipeline.
diff --git a/Accounting/libman.json b/Accounting/libman.json
new file mode 100644
index 0000000..ceee271
--- /dev/null
+++ b/Accounting/libman.json
@@ -0,0 +1,5 @@
+{
+ "version": "1.0",
+ "defaultProvider": "cdnjs",
+ "libraries": []
+}
\ No newline at end of file
diff --git a/AccountingApi.sln b/AccountingApi.sln
index 761477a..a3ff2b6 100644
--- a/AccountingApi.sln
+++ b/AccountingApi.sln
@@ -3,7 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting", "Accounting\Accounting.csproj", "{EA69CE3F-020D-482B-82DB-3A5141E67774}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Accounting", "Accounting\Accounting.csproj", "{EA69CE3F-020D-482B-82DB-3A5141E67774}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.BLI", "Accounting.BLI\Accounting.BLI.csproj", "{3C7E3952-2AE1-422D-9325-7E85D8D35F57}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.DAL", "Accounting.DAL\Accounting.DAL.csproj", "{AF338983-D9FF-4DC3-B418-F14E83036DEC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.Models", "Accounting.Models\Accounting.Models.csproj", "{42192805-C79D-447E-AE45-866FC4CF9DC5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Accounting.BLR", "Accounting.BLR\Accounting.BLR.csproj", "{F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +23,22 @@ Global
{EA69CE3F-020D-482B-82DB-3A5141E67774}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA69CE3F-020D-482B-82DB-3A5141E67774}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EA69CE3F-020D-482B-82DB-3A5141E67774}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3C7E3952-2AE1-422D-9325-7E85D8D35F57}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AF338983-D9FF-4DC3-B418-F14E83036DEC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {42192805-C79D-447E-AE45-866FC4CF9DC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {42192805-C79D-447E-AE45-866FC4CF9DC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {42192805-C79D-447E-AE45-866FC4CF9DC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {42192805-C79D-447E-AE45-866FC4CF9DC5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9F760C1-CE79-4B7F-A3D6-29EBA7D1D718}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE