diff --git a/AdvertsingProfitControl/AboutBox1.Designer.cs b/AdvertsingProfitControl/AboutBox1.Designer.cs
index b941180..545e2ea 100644
--- a/AdvertsingProfitControl/AboutBox1.Designer.cs
+++ b/AdvertsingProfitControl/AboutBox1.Designer.cs
@@ -117,11 +117,11 @@
this.Controls.Add(this.tableLayoutPanel);
this.DoubleBuffered = true;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
- this.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
+ this.Margin = new System.Windows.Forms.Padding(6);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutBox1";
- this.Padding = new System.Windows.Forms.Padding(17, 17, 17, 17);
+ this.Padding = new System.Windows.Forms.Padding(17);
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
diff --git a/AdvertsingProfitControl/AboutBox1.cs b/AdvertsingProfitControl/AboutBox1.cs
index e97655d..53c99ff 100644
--- a/AdvertsingProfitControl/AboutBox1.cs
+++ b/AdvertsingProfitControl/AboutBox1.cs
@@ -13,7 +13,7 @@ namespace AdvertsingProfitControl
var db = new AdvertisingProfitControlModel();
var version = db.Versions.SingleOrDefault(x => x.Id == 1);
databaseVersionLabel.Text = version == null ? @"Database Version: N/A" : $@"Database Version: {version.VersionNumber}";
- reportGeneratingVersionLabel.Text = @"Report Generating Engine Version: 0.5.0.0 Alpha";
+ reportGeneratingVersionLabel.Text = @"Report Generating Engine Version: " + ReportGenerator.Version;
}
}
}
diff --git a/AdvertsingProfitControl/AdvertsingProfitControl.csproj b/AdvertsingProfitControl/AdvertsingProfitControl.csproj
index 3ca548b..53f2183 100644
--- a/AdvertsingProfitControl/AdvertsingProfitControl.csproj
+++ b/AdvertsingProfitControl/AdvertsingProfitControl.csproj
@@ -99,6 +99,12 @@
..\packages\Pechkin.0.5.8.1\lib\net40\Pechkin.dll
+
+ ..\packages\FreeSpire.PDF.3.2\lib\net40\Spire.License.dll
+
+
+ ..\packages\FreeSpire.PDF.3.2\lib\net40\Spire.Pdf.dll
+
diff --git a/AdvertsingProfitControl/BackPageGenerator.cs b/AdvertsingProfitControl/BackPageGenerator.cs
index a47b75c..e1413aa 100644
--- a/AdvertsingProfitControl/BackPageGenerator.cs
+++ b/AdvertsingProfitControl/BackPageGenerator.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
-using System.IO;
using System.Drawing.Printing;
+using System.IO;
using System.Linq;
using System.Web.UI;
using Pechkin;
@@ -10,34 +10,28 @@ namespace AdvertsingProfitControl
{
internal class BackPageGenerator
{
- FrmLogConsole _console = FrmLogConsole.GetStaticInstance;
-
- public byte[] RenderHtmlCodeToImage(string path, string targetPath)
+ ///
+ /// Generates the back page of the report, Weekly Inventory Control, as a single PDF file.
+ ///
+ ///
+ public void GenerateBackPage(DateTime date)
{
- var htmlCode = File.ReadAllLines(path);
- var code = htmlCode.Aggregate("", (current, line) => current + "\r\n" + line);
- try
+ var stringWriter = new StringWriter();
+ var writer = new HtmlTextWriter(stringWriter);
+ BuildReportBackPage(date, ref writer);
+ var backPage = new SimplePechkin(new GlobalConfig().SetPaperOrientation(false).SetPaperSize(PaperKind.A4)).Convert(stringWriter.ToString());
+ //
+ using (var fs = new FileStream(GlobalClasses.LogFilePath + "Back.pdf", FileMode.Create, FileAccess.Write))
{
- var config = new GlobalConfig().SetPaperSize(PaperKind.A4).SetPaperOrientation(true);
- var pdfBuf = new SimplePechkin(config).Convert(code);
- using (var fs = new FileStream(targetPath, FileMode.Create, FileAccess.ReadWrite))
- {
- fs.Write(pdfBuf, 0, pdfBuf.Length);
- }
- return pdfBuf;
+ fs.Write(backPage, 0, backPage.Length);
}
- catch (Exception e)
- {
- _console.WriteToLog(FrmLogConsole.Level.Critical,
- "Failed to generate an updated image for the back page of Advertising Profit Control.");
- _console.WriteToLog(FrmLogConsole.Level.Debug, e.Message);
- _console.WriteToLog(FrmLogConsole.Level.Info, "This is most likely a screw you from the GDI+ subsystem of Windows.");
-
- }
- return new byte[1];
}
-
- public void BuildReportBackPage(DateTime date, ref HtmlTextWriter writer)
+ ///
+ /// Generates the HTML code for the back page, Weekly Inventory Control.
+ ///
+ ///
+ ///
+ private void BuildReportBackPage(DateTime date, ref HtmlTextWriter writer)
{
var db = new AdvertisingProfitControlModel();
var dateRecord = db.WeekEndingDates.SingleOrDefault(x => x.EndingDate == date);
@@ -46,18 +40,18 @@ namespace AdvertsingProfitControl
var taxable = db.Taxables.SingleOrDefault(x => x.FkDateId == dateRecord.Id);
var costAnylsis = db.CostAnalysis.SingleOrDefault(x => x.FkDateId == dateRecord.Id);
- //writer.Write("\n");
- //writer.RenderBeginTag(HtmlTextWriterTag.Html);
- //writer.RenderBeginTag(HtmlTextWriterTag.Head);
- //writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
- //writer.RenderBeginTag(HtmlTextWriterTag.Style);
- //writer.Write("td{margins:0px; padding:2px; border:1px solid black; text-align:left; vertical-align:bottom}");
- //writer.RenderEndTag();//style
- //writer.RenderEndTag();//Head
- //writer.RenderBeginTag(HtmlTextWriterTag.Body);
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "page-break-inside: avoid; page-break-before:always");
- writer.RenderBeginTag(HtmlTextWriterTag.Div);//div
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-collapse: collapse; width:50%; -webkit-transform: rotate(270deg)");
+ writer.Write("\n");
+ writer.RenderBeginTag(HtmlTextWriterTag.Html);
+ writer.RenderBeginTag(HtmlTextWriterTag.Head);
+ writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
+ writer.RenderBeginTag(HtmlTextWriterTag.Style);
+ writer.Write("td{margins:0px; padding:2px; border:1px solid black; text-align:left; vertical-align:bottom; font-size:20px}");
+ writer.RenderEndTag();//style
+ writer.RenderEndTag();//Head
+ writer.RenderBeginTag(HtmlTextWriterTag.Body);
+ //writer.AddAttribute(HtmlTextWriterAttribute.Style, "page-break-inside: avoid; page-break-before:always");
+ //writer.RenderBeginTag(HtmlTextWriterTag.Div);//div
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border-collapse: collapse; width:100%; height:100%");
writer.RenderBeginTag(HtmlTextWriterTag.Table);
//Create the header as the first row.
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
@@ -372,7 +366,7 @@ namespace AdvertsingProfitControl
writer.RenderEndTag();//tr
}
writer.RenderEndTag();//table
- writer.RenderEndTag();//div
+ //writer.RenderEndTag();//div
writer.RenderEndTag();//body
writer.RenderEndTag();//html
}
diff --git a/AdvertsingProfitControl/FrmMain.Designer.cs b/AdvertsingProfitControl/FrmMain.Designer.cs
index 0059ec2..f0e5b0c 100644
--- a/AdvertsingProfitControl/FrmMain.Designer.cs
+++ b/AdvertsingProfitControl/FrmMain.Designer.cs
@@ -45,8 +45,8 @@
this.manageSuppliersToolsMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.adSpecialKeyWordsToolsMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.helpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
- this.showHideConsoleHelpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.dbVersionHelpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.showHideConsoleHelpMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.examineLogsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.debugMainMenu = new System.Windows.Forms.ToolStripMenuItem();
this.rawViewDebugMainMenu = new System.Windows.Forms.ToolStripMenuItem();
@@ -135,11 +135,11 @@
//
// printPreviewButton
//
- this.printPreviewButton.Location = new System.Drawing.Point(16, 273);
+ this.printPreviewButton.Location = new System.Drawing.Point(180, 271);
this.printPreviewButton.Name = "printPreviewButton";
- this.printPreviewButton.Size = new System.Drawing.Size(138, 49);
+ this.printPreviewButton.Size = new System.Drawing.Size(174, 49);
this.printPreviewButton.TabIndex = 4;
- this.printPreviewButton.Text = "Print Preview";
+ this.printPreviewButton.Text = "Generate Report";
this.printPreviewButton.UseVisualStyleBackColor = true;
this.printPreviewButton.Click += new System.EventHandler(this.DisplayPrintPreview);
//
@@ -272,13 +272,6 @@
this.helpMainMenu.Size = new System.Drawing.Size(68, 34);
this.helpMainMenu.Text = "&Help";
//
- // showHideConsoleHelpMainMenu
- //
- this.showHideConsoleHelpMainMenu.Name = "showHideConsoleHelpMainMenu";
- this.showHideConsoleHelpMainMenu.Size = new System.Drawing.Size(288, 34);
- this.showHideConsoleHelpMainMenu.Text = "Sh&ow/Hide Console";
- this.showHideConsoleHelpMainMenu.Click += new System.EventHandler(this.ShowHideLogConsole);
- //
// dbVersionHelpMainMenu
//
this.dbVersionHelpMainMenu.Name = "dbVersionHelpMainMenu";
@@ -286,6 +279,13 @@
this.dbVersionHelpMainMenu.Text = "&Verison Information";
this.dbVersionHelpMainMenu.Click += new System.EventHandler(this.DisplayProductVersionNumbers);
//
+ // showHideConsoleHelpMainMenu
+ //
+ this.showHideConsoleHelpMainMenu.Name = "showHideConsoleHelpMainMenu";
+ this.showHideConsoleHelpMainMenu.Size = new System.Drawing.Size(288, 34);
+ this.showHideConsoleHelpMainMenu.Text = "Sh&ow/Hide Console";
+ this.showHideConsoleHelpMainMenu.Click += new System.EventHandler(this.ShowHideLogConsole);
+ //
// examineLogsToolStripMenuItem
//
this.examineLogsToolStripMenuItem.Name = "examineLogsToolStripMenuItem";
diff --git a/AdvertsingProfitControl/FrmMain.cs b/AdvertsingProfitControl/FrmMain.cs
index 529a3a7..49b7fa3 100644
--- a/AdvertsingProfitControl/FrmMain.cs
+++ b/AdvertsingProfitControl/FrmMain.cs
@@ -327,55 +327,10 @@ namespace AdvertsingProfitControl
private void DisplayPrintPreview(object sender, EventArgs e)
{
- //Build and render the front and back forms of the document.
- //var test = new FrontPageGenerator();
- //var backPageTest = new BackPageGenerator();
- //var printTestPage = new PrintDocument();
- //var printDialog = new PrintPreviewDialog();
- //if (!usePreRenderedFilesCheckbox.Checked)
- //{
- // //var databaseTracker = new DatabaseTracker();
- // //var databaseReader = new DatabaseReader();
- // //var dateId =
- // // databaseReader.RetrieveDateIdByDateString(monthCalendar.SelectionStart.ToShortDateString(),
- // // databaseTracker.DatabaseConnectionString);
- // //var remaingingSales = _departmentSales - _salesProducedByAdItems;
- // //var totalProfitReturnFromReminaingSales = remaingingSales * .3m;
- // //var totalProfitReturn = _totalProfitReturnFromAdItems + totalProfitReturnFromReminaingSales;
- // ////test.BuildFormFrontCompressedLayout(dateId, _departmentSales, _salesProducedByAdItems, remaingingSales,
- // // //_totalProfitReturnFromAdItems, totalProfitReturnFromReminaingSales, totalProfitReturn,
- // // //commentsTextBox.Text);
- // //test.RenderHtmlToImage();
- // //backPageTest.GenerateWeeklyInventoryControlPage(dateId);
- // //backPageTest.RenderHtmlToImage();
- //}
- //else
- //{
- // if (File.Exists(Application.StartupPath + "\\" + "FrontPage.html") &&
- // File.Exists(Application.StartupPath + "\\" + "Backpage.html"))
- // {
- // test.RenderHtmlToImage();
- // backPageTest.RenderHtmlToImage();
- // }
- //}
-
- //var margin = new Margins(50, 50, 0, 0);
- //printDoc.DefaultPageSettings.Margins = margin;
- //printTestPage.PrintPage += PrintPage;
- //printDialog.Document = printTestPage;
- //printDialog.ShowDialog();
- //printDialog.Document = new PrintDocument();
-
- //var dialog = new FolderBrowserDialog();
- //dialog.ShowDialog();
- //var path = dialog.SelectedPath;
- //var pdf = gen.RenderHtmlCodeToImage(path + "\\FrontPage.html", path + "\\Image.pdf");
- //var doc = new PrintDocument();
- //doc.PrintPage += RenderPage;
- //var spam = new PrintPreviewDialog {Document = doc};
- //spam.ShowDialog();
- //var form = new Test();
- //form.ShowDialog();
+ printPreviewButton.Enabled = false;
+ var report = new ReportGenerator();
+ report.GeneratePdfReport(_currentActiveDate);
+ printPreviewButton.Enabled = true;
}
private void RenderPage(object sender, PrintPageEventArgs e)
@@ -910,6 +865,7 @@ namespace AdvertsingProfitControl
clearCurrentRecordSelectedDateToolsMainMenu.ToolTipText = string.Empty;
clearCurrentActiveYearTools.Enabled = true;
clearCurrentActiveYearTools.ToolTipText = string.Empty;
+ printPreviewButton.Enabled = true;
}
else
{
@@ -920,6 +876,7 @@ namespace AdvertsingProfitControl
clearCurrentRecordSelectedDateToolsMainMenu.ToolTipText = @"There is no date to clear.";
clearCurrentActiveYearTools.Enabled = false;
clearCurrentActiveYearTools.ToolTipText = @"There are no records to clear.";
+ printPreviewButton.Enabled = false;
}
}
@@ -1139,9 +1096,7 @@ namespace AdvertsingProfitControl
private void testToolStripMenuItem_Click(object sender, EventArgs e)
{
- var page = new ReportGenerator();
- page.GeneratePdfReport(_currentActiveDate);
- page.RenderHtmlCodeToImage("C:\\Users\\Crypto\\Desktop\\Full.html", "C:\\Users\\Crypto\\Desktop\\Full.pdf");
+ MessageBox.Show(@"Nothing to debug here!", @"Debug Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
\ No newline at end of file
diff --git a/AdvertsingProfitControl/FrontPageGenerator.cs b/AdvertsingProfitControl/FrontPageGenerator.cs
index c92ce13..cc99d8d 100644
--- a/AdvertsingProfitControl/FrontPageGenerator.cs
+++ b/AdvertsingProfitControl/FrontPageGenerator.cs
@@ -10,9 +10,28 @@ namespace AdvertsingProfitControl
{
internal class FrontPageGenerator
{
- FrmLogConsole _console = FrmLogConsole.GetStaticInstance;
-
- public void BuildReportFrontPage(DateTime date, ref HtmlTextWriter writer)
+ ///
+ /// Generates the front page of the report, Advertising Profit Control, as a single PDF file.
+ ///
+ ///
+ public void GenerateFrontPage(DateTime date)
+ {
+ var stringWriter = new StringWriter();
+ var writer = new HtmlTextWriter(stringWriter);
+ BuildReportFrontPage(date, ref writer);
+ var frontPage = new SimplePechkin(new GlobalConfig().SetPaperOrientation(true).SetPaperSize(PaperKind.A4)).Convert(stringWriter.ToString());
+ //
+ using (var fs = new FileStream(GlobalClasses.LogFilePath + "Front.pdf", FileMode.Create, FileAccess.Write))
+ {
+ fs.Write(frontPage, 0, frontPage.Length);
+ }
+ }
+ ///
+ /// Generates the HTML code for the front page, Advertising Profit Control.
+ ///
+ ///
+ ///
+ private void BuildReportFrontPage(DateTime date, ref HtmlTextWriter writer)
{
var db = new AdvertisingProfitControlModel();
var dateRecord = db.WeekEndingDates.SingleOrDefault(x => x.EndingDate == date);
@@ -27,15 +46,16 @@ namespace AdvertsingProfitControl
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/css");
//Set the global style for the data cells.
writer.RenderBeginTag(HtmlTextWriterTag.Style);
- writer.Write("td{margins:0; padding:2px; border:1px solid black; font-size:20px; text-align:center; vertical-align:bottom}");
+ writer.Write("td{margins:0; padding:2px; border:1px solid black; font-size:14px; text-align:center; vertical-align:bottom}");
writer.RenderEndTag();// end style
writer.RenderEndTag(); // end Head
+ //writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:11in; height:8in");
writer.RenderBeginTag(HtmlTextWriterTag.Body);
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; width:100%"); //style for the table
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; border-collapse: collapse; margin-top:1in; width:100%; height:100%"); //style for the table
writer.RenderBeginTag(HtmlTextWriterTag.Table);
//Begin rendering the top rows, the form name, store, department and date fields.
writer.RenderBeginTag(HtmlTextWriterTag.Tr);//begin first row
- writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; font-size:40px");
+ writer.AddAttribute(HtmlTextWriterAttribute.Style, "border:none; font-size:30px");
writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "20");
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write("Advertising Profit Control v" + Application.ProductVersion + "");
@@ -291,6 +311,8 @@ namespace AdvertsingProfitControl
writer.RenderEndTag();//end totals row
//end totals row
writer.RenderEndTag();//table
+ writer.RenderEndTag();//body
+ writer.RenderEndTag();//html
}
private void RenderCostsAnalysisCell(CostAnalysisCells cell, ref HtmlTextWriter writer, decimal? value, string rowSpan)
@@ -318,11 +340,11 @@ namespace AdvertsingProfitControl
break;
case CostAnalysisCells.ProfitReturnFromRemainingSales:
number = "5";
- labelText = "Total $ Profit Return
From Remaining Sales
Going-in Gross % x Remaining Sales";
+ labelText = "Total $ Profit Return
From Remaining Sales";
break;
case CostAnalysisCells.TotalProfitReturn:
number = "6";
- labelText = "Total $ Profit
Return
Line 4 Plus Line 5";
+ labelText = "Total $ Profit
Return
Line 4 Plus Line 5";
break;
case CostAnalysisCells.CrossProfitInfoCell:
break;
diff --git a/AdvertsingProfitControl/ReportGenerator.cs b/AdvertsingProfitControl/ReportGenerator.cs
index ecba903..94f010d 100644
--- a/AdvertsingProfitControl/ReportGenerator.cs
+++ b/AdvertsingProfitControl/ReportGenerator.cs
@@ -1,50 +1,65 @@
using System;
-using System.Drawing.Printing;
using System.IO;
-using System.Linq;
-using System.Web.UI;
-using Pechkin;
+using Spire.Pdf;
namespace AdvertsingProfitControl
{
internal class ReportGenerator
{
- public readonly string Version = "1.0.0.0";
+ public static readonly string Version = "0.5.0.0";
+ ///
+ /// Generates a full report, and places the file on the user's desktop for later viewing.
+ ///
+ ///
public void GeneratePdfReport(DateTime date)
{
- var stringWriter = new StringWriter();
- var writer = new HtmlTextWriter(stringWriter);
+ //Check to see if the report already exists.
+ var reportFileName = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + date.ToString("yyyy MMMM dd") + " Report.pdf";
+ if (File.Exists(reportFileName))
+ {
+ var argument = "/select, \"" + reportFileName + "\"";
+ System.Diagnostics.Process.Start("explorer.exe", argument);
+ return;
+ }
var front = new FrontPageGenerator();
var back = new BackPageGenerator();
- front.BuildReportFrontPage(date, ref writer);
- back.BuildReportBackPage(date, ref writer);
-
- using (var streamWriter = new StreamWriter("C:\\Users\\Crypto\\Desktop\\Full.html"))
- {
- streamWriter.WriteLine(stringWriter.ToString());
- }
+ front.GenerateFrontPage(date);
+ back.GenerateBackPage(date);
+ //Merge the PDFs
+ GenerateFullReport(reportFileName);
}
-
- public void RenderHtmlCodeToImage(string path, string targetPath)
+ ///
+ /// Merges the front and back PDF files into one and places the new file on the user's desktop.
+ /// Deletes the front and back pages when done.
+ ///
+ ///
+ private static void GenerateFullReport(string targetPath)
{
- var htmlCode = File.ReadAllLines(path);
- var code = htmlCode.Aggregate("", (current, line) => current + "\r\n" + line);
try
{
- var pechkin = new SimplePechkin(new GlobalConfig().SetMargins(50,0,0,0).SetPaperSize(PaperKind.A4).SetPaperOrientation(true).SetCopyCount(1));
- var pdf = pechkin.Convert(new ObjectConfig().SetZoomFactor(1.25), code);
- //var config = new GlobalConfig().SetPaperSize(PaperKind.A4).SetPaperOrientation(true);
- //var pdfBuf = new SimplePechkin(config).Convert(code);
- using (var fs = new FileStream(targetPath, FileMode.Create, FileAccess.Write))
- {
- fs.Write(pdf, 0, pdf.Length);
- }
+ var pdfdocs = new PdfDocument[2];
+ pdfdocs[0] = new PdfDocument();
+ pdfdocs[0].LoadFromFile(GlobalClasses.LogFilePath + "Front.pdf", FileFormat.PDF);
+ pdfdocs[1] = new PdfDocument();
+ pdfdocs[1].LoadFromFile(GlobalClasses.LogFilePath + "Back.pdf", FileFormat.PDF);
+ pdfdocs[0].AppendPage(pdfdocs[1]);
+ pdfdocs[0].SaveToFile(targetPath);
+ pdfdocs[0].Close();
+ pdfdocs[1].Close();
+ File.Delete(GlobalClasses.LogFilePath + "Front.pdf");
+ File.Delete(GlobalClasses.LogFilePath + "Back.pdf");
+ var argument = "/select, \"" + targetPath + "\"";
+ System.Diagnostics.Process.Start("explorer.exe", argument);
}
- finally
+ catch (IOException e)
{
}
- }
+ finally
+ {
+
+ }
+ }
}
}
diff --git a/AdvertsingProfitControl/packages.config b/AdvertsingProfitControl/packages.config
index c2bb520..75a2ffd 100644
--- a/AdvertsingProfitControl/packages.config
+++ b/AdvertsingProfitControl/packages.config
@@ -3,5 +3,6 @@
+
\ No newline at end of file
diff --git a/SetupProject/Product.wxs b/SetupProject/Product.wxs
index c273ccb..48a546c 100644
--- a/SetupProject/Product.wxs
+++ b/SetupProject/Product.wxs
@@ -90,17 +90,51 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+