From 5229cac9873769da2296e4dd11ce325fbd7c8c83 Mon Sep 17 00:00:00 2001 From: EugeneTes Date: Fri, 16 Jan 2026 12:00:24 +0100 Subject: [PATCH] print server with new concept --- .../Services/PrintServerHostedService.cs | 2 +- .../PrinterDiscoveryBackgroundTask.cs | 14 +- EpsonPrintService/Program.cs | 7 +- EpsonPrintService/config.json | 5 +- EpsonTest/Program.cs | 375 +++++++++++------- Inspectron.Epson/HtmlPrinter.cs | 13 +- .../EpsonPrintServiceConfiguration.cs | 1 + .../ConsoleDiscoveredPrintersReceiver.cs | 0 .../IDiscoveredPrintersReceiver.cs | 0 .../JamesDiscoveredPrintersReceiver.cs | 55 +++ .../JobSources/SignalRPrintJobSource.cs | 17 +- Inspectron.Epson/PrintServer/PrintLoop.cs | 10 +- .../PrintServices/EpsonPrintService.cs | 44 +- .../PrintServices/IPrinterFactory.cs | 6 - .../PrintServices/IWrapperPrinterFactory.cs | 6 + .../Printers/EpsonPrinterFactory.cs | 18 + .../Printers/HtmlPrinterFactory.cs | 12 + .../PrintServer/Printers/IPrinterFactory.cs | 6 + ...terFactory.cs => PrinterWrapperFactory.cs} | 4 +- .../Printers/TM-T30IIITranslated.cs | 4 +- .../Printers/TM-U220IITranslated.cs | 22 +- .../Printers/Utils/FinalReceipt/Models.cs | 20 + .../Utils/FinalReceipt/ReceiptConverter.cs | 30 +- .../Printers/Utils/KitchenReceipt/Models.cs | 8 +- .../Printers/Utils/OrderItems/Models.cs | 27 ++ .../Utils/OrderItems/ReceiptConverter.cs | 183 +++++++++ Inspectron.Epson/Queue/PrintJob.cs | 10 +- Inspectron.Epson/Queue/PrinterQueue.cs | 12 +- order_items.png | Bin 0 -> 54105 bytes receipt_tail.png | Bin 0 -> 58282 bytes 30 files changed, 694 insertions(+), 217 deletions(-) rename {EpsonPrintService => Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver}/ConsoleDiscoveredPrintersReceiver.cs (100%) rename {EpsonPrintService => Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver}/IDiscoveredPrintersReceiver.cs (100%) create mode 100644 Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/JamesDiscoveredPrintersReceiver.cs delete mode 100644 Inspectron.Epson/PrintServer/PrintServices/IPrinterFactory.cs create mode 100644 Inspectron.Epson/PrintServer/PrintServices/IWrapperPrinterFactory.cs create mode 100644 Inspectron.Epson/PrintServer/Printers/EpsonPrinterFactory.cs create mode 100644 Inspectron.Epson/PrintServer/Printers/HtmlPrinterFactory.cs create mode 100644 Inspectron.Epson/PrintServer/Printers/IPrinterFactory.cs rename Inspectron.Epson/PrintServer/Printers/{PrinterFactory.cs => PrinterWrapperFactory.cs} (79%) create mode 100644 Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/Models.cs create mode 100644 Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/ReceiptConverter.cs create mode 100644 order_items.png create mode 100644 receipt_tail.png diff --git a/ConfigurationPannel/Services/PrintServerHostedService.cs b/ConfigurationPannel/Services/PrintServerHostedService.cs index 12ff87c..7848941 100644 --- a/ConfigurationPannel/Services/PrintServerHostedService.cs +++ b/ConfigurationPannel/Services/PrintServerHostedService.cs @@ -42,7 +42,7 @@ public class PrintServerHostedService : IHostedService _kernel.Bind().To(); _kernel.Bind().ToConstant(_logger); _kernel.Bind().ToConstant(config); - _kernel.Bind().To().InSingletonScope(); + _kernel.Bind().To().InSingletonScope(); _kernel.Bind().ToConstant(config); _kernel.Bind().ToSelf().InSingletonScope(); diff --git a/EpsonPrintService/PrinterDiscoveryBackgroundTask.cs b/EpsonPrintService/PrinterDiscoveryBackgroundTask.cs index 9ba362d..69e41f4 100644 --- a/EpsonPrintService/PrinterDiscoveryBackgroundTask.cs +++ b/EpsonPrintService/PrinterDiscoveryBackgroundTask.cs @@ -1,4 +1,5 @@ using Inspectron.Epson; +using Inspectron.Epson.PrintServer.ConfigurationSources; using Microsoft.Extensions.Logging; namespace EpsonPrintService; @@ -20,15 +21,13 @@ public class PrinterDiscoveryBackgroundTask public PrinterDiscoveryBackgroundTask( IDiscoveryService discoveryService, IDiscoveredPrintersReceiver receiver, - ILogger logger, - TimeSpan? interval = null, - TimeSpan? discoveryTimeout = null) + ILogger logger) { _discoveryService = discoveryService; _receiver = receiver; _logger = logger; - _interval = interval ?? TimeSpan.FromSeconds(30); - _discoveryTimeout = discoveryTimeout ?? TimeSpan.FromSeconds(3); + _interval = TimeSpan.FromSeconds(30); + _discoveryTimeout = TimeSpan.FromSeconds(3); } /// @@ -68,6 +67,11 @@ public class PrinterDiscoveryBackgroundTask try { var printers = await _discoveryService.DiscoverPrintersAsync(_discoveryTimeout); + printers.Add(new DiscoveredPrinter() + { + IPAddress = "127.0.0.1", + ModelName = "TM-T30III", + }); var currentIps = printers.Select(p => p.IPAddress).ToHashSet(); if (HasConfigurationChanged(currentIps)) diff --git a/EpsonPrintService/Program.cs b/EpsonPrintService/Program.cs index 562a9c9..92e8685 100644 --- a/EpsonPrintService/Program.cs +++ b/EpsonPrintService/Program.cs @@ -23,6 +23,9 @@ kernel.Bind().To().InSingletonScope(); kernel.Bind().ToConstant(config); +//kernel.Bind().ToMethod(sp=>new HtmlPrinterFactory("TM-U220II.html", paperWidth: 258,type:0x0d, logger:sp.Kernel.Get())); +//kernel.Bind().ToMethod(sp=>new HtmlPrinterFactory("TM-T30III.html",logger:sp.Kernel.Get())); +kernel.Bind().To(); kernel.Bind().To().InSingletonScope(); kernel.Bind().To(); @@ -35,10 +38,10 @@ kernel.Bind().ToMethod(ctx => return loggerFactory.CreateLogger("EpsonPrintService"); }); kernel.Bind().ToConstant(config); -kernel.Bind().To().InSingletonScope(); +kernel.Bind().To().InSingletonScope(); kernel.Bind().To(); kernel.Bind().ToSelf().InSingletonScope(); -kernel.Bind().To().InSingletonScope(); +kernel.Bind().To().InSingletonScope(); kernel.Bind().ToSelf().InSingletonScope(); var printLoop = kernel.Get(); diff --git a/EpsonPrintService/config.json b/EpsonPrintService/config.json index 546cb75..b6ee866 100644 --- a/EpsonPrintService/config.json +++ b/EpsonPrintService/config.json @@ -1,5 +1,6 @@ { - "GroupId": "67e534f8e86e816689323023", - "RestaurantId": "63e37295bd6f26dbd36164c0", + "GroupId": "64a3d9f0876bc5d1704bce43", + "RestaurantId": "64a3d9f0876bc5d1704bce43", + "ApiKey": "LBOACMlvFEgDbZqt24uW0LjiFv0LKU5DT94g0JDoBnI=", "PrinterConfigurations": {} } \ No newline at end of file diff --git a/EpsonTest/Program.cs b/EpsonTest/Program.cs index 04d2c17..575fb3d 100644 --- a/EpsonTest/Program.cs +++ b/EpsonTest/Program.cs @@ -8,6 +8,7 @@ using SixLabors.ImageSharp.PixelFormats; using System.Text; using System.Text.Json; using System.Xml.Linq; +using Inspectron.Epson.PrintServer.Printers.Utils.OrderItems; using FinalReceipt = Inspectron.Epson.PrintServer.Printers.Utils.FinalRecipe.FinalReceipt; @@ -58,159 +59,178 @@ using FinalReceipt = Inspectron.Epson.PrintServer.Printers.Utils.FinalRecipe.Fin //Console.ReadLine(); -var receipt = new FinalReceipt -{ - CompanyName = "Klingler Gastro AG", - Address1 = "Münzplatz 3", - Address2 = "CH-8001 Zürich", - Phone = "043 321 22 22", - ReceiptNumber = "1-81-202", - DateTime = new DateTime(2025, 12, 16, 14, 58, 0), - Guests = 2, - Total = 160.00m, - Currency = "CHF", - TotalInAlternateCurrency = 172.80m, - AlternateCurrency = "EUR", - PaymentMethod = "MASTER", - PaymentAmount = 160.00m, - WaiterName = "Yves", - Terminal = "Hauptkasse ZH", - TableNumber = "12", - VatNumber = "CHE-449.635.880 MWST", - ThankYouMessage = "Das Team bedankt sich herzlich für Ihren", - GoodbyeMessageLine1 = "Besuch.", - GoodbyeMessageLine2 = "Auf Wiedersehen." -}; +//var receipt = new FinalReceipt +//{ +// CompanyName = "Klingler Gastro AG", +// Address1 = "Münzplatz 3", +// Address2 = "CH-8001 Zürich", +// Phone = "043 321 22 22", +// ReceiptNumber = "1-81-202", +// DateTime = new DateTime(2025, 12, 16, 14, 58, 0), +// Guests = 2, +// Total = 160.00m, +// Currency = "CHF", +// TotalInAlternateCurrency = 172.80m, +// AlternateCurrency = "EUR", +// PaymentMethod = "MASTER", +// PaymentAmount = 160.00m, +// WaiterName = "Yves", +// Terminal = "Hauptkasse ZH", +// TableNumber = "12", +// VatNumber = "CHE-449.635.880 MWST", +// ThankYouMessage = "Das Team bedankt sich herzlich für Ihren", +// GoodbyeMessageLine1 = "Besuch.", +// GoodbyeMessageLine2 = "Auf Wiedersehen.", +// TerminalReceipt = new PaymentTerminalReceipt +// { +// ReceiptType = "*** Kundenbeleg ***", +// BookingType = "Buchung", +// PaymentSystem = "TWINT", +// TransactionNumber = "XXXXXXXXXXXXXXX1494", +// TransactionDateTime = new DateTime(2025, 11, 11, 12, 34, 49), +// TerminalId = "31108834", +// AID = "A0000015749E", +// TransactionSeqCount = "6127", +// TransactionRefNo = "99036644599", +// AuthCode = "0d3396", +// AcquirerId = "2", +// EftAmount = 67.00m, +// TipAmount = 6.70m, +// TotalEftAmount = 73.70m, +// Currency = "CHF" +// } +//}; -// Add items -receipt.Items.Add(new ReceiptItem -{ - Quantity = 1, - Description = "San Pellegrino 50cl", - UnitPrice = 6.50m, - TotalPrice = 6.50m, - TaxCategory = "A" -}); +//// Add items +//receipt.Items.Add(new ReceiptItem +//{ +// Quantity = 1, +// Description = "San Pellegrino 50cl", +// UnitPrice = 6.50m, +// TotalPrice = 6.50m, +// TaxCategory = "A" +//}); -receipt.Items.Add(new ReceiptItem -{ - Quantity = 1, - Description = "Panna 50cl", - UnitPrice = 6.50m, - TotalPrice = 6.50m, - TaxCategory = "A" -}); +//receipt.Items.Add(new ReceiptItem +//{ +// Quantity = 1, +// Description = "Panna 50cl", +// UnitPrice = 6.50m, +// TotalPrice = 6.50m, +// TaxCategory = "A" +//}); -receipt.Items.Add(new ReceiptItem -{ - Quantity = 1, - Description = "Granini Tomatensaft", - UnitPrice = 5.50m, - TotalPrice = 5.50m, - TaxCategory = "A" -}); +//receipt.Items.Add(new ReceiptItem +//{ +// Quantity = 1, +// Description = "Granini Tomatensaft", +// UnitPrice = 5.50m, +// TotalPrice = 5.50m, +// TaxCategory = "A" +//}); -receipt.Items.Add(new ReceiptItem -{ - Quantity = 2, - Description = "Business Lunch Menu Seco", - UnitPrice = 44.00m, - TotalPrice = 88.00m, - TaxCategory = "A" -}); +//receipt.Items.Add(new ReceiptItem +//{ +// Quantity = 2, +// Description = "Business Lunch Menu Seco", +// UnitPrice = 44.00m, +// TotalPrice = 88.00m, +// TaxCategory = "A" +//}); -receipt.Items.Add(new ReceiptItem -{ - Quantity = 2, - Description = "Brunello di Montalcino 1", - UnitPrice = 16.00m, - TotalPrice = 32.00m, - TaxCategory = "A" -}); +//receipt.Items.Add(new ReceiptItem +//{ +// Quantity = 2, +// Description = "Brunello di Montalcino 1", +// UnitPrice = 16.00m, +// TotalPrice = 32.00m, +// TaxCategory = "A" +//}); -receipt.Items.Add(new ReceiptItem -{ - Quantity = 2, - Description = "Espresso", - UnitPrice = 5.50m, - TotalPrice = 11.00m, - TaxCategory = "A" -}); +//receipt.Items.Add(new ReceiptItem +//{ +// Quantity = 2, +// Description = "Espresso", +// UnitPrice = 5.50m, +// TotalPrice = 11.00m, +// TaxCategory = "A" +//}); -receipt.Items.Add(new ReceiptItem -{ - Quantity = 1, - Description = "Tip", - UnitPrice = 10.50m, - TotalPrice = 10.50m, - TaxCategory = "B" -}); +//receipt.Items.Add(new ReceiptItem +//{ +// Quantity = 1, +// Description = "Tip", +// UnitPrice = 10.50m, +// TotalPrice = 10.50m, +// TaxCategory = "B" +//}); -// Add tax breakdown -receipt.TaxBreakdown.Add(new TaxInfo -{ - Category = "A", - Rate = 8.1m, - Gross = 149.50m, - Net = 138.30m, - TaxAmount = 11.20m, - Currency = "CHF" -}); +//// Add tax breakdown +//receipt.TaxBreakdown.Add(new TaxInfo +//{ +// Category = "A", +// Rate = 8.1m, +// Gross = 149.50m, +// Net = 138.30m, +// TaxAmount = 11.20m, +// Currency = "CHF" +//}); -receipt.TaxBreakdown.Add(new TaxInfo -{ - Category = "B", - Rate = 0m, - Gross = 10.50m, - Net = 10.50m, - TaxAmount = 0.00m, - Currency = "CHF" -}); +//receipt.TaxBreakdown.Add(new TaxInfo +//{ +// Category = "B", +// Rate = 0m, +// Gross = 10.50m, +// Net = 10.50m, +// TaxAmount = 0.00m, +// Currency = "CHF" +//}); - -// Convert to print commands -var converter = new ReceiptConverter(lineWidth: 48, bigFontLineWidth: 24); -var printCommands = converter.ConvertToPrintCommands(receipt); +//var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); +//var deserializedReceipt = JsonSerializer.Deserialize(serializedReceipt); +//// Convert to print commands +//var converter = new ReceiptConverter(lineWidth: 48, bigFontLineWidth: 24); +//var printCommands = converter.ConvertToPrintCommands(deserializedReceipt); -// Print the commands -Console.WriteLine("=== PRINT COMMANDS ===\n"); -var printer = new HtmlPrinter(@".\test.html", paperWidth: 384); -await printer.ConnectAsync(""); -await printer.SetAbsolutePrintPosition(97); -await printer.LoadImageAsync("ristorante-klinglers.ch-logo_white_bg.png", 390); -await printer.SetAbsolutePrintPosition(0); -await printer.PrintLoadedImage(); -await Task.Delay(200); -await printer.FeedLinesAsync(1); -await printer.SetCustomLineSpacing(22); -foreach (var command in printCommands) -{ - string attributes = ""; - if (command.IsBig) attributes += "[BIG] "; - if (command.IsBold) attributes += "[BOLD] "; +//// Print the commands +//Console.WriteLine("=== PRINT COMMANDS ===\n"); +//var printer = new HtmlPrinter(@".\test.html", paperWidth: 384); +//await printer.ConnectAsync(""); +//await printer.SetAbsolutePrintPosition(42); +//await printer.LoadImageAsync("ristorante-klinglers.ch-logo_white_bg.png", 300); +//await printer.PrintLoadedImage(); +//await printer.SetAbsolutePrintPosition(0); +//await Task.Delay(200); +////await printer.FeedLinesAsync(1); +//await printer.SetCustomLineSpacing(22); +//foreach (var command in printCommands) +//{ +// string attributes = ""; +// if (command.IsBig) attributes += "[BIG] "; +// if (command.IsBold) attributes += "[BOLD] "; - Console.WriteLine($"{attributes}{command.Text}"); +// Console.WriteLine($"{attributes}{command.Text}"); - if (command.IsBig) - { - await printer.SetFontSizeAsync(2, 1); - } - else - { - await printer.SetFontSizeAsync(1, 1); - } - //await Task.Delay(200); +// if (command.IsBig) +// { +// await printer.SetFontSizeAsync(2, 1); +// } +// else +// { +// await printer.SetFontSizeAsync(1, 1); +// } +// //await Task.Delay(200); - await printer.SetEmphasized(command.IsBold); - //await Task.Delay(200); +// await printer.SetEmphasized(command.IsBold); +// //await Task.Delay(200); - await printer.PrintTextAsync(command.Text + "\n"); - //await Task.Delay(200); +// await printer.PrintTextAsync(command.Text + "\n"); +// //await Task.Delay(200); -} +//} //var receipt = new KitchenReceipt @@ -246,10 +266,11 @@ foreach (var command in printCommands) //// Add additional info -//receipt.AdditionalInfo.Add("1 x Amuse Bouche"); -//KitchenReceiptConverter converter = new KitchenReceiptConverter(bigLineWidth: 20, lineWidth:33); -//var printCommands = converter.ConvertToPrintCommands(receipt); +//var serializedReceipt = JsonSerializer.Serialize(receipt, new JsonSerializerOptions { WriteIndented = true }); +//var deserializedReceipt = JsonSerializer.Deserialize(serializedReceipt); +//KitchenReceiptConverter converter = new KitchenReceiptConverter(bigLineWidth: 20, lineWidth: 33); +//var printCommands = converter.ConvertToPrintCommands(deserializedReceipt); //Console.WriteLine("=== PRINT COMMANDS ===\n"); //var printer = new HtmlPrinter(@".\test.html", paperWidth: 258); @@ -291,8 +312,83 @@ foreach (var command in printCommands) //await printer.PrintTextAsync( // "1x San Pellegrino 50cl 6.50 6.50 A\n1x Panna 50cl 6.50 6.50 A"); +// Order Items Receipt Test +//var orderItemsReceipt = new OrderItemsReceipt +//{ +// OrderNumber = "1", +// QRInfo = "Margherita Pizza Classic longer text", +// DateTime = new DateTime(2026, 1, 14, 14, 35, 47), +// ClientNotes = "Some main note", +// Items = new List +// { +// new OrderItem +// { +// Number = 1, +// Name = "pappara", +// Quantity = 1, +// SubItems = new List { "pizza", "cola" }, +// Comment = "Cola zero please" +// }, +// new OrderItem +// { +// Number = 2, +// Name = "Classic Beef Burger", +// Quantity = 1, +// Modifications = new ItemModifications +// { +// Removed = new List { "Onion" }, +// Added = new List { "butter" } +// }, +// Comment = "Medium rare please" +// }, +// new OrderItem +// { +// Number = 3, +// Name = "Margherita Pizza Classic", +// Quantity = 2, +// Size = "L" +// } +// } +//}; +//var serializedOrderItems = JsonSerializer.Serialize(orderItemsReceipt, new JsonSerializerOptions { WriteIndented = true }); +//Console.WriteLine(serializedOrderItems); +//var deserializedOrderItems = JsonSerializer.Deserialize(serializedOrderItems); +//var orderItemsConverter = new Inspectron.Epson.PrintServer.Printers.Utils.OrderItems.ReceiptConverter(lineWidth: 50, bigFontLineWidth: 21); +//var printCommands = orderItemsConverter.ConvertToPrintCommands(deserializedOrderItems); + +//Console.WriteLine("=== PRINT COMMANDS ===\n"); +//var printer = new HtmlPrinter(@".\order_items.html", paperWidth: 384); +//await printer.ConnectAsync(""); +//await Task.Delay(200); +////await printer.FeedLinesAsync(1); +//await printer.SetCustomLineSpacing(22); +//foreach (var command in printCommands) +//{ +// string attributes = ""; +// if (command.IsBig) attributes += "[BIG] "; +// if (command.IsBold) attributes += "[BOLD] "; + +// Console.WriteLine($"{attributes}{command.Text}"); + +// if (command.IsBig) +// { +// await printer.SetFontSizeAsync(2, 1); +// } +// else +// { +// await printer.SetFontSizeAsync(1, 1); +// } +// //await Task.Delay(200); + +// await printer.SetEmphasized(command.IsBold); +// //await Task.Delay(200); + +// await printer.PrintTextAsync(command.Text + "\n"); +// //await Task.Delay(200); + +//} @@ -417,7 +513,10 @@ foreach (var command in printCommands) //await Task.Delay(2000); //await printer.PrintBuffer(); -//await printer.SendRawCommandAsync([0x1b,0x21,0x10+0x21]); +//var printer = new EpsonPrinter(); +//await printer.ConnectAsync("127.0.0.1", 8888); +//await printer.InitAsync(); + //await printer.PrintTextAsync("Hello!"); //await printer.FeedLinesAsync(5); diff --git a/Inspectron.Epson/HtmlPrinter.cs b/Inspectron.Epson/HtmlPrinter.cs index 1aa7413..7b28de8 100644 --- a/Inspectron.Epson/HtmlPrinter.cs +++ b/Inspectron.Epson/HtmlPrinter.cs @@ -4,6 +4,7 @@ using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using System.Text; +using Inspectron.Epson.PrintServer.PrintServices; namespace Inspectron.Epson; @@ -14,6 +15,7 @@ namespace Inspectron.Epson; public class HtmlPrinter : IEpsonPrinter { private readonly ILogger? _logger; + private readonly byte _id; private readonly string _outputPath; private readonly int _paperWidth; private readonly string _imageDirectory; @@ -60,11 +62,12 @@ public class HtmlPrinter : IEpsonPrinter /// Path to the output HTML file /// Paper width in pixels (default 384 for 80mm thermal printer) /// Optional logger for diagnostic output - public HtmlPrinter(string outputPath, int paperWidth = 384, ILogger? logger = null) + public HtmlPrinter(string outputPath, int paperWidth = 384, ILogger? logger = null, byte id=0x01) { _outputPath = outputPath; _paperWidth = paperWidth; _logger = logger; + _id = id; // Create image directory next to HTML file var directory = Path.GetDirectoryName(outputPath) ?? "."; @@ -174,8 +177,7 @@ public class HtmlPrinter : IEpsonPrinter /// public Task GetPrinterIdAsync() { - _logger?.LogDebug("HtmlPrinter: Returning mock printer ID (0x01 = TM-T30III)"); - return Task.FromResult(0x01); + return Task.FromResult(_id); } /// @@ -320,9 +322,6 @@ public class HtmlPrinter : IEpsonPrinter { EnsureConnected(); _logger?.LogInformation("HtmlPrinter: Cutting paper"); - - _content.AppendLine("
"); - WriteHtmlFile(); return Task.CompletedTask; } @@ -493,7 +492,7 @@ public class HtmlPrinter : IEpsonPrinter if (_isBiggerFontTM220) { - effectiveHeightMultiplier *= 2; + effectiveWidthMultiplier *= 2; } int fontSize = baseHeight * effectiveHeightMultiplier; diff --git a/Inspectron.Epson/PrintServer/ConfigurationSources/EpsonPrintServiceConfiguration.cs b/Inspectron.Epson/PrintServer/ConfigurationSources/EpsonPrintServiceConfiguration.cs index 129d8d9..0935696 100644 --- a/Inspectron.Epson/PrintServer/ConfigurationSources/EpsonPrintServiceConfiguration.cs +++ b/Inspectron.Epson/PrintServer/ConfigurationSources/EpsonPrintServiceConfiguration.cs @@ -6,6 +6,7 @@ public class EpsonPrintServiceConfiguration: IPrinterConfigurationSource, IAssig { public string GroupId { get; set; } public string RestaurantId { get; set; } + public string ApiKey { get; set; } public Dictionary PrinterConfigurations { get; set; } public PrinterConfiguration GetConfiguration(string printerAddress) diff --git a/EpsonPrintService/ConsoleDiscoveredPrintersReceiver.cs b/Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/ConsoleDiscoveredPrintersReceiver.cs similarity index 100% rename from EpsonPrintService/ConsoleDiscoveredPrintersReceiver.cs rename to Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/ConsoleDiscoveredPrintersReceiver.cs diff --git a/EpsonPrintService/IDiscoveredPrintersReceiver.cs b/Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/IDiscoveredPrintersReceiver.cs similarity index 100% rename from EpsonPrintService/IDiscoveredPrintersReceiver.cs rename to Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/IDiscoveredPrintersReceiver.cs diff --git a/Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/JamesDiscoveredPrintersReceiver.cs b/Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/JamesDiscoveredPrintersReceiver.cs new file mode 100644 index 0000000..9e8b711 --- /dev/null +++ b/Inspectron.Epson/PrintServer/DiscoveredPrintersReceiver/JamesDiscoveredPrintersReceiver.cs @@ -0,0 +1,55 @@ +using Inspectron.Epson; +using Inspectron.Epson.PrintServer.ConfigurationSources; +using System.Net.Http.Json; + +namespace EpsonPrintService; + +public class JamesDiscoveredPrintersReceiver: IDiscoveredPrintersReceiver +{ + private readonly EpsonPrintServiceConfiguration _configuration; + private readonly HttpClient _httpClient; + + public JamesDiscoveredPrintersReceiver(EpsonPrintServiceConfiguration configuration, HttpClient httpClient) + { + _configuration = configuration; + _httpClient = httpClient; + } + + public async Task OnPrintersDiscoveredAsync(IReadOnlyList printers) + { + var apiKey = _configuration.ApiKey; + + var request = new DiscoveredPrintersRequest + { + Printers = printers.Select(p => new DiscoveredPrinterDto + { + PrinterId = p.IPAddress, + Name = p.IPAddress, + Address = p.IPAddress, + Model = p.ModelName, + IsMain = false + }).ToList() + }; + + using var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://api.dev.gastrojames.ch/api/printerServer/discovered-printers"); + requestMessage.Headers.Add("X-Printer-Server-Key", apiKey); + requestMessage.Content = JsonContent.Create(request); + + var response = await _httpClient.SendAsync(requestMessage); + response.EnsureSuccessStatusCode(); + } + + private class DiscoveredPrintersRequest + { + public List Printers { get; set; } = new(); + } + + private class DiscoveredPrinterDto + { + public string PrinterId { get; set; } = ""; + public string Name { get; set; } = ""; + public string Address { get; set; } = ""; + public string Model { get; set; } = ""; + public bool IsMain { get; set; } + } +} \ No newline at end of file diff --git a/Inspectron.Epson/PrintServer/JobSources/SignalRPrintJobSource.cs b/Inspectron.Epson/PrintServer/JobSources/SignalRPrintJobSource.cs index 25e799b..da35bc8 100644 --- a/Inspectron.Epson/PrintServer/JobSources/SignalRPrintJobSource.cs +++ b/Inspectron.Epson/PrintServer/JobSources/SignalRPrintJobSource.cs @@ -20,7 +20,7 @@ public class SignalRPrintJobSource: IPrintJobSource _logger = logger; _connection = new HubConnectionBuilder() - .WithUrl("https://api.stage.gastrojames.ch/hubs/internal?access_token=https://api.stage.gastrojames.ch/hubs/internal") + .WithUrl("https://api.dev.gastrojames.ch/hubs/printer-servers") .WithAutomaticReconnect(new InfiniteRetryPolicy()) .Build(); @@ -92,8 +92,8 @@ public class SignalRPrintJobSource: IPrintJobSource _logger.LogInformation("Received print job for working area: {PrintJob}", JsonSerializer.Serialize(args)); _printJobChannel.Writer.TryWrite(new PrintJob { - AreaId = args.WorkingAreaId, - Document = args.Content, + IP = args.PrinterIp, + Document = args, }); } @@ -104,8 +104,15 @@ public class SignalRPrintJobSource: IPrintJobSource public class PrintJobFromSignalR { - [JsonPropertyName("workingAreaId")] - public string WorkingAreaId { get; set; } + [JsonPropertyName("printerIp")] + public string PrinterIp { get; set; } + + [JsonPropertyName("logoUrl")] + public string? LogoUrl { get; set; } + + [JsonPropertyName("receiptType")] + public int ReceiptType { get; set; } + [JsonPropertyName("content")] public string Content { get; set; } } diff --git a/Inspectron.Epson/PrintServer/PrintLoop.cs b/Inspectron.Epson/PrintServer/PrintLoop.cs index 40e08b4..483a7ed 100644 --- a/Inspectron.Epson/PrintServer/PrintLoop.cs +++ b/Inspectron.Epson/PrintServer/PrintLoop.cs @@ -34,14 +34,8 @@ public class PrintLoop while (!_cancellationSource!.Token.IsCancellationRequested) { var job = await _jobSource.GetNextJobAsync(_cancellationToken); - var assigned = _assignedPrinterRepository.GetAssignedPrinter(job.AreaId); - if (assigned == null) - { - _logger.LogWarning("Received print job for unassigned area {AreaId}, skipping", job.AreaId); - continue; - } - - _printServer.SubmitJob(assigned, job); + + _printServer.SubmitJob(job.IP, job); } } diff --git a/Inspectron.Epson/PrintServer/PrintServices/EpsonPrintService.cs b/Inspectron.Epson/PrintServer/PrintServices/EpsonPrintService.cs index b569a77..b99c65a 100644 --- a/Inspectron.Epson/PrintServer/PrintServices/EpsonPrintService.cs +++ b/Inspectron.Epson/PrintServer/PrintServices/EpsonPrintService.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Logging; using System.Reflection; +using Inspectron.Epson.PrintServer.Printers; namespace Inspectron.Epson.PrintServer.PrintServices; @@ -7,12 +8,14 @@ public class EpsonPrintService: IPrintService { private readonly ILogger _logger; private readonly IPrinterFactory _printerFactory; + private readonly IWrapperPrinterFactory _wrapperPrinterFactory; private readonly IPrinterConfigurationSource _printerConfigurationSource; - public EpsonPrintService(ILogger logger, IPrinterFactory printerFactory, IPrinterConfigurationSource printerConfigurationSource) + public EpsonPrintService(ILogger logger, IPrinterFactory printerFactory, IWrapperPrinterFactory wrapperPrinterFactory, IPrinterConfigurationSource printerConfigurationSource) { _logger = logger; _printerFactory = printerFactory; + _wrapperPrinterFactory = wrapperPrinterFactory; _printerConfigurationSource = printerConfigurationSource; } @@ -21,7 +24,7 @@ public class EpsonPrintService: IPrintService try { var configuration = _printerConfigurationSource.GetConfiguration(printerIp); - await using var epsonPrinter = new EpsonPrinter(_logger); + await using var epsonPrinter = _printerFactory.CreatePrinter(); string address; int port = 9100; var printerAddress = configuration.Address; @@ -45,19 +48,46 @@ public class EpsonPrintService: IPrintService { throw new InvalidOperationException("Printer is offline or out of paper."); } - - var printerAdapter = _printerFactory.CreatePrinterFromId(printerId.Value, epsonPrinter); + var printerAdapter = _wrapperPrinterFactory.CreatePrinterFromId(printerId.Value, epsonPrinter); await printerAdapter.InitAsync(); - if (configuration.LogoFilename != null) + if (!string.IsNullOrEmpty(job.Document.LogoUrl)) { - await printerAdapter.PrintImageAsync(configuration.LogoFilename); + // Download logo image + var logoFileName = Path.GetFileName(new Uri(job.Document.LogoUrl).LocalPath); + var logoCachePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logos"); + + // Ensure logos cache directory exists + if (!Directory.Exists(logoCachePath)) + { + Directory.CreateDirectory(logoCachePath); + } + + var cachedLogoPath = Path.Combine(logoCachePath, logoFileName); + + // Download only if not already cached + if (!File.Exists(cachedLogoPath)) + { + using var httpClient = new HttpClient(); + httpClient.Timeout = TimeSpan.FromSeconds(10); + + var logoData = await httpClient.GetByteArrayAsync(job.Document.LogoUrl); + await File.WriteAllBytesAsync(cachedLogoPath, logoData); + + _logger.LogInformation("Downloaded logo {LogoFileName} from {LogoUrl}", logoFileName, job.Document.LogoUrl); + } + else + { + _logger.LogDebug("Using cached logo {LogoFileName}", logoFileName); + } + + await printerAdapter.PrintImageAsync(cachedLogoPath); } await printerAdapter.SetFontSizeAsync(configuration.FontSize); - await printerAdapter.PrintTextAsync(job.Document); + await printerAdapter.PrintTextAsync(job.Document.Content); await Task.Delay(200); status = await epsonPrinter.GetPrinterStatusAsync(); if (!status.IsOnline) diff --git a/Inspectron.Epson/PrintServer/PrintServices/IPrinterFactory.cs b/Inspectron.Epson/PrintServer/PrintServices/IPrinterFactory.cs deleted file mode 100644 index 8e62de6..0000000 --- a/Inspectron.Epson/PrintServer/PrintServices/IPrinterFactory.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Inspectron.Epson.PrintServer.PrintServices; - -public interface IPrinterFactory -{ - IPrinter CreatePrinterFromId(byte printerId, EpsonPrinter epsonPrinter); -} \ No newline at end of file diff --git a/Inspectron.Epson/PrintServer/PrintServices/IWrapperPrinterFactory.cs b/Inspectron.Epson/PrintServer/PrintServices/IWrapperPrinterFactory.cs new file mode 100644 index 0000000..47f914e --- /dev/null +++ b/Inspectron.Epson/PrintServer/PrintServices/IWrapperPrinterFactory.cs @@ -0,0 +1,6 @@ +namespace Inspectron.Epson.PrintServer.PrintServices; + +public interface IWrapperPrinterFactory +{ + IPrinter CreatePrinterFromId(byte printerId, IEpsonPrinter epsonPrinter); +} \ No newline at end of file diff --git a/Inspectron.Epson/PrintServer/Printers/EpsonPrinterFactory.cs b/Inspectron.Epson/PrintServer/Printers/EpsonPrinterFactory.cs new file mode 100644 index 0000000..dd6b572 --- /dev/null +++ b/Inspectron.Epson/PrintServer/Printers/EpsonPrinterFactory.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.Logging; + +namespace Inspectron.Epson.PrintServer.Printers; + +public class EpsonPrinterFactory:IPrinterFactory +{ + private readonly ILogger _logger; + + public EpsonPrinterFactory(ILogger logger) + { + _logger = logger; + } + + public IEpsonPrinter CreatePrinter() + { + return new EpsonPrinter(_logger); + } +} \ No newline at end of file diff --git a/Inspectron.Epson/PrintServer/Printers/HtmlPrinterFactory.cs b/Inspectron.Epson/PrintServer/Printers/HtmlPrinterFactory.cs new file mode 100644 index 0000000..63db954 --- /dev/null +++ b/Inspectron.Epson/PrintServer/Printers/HtmlPrinterFactory.cs @@ -0,0 +1,12 @@ +using Microsoft.Extensions.Logging; + +namespace Inspectron.Epson.PrintServer.Printers; + +public class HtmlPrinterFactory(string filename,int paperWidth=384, byte type=0x1, ILogger logger=null) : IPrinterFactory +{ + + public IEpsonPrinter CreatePrinter() + { + return new HtmlPrinter(filename,paperWidth: paperWidth, id:type); + } +} \ No newline at end of file diff --git a/Inspectron.Epson/PrintServer/Printers/IPrinterFactory.cs b/Inspectron.Epson/PrintServer/Printers/IPrinterFactory.cs new file mode 100644 index 0000000..dbb46dc --- /dev/null +++ b/Inspectron.Epson/PrintServer/Printers/IPrinterFactory.cs @@ -0,0 +1,6 @@ +namespace Inspectron.Epson.PrintServer.Printers; + +public interface IPrinterFactory +{ + IEpsonPrinter CreatePrinter(); +} \ No newline at end of file diff --git a/Inspectron.Epson/PrintServer/Printers/PrinterFactory.cs b/Inspectron.Epson/PrintServer/Printers/PrinterWrapperFactory.cs similarity index 79% rename from Inspectron.Epson/PrintServer/Printers/PrinterFactory.cs rename to Inspectron.Epson/PrintServer/Printers/PrinterWrapperFactory.cs index 5d8c1e9..62aa7a4 100644 --- a/Inspectron.Epson/PrintServer/Printers/PrinterFactory.cs +++ b/Inspectron.Epson/PrintServer/Printers/PrinterWrapperFactory.cs @@ -2,9 +2,9 @@ namespace Inspectron.Epson.PrintServer.Printers; -public class PrinterFactory:IPrinterFactory +public class PrinterWrapperFactory:IWrapperPrinterFactory { - public IPrinter CreatePrinterFromId(byte printerId, EpsonPrinter epsonPrinter) + public IPrinter CreatePrinterFromId(byte printerId, IEpsonPrinter epsonPrinter) { switch (printerId) { diff --git a/Inspectron.Epson/PrintServer/Printers/TM-T30IIITranslated.cs b/Inspectron.Epson/PrintServer/Printers/TM-T30IIITranslated.cs index 772ad55..aa3bd73 100644 --- a/Inspectron.Epson/PrintServer/Printers/TM-T30IIITranslated.cs +++ b/Inspectron.Epson/PrintServer/Printers/TM-T30IIITranslated.cs @@ -8,9 +8,9 @@ namespace Inspectron.Epson.PrintServer.Printers; public class TM_T30IIITranslated:IPrinter { - private readonly EpsonPrinter _printer; + private readonly IEpsonPrinter _printer; - public TM_T30IIITranslated(EpsonPrinter printer) + public TM_T30IIITranslated(IEpsonPrinter printer) { _printer = printer; } diff --git a/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs b/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs index 0887143..34259c5 100644 --- a/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs +++ b/Inspectron.Epson/PrintServer/Printers/TM-U220IITranslated.cs @@ -1,14 +1,16 @@ using Inspectron.Epson.PrintServer.Printers.Utils; +using Inspectron.Epson.PrintServer.Printers.Utils.KitchenReceipt; using Inspectron.Epson.PrintServer.PrintServices; using System.Reflection; +using System.Text.Json; namespace Inspectron.Epson.PrintServer.Printers; public class TM_U220IITranslated:IPrinter { - private readonly EpsonPrinter _printer; + private readonly IEpsonPrinter _printer; - public TM_U220IITranslated(EpsonPrinter printer) + public TM_U220IITranslated(IEpsonPrinter printer) { _printer = printer; } @@ -34,11 +36,10 @@ public class TM_U220IITranslated:IPrinter public async Task PrintTextAsync(string text) { - ReceiptTranslator translator = new ReceiptTranslator(); - var ast = translator.ParseReceipt(text); - KitchenReceiptPrinter printer = new KitchenReceiptPrinter(lineWidth:33,21); - var commands = printer.ConvertToCommands((TranslatedKitchenReceipt)ast); - foreach (KitchenPrintCommand command in commands) + var deserializedReceipt = JsonSerializer.Deserialize(text); + KitchenReceiptConverter translator = new KitchenReceiptConverter(bigLineWidth: 20, lineWidth: 33); + var commands = translator.ConvertToPrintCommands(deserializedReceipt); + foreach (var command in commands) { await _printer.SetBiggerFontTM220(command.IsBig); await Task.Delay(200); @@ -49,12 +50,7 @@ public class TM_U220IITranslated:IPrinter await _printer.PrintTextAsync(command.Text + "\n"); await Task.Delay(200); } - //await _printer.PrintTextAsync(text); - //var lines = text.Split('\n').Length; - //for (int i = 0; i < lines; i++) - //{ - // await Task.Delay(200); - //} + await _printer.FeedLinesAsync(10); await Task.Delay(1000); } diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs index 4926a88..98dbefa 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/Models.cs @@ -24,6 +24,7 @@ public class FinalReceipt public string ThankYouMessage { get; set; } public string GoodbyeMessageLine1 { get; set; } public string GoodbyeMessageLine2 { get; set; } + public PaymentTerminalReceipt TerminalReceipt { get; set; } } public class ReceiptItem @@ -43,4 +44,23 @@ public class TaxInfo public decimal Net { get; set; } public decimal TaxAmount { get; set; } public string Currency { get; set; } +} + +public class PaymentTerminalReceipt +{ + public string ReceiptType { get; set; } // e.g., "*** Kundenbeleg ***" + public string BookingType { get; set; } // e.g., "Buchung" + public string PaymentSystem { get; set; } // e.g., "TWINT" + public string TransactionNumber { get; set; } + public DateTime TransactionDateTime { get; set; } + public string TerminalId { get; set; } + public string AID { get; set; } + public string TransactionSeqCount { get; set; } + public string TransactionRefNo { get; set; } + public string AuthCode { get; set; } + public string AcquirerId { get; set; } + public decimal EftAmount { get; set; } + public decimal TipAmount { get; set; } + public decimal TotalEftAmount { get; set; } + public string Currency { get; set; } } \ No newline at end of file diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs index ab917ec..b02686c 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/FinalReceipt/ReceiptConverter.cs @@ -83,9 +83,6 @@ public class ReceiptConverter commands.Add(new PrintCommand("")); // Footer info - //commands.Add(new PrintCommand(Center($"Bedient von: {finalReceipt.WaiterName}", false))); - //commands.Add(new PrintCommand(Center($"Terminal: {finalReceipt.Terminal}", false))); - //commands.Add(new PrintCommand(Center($"Tisch: {finalReceipt.TableNumber}", false))); commands.Add(new PrintCommand($"Bedient von:".PadLeft(_lineWidth / 2) + $" {finalReceipt.WaiterName}")); commands.Add(new PrintCommand($"Terminal:".PadLeft(_lineWidth / 2) + $" {finalReceipt.Terminal}")); commands.Add(new PrintCommand($"Tisch:".PadLeft(_lineWidth / 2)+$" {finalReceipt.TableNumber}")); @@ -94,6 +91,33 @@ public class ReceiptConverter // VAT number commands.Add(new PrintCommand(Center(finalReceipt.VatNumber, false))); + commands.Add(new PrintCommand("")); + + // Payment Terminal Receipt + if (finalReceipt.TerminalReceipt != null) + { + var terminal = finalReceipt.TerminalReceipt; + + commands.Add(new PrintCommand(Center(terminal.ReceiptType, false))); + commands.Add(new PrintCommand(Center(terminal.BookingType, false))); + commands.Add(new PrintCommand(Center(terminal.PaymentSystem, false))); + commands.Add(new PrintCommand(terminal.TransactionNumber)); + commands.Add(new PrintCommand($"{terminal.TransactionDateTime:dd.MM.yyyy}".PadRight(_lineWidth/2) + $"{terminal.TransactionDateTime:HH:mm:ss}".PadLeft(_lineWidth/2))); + + commands.Add(new PrintCommand($"Trm-Id:".PadRight(_lineWidth/2) + $"{terminal.TerminalId}".PadLeft(_lineWidth/2))); + commands.Add(new PrintCommand($"AID:".PadRight(_lineWidth/2) + $"{terminal.AID}".PadLeft(_lineWidth/2))); + commands.Add(new PrintCommand($"Trx. Seq-Cnt:".PadRight(_lineWidth/2) + $"{terminal.TransactionSeqCount}".PadLeft(_lineWidth/2))); + commands.Add(new PrintCommand($"Trx. Ref-No:".PadRight(_lineWidth/2) + $"{terminal.TransactionRefNo}".PadLeft(_lineWidth/2))); + commands.Add(new PrintCommand($"Auth. Code:".PadRight(_lineWidth/2) + $"{terminal.AuthCode}".PadLeft(_lineWidth/2))); + commands.Add(new PrintCommand($"Acq-Id:".PadRight(_lineWidth/2) + $"{terminal.AcquirerId}".PadLeft(_lineWidth/2))); + + commands.Add(new PrintCommand($"EFT {terminal.Currency}:".PadRight(_lineWidth/2) + $"{terminal.EftAmount:F2}".PadLeft(_lineWidth/2))); + commands.Add(new PrintCommand($"Trinkgeld {terminal.Currency}:".PadRight(_lineWidth/2) + $"{terminal.TipAmount:F2}".PadLeft(_lineWidth/2))); + commands.Add(new PrintCommand($"Total-EFT {terminal.Currency}:".PadRight(_lineWidth/2) + $"{terminal.TotalEftAmount:F2}".PadLeft(_lineWidth/2))); + + commands.Add(new PrintCommand(new string('-', _lineWidth))); + commands.Add(new PrintCommand("")); + } // Thank you message commands.Add(new PrintCommand(Center(finalReceipt.ThankYouMessage, false))); diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs b/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs index b9dde67..2f22719 100644 --- a/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs +++ b/Inspectron.Epson/PrintServer/Printers/Utils/KitchenReceipt/Models.cs @@ -40,15 +40,11 @@ public List Dishes { get; set; } = new List(); - /// - /// Additional items or notes (e.g., "Amuse Bouche") - /// - public List AdditionalInfo { get; set; } - + public KitchenReceipt() { Gangs = new List(); - AdditionalInfo = new List(); + } } diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/Models.cs b/Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/Models.cs new file mode 100644 index 0000000..e03a202 --- /dev/null +++ b/Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/Models.cs @@ -0,0 +1,27 @@ +namespace Inspectron.Epson.PrintServer.Printers.Utils.OrderItems; + +public class OrderItemsReceipt +{ + public string OrderNumber { get; set; } + public string QRInfo { get; set; } + public DateTime DateTime { get; set; } + public string ClientNotes { get; set; } + public List Items { get; set; } = new List(); +} + +public class OrderItem +{ + public int Number { get; set; } + public string Name { get; set; } + public int Quantity { get; set; } + public string Size { get; set; } + public List SubItems { get; set; } = new List(); + public ItemModifications Modifications { get; set; } + public string Comment { get; set; } +} + +public class ItemModifications +{ + public List Removed { get; set; } = new List(); + public List Added { get; set; } = new List(); +} diff --git a/Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/ReceiptConverter.cs b/Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/ReceiptConverter.cs new file mode 100644 index 0000000..12ab320 --- /dev/null +++ b/Inspectron.Epson/PrintServer/Printers/Utils/OrderItems/ReceiptConverter.cs @@ -0,0 +1,183 @@ +namespace Inspectron.Epson.PrintServer.Printers.Utils.OrderItems; + +public class ReceiptConverter +{ + private readonly int _lineWidth; + private readonly int _bigFontLineWidth; + + public ReceiptConverter(int lineWidth = 42, int bigFontLineWidth = 21) + { + _lineWidth = lineWidth; + _bigFontLineWidth = bigFontLineWidth; + } + + public List ConvertToPrintCommands(OrderItemsReceipt receipt) + { + var commands = new List(); + + // Header box + AddHeaderBox(commands, receipt); + + // Client Notes + if (!string.IsNullOrEmpty(receipt.ClientNotes)) + { + commands.Add(new PrintCommand($"|Client Notes: {receipt.ClientNotes}")); + } + + // Separator line + commands.Add(new PrintCommand(new string('-', _lineWidth))); + + // Items + foreach (var item in receipt.Items) + { + commands.Add(new PrintCommand("")); + AddOrderItem(commands, item); + } + + return commands; + } + + private void AddHeaderBox(List commands, OrderItemsReceipt receipt) + { + // Column widths (fixed proportions) + int col1Width = 8; // Order column + int col3Width = 12; // Date/Time column + int col2Width = _lineWidth - col1Width - col3Width - 4; // QR column (4 for borders |) + + // Prepare column content with labels on first line, values on subsequent lines + var col1Lines = new List { "Order:" }; + col1Lines.AddRange(WrapText($"#{receipt.OrderNumber}", col1Width)); + + var col2Lines = new List { "QR:" }; + col2Lines.AddRange(WrapText(receipt.QRInfo, col2Width)); + + var col3Lines = new List + { + $"{receipt.DateTime:dd.MM.yyyy}", + $"{receipt.DateTime:HH:mm:ss}" + }; + + // Determine max rows needed + int maxRows = Math.Max(Math.Max(col1Lines.Count, col2Lines.Count), col3Lines.Count); + + // Pad columns to have equal rows + while (col1Lines.Count < maxRows) col1Lines.Add(""); + while (col2Lines.Count < maxRows) col2Lines.Add(""); + while (col3Lines.Count < maxRows) col3Lines.Add(""); + + // Top border + commands.Add(new PrintCommand("+" + new string('-', col1Width) + "+" + new string('-', col2Width) + "+" + new string('-', col3Width) + "+")); + + // Content rows + for (int i = 0; i < maxRows; i++) + { + string row = "|" + + CenterInWidth(col1Lines[i], col1Width) + "|" + + CenterInWidth(col2Lines[i], col2Width) + "|" + + CenterInWidth(col3Lines[i], col3Width) + "|"; + + commands.Add(new PrintCommand(row, isBold: i == 0)); + } + + // Bottom border + commands.Add(new PrintCommand("+" + new string('-', col1Width) + "+" + new string('-', col2Width) + "+" + new string('-', col3Width) + "+")); + } + + private List WrapText(string text, int maxWidth) + { + var lines = new List(); + + if (string.IsNullOrEmpty(text)) + { + lines.Add(""); + return lines; + } + + // Trim to fit within column + while (text.Length > 0) + { + if (text.Length <= maxWidth) + { + lines.Add(text); + break; + } + + // Find a good break point (prefer space) + int breakPoint = text.LastIndexOf(' ', Math.Min(maxWidth, text.Length - 1)); + if (breakPoint <= 0 || breakPoint > maxWidth) + { + breakPoint = maxWidth; + } + + lines.Add(text.Substring(0, breakPoint).TrimEnd()); + text = text.Substring(breakPoint).TrimStart(); + } + + return lines; + } + + private void AddOrderItem(List commands, OrderItem item) + { + // Main item line: "1 Item Name x1" or "3 Item Name Size: L x2" + string numberPart = $"{item.Number}"; + string namePart = item.Name; + string quantityPart = $"x{item.Quantity}"; + + string sizePart = ""; + if (!string.IsNullOrEmpty(item.Size)) + { + sizePart = $"Size: {item.Size} "; + } + + string rightPart = sizePart + quantityPart; + int spacesNeeded = _lineWidth - numberPart.Length - 1 - namePart.Length - rightPart.Length; + if (spacesNeeded < 1) spacesNeeded = 1; + + string mainLine = numberPart + " " + namePart + new string(' ', spacesNeeded) + rightPart; + commands.Add(new PrintCommand(mainLine)); + + // Sub-items + foreach (var subItem in item.SubItems) + { + commands.Add(new PrintCommand($" - {subItem}")); + } + + // Modifications + if (item.Modifications != null && (item.Modifications.Removed.Any() || item.Modifications.Added.Any())) + { + commands.Add(new PrintCommand(" Change of")); + commands.Add(new PrintCommand(" Ingredients:")); + + foreach (var removed in item.Modifications.Removed) + { + commands.Add(new PrintCommand($" - {removed}")); + } + + foreach (var added in item.Modifications.Added) + { + commands.Add(new PrintCommand($" + {added}")); + } + } + + // Comment + if (!string.IsNullOrEmpty(item.Comment)) + { + commands.Add(new PrintCommand($" Comment: {item.Comment}")); + } + } + + private string CenterInWidth(string text, int width) + { + if (string.IsNullOrEmpty(text)) + return new string(' ', width); + + if (text.Length >= width) + return text.Substring(0, width); + + int totalPadding = width - text.Length; + int leftPadding = totalPadding / 2; + int rightPadding = totalPadding - leftPadding; + + return new string(' ', leftPadding) + text + new string(' ', rightPadding); + } +} diff --git a/Inspectron.Epson/Queue/PrintJob.cs b/Inspectron.Epson/Queue/PrintJob.cs index 5adb631..3c09b4e 100644 --- a/Inspectron.Epson/Queue/PrintJob.cs +++ b/Inspectron.Epson/Queue/PrintJob.cs @@ -1,13 +1,15 @@ -public class PrintJob +using static Inspectron.Epson.PrintServer.JobSources.SignalRPrintJobSource; + +public class PrintJob { - public string AreaId { get; set; } - public string Document { get; set; } + // todo: change to ip address + public string IP { get; set; } + public PrintJobFromSignalR Document { get; set; } public DateTime QueuedAt { get; set; } public int RetryCount { get; set; } public PrintJob() { - AreaId = Guid.NewGuid().ToString(); QueuedAt = DateTime.UtcNow; RetryCount = 0; } diff --git a/Inspectron.Epson/Queue/PrinterQueue.cs b/Inspectron.Epson/Queue/PrinterQueue.cs index a574e70..1c4ff50 100644 --- a/Inspectron.Epson/Queue/PrinterQueue.cs +++ b/Inspectron.Epson/Queue/PrinterQueue.cs @@ -34,7 +34,7 @@ public class PrinterQueue { _queue.Enqueue(job); _signal.Release(); // Signal that there's work to do - _logger.LogInformation("Job {JobId} queued for printer {PrinterId}. Queue length: {QueueLength}", job.AreaId, PrinterIp, QueueLength); + _logger.LogInformation("Job queued for printer {PrinterId}. Queue length: {QueueLength}", PrinterIp, QueueLength); } public void Start() @@ -50,7 +50,7 @@ public class PrinterQueue { _priorityQueue.Push(job); _signal.Release(); - _logger.LogInformation("Job {JobId} priority queued for printer {PrinterId}. Queue length: {QueueLength}", job.AreaId, PrinterIp, QueueLength); + _logger.LogInformation("Job priority queued for printer {PrinterId}. Queue length: {QueueLength}", PrinterIp, QueueLength); } private async Task ProcessQueueAsync(CancellationToken cancellationToken) { @@ -68,7 +68,7 @@ public class PrinterQueue if (job!=null) { - _logger.LogInformation("Processing job {JobId} on printer {PrinterId}", job.AreaId, PrinterIp); + _logger.LogInformation("Processing job on printer {PrinterId}", PrinterIp); try { @@ -79,18 +79,18 @@ public class PrinterQueue { // Re-queue with retry logic job.RetryCount++; - _logger.LogWarning("Job {JobId} failed, retrying ({RetryCount}/3)", job.AreaId, job.RetryCount); + _logger.LogWarning("Job failed, retrying ({RetryCount}/3)", job.RetryCount); await Task.Delay(5000, cancellationToken); // Wait before retry EnqueuePriority(job); } else { - _logger.LogInformation("Job {JobId} completed successfully on printer {PrinterId}", job.AreaId, PrinterIp); + _logger.LogInformation("Job completed successfully on printer {PrinterId}", PrinterIp); } } catch (Exception ex) { - _logger.LogError(ex, "Error processing job {JobId}", job.AreaId); + _logger.LogError(ex, "Error processing job"); // Handle exception (retry, log, etc.) } } diff --git a/order_items.png b/order_items.png new file mode 100644 index 0000000000000000000000000000000000000000..aead8c971de12dc4bef7cd26e124782606e9f73a GIT binary patch literal 54105 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 z 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 F{slb6bgKXW literal 0 HcmV?d00001 diff --git a/receipt_tail.png b/receipt_tail.png new file mode 100644 index 0000000000000000000000000000000000000000..90778542bbee70691556bd47b0b7bc881fbf5785 GIT binary patch literal 58282 zcmX_I2RN5)`))_bC|k+S$Vy1EXCWy~BQqo`6(uUGLRKPVL`FhZW)#_qjHHt6RmsZc zf8OtR9RKe)e7)s2p69-=`?}8SJkRU7udk;`vyE-rx^?Slw6)X>)~#EA5I^fFw%}hj z*0oCDkM&m!G*#ARedHL$Up8G-)>U4&E+?33*=#fZPU)m|_R6|-46fv7{SRwSw{`3K z6}8orPr8}>TDk6K+!3)BT;UMm+L6K6X!m&Fhp;FM`?n~&J)0+{v%==w6jwcQ14~=DC*Cu;8v9HL!XoB<0`IN&;O-itU-qQ{D+1?%Yo7 zrTp$7Lr+i79O54m)MYO%wMDmcn@SsFZ|P1SdxfB6UQWXh!#gYI3&dx=Z03Ke=c_SB z>kT;+vS)NW=ysr`nY!<~W~y{TN|rIvz0qIuN3c=wPU*lk1t0A{oPig_ZETJSg{Eh} z8=hv3j-UvpxYImbWuC)QNiQTKWP9)0dx|Ra@On!djuEzd@0ZSN>vfzfGs!+KaDS;V zS^1vd_}tPbDVox5&-!_vM`yK|_}(1jsbAZ!bqISYzneBRG*qM5=U0b|pGw0@@ZRxZ zMzgS`t*ZI5GkT6WXQ(r&p0@=gM1Qbe_FNOl_eqe<5AWetlMFnuS+h;bTYj+c#pV|* z+AM}?#u|Kw?!2!!DHomPYg;lTkeq7bZ8;J7`qP)=*G}t?a~^RR6F1>= zIgr)9U~rkSW=&?fVq&wI(YmW=SidfGh*gC6399u^-*~g7e%_;;s!q4E(NQ=4%8uR> zT%#|l`0CH+S5z>nNQU_x8DREqH|D!y%N|@iP1(1LGA!Gsrq$DqeVONiAsUaLB}S7%$5ri zU%m|d{P~n#yn^o8v#k5}?Q3sur=!?3GB(yXGuk#YGvhQ+N58nZDC;^x#}wcj7q|Ok z>_Js8FGc_DyPoCcg@=VP;LfPcj@N7ZR3s&NXPz(2wQ6MYRx|OKRF`)Ap>yQO19}rF z8N<>?H$5wQ_E2-Fep1m{G>Wb5PfSa@hfk*3bY`gY|i*R{ptQU^BnQZU!}6%{5yvO`26{Ejl;>*2DHVG<mJgOexKZr(gJ{PAg0aWSiI zTUvU0Vs36&N(#T;Q#o}_O@HM_Vdc%ks#KpAE9aNY7P^`}|K+vBm@QW*-@0|U_Tesz z&Mf0ck&!znHfbF_%EQO!i_OMcs~_$$h)5FI^Ijh=^GCzPj41bvPzEI$HMTKat(R{@tb5 z!y_W9v1v5x_X!I2elNa)tjNvH9Vjm+CpR)Wn)u?ygPIx*a|?@{Z@*_|XPx`rQsX2An@$3Ci|scDgO=3YPm4?n*j!WWlx+QgmDhq~(gxpR9( zMN={}gN`R@7>n~}WoM@r6|v~Hjr{(t-llup=T$+7Sz3Eed3hWOhD)8Ietv#V#YTaw z`~5~nY+k&0@uk8`@mrx|YGx))c>Vj4Pf6N3I#NGAe0+N7;MK963h~WusZ(69Mgru< zYWDNIqGU)WYqL2NfYZ~`Mtcivmmv$FW5r62oJF^7eQI^Wsj6ZX{R_S2_N5ehCdBgc2&7~x_PGYRan zPkH{_*K}py&ChJSJofc6c$H#zJB|5&~sT9(J3G-9DuBj zO|KEoF01_cbB|{5?!kfjaFH{wZr|S_fYa;tuj^v^ix=dOytz5Yz|MZuz<^Mn-^y zMUA-Est3c49YG#GvEGZ^Cs5HYQP7@VyMwUf5)%t%-ES@K_(NWD|Nhaju?-iH{FL^* zZHN%A|M0=8`T=9CqSp^PgY3>m!_&sq`L=CQGLE}9ZrrHBF_ZY{#bt_xdXAoNjupCC zzSBm|zBwTh^72hN7PU^L-H7lTH*Tc8d}-FAEYHKTqH#S8{csuvkeERy;&PL_t zzhCbr=JG7-8B%m(G)zr7nY!}_lY$kVm6Svyx8}J`nj>xw;^-pzZJFG%VLg+mk=BhH zayWq}PoHM5Qp1Inxlc#!zqma!Gt<7igfY0*!sabj!m>V$Pfb(v3gU>3on1mOfLZb- zQ=g-)ZEyGW9zH?A`+P?qzryDu1IZ$66yk$BO}%!Nc7Md#d?IDb(9zL>Y|B!0-u5(C zVS+;Zh^yS_uU`WXgtHP}y$U(+Q0$9bZ{hZ>wY8F5fV{gT?tk;O(x*Rum?Vk4udThZ zFc`TXc`-%ji3%wnoiD{+M9nUAh_8-Q6#h`8qoky4iarpqnTpA&%PLaBwv`w0wEo_M z2j)0IB4=}b4qh30g_V(%l%!^8Y;GQI5YDz-U0!I4kqIV;`$F8FyJ_4B&0Jl-uUR)m zkqk&fL&NODNb^qWZg*V0rFm&xFzL8T5Ha9&+@$F|A3Px0a;0^RlX^+g@L!hiI!h}q)I==++Q*4Ea$Kx2}U zVU?9Cr(T|Uhxhd>fKYxGQOP7+KJ-b_8uJ8aA&em2UFwSaKe{6Ve zY4rDRD`a@LHzr4p9!*bAH*<4~diIPPg$1Y7>eDmzrg+8pjI5Fe-@kvS|E9T`eCy>Y z;nC4ik#qU?y7DgO*>_3S1hHStw?N2E4}Gw}0VQdHatA-%u3eY&-?gWoIE#~&cd^;} z->)uS0ReVSVcSOWcPn0+MVr^|)HOE?@bGxswxy6I&&|!P`}ncOQZh6wtP&YQ`{+@N z!G;J~j_pGqV*GKJa&plqSYffTO_jb>^$iWr5)y7BwW(U1;HuE&-ytC(K`vL!YoSq1 zU48QFrR?76g}=hq%qrBmVZ#56fwk1s)Gp+81yZgm?YST#ot&I}TW?cNPEM5T<%<_C zkk69RwZIa@#&VF@M(SAi>C-1%fR0?wgMWNJVId*6>n$rC3U@FwYofHTGd4Cxed(RO z;VkzQX}e~R$JIMZd_1lvVi0)-1_szhoV={^MLT}oXdi9UT@UZye`lRX&&qmVUB)W3 zB+*M;EhEfDj$`}O^fbBOju(c&-a{Xs9@WvIM&5F}7-{Nxu&b*pkX`2C%#5oJfB58f zs%_iOyt=R+`=Apm`>92P&rwj5W$h}#s}u{B!$U)1;o%k(0S}O!5sYSZen71D(iR2h za=Pqw;^d!1MX~5#6VsA=_K6ax9BB_Bd|Y4uEe_*{xWhNU6kidDP9fJ=+b`jlaryG) zA|uh31B|8J4?FA*!g3;gm;Hs^`OhAmX-@FY!|Jq!yZ4bne8-fetP{! zeHE=@)2{2^l~0{|tju7bz}!5sV^`JX%0hTse~hg^Jomk7Bdz>}CS476b;OAZpd<=` zl#EPUXQzLP*w3`fFBsC>Ri~m3TzV{F6e*i~!fI-u9y^^Nm{ENfD_9fE>6o8cruj*y zfL>}weDyz=Pcgd8J+L?Wu994dtG&dnke)Fw`nw4Z;e0AGVd4Ng`;oS@%BGH(xb<$1 zj)}P+94v6~;FI6q3iF)%H2?`ew6xHj%IK(z42h_|AWo9vi4>jQw|6#{t*tKE|0rXP zY_y{LjI52%+FE+;w|R5iVf(IJ-@ZQcEnBzJ=&Cb*Pf%bMNXy9R$0k_y*94tBdGeLZ z;1PRi_DfKgjenA&Z|abl3&xyZ-m@-x{ogx6%hAmTu>iWR52D zPn>BRo@kfld7h-w`sm;G-|S|~opdI~D_d0zZ55Rbw{G3S zOC%k>%L0M|iva9DP*rzkWS8Ha?CezxeA5 zPU`*;oK6B8JIDE0sKcH<{Qz7v=_dc>_ciPcvKyCxfd8S1vT&ddtOkDbC?ewc>C>85 zuO2{#2;6n(F@bR0-1mZmQ?s*!Po(OZ6@Ghy>qjE6w6t{k^Znq9j0{^lyJyA4PmuRR zqN3`GocpmiNm*IjOS|=Sb!kXKL$33?_Tbr@^a-VV+LfDKhqp-%(A;WH3@P7ZTQ7fU z{E9YUZz+oysaY1o`qY0TtK%ho%pFlLv1Az8k1zQ|5==a;0gqt5*Ho<{>M2a5Es&@(cZHdCmvMOU<&B}?(z z+ps0l<({lczntVp)$b)%$vbz@n_^b$?jZ(2Bm4C#e}dFp6M2*DuDYzXNgdSf+#<%L zk)IiGc$oXDVKyIay8l@j-czTe#ME2ynz|AnhtVCuKhZL z0us2{TVGd;LX%G>f@9;Ib%TS09EzT?NQS`T_5;ihLK|4m)dY0!@cA4XKv&eRtR({St(;sBI@@;oq{21G-xZ1BczdBdZoT%!r5-xSk z(&j;urpiB)2csH}j$(|AjIOS(MoJ;dw*n%!MI`eYA9$#J{i|R`L6{$#*rU33#q^A` zU1CBNs^9nn*WOS}xXs6MKN?W+EyjTXf_4FfnvBTy@GUEo$B`WU^M@3FlA?Qhjv)!4 zH6I(ZLp*37IU*@lg0n<=&C8ef;Rv8Kv9YlMr}A=h6TpI2N7L0+3P-cXq~qN?Wdsf7 z7H`1K{^6ph?tZ`4GmeNN6|1h=kBi!zBv9lGgjU`Og(_<6Ead>vqC_% zIhUd$XUvD139q%AKW>cg!vVFiw@1hMbYQ@;pToZ`^%%)sXuJ;IT9l$<7PYjoxp(>7 zYv<*8XVKDMlIZQ+{uB?B{thV!Aj@+)rbi#$2hKjejt9Nh^0J4Ju<$}#{OWsr3{sid zhv);O5CA_@T~kjx7yW|XZ?ZYyuhW4*db5IaKyQPj;W=%5l~HlImsaA5j?vBE1!$1~ z8Uu9~tZ!u)B0cbj-v@E=jLjSP}{gBV!!PpOj9N#~=%%Lme3z`T4iEYJSDD zeCD~B^V09a{q9qi$k$?D=Cik3RLw8rbenl>;J)SXxbi0YDn#*Nd$K15w}D$Ri^YiFg1*gYDnBbEi0tgo}#{b-Z&})@eok zZ!ZtA(wWcPc!PXmps%lFX2#|2?hcR)#EWJY-KaRS3~-m4vhp3Xp=a9_tJLNeaNaBD zH%Z-kE+HiJKs%g2$78{ze7;&NEIyu`21H-wPIIYm-@aX_wy?gf(N=w-*Jo!~GU(QVI4&qdd14V@64&>+C_|DBeD8UAQy2`-onr&kK_k@i~uw6u-7urNHmj@iOKFxqboG% za)%2mR`yja4~mflferVwe!iXE_Z7$Xt-ij#Ck+iJ+fN*uoN5$fS9^X#Jaj>>?*DIEGfoVbk*7r*@Q(5xhE-PWHx%cW^rr+?-_wUuvG({<&YnGMX=O#fV~47Xi{$3boAJsEIcLCD z@F^geg^_v-00i12@z z2_vq0aYNsbND;O)s&y(lE?&t!xgk!1b*~t^-HQL?@@@eBpnQ{FX<>TUUxTXuiXX{K z*Ht^p1`59hsrcVXtPs<%8*?l!-`Q?xSorPoFS4KmgM;W|CezheYZMhLd6{c^Xt)Hq zxEA(V@>l52}BX!zn?op!-J+eQ8|!m{wu_HabDl!-LoGTAhwZI5FFJ5(v)ewJZTV z?0WTT&c){4q@--$B?p#dYgJX1l(h8J@^tg`xanFnDiiu~P)GylY^iWMNhSUAr4B5? z8KC*<>T2ZY)}9_mo5w02?G~_wJY|`}f%IJO`IF5IzWZFXv?QGb`g8(;NndhbAnpQs zd#uMK67tk@v0L{+GocP4wqBZ6#5FbPWEJ&oBVBh@?;bjeS2t$u{>zb%9uZ3T(6wLU zI!a6;XOx_sC2*tiGcBrw+W@~82Huo`fnmNzruJcE#kv5L*)5 zqA8p2yKC;D6CY~D4l8kfw7z(;-&GEEeR;lCaR}_%b8zh_{`jq^lja{Z@i*Q;?E$k2 z$p9@Jxj4cyO6gV&y3n(;-&}82FC?_M`}`-Cj;ZvyN_-KD&ay6rP*$W)$yPcpuEKA+ z`ictTqN3YxfBdKiq-<+rlaQW%ADsZ$IEhi=1oO86dOEq;9bg|~Vj7V^z7$+y###qsQ6v}Eu5C)a@~3Hl$YKu>QbyOr*P zZbJrx$(e8}fLdP(1~pX`uGjjKp-V6B`=!{r$?rx9{E}-$b@1RpLZQBRAp|=5{{8#K zw>@-99A)c|Nr@xso1W}X2i;s=zB`~=MVv*dESj2@)}rtmjh9QG&;A5X+r5^|p9d;Q zaWvGEa6p;&k_>wYk=oP}!>URMu}3so5WLg?8%>*FRSdg3g+a&l}tH=2EVKkyae zS+ohTlJKdQ7XTl?4|wN`Fi|0^*Kouo3sf0LBn*1}|Jgrzo_+Kj1?l9gPU`kpA3*zu zy+pCriIJws>(W7%cXoCLxfv%A?-7<7cjE!A;&O=T>QvihU-m@Rix@Ck77b_L6|{yo0B^{R#O9l8klaK=;hRhbi( zA&D=()A9sXKnkSlpYVI(ULP;VoDvp7m+-wb>L25aH|d+krWZtCC58Vr^O-Cpd$`<9 z_d$ng6Ar}09DAy{GbMw8wjNEA-R-f4^lk^4EUWpOIr&u-7QFwvr0{R6d;*~`^NrCZVl`P9YBl5-mH5K*E;~$;%>$RCg zHcja;akR`Oy_mC9R?Vs!V5;fyu5iEFF+M9PF1}6)`x&jE26{^3^^ELOJ&oYqG>fl5 zfREpm!jT3PdTS~9sjbbsd6)+jITEIt+9oit>k!-kW+16EI*yo|KbxF&aBzSw z!Ia&36cGqEzOGISq!r*PUX93~yzxd&LxYXI?2QSihJBzI+d4Yb?d)FU7}t%@wtoJs zfvW-44OR^`Jc!ExwA~%0+aL!>1EQmYppH)XW048*;ny#F09O(l{QO(O>wS7AQi1M4 z3Ib5(oDr$vs>2&WGy{;Lc9R z*Kl=VQBf3&M+V-$T?b(>IhmIy6Q2Tb1;UlN$%}F{zp&6kI!0SdOFUNp+V$&gpFZ8` zu;T-9;^X5(l`pE>Q}OllXKRk_mnEMBx=W3kJS(`rMPO5kZ;?XeU(brQ9dWnR`*-kI z7HlU$Y1G;gCb!n>DtGYOFBZTu%ZnGGPo-sNU&KMh@*vX^5@-j%&K@j&WMlQ>>^PKn zh;t7)4yv3yxf8hrd_#`cnkQkpfbrhn-ytO>6%r3te*8IjWZf8PLf3+Y`ts(c4EU33 zhr+fWKOn@Ess4}S;gEBs08xUKC&ZP!Tgc+#4cu?)vG^2JUC=>*KRDH8Q1Jo*gb&~R z*Yf>)6Y>p~IriWcKk!@-p_Cy~0JDPSX5i#J2BHt7wj{+0C<)}Ua1cL#|BCz5at@*Y zXo@`;j?03OaRepDI`0XZn18>&X(B~I0|Ws?z$C5>5#q5tS)2d*H3RjQuF~sb*lnnX zsGiMGgq08**uh@Vk)$2NPOT#XGV%rjg=j`(8De7t(a0<>Op}{L@&fY>nd>41PYwl- zC=`2W40i?JUv@{OL|+H-^hsbKHR7I#FTfF`e}_zXJZxBtdPoL(+ z%_6lBp%kpxsf-9L>6N+e>-%xCK>D(>vX=d=q#~jevx(cCOIgK!&yPli#l=1BnHWYS z;;M1WT8Qt$A2);{O#>g<+1bfn|HA?G48-*GK=?7Ze(LJ#h>8e(ISiV2qgX|gD(&I- z=(G{|@6f?a4QK-a<3@=*SG(&v5vP!i3knKi6>hNwR9D`dcvCCpIZ1_Fr+(@b)1m8s zfLU0gzk=S^0nG~(0y5?VJRLyFIIJj+&W-yD={QLx9m0vG-oD+y*jU%Xg6Ek0h)t+TDu3+5QwJQ&za{zz6G)!cmOR9Jp_SSP%j7WY~6ifd43Y7 z-)XE}Fsowq2Cxn}dtVEvfGjO6l6v17NM*iy%~*4BePsJU%Vy>B?;yg4avMdHva_38 zB#8n9KL*0><(ZtjKpOWkpo* z>p$H65wTBSz7zqM09ffUn_)VLC6ZsA?gb>bGN-nI9ny$^7c9mQeK6ZF^r%bo&4)hl9 zUQXnctuB&^G8}hvdvI-)u1vR2wfQ@TLTKY0Xenyg+?%$XA$|E5`A5dWVXuw9adh5jRosq6U6N$>F zbLmosMC2J0lZQY86&3L)>!?Ka*kUzgSzvfXuSjoOPUU=HZy2vYCD*2*xut`!-H=`v zr2`p%N4#f|qmm5g{K|w^Gdws8KfP&f935qbY(S8bVuHLF9nA*E&$dNNmpya|iHUbw zTMbY@-6r15Q3zRYLA6<)&GtIbdfC?Y-HRAj;6T(g`Jq(NhETCV{ycz0b~Y~lCL&rv~~%8 z2V#>rzAj!&RsLrXhsukT4%j9!)`e=w6?Ka=6>81 zYnGo5bbbwipImtR=g+xLy(&qu?=G}_@nh6riDxtl8_;RUtw^y2UjPpMJuD$^Q}qJr zX=&oycfIi5&IPh zc=>-{EbPC$dbbDbQw^rj0%@~`O04YdpYBq@eftjh*nyLV(74*Xwx9@SMc$QRz5baL zxZAG%`tt5_VRy~x@+n5*X@lb`u;lRM`yJnLu$PxA)(#Q=14bXo{Ib)gw-`}l`-2r9 zrq~jvh^y{z1cUvz*FgetZg+`%=e1PmRh3=3Zfe0peqkV7e)(^eJU$FBjzG`b?>)J? zGy$Yi+w8S^1uMxeZ4YHx9EKNEa?-ntmCyf|vp{WTnz;~sN|<}knIz6hgdCAkL0_X} z01!;!qr#)38)!ZMZv5_0IJsSa=+ug5g>!6t^KcRUhhSou~liROJ8 z?93JDHABtu&7`VgmD~m+P8W@5l?JXlA>gF#zq~~gUW{BQC?+->s=3?j_tye9SI2Vn zY-iv0sJWo#W4BRvh|X5N^v42L6C6?S z)W02nJ&eAXcs}6%Ln9uWR54 zP^Fze9OxvRJTWhxII#mZOL|mXVhsUc2q4q}F2UvRPi5~f(^FGLzh8eVg6AsdT;}rV zF|SH{>1ikd+bepSiDQ5SJ@7e7)$^R3P(Z9JsM@4jjCEu@5jWcaKtkX(!i*3rTv0Bm%QN28BH)ZuVF}x$;YaA*2a*mxGXtAnfph zS0?N__E^($fh;!|Lb*mxzT-=DX9zB#j{M!-t=uVd&2Wg#k1c zi9!c>bqokSyKHJ3&hYYLXT=bE&-|7EX0aOUJP8OeCbwn{QDx4QUfT!n$akkI8Um(J zbD%FBbne>(duy!R)d%F`u(QC4ug%65a}R}> zi3v^a-Nr$4Y-@6ADsE`vZ+QH&57|!R(rXg1dF=N1OU$4xk1iX-qDrtm&KGVVsGLW2 zUc7QX{(b5nw~$)VNUGE}Z2%K!QwhzRXaD_!3oz)!BhW@P<{Y4?{4}Iv;QQ9YmZKj< zS@9?_EbEyNke2=&HGf_1Dfk28S>)hA|GCA#>W+52&&1dmHv|m0=IHL8EnIPtd#X_a zN0@(=SqL#sf)^%KM=90I5*`h>NMRX72aj((Tj(Be?;eO+mT6=2k=T$BB}>a>t^s0B zs;&K>=z7!gYb&KXq; zbTGJDfNx^w1*bs57&mTnX_OP~2@a0;jPG|sF99#}9(3Q?@?k@Jhuo8STAF|##m1t{ z=o6x5GIeuH_IgDtEbKb@v5|UgOF@{1QcvB!Do(Dw+B|7u;%Sw~3M#ERbJe5p0 zx6e@CD(!X{5H?Fzm@;jp8qxgG^=O}Fbh&uaW8=)!N7|P)>s436ZSUOn9EeNa)&BIv zHr6LImu;SDr@N7XSz_qlyM*eBpMlRigCWG3RIj+fp zl^2s$6#aR(kA`t@neeC;si&P({yXZI5*F*jn5fFNhkjE;lv+5Q)>jp4p@G6=E;Vj8 z9=Y^;pLrJ22Oz=F(CD@K$0BI+9E4N0<()kkVXUP-=CAifQth$i{e+_nyjjTtvmw&Q zDGlPZ6&Q|XhAUmJYPlJf-LCy3=23MP`^lIY+A~U>8qYHa6ppwjo7}yf^*jA)WLbw3 zGNPjI(XiN;b=sOTf~wr^4xf)HGD}X6>{i#$kG$QtL#K5|;*KCaA0wao>~GiV3y!Q~ zFx5J)hJ~QaK_pDZz$^ql_ z(&bZ>`yR!%&+v+|J~$$OUwHCUqi}LoP2{Bm#u`y2N@5j|o-Xuz+LV!FT*;@a<@258 z&QG65IuDqb+ABt0{5(IiYX^78-hrf5X+fU^K{kJ*fR=l=kGSo#q_8^mad_vu2(IWy zhHdqRj4G7E&4cHr!X&kx+){{F4%{FZqttr*zA|0A|6c};*3dPF?zB^5FGqJQj~y1Q zkU!lfDLAVk7I5wwB~LToE?Y%+QRj|-2Lw4cYpYTi>WZNqp(;w|XFfTUkX)5yBQ`|m za(wePD+)fgb}fD16K^!=-KHs`V|*CzPzPl&gnU1JfK9uRQ!{Y}5Y+#vsOy0;I_htmnKlWrWNa=wth zdb+VveGE`?Z3mj6`&+o58vds`2mL;W9-KK!9{wWmZZL}xPdfOpCOPF7n;3=G!NLL3 z1&stm8&p$veir3hX>KUlP^uuq=Ao&^w%~GwRdy`1>2ogh`t?uSB)p_at~cI!vaJ6 zjgES7@kVGp|IjX_dSAVRts{T))Xn64UwH^X&G~d;;bp3ndVM~VT~G;NpAQ1h1^O4J zg8e^+!NY=lgu9{FNfu2X^qS2YXS8-Mrq^v6%3a{Yi zMY4oW9XRdsoHPB%?d8V`W3F;Q+IwVVI=^iFGq*&DFGxyAmBh=br?)$&$2e@@?qWzo za`;Jf8nFF6%g^75ehZj}xMGn2&>sUi%7Uo{aw28=<+*}wC$t;m=xkXsLWfdQQ?pDPqQN&GZG8@+?3G3Bb^=bo z??k7B0vMx>NXs{3G4pu+)1{awncrStPD)Mn2V=hb<}ZmV-b>vjS7A&@7}aywzkmPP zVi!I@qW!Jr5dQ^Mf^f|;6Ohz3P37gvNqgNHCu11Eq$hSgcw+IncS{JMBa0Res1Q%&?_ z+y>OgUez5i-Gh|{8%1pCLwx+|7NLs80ucs)laU1KErd*GmvOKJPu2AFP$X!}6X>^4lp!8Nk%Z0m z9ej(UaKjMCJY<93UNba6sL^I%j)>_N7oD`5KtrFp=&IfXtRB!FJ5|6l2}UL+$?JcN zwr$(?1&lO=-uL6PY*U#HyBhBCKm-7{L%i`|3l<0udhw!wvhmW~f(N9jZ(o?Y+S;xt zKWUeIz;SdD!HYJo_6ytS+!E^f1#AkGIiP4wYioW;U4Ct}f~h}GXzTH%!@cvTY+BEu z^tUu|nQgFL6d!v1&7ps(XRZ8Qii(ZU^j6I?luzNkC-Ag*DEgA9TgoWarnM=twaUnf zWvi<456`~cNw?KfXnlqF5-}~0C1{c~5pdMx=H;R55rA~;K5b1F=Y?U$85k3xrIS_` zF-EvMhc~mQ9Ey6k5W)+D$}v;ZcxP*0NFNFcabz|K&hny=ZJxS67#{aSd}Iy@O|gYxiV)V|5-;p!0`p7AAwnx*vLzRn1|}fT z-Rd@YJ)${)z#)?>FPoi{CiLZQ%zx94!hpI?2y3wxwF2DbG;qh~GWi4-&a zh@+b`5?9dSu^G69ODInP=%BV!IFh3Gv|+R@l}z=({Nj53dcRAt=$^)` zEKziJ1STU6U~qxnMfMe1L)pr|Z)k-(>V#1`8tL45)XEK8GhV)YZ=Mqp8fx~dOd{q( z?BSb_39kk+klke$#U^N%%mm%ipAEjKfN^~oci0WU#|knRiQUSPFUXb(nRoX0Z@!y+RuzMP^u`xJ`-(a0Gb zIGK0>P=~&^>(I3e1?L1&7JygvAF5?pn43o(x-Ob=DiiYuY#HT|Zvdh}x(D3+Q|#~K zv+3@lsK9NMMiTO(qSlR%_YqwKK8U;T5+pjF_l5DM3cfb9^S(EfESV7!{GVZ-)#T1# zW1`?c2bX<98Ohl{nD^;_XiNPi6q4UAS@-6)dB$fbdUtp8cjww&9=%kiKfx`@;Rw_y%lwyl zLZa%@OTG!D1vkNw^5vBo1eJ}1kVX&4X4V9rGDWvP(SP@|SFc)%E@E5&C1>=gX&;*N zpY;Oq12_&T7y(37LYl9*ARR+Y(*K(Y1S=7k=!AMh25;tiyc7|%Hj9)_e0+Rh$pg?X z5`_l&68`}84IO9EMETOl__zg<6!f{oQ6E-DMytI_caQNM@BWM$~Z%6{3CCn zV~-yEDW*$bJEJ769)u1fZvb+bA#mU&Y(WVuj+TGE7c+-k&{w=!1W7Y7kxTU< zJPi(o-}Kcm&*P0w2s{SVK=en|P`4I>*XC(oJ9Hlb^G%2nGMV`mGd%zstN|S8u<+6< zzON^a9VQb3U^;i>knjI~XNC0k&m&FxE}1T|L24zb5uQt`M*<2#15G7N0+om5<#mA3 zplm`F1$&@wXc(bv4#?)$`2%Vi7>dz}2^pz8RGaBaDlsyp>dh45v{;W8>t42THmA@#A;C{g&3604*oK^ec~4n>}X83=mp~?FdOl00WN?9&AII zgL%)$b72skixWr{pq=+Zg#(EVRgkDJtFZMDEecHe>(`G#8iU(HW$eX{#2&i-5Lzv| za?;^K#neA1ii~!iVl1l^!%A?tZcacK53mUd2pr!9-~u9wK@<8Iujm-NHE>lz5dzxU zKgTueSWo{yP3Bm*lc!F(;CrwA{_0!XZ#FaX39{5=>rt^BB!kzEJs%6pXZJajjPjTN zE68ST(}0viRF;eJw?69|kWz!HvH-5EE62j$*`+)Dm_j{t8YN6A1O){V|0QH9R8`n* zaVg_><)}opT@s^DVJ@IzbvD}_tQ`pw2rN5#R{s^^kW`M(=6bH&aHv?h1_GuF2amuq zRAjfAE8AlA1h5Y^LPwNL_hMf3KYwhq!jcH4p*ex=h{Tg1(?@8|KPBU$IQQ>Oq;HrU4^x(gdbq1p^W%XiU?x&{WBE9L_ zVkb%Wgv^2nj42dCAQn0E5K(5KHM0DD#p-wk=156odCgaG7D3FJM<{+IGn{Ycel!AS zh}o2q6Y_3+mT1F7LVAq>Yfy1+BZ>Ybxrjyv04KHKq!IoYvq0~dE9TWn>S%$z*5)(_ z2=L~n;u8mCW$T~{RgtTeDW9bAT<+(buHy+Nlgw4UzA3a3gHEo7Noq1`e?~^c^N(Dq z+n#{|uE5-ZRYc?br(n6w4?_z z{*FGBRDT{ZZyv)##dxl6EJM9;CUW!b1O?NC#jt5%_J67Yj@xn;PaC>~D-1+rhqR5p zx0IBSlCqTjEj6yktG-0-n{rcxwT1TP{h**X3IDa*6ruY^(WJbo@hK1da`L$b6TjL= z-nhCLp(IojoN9DLkOHOqD8MXB`1&ZQJaSdz=gSUIrkUvIehA*EZ*B>8M49it+UF|8 zJlN_f&n7e#r2FvBJzxJkL}inT%ii6(B8z{vQi`c13r;)2i}vdN3Ddi>MN*?N&HK1+ z9x9-#U6&Y?>K87xx%G?7KHKzNN|||dg;FVB>A_g!`L(Rxl+a=+e*B7?9S+R+W@4zn zqqGh*lUv>6BBtsiDu$wW7e_w46k~WXwU^41yCN*>{N(jCL4G@a<0r@6m8P~wOrU!| z=cHo)HTl9`8oDF=BO131_7*UxFkI`tTJk?1PyC-qy@XMwHi$=BM^}&fc5F+3FVg(H z&+}HyJ*j-UWV%Pkdd#>68MU7B>FrIPG|YQK!iS5cujrKJ$qu)HxV>CLto4q?kC&9Y z?NvLHeFRz#s%mXlzoS2WqH2??z|O>w(Ac^jqzQ0-U&LH&!h|Y7#%#D6^}vMnYMtQy zBeI48;gw0R%CzGTQC)tUkbAH@DgOR#bFWnC+#^v!3u$5+Y|Y6w&+Pi2Wwc3p?Xfy# z>Zg=>UTLyKxVOWP1~`*JWhr-?;i>kUdwIlJA8(_)zZ}r?EF_}NE^RrWGLa$fNZPZe zv{CJYDuYKGgk9M5jh^|Uz6)3;Gu+#ge_VrmGZ(F3piiVzt4&{k4x2ukn(paxl|H&8oD;AToW3-pOQ8tAa+Dbw$L*qXh2|4O8B)~SVanFD+e4Z=&(+4tr%OX4>cX$ z-Mm@yMMJ?64Q?J4C(rKm%;nRA+9@wi=I%JSZ7e#jF8FNc;>q9p(rEAdGV_XZC5dEr zQk9(eu5Y4$a2(h4{^w~9-6QKe)SkQC1#+tT(vobyPI@%l&n45Bg(5%$icQGlonMn_ zh1HY7W^}pOZ$3BkUerHPr!)0vxm}}F?F5T{o2po_t6yk2HvtbyHa$$NkC%1_Zw*%{ zVQ^Ps{iiJ(%1$Zp{<&U9T0`hS;t-$h7T0}xgAbMN(Y&b3Pv)Cz&({d6pc-=$3=6Mg zP-CDKIv2dmB$>OnN~_=w?=LOJ$2Y@Lo0_%V>Q4uW1<{||{;1)>7Jf0cz84ErIt{N* zU*0n#seQ2h?*_rs#I*lXWif4AD9>!+jB_YssG#ANj$!Vt45#>%dVK?w_XXEQeh<&R zuY)(Zc1-y;6hu!{A5D-7Ou2N)K%zi=?*=aku8K281$PFXoMmNbm~OcnGn<%v#L4c4 zN-l$5Up-aFPL&y96DpNyb@$1!{k9hhmLqRGAvb<|=4>eQ6UXq?%ztK~^r34lQff6S z!&M#fye9gbD_S>P_WfP(sCgE@s55oktd)`7a7eY0<-xIz0Us92t=?^;o75xnyX?U> z?>DR5^pb1oC|~S0+f4;dDjv~Ov#&-nQXx>2L5K)Q7@$6gqGEA?=~hG<;0#&=5Xxj6 zZgKX4^v@RR_ex4F8~fn|m@gr;x*_?7|{UY^i~YR`;?ZS`+3EJ?HxOwG`@ z*RJ)^tMTPx1%Mpk(69y@WAmVfe}vTK)+9b_BJifz!ZWrbJgXk6F)?EhO9XfmqG*uOeYgT) z`nm2|!OE z_Ucx=Us-uQTAcWh!J`jzETe3}tsk)4Nk)W#=aZj5N9X!(Fw*oRo(ICB=vhXe3Z(~? zgAf{ki$IA)Ue@WsrhrBQazuZ~zR6opZM{|BCwpn)X^l8-q7CC4006O!_$^J}cAzG7 z9C=g+I1z{y*`1e?dDMhDRo;jBhd8sCE$`>S0F3+e5K-}7LE<156|!dNOL6gt4r1`e zXJSr$W^RuCh!Uy>gf;TWgZbGj+-lZ%p*w)87OZh4<5?E7V;wKg7e2(&00-k)0vIL# z;*{DB2M4?d=votSQ$UNN70WK9jl(26QKwLcpaWz2olp!#05}L!!u^o1toi}g?ql5H zMgU5XN7ARxt2(30Jllb_P~k&IyvIsm`1TYYvMZ+%r%As4X zO3VmTJIYP#uoz_!<}qvKB|gRzl3E>yhjZMRzcb> z$6>I-08sJRiwsO}5RtfVG&R0vVs1Yc7X}cbiGq|PzBpni#PfMvU^QcLhtZB0nLHQU z;&b8CBhS9+cZx+n*McbtY)H_FS}Cg=N2>X>_4Ziq`5J6Q6`JAY zc<#mXQn|1qq1F=St4`X zw*9t3u{-PuFtuEc-H>8u{Ol=Z&N&e#9OnBEAM!(e%9vR?2ajnwog5 zS240WE8I$`CZJ1jVUFbs{GbOs`q_Ja5*rHshpC+75Wevk8a#k$*k5s(OL6g2aM7>a zMv^4-Qg`UKp~sZ}`*!1U&)Sk#G1xD6&{KG@ML%d)@<1S1tnxsVH11GC%AzP)?bt$3J^uDy5} z5cndOYie(n}ut7ptsTsY7mH^`FC(t}lBQW=h zj03Bz*0E!$|MMW>iDo9xAh53qqRd+Uk_nY9JCWjbHU42Q2dqzhP)Nt29|jt63Vck2%#{Jd4;W9ROxo#Y1= z12uSEVOuJcP)u!@N)0pGn{+9fJQD{g5~EJPHhkEgfI&Xki$A?O4XQOiKOgqECZw~! zZt}!&4}Wq%fCZK(-YJvUw%%>!qT&)OX5aBFk^k9_z(IvXL~Jfung-m!bR&c)OE4y| z`z4NQ#u#G2d2We3qe)zN+F#{s>s~So63 zs|RN=u^|y#DI_~W6jpdCLjS@59Pvh=0@+-?Jcz+hDIGP;P!J{p4xPJ+@`=+17%+n& zg}90E*8cLJVTX46P+O)6O<&~io;|Xc@{mM$cTig<-@~&z=02V;)+WV0JI&$y64G`&eY8URFGwo?dqj(>bn;q8 zF1K@g5BGWQa0ZQmQan}-#gAjVKmF;ch^Gcn+?nTZhYRwd=S4~j&8qF^;^wZDom19u zdKTh#b)uWQ)7r}HJxAZ%BwD6WodzE-{hssu_AfAO6SebXtCAyfbdJeo*#*w8Y0-K& zlyBWVVd7Ut_k=U#uR`~s`-YQ`xfhbe0=494`P{E|irZEB(AOyLP-9XPRr{fqrN(cy zxsAi+eJWG#d96wckCJizQ0)aV+a#xT4>s@(7DfHKFXMFFT21d(Nx%WYJnge|l!j-( zC7DMFM4X^Jnl<<+hdy&5$w-+_wnJND_d>T^~2KG%KVx7W|7HDvGTR?QZ=%~LuJ z`vy<4^8paEa;Xh>9`;RW3~U?a6%uOLL%H+P7A{WRvpze!)L929eb{v#T+R@Yf5e#Aj$)LG&hxX|Y$6Ak1?+~T?)7y6H^#8GR9pG5LZ<~_r>{;0}S!pPdO)|2g zln|j3T2v_6l%0`mnZHV#O2}@Bq@}V7EvrJQ@4Whd$MO4r$MIFX@AEwObKlo>uFF0d ztq8Mw`JnWJC%ii}lGKzoX9*a%nZ3Rw_IsldlaE2(npVCpe&oS4xv58<*K0a9e{ern`PpD8E ztG>OS>z}-UKLz}z-50{zN7ip;QI9B3Q&?c{(i|$_Q>@GB8pb}*C6N`+QTS|6LP&T{ zIG+gjl|(JMkx9m;`-|G|Tvamv!~OHOf`(#1adO(G-tgq83ksZH6Q%zY#oO%2^{tY) zvSj07pXm*)K@WwbB_*xe_RBc&>F|`YakjsyerB+5n|*V!h5cJd0Ls!j4$h<871Vp! zRH+33>N#8?LF#*j7H&DzH(pPrz|(U^9fR_TM1D|}73O!aS_QWiY)yD3ftEQTayCh@ zQ*9*W2k2?!$6bN_6q%TM8rZ%_;t3au;PS1FsfxDoed!N|`jPdNnwpC3unDxhA|->vH*+^_^*`g?7iGqpnS&7L0gJTpaMz3HygL38l?)-*mC?6e?fl=FO5d4 z3d9X4&(WVUOR_x!94X8A-P{`Ij=AdHM)2Xn>yK)}UY{{#JACBx3yKVTvi|2{^wAlI zKBiGf9&AX3zyPpGlLP>!H^?}f$}1C@zpEBrJ}~@32XFjSmTpEvzNCAQRE12W7?kR~(Z#LbNAZrO8K! z`h0)ruWjUafMx*Y8XKavv*sq^JaGbl|j)y^tWQw8Nk;zvLylMh!sp_U)=68xryBCG9b>FJXdE_1Qu zj6$9sC~kPb2di3^7D7%A8gQJfK+Jj&#E(yPSy3(>N^I~Xl(ZOiU+?hYRlpd96im_= zv$w~k?tzCEl^cK)itYfW&G#%S4XdAo&2J9B-iP}ffNFFyLiKq4bOW^abjv~@cD}l^ zejb^+QRc|?D$C^MPRlYy>3F73;V=v3y^uJg_%t4RTT*0F%-2G$#cKRv@V;`Rnj>v1 zw9EUz`ztCbkuDXb7`aqX2ma&15erBf3fxqZY=GHFPEHQQVLbErNUebc_fEV&fp>R6 zm3^}3lLxx<;~=l(Au`3U0aZ#s2i{IPs_C&pw|oW=2Jx;_(gzx)9E+Q+loeEaYem583h z)&X+?k>=!a`LNo^WGeg+Af3;g@x$RI@|f}}?M-cWR` z9|ro}I0}$g5}FUa>HqSx&@4a*3^Hoq-D-Rr`y~|1$7KuG7mt7EN^Z)4%5P6XpE9(NqjY8<5sGuML zoUrx&E)5i^dca=LEmFQ&p7I7z-2KS6#HH?CWxHidRM&{+op>~FZ$p0VBL@=^mtXJx z+yS;t!)->@EI{9Kq6dk3Xvxr3$^p5AAPF0+yNpj~)Xh%TB8|~R+iM0ETG!Tcvn1x^ zJWj8jlBG)CATC9KIGEhX))TKvZr9W(fF6gG0Ph)gQmw!-iICtuc0e>yNeb&{PATF} z@6K>Q3xkuFh4~a30_g;#-66O*Dc37eO6c(I^C0?_YnH9xKeicN3536Zif~&_#bb%$ zWP_DgG>%7sJ>JGj|3W!HDmV_`)Cd3UZGp7lF;ExU`;jfczvwM(IaoVbZ6G#bvIOcz zfxqteA@$Aw`sve(YYnhmx#X<}cme4J;cP^<24Qm|FoIR-zz+s;KmfrV0{-*?dkHDA zjE~Vy!5Xf0?%X-jbYYVmfd8NbIdeEjTsllU-zycem9-s0uP4`=U!0f^trnVjL{y6W z)ECjhkt^?NV=RO>5hVZ|1O$Oj_kIhB!Xbs08TW(^8&Od=ELq~j8yg#UcAsyG6}y5M z0Rld;1p?rK=nw%;uzc6SgxMspMOY;UKZl$MN{;}l4Qia=DJ%{gC%_`{jv*KmF6Mtp zp+Hmc1rV(RA0mKdygx+0;x|K3fdY?lTl9PmfvgK69~G!T11>=DBp?H?-d)K1!0IE*)`h9sTyt%>>l`!`R?tv_;tpv)s} zYakmW$rpKNI*ZMb4|bup_U&}1nThpEwd$za$`BZ$31Hiscfp&^HpHV~vBOmDwFdXU zB#$kA${gqv9udHBI$4m@r4E*Y6m3KnKq!M_5k&pY=ZnIS^dSM!1fUJ%i>iHU36hhO zL+J4E*RQJ{D%foV8kwJ{dr-lvVeuNVW0LVwCzfTGw zp(+}JRD1-H6@U!UBYPoY0;(Cu)BKsX*X=F35c35L&$UyCnN0L>cW7vIvTQ*#B6e|v zW~hDWg=dKpE(rG~V3S^5WMl&?Pf1U2`TsynkL)HaF>_DP3wn0|iVpzV>4#lV4wWT} zScvtjMt=l0EXmRk5S)EHt;xrm);pw@fx>khAz$h!k+G%#g(-kwK-o9ZAE!!kC~z@I z1SNe6Wq85C@;|d0X~UqwC0`AQ2#)L35VMl;6rev@e+oHV_o>7`5k3%t_`m_ApmN9E zSAJr(faz)DhUCHD#qxzAg-k}+jSHdpB?CIehyc39b`Mbtd=`Xq!2h-e^%jiB2u=@2@kv2wKqXP% zf;E_L(RJ(ZpI=p4!GMDOn}_#HX<6ugSHdX; z5Jr@JVZl~;S=l5+9N?0XRTn8;3t6$8Rn8`e)D8z51m6j{^AZVMtq&h+PE5@F`5Wa3 zfKkJvoxd=#p8Lss>cPU-<|-f9p)hv{-6kz8;ek+~HLeAwZ^Y_*jQ2O8904C^ zfHv=ck@;vHssSANlDeeKj1;x9g8Nf>v zHoKVtr#cl#xEo*#0BEl6M|8{Adw)YvYe7&(wKDiX6a+A>Qyv(yXX!#=w?{o;e1}L7 z=z(!CM?2-}rXI+coSdv0@qKZPd%)YG3m-+VnQ&+ONRzx%-S|*g=P&!GcjIDOVYzfPy+0AGD%C$>- z%8zI8CwKAlvIei}Jg{;}l32CsxLv)8>ZPr6`hu+88j;OuY6Tg2*U|=6T?cE|rpt|# zIrBVwWb*9R#JkFr!uAD9TTC7Ih2O16-?d0FJ2At|)mqO>+Ei~SbC!2g>^7n6jL)uh zhqV&|k{kBwUUyR5o0QsRb34K}&+hZmO`jU9&59B=VRG4}zsp2o#_VmDrHWF0LCUGM zO8W9qCoTqWRp~$I@TchFyziN*nxW>*qX(iP}J9*FvzEu-dC*TA|);5GB53fVTi1*{oAm1f5rfpPA&xl zgBbarGV#w`+RwNhDM>C(Om1h@f0gfTcE0G&bM9}_Hv9QomQHLN609%b+7gkfZ*Sqv z;k`jI)#>Lwm0!;{wdeB*4!vjPzhcL(c)qUaRxs-vFI1_zZ2A59KWr^BFFEMGl8T;q zShU|Y`H$*P!!wPJTOxzYH$^lX_^%5`P~aO=ZGrqNQe?24a%sObR5~wmZ`8MV)Mk)seH#_sfa<@SC*xTeELiC ze-=M^5PI|L7Ryd9PI=ejhv5%bZp_#jExsl#b!cmvzy2$|SDS59Ieet^DpCSi{@c1!F}iYXrip}}j**{1oRFw)-X)E)Wor)K zUUIv?Wrt{8x%dgb8qq^lmZx&=y-MVL`*9LP+1Tix`zVs)(<=@igskcKVwv^&rYhGa z!*`g^6vs=atssAm^^no5x0-O{$U#vDzAI9TJI;%=T0bwpG|dKy7Gy1Tjvj(sn}1&3 zxP#XvZ8hYT9Z?kwC;`AOJ$updX*>{-B{+9%935N37O+#gVF$b2s`U6`>v|rCLKSA# zIQ>{iyZ=981qTauyU1}@I1xgI;uoI05SW}8xpd@HafH{YiIpopnG~+n)VvJ$G)||s z$B#V`PzUfoxM5jEz>-2!|t9In<-q@bZeW~6$1nYSop&ZSq)dYEqCz8y4LRzgua z=x~_QJp9vk;tc>;(`;97>H#+XiRhra$^=S*hMs$W4gmqcy+!gE4l+}qIxwq#sQ#Ga zj-VUR$Mh)ChO1?6LSZuY!aX4=EzJmx9pzb|xg&uHI-bvYxTXC_ejr^pzzzfj1~S%< zduL_u4?nO4kYV7*^G5=qE2pC$#m9=)1`NVD^vQvI59mXw8KAKK#>V%DZxiPZtP!;# z^?hiN(8X(pAD0Oid{T7#%#GJy=#fI9@84yyx(bDf!L)q=Wvrs+fnkX-I#l^A!;=c& zlBo0nOS1%k73f%;yI7r~Me;M}rc`YaAn@(ZBp1viyU>hMdY9ly{_FiXr{0kPN6=jW_enSN*G_QF)x!x`@()H5*l1rd((pA5a| zC90v{&d~Hu9#1-(6a${}@1MDUls##qXC{X5T@W1N|4IHNBhhw<{rPxjs?!{uL4D$U zbnE~?$w&mbygLS4GGppJEE3F+~dg@V4+{piOfjL&M)bj}X-I^qQ{O9d= zL(qv**>?#_Zgku8;S@43m~Wo0Qj9-@#`O#(4&G(u?5$m&)+qP|kKHB~5 zouG_E%b%8id&kavieiUMmIj6E{uxgonv|jwC@T(9J5;h9s->t!NM%K^R_)}zRbqGn zcY+QiSF_Nw-ttOcKufy?ApFKpxLelX<58lJMjm0q51>oIFq4{{rWGU7*HGK+-CH@X zo`7Ln7aky~iDQCqMv&a_d0)f%J$y`Hz2NKQ-e>9PsHy5Sd)5$1Xn3RHSD!?Za4K1w zqm~|xMnN`FH-8a9wB!V%nJ%0n4BX3spckL&i>tLzAHjRLjWPX~8PRW!{)0h8)j_T3j3) z@BP+X9$sY!^Q!RHn(zOuBB!|S+=x{*{5-g=FbwA+Kq33rw|lv8I#D9*q$*rSZ=mgf zXZ=;{YLs`#nL>Qgf_CR3#a;I6u$jlLns5QdWhw>yn45s3=`y2WhGl~7>mduc?;MexX-Mz>b_ zRZ4@n1izN9l~s2&ks2qiihLi&cUqhK9lwdY-}E zr2s4_H42-$@PX`trkR81noyoq>bIJiK12}Dp6ANG)kA`$epg4ajBdB|zyDSavTi@y z9ik#_08=6v_vun&1(wC9-08U9d}`q$Ug*rQTSj+mH!dsG!TD(YaM_@h=Gx_h&Zd&$ zmqKz*mCu+>Bi8^}9wC1)Zc4;ko#IG~aFkh((jA9RLpZB*&`_H8^!rn2JFK0ZIcEFT zLIc2DB3LH#4(u+NVh`D8SIYPR#1 z#$JJM949xtpQmwc`Uf4zMm^Uo6Li9a@J*=)R zPP=0rd4#c7&?53s`Pv%j!@$kZ(gVH>(HZQHCf4sJo?>hfU_eR*;h4v#VI5-;@@wk8 z3i^4>3W{`Dn<;IMKx2q5Am%}&X9kAW099EX8HxY<5!Mu@sjCX@?d<>(rVm9i0i|^V zb_{!HEM9CdQSq=sLUV-PI{*RWAh-17^U=K*o;138b@<}Np{9(fph%WEzg+AukPYee z4UXgF{Z z{(f-pH#-Ud=7pxSI6|8dt?m0}4H_)Y89paos^gyKUFmyKx&LbNF&h!rUAexRl|BK4 zts%9<6MGE${4BgmIMpd+i&LNb*iD4~3D2-gW19f=a=Ia|&4dg#Q2ujTe1Yss4thKa zl>L7pB3@(4q?l>53TgOR`*S@MeH-v+Lr>}+;ZGnVb9??w)GzIb5@fiSjQJRf`(WUJb+Dx*YE51u`U_zV(~fPw(P zL1~vUrO0sgN{Q;!Cn1V9VmTju2d6*e zpXQhh0B8a@fqKaAK+3nuu6~8FM;Bg)H8(eFpvpxe7;@<}H(lN3Z?%5gcQ9gWrV9C& za7ER#YuuD4ytggdI_C18EMz;Zk~Oe%9m}ib=CQsZX}0F+Mw#XMkp&^aPjWckJ(N7` zBNu!w^~GaTH2Qm1nHC$Bul{~K`+66V*qUBn z+)K$_DK|v7T$EL*fz*HFc7xa3UfFe?U2D1(h>X)ItDFDX|0;D7j{zb=zfNaK`!cE9 zjKRK^gPR&ydRm7!_eZrS{9ZM&`l9g(rCka!nTP(^_|OX+!J9MJL1A_la5fCvxLn+h-UY{$Ls^U_OtP@7enFRuh*mJwEr2V3*ot zs+}a1v^=Ret}i(&+c32;!pX?Gc&Ajjen7zxfa%|{0{29%`pae9Y~*^1r6#t0HEY^+ za>Lyyx7Q^XB!|+chH7Kao)v@yj$X$Hi4z5yrK#K6B@U&i%_}R+irlL5eQ0A1ujTo9 z+@=2A$H}e2l(akL;`3J3}Jq2HJ=VxUPN(M#!aWGq@ znQN`FGNN=OdG*H3XX%nZyKf}kuzQdn$+@o(Z?&@Cu5GiITO+wsTT{*Cb#mKRHXdea<#Hx;et$L`z{TOpO^H@H@haWd$8r?5x;l0>GewY1#?E}d}o4X8xoP4TfFLnI& zx!wA=V~Rym{~!kZY<_1T{P#FZWQJP=+mGVef(>7Ojb8sPXSizUrf5h}U~=wnF3x37 ze$O6Ot}baWRr)Bk&gY$AknNBe=Q4lUeJ3wGOp7{e*7UBj&1^xq43mwpnQ=%(pMHeh zU2&y1Lid{{?8LU_m=zDzIxn1B!cy?4Y-GWqeP&;{eX6@>O*6Z-yZto8%k=ksNE+4d zysM@o&OMR%r-bdWwNtB2i5insO1@j=TlUdcXA(Dfg{Emg^Gl8r-O*sC)g4gwL}q`C zyoQ2?>=T(K)v6=jY_4tJIu05M7IXRNgl8ljS86lsLxK!Wg~$b=)_-RWM?abYSr>8l zG?rL!-SuJY{5I=zXRS+BH!4Y=hPTTwH1uA+D5y&~6yuqbF8j={P*ux2Ci@>!-na%H zwYDO1wX=2gwZ8RB6Z(uKb#&e;L?OlpEDIv2xBTR&e6IKBSwI{6qTo!|5%y~O! zQ;nbykiYfQyf(Q&LLG47U1o+x3ij=S2nr5HgSG{$^uEb70@CM>B(aGXyV?Cl-KZ0LVS?{V36K zI77gs&&<1$9C`LuzIR)0I4cGi3F&!sU&ho)GHXM?h^8KA765Mm%!ny_kI7fmHIv}G ztIGf z0Hmcf(GsE!^e0p&O=x2%49SUsv%o^P)g7ns{}UZ(cnLQG$dqyD-1l!QN#SV9g;0`hfm7 zZoGaDMf@f-)Zn?1jzM{Qs5Ag~5L54pRv)m(Qy4-}O*{c*h`*qTvasErh4chfAZi3j z+(R_Nc zr;uoJ`S6#mJC1!>37qHvqbl-G2t1&uKB$jPAR+?E592WjUXC2O>F;^UDEHX@|7p+j z^EVN(N6`tW|8NEOprj_b1a1^WNE1kT6Zv)5Kx+tRqEaHRVpFC@1W0|XVJOT#6263z zmtt{PFS*=XiZp&Q76I(QVna!Tq8>aiSacM23d@%_efo|!F~F?P!OX&z!!1}x9G)s< zJq7>)@&}@X@NiS;1CSwx_89Riq}`?3Oi&p)G2K4JaG!%kx`L~{Z+{eTJ-!b!Pr=QT ziHS{a`QZ4ZP0sA>o@;%CQJ>I`K%hd&Yo`Og0IWc#A$H#}P3_pxqo6~X&({qN%?f7h5c36az zF%4j0`orpbH1!RRY-yD94^(c)0~RGW2MzfFqBhfgDa2#i>lntC!8P+9X>2r9la$BM zDnk@aF`A%w{{`cqgJ?^UCvwNV2s4FI62B+w6*O^(6o>!=j0tI&qd-I35HI|GJPqiwiB!lyAzJ3J0t{MSxOg8e&Dsm7kCPxZ{rlg88S_oW(fOAtc!MQN_AL{JgwJhI@7#TW+N@BSU~M1w}xFKe+DQ3>R+I z06j{qJ>-(4!X+o7^rcwB)v%C#_`q>&J~$i6KSs#_KsI;daCO2)iXD?*NXQnbGM|-p zeNXL=l@wH&6Z$6z00CN@-$-3`MR88uFp1-+zXfXwzno6*foKqh$o+Yhjr<#6I}pA= zuRv;4#$Xj$Zk92;9BO!TC~v9u=iP5r(9~jY_TIN|L2tr#7%(Arkz2P;tfJOYdM09g z=2UCu1uIs_z5MH4nx=&`?kO@?~2L$ZOay=) z1MrJLrpJW~%>N6?0uTaxA`x;>yyQ4Gur<4X)yP|O$sVRazDH(ka*2{>Yv#=U;LHJd z>31@H`w29-h@spBA^~?Fz73A6IzMIoyAM8lR}kVOIq8%&QJlhA*T448)vGDEe^($h zA!QYbX$S+jzc70*|KV!qyobxZYR)=BJb-+Te?v;iMCg8{`%>;45}TV5I)JF~xN)16 z7BpuBNULbYV{9m3JU-6*?+{Ql%IJEJ^aVB3*N``TSOM>_l3U5F}RXg(AG0Xb{aB-MRDT(zA1@5lk zKZ%kP5)ZtNRN~Nt8Eo=m6UsvnCUDX281%WS<(~v};LJK=JwSw!Dwg0C3Yw+>D9AbH z&H4m@`67=FQak?5eWMv;xTt13I|ZV%Q-&vG6ZP5J+Jbp3C3Au8or>=elEEfOk|We8 zSYr3T$8NA#H1uB7{x)kjp$aq_1WMN5Eup^`0;OMx+O8kfAIxnax~hlHZVSXo5;Rhr z{;vdroaFRGg@<9L7$e2tgOs4bPPnAH(v-&25G?|ZL>3K6Od78%SgtVQ<9H+=uVx%J z)rN}=z;LfszHeF)-a^y2fwiIGr5I{pKE#Is85u-kmNecu5HPq_c$Z)(gMz*7;X`EP zV__WDdw2ciUV7WH5xTdNz6T;OcTGVtu{bB)U#lUSz-S0Oa`h2QMHsIj&m#B+$MOn5 z&45*CZ~#S$%;3ScVp$>h_kI0B@m(Mi{)OE_!8JtsTvTAI1|b)u$qh*Jtja^O9mRD} z01m0MVZu~9zV6kR!z9*v8~QhxLQus2PMeSe98wI@-qPWs za~ps(6kK|?cLWe|POdJvgkK_&pE1~V7r-zIr0L*JKyVDeQqG?v49M5(2j{mE%AVDu z(v!ZumiNGf*vu>NTq=8nACPeWr*!UdE zZ@Odn4)=cbe&g7EYdF>cDpFv<{kUcn)9U{HjXWj>h$7>uJE5~k=-J1jy|ZTvv7s7d z3@r$nn!l}4xWniA6@;*nGL<~$5Zui`%x4NQFII+Z-jhq;fBuAbS_IkTth0eT9N!i^ z`NdkD#lO16M&$%xMG9s^xeVVPDW9-@X^5oX>wPzoF?D1NH@rLAy^}MjaH=aJ{C)V? z-~)-qeVx5)y|bEePoViiHPz7Z1|rUzy@$m>)RJqBLYRR$RzagpqP&qf5%gD7?$p$* z{XN@Y9C&MXCIa;E0ENpy3<%1#6$x^IWAzJXUiH*ALt=()2l`$59#t@}``#I+HtYW- zlg*meW@fCkLC}43#KD5?vIt|H2(+U^7n_tH1z6*M>Hx9}@7=g@W8(a`<5Ao8-%Ufw zMb-{uV`jXF@;EAq<0BdL@6Wq+2VgOAMOBHQW8|!n3K+%rDpLhy_@cu^?+Kubi0;T* zEOHceNHo^S*$7F#R+P_jA{M?l-!T$@VFPMOMyUG?p|5V^j=cZ4;t%c z0+umPrUBwgZ@=yZUyhY6Sp>)KQ>H2PpHNI8xCmZ9F_)zW3)TT}g}kfff*8v@Xsk4l zyNf*unp>2)Xp6w5f^j+VwewD4Az05R5P-v`dMEF)665sL5-x1__#x2|=6Q@bn}wGy zUG;Dkl?Tv0LoN{+4yst~S~*Ok(zS_eWBujYvt#~wzbPC67mbg>kE4*&hXQomelKFd zu3iOqPMeXdu%h=71OWqSK`TJ^mZ{(xV4lztifei--OA-6E-XxzR6xPlzjn7aqDMgP z)5^oL*bI2`k996ZnzHf&AnK^-S6RkaAWpQTWTD0CjPzTAy~oP{44~yOIQ0Nf4F*L~ z&i&ii#lo0Qnb_k0cU{G9s(ELNOsU@5ItFtUM<>RgU zMQ&G&GiCLEv6baH>1975ZZ;4>N6`&aTEnU_iTPaShiB|XUDHRvzuy(ii_g{+Ot~= zTcgdygYq6kZqbz&34SK&-B!xlYkOmM^XjPh57x%}q->=U=9z8jOgv^IXAg~vOwp2# zH1R{~_2sWiw*Kef{>*F9xXs1LkNYLH(v&x~*V!+xds z_ng6HSMtto8!c>3|26M>h}U_;9j9tEc%HFZm~OUk>AZWwUBxIs>48ss4`cCrg#(T| z<}QnPJ1%ehbYeq4Gyl2OikE-Kc*@Ka-s8AFPidsA+j^j^$H#rh_R3W| zHq4Cru=SZ8RXFd!S#nnP+K%M(BBADwi==KTSS~X>z-wXNeS&2(cewB~or?Bs%ncBh z7DApTYr9hK@+(pv+$!8grVZ@=8-@927ME3ye#`SU@##68w}98B{Zhbb z(Z9*;i+FjA{A3vwOLr+Txjo;a)4fU7dBe-wianzbl5~UGCZwJjr#4hDDZA=F2vqlC z%QT&P#_S%RZWhff_fz&xqR7UDDL<^clBRt`N9WXZ?pgmjVWo9R$SBGBSDdIxh`D&` z?ku+~0Xt2}m7Mr~;z{?cCsM`&Tm}ymX+$^VwO6-RHSz?d>@l8VOF60hPkk6Q0`P?0LKaV@he9oyI^TdBQenN=&h?fvqgjoNx%PR4AjI}elz zZM<9jJ6~1qnsfNWVl$n556-#uo%lkzY7uMBBH?WLF3Di&Yq_Rt@L-ST_wYJ=IS}A- zaivE)zN7HWJ{wI_vv>Rj-sL0td$*(p^;SPvrXw_X#~r1?)L2LqVL|;lX~8ciU=kiElN(FZBTA6D$&|?YniL; zog!&fy?sI_&0hYw@RkNBiH61AmOp8hna-E_T;Et<>X#3Ki267!v?le2BCUgLC;6+B zkL8b)|Fw{mZuu8K#BRY7yy@M`moc!#u3Puo&rhE3%&4}$m-9WhJ@Thv5jkD_1@WMw zGExTul+0Z?I>&6xEM`Oj)_|@>B0-Di)ui-v6Br$y-pcPzzvUy{#yo_x@xFp%aQ=k; z-r47Bic#8Izol!@mTloarhE|UO*Skx#JRi8cPt;3~g>yc{$Wc`ltm^*$i9s!$XmcvF;Jn?7F0IOw%@)xS()OEUf($)Ukm!Hf$Yp981h+-O$e-n?Jg3@l@ zLn-Ovj}GkW(-^JQ(bKcK`Fzroj|4behVB_2K$e|MZC#5OO|6vFiaB9yVnV@u6s&@~ zr4K2Gv9YnWgToJzfPrwM9)83x@S?cWN0W~--y=txBk5e`mkSad>)TsSoV+A8b(U|W z7QY@)!&qOGctLUT0(3einxaM+{4Art^|p^jrXPxxolx))unS0+ECqn8`_TS$s(V87 z1X;~xB=o_@pNE;5a9>8e{$h+j*U#ssu$VRxc+xPLC(ZXMq)+2e8@XeY8-!VPxLF8x zb5?$6=Ih)QwoN)5ecw(XJs3yOjEf(f^U_q>eizP0AkyexB}7lRU#de55{9c?gwHX; zXc_G_hXVtJ(HoJ!34mQkZ}0NSxjRK0T+2EO8`3&4aN&%pOc>xwAfOxfXe{P3Uv{Oc zYV*;cJRwBYL&O(LpSp7=1D+0&DNaaSOG@HF^bkb5o{P3EmL%B~HoQZ}B?Tt6H9rl~41{qm2}8<|<_Cb4LG|twFU%1Pl-yW{$AgT7c+}XK zy=fw9d33v2PjcZrzGad3U6Jof6K)%U32xrDEiO*AR@k#je+DA2dL)lSLIgZ-41yb) z!4CGKw7k3liwPO|c`@trfOw)B#0@8N1-xmOL;r@L;RSNE2=!-fMVv`M=k)>wxNcq` z;t*5PD58bLeUSGXfyIW21`INcFQ=e#0e(n04qgr_Y|tE#ffDsRG9v~$^6BoPbYjLj z#9dd4sm;%41S*BlqLg#z4Dz`Nr$aG9c%fkQ`KeY}<(U!MZ300@QSp@2l54-C+ z1b`NZM3e4re0!jwOj(P~^m!|chxk>{a76&^L68_bN+Gov19^fUfqHM`J@(_}?x7nT zMw@pEo%veXFfQk`_Sz#@H^ssDP$DQ^e~!y$5l`m-2}2Fp(cK+^@2|zYfh9s8@}eg9 zg!OVm)Sm+}gu^=ub}MpTnE=Euc&Y%o1tx;dw^+;dqO%8A)29~cevD*bx1+|(!fBhQSGN6Y% zRv1>QV1Yrt6&Dt{`Z0@vtfvjl?U@E9C6Qh?V0i@HQBu+57;W^uuM_h?!u102{p2Z>cn_yr6D(S)tH)QbTg0p9npzqTYlWF)JyxP-3^Hx4!*RYC3rO&5DmHoRHGzD zB}+?7V|#dkk?;hF5fF6?m=9h?hWr!={7lX)u1B!viSCLm7{i=@>lR*F(R{o<2nK4v zmc@mEAXrLpkx1jM1?)vP8I&6h@WEz?8B+1_@pa#R(re|n_B{Uk2PZ*JRd#AIZm?fDD#$9D{Za-r!o&~iZ;QO6$d+;+2cW*x6B;J?d#>)>z`k0igVY2NyQ%> z9<2i0HBeR{NrpdvHU$2H#f>L~i9NcW+deE1awd@_rMa#Eu|%Uc=_c%5<&LL9sM;8! z=n%im4G>iUdjuNYe^V<10lJML5w&%xD~gcCOW}?bsU1JP|2>JG02EQGFYc+9znO6Q zV6-8>(aCq;(g$pFk590Yjg^i%@E5pbwU|eB*Xq;X1b1y=+`EM9#b=q-<|{p`jl#t| zlA+IG!SW91mk?|le|PYj6IMQ6CYh(kjnCE6AIJv3Fj%Z&z%>J;is!U34}b0GT!=2f zYdiahUSAWi4}>m}w$Blu58>40kH3-~TYw3a);XuknlkFtcfPM+KJBDe^po4S%j;zi zmOj$9d03bd&z)n3+y-|V8X~>T{8%0M?}W(OB6nX4a$G@goRx3>IO#dew*hum{ z0dJTXWSaE`i`FwCSQ{w;Fygu*+rPA|Opk2Ni`Pgbh)C-r@?Eo8fII3opg%J&PxTcQ zm-jhjUFbW1jQor1Q~u&?5h$J(TErV+ zVg?OAoBpytG!9(pj1;Hvw9+Y^=2*vMBXO@RrpoeieHav>A7%k7h;P#1dlP{eBD61q z`66>?M&oEWiU^4QY3u_sgX@vD^|Yho1nxOXRiMCys21pO#bJcM8oI*I(0Scffxm&K zw9$#I*#Gc3+;k+K!$~u7?G6}Ma5W=wD|Om3U;H=?fNaBMe>Gu4R9<+ku$i8~#ln2K zlrqf63dQGG2$MmnRW!uQ7QxLG8h$DG%N`sEb#ys&3`3rHAH@ZYD#bws>{=Kn`7K!ANPFK08G9pq zu!BMi7*O$H7g%e&-)POGDw>52SX18wdO8+XIYJ z^PJ3{?JgPDh`O&HxvSL~aNC%0%-m$^lz)YPS_78|HC z?p+;ew%1~X`b{hDUYD8=SB57GuZ*>yj<8+7dguGx1wJ2(Dx5zSezwzk8@W>5(4Eis zfpUZT@{g>YM>jpuMl6TWLv1XU^f#kt9h&Z@%g8w|ecP=b1FBFki`z z_8!rZ73Pns!h`dEIh-Hs?GraPX4a_Rn9sWBOt`#FK`d*8en+EFOP`;qenI+%G_x!E z+z0LARk?Y}8h8ua^QAczxrz<8@8dhS#`>kP=d84oqHgl)hR1no*gVf%c9eAGHI6p= z%%H)(kgv!@dvQ{pQ+&zf4)&2GDLKi4hC-fV9>JWN`by)+VmPHG`#zsNn6<0FroLAnUB*ook!x;0hw9{;9xwYjkwyO41ec$NsfLQpLX6d6WqDtZMS{q7V%)m{&>fu zD~&&lo1Qr$l7HaAVjjLlGE5nvM}l3oW;P!+44BGJStQS|#L_#ECdM1`N@4p^b-S|c zK!v3*L^!wyj&el}tPn8EyQQrY%6z`b$-W4~jOt9)GfuE-*J_9us8 zb4*?YJv^8Y81C+zEZxcQK)YS=roN0Q&pN)T&zJx|z}Kg^H!3_tEoDN2eG^}=KHh(8 z1txoYkHxVq_q3UkPv-c?aXoYuFXpQV;1pIH>kbpWzfAq)v|If5HA~z4lcjLVgR^o& zuLpnC<(RHdF@c)?rWZpz1=hxG~Vmn1)I3Nosx3*qW8VC@ixZPf|SVLjK*mOTc0T@c5xCf~l;C>p+~Z^A_{y zr`>z@?P~%8Pof$KDv;{2VXJSpeKo7uh~W#-HCIY+4VeT*M9kN*=t6?$I06^kz@blL ze;zz|2$8~XG_Cy4VNL)@7_Y2I93q*jZ3ch8v&ULJzqFdx(IO}pNNkQ0^!?9YRTu$+ zR$Kz*6f{BZfh;9k_4Ne>5;klrL`Q~d+*Pn-H=jR@9GIWr3VDf_w>O9vJA0!82d+-N zd;a=$+|#F$?d=x>f!{9*Uh_mQwXZ;wHwXNi%U*H??+uQj7#|OdW^mM z+!+wCDu$IsYNgV)N}W55XqIar)dA~Phonz`00Dj1x-1PKTtlC?Xu0vX$phYNco+}a zue7)i-VX_u5j)jbj5uEX{Qlh)tS^Bg)ILJ!zzTT+!wE>Y8EBsezdjD;M1XV$II|U& zuNv*N5z@d^kF|@rvi+MyD18+6aF|BaAb7#fCyB~}st!yQj)4r$6{>E0X%U07Xab0l zq`I-aja^5}&C!pUPdDIMr{d;{RXI;$-sq=K1}N^px>HC1 zv{7`XW3zxK4_{9oMLKerXaWQXbd)|YIL$-3q^BvGHh%cq+tVLDd{8$m%zf7J;xUuO zkt;`Jc=cfM16j(#kf9U27A?5i+O7t>&;y6nL~a&`mP0f&E{b3z`_JW^H+I5|k#c%ORlBPrPHud4nb6?D0}Jxg&ml+~}w~2lODMp@04v4~8Uq zx}iE}m7OLsHO7l&m^p-}dm2!sjRWwK0?>isUHZnx%^6>^!~M<9R7&E=#7q*rL#9v8 zp{9d)f^s0RE5PQ0T00Ki_XDG&nj_@1#|~{ZHXf)gEFzK=1TGyC40jN%#G9dW{ULHS zS9+a2_$3dTL7eFs3LH-T}xy!Yi5btaST4p#)fyD-eh;qo0Q z6SZFNk?UiGwYkY{CZlavvP$|bl?3yET{8?DfMB3aQiJgUs0-uX*FC@lsqaSaD1Ng$ z>P)m1^;mjph$6!*Qec1ukhS2?QfruW`oT05uR%A&z1K7zBgiI zBo>|b_41<8%~cqG4lNBCQBQp*BQ8cb)Y zc^L60j_rV&e8@EuV99-tk~lnOIg^eEK+#PN|HaAGbcFbqt~iuXZNQ+`S+vJ~vC^Z3 zDvI%X0oZ{)o%r!zS0bN?v!MSbg_c|H0ZciGX3FJ5SK%Xx)&x~3lf=!4-44Jsq>xCb zdeF9Tw(y$QkJONghjYAb`Q_!>*Iv3+wWgff)L>J1QKi@<$T7TRC!0x{JMAExiBFBR z^RH~T-8JSHzo*SVEKgloO?>~e>qVQUb}hUipN9E#3lY3apb%hSj*8|nU6Z&l`@WH$ z#!8(K&Kr-gmr4aY-n~A=DLq_}iUHcpl(DUZuU$~v`TjFK|3HM09jmf7Tx5;jw z+&=i4m-NcBw**6WmG*t>S*v z*@PIUqXG`)#9oIpKF-h3d~sv$UkjO%E8l$%TII6zO2?f>HX?fhAE%SePMuMO__xW@ z{o}vpfU#<*Bq{PJ%$5Aw)vSN>s-7!*oMbKA(VG@{@uN@s5BI0O*KYXcntjlHz5LgX z0}K&`zrt2!{l3%nLfFYaw`F5zcz5gVbUR@#-=@t!(>vwNPq(JzRJb{$ zoe>8Lw#}=q?ypCpWv1c&*xx1rRIP zR`Bg`^E{qP-U0sQ!9&~%cT-Tz*VXM_F0)?q@ENuqSbnSao?4WWq?q1 zb#*7Mam2j5di5%uogmd4WwgrG7;p%j{Zjx(?MX^LL3xG)pBi}}v?y7y-Qe6o*?}aU zlYko@eDMGYQ;xAT<|;`7K8|=}j_Vj^rflo<7_CPR3Y}fptl${EkHo$A2iL-L%7w!P z>PrKG2W_xW(H;ozRhu;TQE`uwaKe)x@5GCqR~RIR06iSZT37bQW<=+yMxg$3J9RK++g{X$ zz@=_M-?eLh1pr1W;n0afftdjLFIBBzph(0kmBfOp91KvoIGHt^dYo;3Tkuf& zAy+(g!JCYhL=u4Qp%i)HB}x%feqi2bphlf^l`MOJHG(i5;m)?ohuWG;nZHfO36 z^=s@-wP=Xuxd2H~_Z|Ve9z>OkafG$DwNaKhz)^(GM-%-)gU|q6L-Q^9pHh32@>+|o z4lt0f_upIc?$_I&e!v##XF(MiAeaCiT>7*w%XOUiZJ;VB45{z?QF8o4{!WJoWiC=i z1C&XwNZvt2zWYO;h#)!jopl@bCdwMm7AUac9J&l)DEJ4Gx}j9r03i(EM`)=NQBYwQ z-wB?BlJNj@5=5PS=($rsbX;WBvU#r~&YOByzi) z{hI_xx`~v}g{U#$4OcIUv3+#W_@yPI=uK3O`XM1Y_*2TKf(MOJu+QPm$U&*)%Q?}4 zP~s~b&J5`fB2ZYO%s`e8H^SW^#sxlMA&cqAN+{u0+HXOSgyUm-RO@O2Ntk3cCrYN<+6-sC3C7B;r2 z|M(E<=004FG0IzfefeXa42ik92@u6o!GkvzL5!V>3;kmoR*59)K(a!}^R2;Tb2ZFu zA@L|$Bk*AcfG)t~D775`ors+pdqU#vOhOpfkC&Fmf(|3uCN0)6@xSBZfe2~v&|SZn zi)KC$dQW<Tq3Ly{-ukEmPZ5M~t+Df?h3%zC6tJKuRqd+u z-B9bH8q@epU>6K4z!uGq_-4C|1(}}ttGDKYvZ`te)c$JF?NJ;B+b2&1B=R8npapau zF;0LNOXaoXlTs9V2cnG&lOGOiIeBZY$;2davQ6NbGy@360#zK?(;!O|R*JL{X5v0^ z4`~VGNU)4jXea%rBxOejWf(AWRCLzCp@QdG_HB{P?RyJND)E?P;qzrYeJ+7rvGc2W8)Z|tV zU%R5!0tADs8C=7ajFgre$Z?>uBdsTKjX+wl=`$iV^7DH z0!it%wJ&71zXtOHQ!gSTm3G^CAGdO6|1LSDfoa7k&G6RX^HMZ@aUbw+iaDqOK-aEm zaq52GiC*8o9G8Hzl(Lt}E3Mzwx&MzYIOB$=FQnXbLYiYN#2FZvau@K|kK~Tgr>`W(GmLB7HqWf1Hbe>20GpQSU zcmgA=g;E-trKGvQ9bijwKJaKI%@Y}i$nakV10V}9$J{Z7ZoG=yQ<_RwyO(WZxa|2z zlsZbt+|K^w5LWXGNL*T0PAm_F6A(vC45~If+fdDc9Z$R1L6Ae0qqU9AJn$f02%n&1 z1N8nF2K+P(j5FweOG!!br{OI~TXV$tWBLsQDT8PQu|=&ErY3~J>Lf^405BDcp!o5D z_}k%z?}~v{QfCr%A9Nd4;4-}R7&L^TEQ`RCBA6BiybV0N)yFiw_Bms(gA1)CF{^pg z&e{K1_k1Np0;ee*-@Uz@@P?tMkrX}M07|a1k^}Hb@)ROt@YTbBO@JJL`%KH9aaCMl zxf1ccfP-+}H~(f6R@=E#d5t`j3dj^7;Q;7=5~L#FjmileDcIdeW`MT~6nLbz7n}Yf znE6l%xL$opU;(TQ8~m*B1&QbeGfGf2!RXl6F)MUP%>j)P5~d%o|LL3^^dU1qb?wKq z{ztUm%WQY>z5aB?8Fi7%dqz*0ynO4xt8i9U$YWbI;vPUtBUb|lw#??tLpv<%DoxZ1 z}OrU)6zFqZ27hjI~<+Lzgsc*>-53osk4C_1eP{e{|V^* z{%a0T%*e;5{J5{%ujfcedFXl7*`|4*eQY3U@p>s6DZR2^Cfk&~B%VIRkTi+ky4!7E z$=&!Gsg%%=SeMNdwC1Z-Y(ocAw2q3r{SMZu*5@Y}=gUV44yT=>Rfh{^^2G-cP?v+ZR|1h zEr0QUC0z$NmunkW%BpOok|Y`BWM-7@Pe!(kLWrbPh!YKaXOBqsjFfd6MD~_hY01v2 zj3{aNeox=It~0I^|M9-h`#kskTlcVDz2P1~1xr;rEl2&P9*N{Fxm5)jOGjOV0Ge@~=`nuo_f zcs4leZf&6*$sJSX`iDp7h zTUVdCcA>Ubk)h7o`Pe0)!tzHURT{;bi5f$~^_qFl&j507puk285=GVK=R!z4UGG`rF4mYpEk3mkO`0P6BUSlii%jnE9npF0 zrFZJ_)%63CItMRgZY$`HViJnBKwDm}L^-;ueON63<9%}F$u?qTcCYF@n8=2y!wp(VjS`6jX%^ z&AOCt#jB;ntb(Q7S+mk4qHk;*5aRsw7++mmxIdj5%hnw_M(1tM{7axw5R>(A0>fp4 z=>Nw5!a$P~{TSQ?DHyDbB7Kq5Fn62E1}(B5fBP~>W(Sex04u-)uF1cn*G(Xg>gP zC_~OfRB|W;JDlx=4Sq(dXOnUD@H_D~pnRfa8<3-+Z}<%+!oDaasvT&D66{)+SIR$S zP}?7dRt^jm6zuGTRz_-$KCocKvHbV&p)%W6E^`ja?82~h-a1aV1g>Z{R`K`BVpyExlaHoeSCZHZ8IUls#9#lvE{iFn$7N$za zr$0MrU{j4F3(EnzBw{3g*||0_k;Cxt#C=GiFp$a1hm3Ni@&Q9l`a(#ZNqWka6RAD-kW7)T#g##j zYZwOn{XL%Ht+8hcJ8hwTu>IBvO5?@#HA7Lvn@rM?$e=#6MqvkZu4HXocpE_68F2f+ zs@jagG6uCfT2e@pz`B!3J0y&Zk2s0ZW5NqFhUy)DJ_@|EI6!bp8JL-cpameOA`nrS zRVg+$dq5RWe0Yq3N?wfo6%Q58;Nj=eLyd@PYH_Qe zrKK%}$_xz$H1Sw|!#jsoXn^@0&)y z3K}%Y9;?&&1UZ0Sf^FsGt2UsSLj@=pJ0?^Bf^pvSdt?hXK={-%E|L{g0?iYF9m(Vf zBI!c=O70w-3v6KE_x3MettJkoi%&mGk!&}h{Ee`e-9$~f-qs>Az5)oGB1Yvw(RbkK zL-Oqjj+y~{9F_|Bp~rTUwid+{xe_EqY?v$&knYY1@E*fFf#^YN9k&X4$q%nzy$VYI z{mFp{au#5O9LC!~5HjpgSxyml69LZv;KS^{vn;rsus)%N6fiw~Cuu^>g1AXKjdh37E@uDJA@avD*Oo_llOP{h%TMGN4JAR7OC` zQ*PX-cKW&G!Y^M|l6thzEK2*Gm?EAfBJk2Ub_@{`iVz7H=<5^14E8f3L;$K!s=w@P z8ICp~vE~~ZqB|1%iY4}T%wnoSU6l8))1=czzejo}XL#1MOs9=ybW+Nb(5OT4#Xz>$V|6^+$kcx5E7!V zf%o18QOTzJ zA(o1HtG2?iPbr%rGyq`ocNl=|Wq$ZpB5{{hSjHStC6bpFgEbXN+&jrx(DVMiuz+?} zy?Z=5S^glF&QW$gt8}u3*l-BUD{mgaM6j(SkP_RO7lu-dVZM26^Cn-9AZuHiy4B^` z7^pR1@I{9YX@0BK2W(VP=$K7s5WKM#&KR!kN^wg0WSkmz#MZLx6X+QzJb)|sz@q`n zh~@!N^hjus_@x9jJA@&)Ll{8-{%m}FJmcxplP0(F90^1~w3;Y}r#Zhu4@2%EA`$V! z*jGgK{>)&L8EFV6VpN3Z(UDv?lE04zGqP=WmY?TsAbNy5!Ltp$Gf`~88y!2W7j)N| z6K!>K(%^Nj&p3T*$=q(_A+wU$Jj{2X*SRj)`m`R;`oaq%y^-FdyJ7FjyZ$CDYuJ13 zySEG00mN(_l8&4E>^h5ftT6a2ZOXbL?J`P%5t)7H_m?Z=%K-HvBA&A6Dx6eylmc5` zCY5}WbwG~JMK_Vk-O#k4vxe^O)Qq$6E@;APHNp?D)EuQK+iAR_5#p!Up|t(Or8cR1 zo57l;zsuMFj1>W_NNrw)mKVynU2M&KMf;${aWK%~X9F3Dj>YATec}k&>c}HcfV;&C z-paRO^GPZq!BNj$-n91Z?Ku>4yUh+H0t57I#*g9y_YVqNv>r=6%mI^`GCEXHTK2o% zI!WQO*y^@L(BR^7RxJxfk(bP zp(g34m||LVB*A^I;NYP%6RZp8J7aUIOp2`{h~97VYs4N(H7SWDls-pabtNY-Q1CRk zsflb66P)USLlIdb-R=Z@=mx9;ls9%ir92tfA0hM!fxY)H}3P; ze{g=0&5vM`?Cg+*LKX$-uEyck4&ckc$Z)a+BYYmsIDyv5U9Yc|nARy}kjzD1{sxc!G#78GlZ=Rk%C=0g@lVM=~q1UI#FB zLw>(dhxV{Lo+VMh#CSuThD7;+dLKc6i-OJA`DCvpgBJj(j9DhM*#C%=0270=DlNC+ z_d~I{V#{q!)LonI1`oEiRWR$3_Ej8@0f2u90zd|4EivT_k^p8RI50Hi4UPyI2LnTJ zZfxakk1l|&26F&S9X@wfPR<5$$YI^uM@7%pJ((S^4d4$lp?r^vzgc`sKmx(MAgA}NIFmHDq5{C_&OU#Cjc8IMc);H!o z@ceGZG3&-&nv}G-chk*$)y3&KgT&ZdAxW>z_-WhPX8jZd?Rpn0vqY0imX_Qhno-=; zxbDT)g4DkHtM|-A^=zgUFSS^&Qo5I`1^X=DUetV=@#G+L^S%l*Ew%N^cItfUgIcV@ zw+xfr#??kNJu163^*II)gF|ogV>l~*yTqn}hU>_`o5Qm3kdG3I7f~GoKj-+U+tdau zE|$0`RUTb5G!ISjc(c5`?&Gu2G-c_7ZN;9Jdzx?Nt}OKq|6ummzAU~|bUun^nr&KO za^tz77k}E`W`EN@tWlXaV9xlVf8@HdO-ti%Ilh*)IK!59<8*qxz&o2 zM57wq?mO-Pm^7ZFgo8=0^k{mGmDT!UYpdzfcBMuQ8}@~XVH-^;hI?TP(hLo=A$@t* zSedsvv8?6dDL>N>iE)RImBWhsxhpA2 zcL$BSXYF=7et2|xV%?d5=*X#eiUZVr$LpW$P-Z!8-?=esEyqssjZ*j2V+BUjb~8`r z5UwR2@!a)Bnadjm^#8D@?f3U$yE`f*TuoIi)YYNlZEO}Z+6#7{RF z9SNn@;AJ(m(|X5Ow5w3gYY?hsr1+r;#>ufqUfwcKnS=JxiR5v^CWRAk&GgD}n&V;J z!_LsA^JR$@;3o7tfQ@sX+Ml3uVmaB52RbL5U-`>YtgO(tZ{LV02vU8de;^aqXJ9sP ze^nSz4fNSKu#%cS^*~m--q)u{qEfH_v$25nAhmqk!YaV0n;Tf-H3u$3V6uY^ULWj8 zq(lVZfA*}##UZ!Dsjklpp6%3bJi}U^hr~2UJ@gw_4XFsHa$Kg13t%Q*S=e?#QI^5? zqQymvSn3045?hET4fbVTW;(pq9#Bw#j&00=Ke&OPVtkwuk$8A0->$S#>oLyx9jah-d81Ewnzyr6=RVxj~WV>UE2$RK~Pqzw<8n7H_QDpajapz$LRazhr=Ukd^L zL&+>C-D_0{k+D7?6)CS7H&5l&2zlRZB5(s~E6p%<3OXYUUMG5Zu+W&?vI%tuq51$= zV>cw><6wno3C~=5nwH!U2r-2YR15PS3fxl2ntA)R;ZFbI&DYI&vIDM)#g)Oi(1Y9l+sOQF)gNtWWPB5{DKBKV`shhGq$rHsNPF>nqaQ?COye5sA32 z&8C*_95|e7xin(0uZnacx*?dbsA#{b&7|?zj{%R7L5+=;FC0_HlveWcOXa9Y<}s;f zNy`FWD%SIC{V1Pdu9z$sV@UmJ6%pe*k0k89($c0u2J9Ol8i>}FAZy#$#AK8xv7l`t zYIpLWAZ(-&wXc-ARdU6l+s6RQ1woN+XxNve)?W3?m=+5+>|+t#9~7KnWz#k}#ZGU%Kv^HgDk!JKEfYQgI{76jCh$_93xo#E&qH5!U3! z6KsGaJ*@Obc}X@i*A@s@m@%B*I!2MKP+HH3`Rq{MH4`rZ05HN8{iUdYJ`tZR!Vi#} z!pX%&0p$TF2sT3`BNFBnVK6%|Yl3(k0dR!eKl!-+Ou6Ry2*&7Mim6Gz=cZ86$CFD( z$B(83W7YxGVEbe-BN3jMOxz|QKYd}@u11x{x;LF)w9$9*|C;WtMk787rvukzzHIZy z-yC4#0a;7lo08&o=1lN7;IJ%Ey3nJPd9|ev0_F=Pi58%;sgv$_UM+~vhn-F`WK;df zJg21*#q`jQh*8}CW;7)^`Oy&M!AnXW_3vK>K~BYf8OX}IcCWP5d;RlQh!#LgbR9z{ zNsb^E3T(urRYJ3k;Wo&@*bC+lt_m=1e>OWrpl@fj%N4YJB;Nj>T~)LSiB}{&i`?Zp za*qhQMfwIja76a{-mPCpW-MI78OFmgMC~-dE*OOk65|zy@r4`7qfUSY;Cyc?WChH#y>)1BOd$Fx!Ep>YTgoP+Zbg{mmgB>F?>xFHfr(%8&;itjG5-%ts zmqL~liy69e{(WkBi^Y%9TA$0-vcA5!D$fyX4qo8G>zWiN{@z^ZVwebRoB_uhahniR zCg?|WT`<7>`qAy(3?T@aPfLtHF!jV9!wf9c?nHbu8yGUcBTaouN~2{eyYn5gzDVc< z)Cj?_eMBvAKSK#fKqaymiMbZ^wpO-p^GL?Yel2;5PX9cV)x2O@iG3Th;}8Ktj#`W+ zL8mkZT}_-z+a3}0xwOiH07(87-2&Y(vGw5aL8lP(fAtF<6WpiVn-`Ng_OSByy|3}E z;j1H0JK3b6+}T%(-jUeSrrqj=w{A0hMi56rz+#xyMuO{?T$!`dydI;m;pR3Gb#RYx z81D>g0N0yTO)<2ojp&WGhNaQ>wP(E~)N~g6u4puK2k{+1k?hwjib+))e%u_x@L$e0B z5m5#~2+Xr*&pPW4W3)pP6$f%?Ed~fzGqpN;=9T5%dL#CYILkp($5LsGoRtgRknMJt z3{WLfcrc{|gd-p*Vg5B4=+Gx5bO!F{zTvva ze@CyZF7cRi$wA?@vF}2Rvd{T=KXz*}o)e~|@NIf|r~X%?L8@=W(_R^SN@w1p$bmpo z|Ikc74ZW|LI}4E(T$f|8JOwn2MDy8~nptz)S#*H-44PAH7HtzJN6hZ)_TQQdP%n9@r$z67eJE7Xg*=fLy{5o3qE{V!Q32pL@n9=oA~H@FY3U z2IVDkWU*J(LzJIu!v+`K>(_#&lHegU9#7gOc*=2C!REEHTS#d7_QS%2dGD=}_`ka-|LUaS4- zqr{8(;MwZAUyF$~jbws?C+B5Q`LdHKB=((H!Ja@oRswGW(LO-5O}HX*(gL-kMa|ZC zSx{&Nwg7iT)H0Kkm!t<0G6N?>NAJbQ4ei%8Z>y!RLC8b&0R%Mz8$kGfuyiOwM%pj1bKlx znFzHOTYInz!v9WaHTYl+xABA*f(2n4u(%vyVUQWh-K`@%7y!!TJv<95#cQh~xDsO! zYa}eXKnf9{IBNMENs~BJz{IJtQO_Yni3lQ417nYX4hMT8Efg5Eb2k*y-8QC0NAozS zK@QT3ICx0*u zGkzL3hv1WVuf<&7n3DkWkwORawL_7DyyQ1A@&V4Dzb8j0Eg`{%jg%a%GF<9FIH5tr zqkxrx&HxoS!jNcn`o|qlNtP;u)qv>R_iuzx4s;0DiWmE zbX;sVPKwiw`0V&{Qdvtcp;g(j(CK_~yT!wvhurZ)ZA$Kxg+o%!)*NgH`S!Xu$SQxm zx({Smw9KuTL_KdE6E1Uz>#lDP5uY2j{v2H-@Idj!EzM$~&C=`|>Bb-JgPFGmYZ)C8 zs19tEW@m^P*;vNC%;jSg!{tr!i!F=u>q}w{9Qm#>ayNq#X1$e`UVU0U+aRF9#?jJ% zb3eNX-Elz?=3+XpsMgy3{M=Ky`uhqh&Go}nC-{Ce`}2oH2%8>MEIuOdktV08!<KU)?*%ZjeZ0;Aob%M#nGhX31 zPg{LL`gn%qUEArXQD#RktLQ*2N?};Rh2I@x?n*r7o|b}sKFiBnXOk0Qs~6evf=07= zsZymb^T}!dui`Q{3*VJXu-&?{2NJEPGnq?%ZzsY!TL6wdt9!s+-S8Odeee&0+s| zQQqW4=@-Y&ccQ+F!xRQgBs|VkwHe)&h+c4_z^#<3KTlZa9jd&hWc7kudOO-CM(qVE z1mzB0|FCtr%(Y@kys5rzJV$PMT6Iz`HeYALCnSGhd&HKtc{%26Mva39rA2niXS><9 z;TK&O-KL}m$5xelItsgQuH~KYqd&fRw@~Nk*hF>-e`-Hdtm&!USKmMkc}{exC9qag zs=&W`Ls<8LBvXEQY5I?mVG1>AO+q>|`E2!-P2O^hiE$lABWT5}gpW&JI>vV-Fn6fR zBAz?Ze}~_*(#y9qBz_cpT1pvkETT~w9f_>vNUZZKYvAKcw)?*nqQHLOfw;KI77pR9cb_eJ_q6G*$jxmYYi*uea9&Cup!cnx

zF`!PM6FsVHk zkuen{y5!hCYob17H*BM~+~uM0E7d@bL2qt9YiMic{@*|Ih6L_)wD#)@TeHj%v7MS_^WsydG>ngBIXCX#o2%^E z$Z%PF{t3f7k)ml~_8Z$ZO^!#uY?}#Ea=npuMZIP^b)orKkF=;(;%Lvc+@Y)U*AIQ` zl3AJyujL3-a%{Sa>pCRh>3MQQT;J?sZjU$jK+)Hj*0HZ1>@-r$cy_aq%SWgUREWO~=6=45p&-DqBn#VaerC)FqShuhC zK+1*@znKG}qf+=grQ`pRzkd{JWqV;Z)vw{wH7)X(+2m?}7U zch5rE{1BI%PUXk$m4_b=XIwY_=CXY*svX`{i8LCf;zWOI`v-4NS6^Z17}{ISc7waL z{_BJZ>VJDz~Wzj;q8yRN0ulK00gO!*0@%^XG4PF3*K` zDE*ikW1iZjVj9Iqd+H)(E!)ZO<~Y|}>Vlldbv7fJ509oE3pF1Z%aHS24U3fY80_<2 zrH+dkh-r3HUvub{y*4afP$_1srM(s`GM~DzxOkKj=6;oQg+mUV-gcwS4Mp|6v7q-4;zf^VX$-YKz>05O=$pPT8PML z-@dkTI#4)E3AaE}fHJ`UB#khXx5;_LT?POV0!?xpLz2SoLZgZlWZ|th-%nVxMqEai zLkYv0A=+?PQzdovp!az%A-(v&1QM@>S4Xxa!hXz6FbRMgdHk>}h5>*2QI9wcB14y^ zi3=Vj)JRSa;Q03Pox-+EsW{JJc0^MTBOG*j@L}wG17r@d)_WmB0Ih5HWzl1@*J2FyxE52;*Pa zYlcL+>vX_tBgvABu_fusX%=o%^f-hiMAQ!8Ce#gx4#yYdVP_ZtuGJGz|8a5>VJ@(l z;5MmNzG&;{@P}_vp#xPvkT6ubV5nG7P$Qx0cR1p)30z8*qo+!RPR|!Yk}N^Ub8cA` z6K4o=prGJIJqL|W{kez4)OY*#?ZrQkbQ-&OwGbA!)QqT);MGM1324J8nicxQltP4mA^w0 z4aOF5-_WY+eEDS#wHuVrE&wv%`LKxHO_cm=lp7xG0F~348yHkacM703tzm zlKJ#0@$W;_298$-voX-ag=3ijSizNQK=29Za*|hq#gC327&}5HU@zJuPaPE*N!Fr% z0DEPtJiC+iO3^)or=D7AJV1-aP0P&>4g+W{js^_Q{fBXXUOjuInaRe@i zdx3N%Qh_6VB_=M88i*NOFn}p5*1d+a0}^gj`eeER`Fyz971fODF{(K@?g6ERJ>>EGd#xj`H@HR}5-mDiU&`4hagJ1VmR% zzVW$-7?`nx{C`~R&e0yOxOpB6Y?ZiNC>@bgM-R&aV1G2NkB@od`(tw;#%}T@-@av_ z!YvGH7*WD6!(=|*JOfS>5nLT9_~93ojDEV?Yju#IAzDmv#ixODhrv+>-)$_tgc z-@DJvSiD5Z4Fv{JU9(q?KqpDY9q>;qLpytW&24XyWlPj$0Cv#yljZ||LIPee?~g2N zWaa$d6b29h1JQz^lm@-3c>;<#;?YGY%y@9$net4)+i-%B$7xQ1oq+@^0W~C2BPf~h z!psrsE|?rbG>61M%!x7G#P|$X^)MEOArnMzNL&lTAVIW{uyyc&xQXShE(e+iq8J(m zt?JBgX{o751o1_1Y&M*^cpdNtuHDiv4KO-{?=>zwKy+ZTBoqx;3}oLlRM-q{hn^9F z+z-?ZM%?yKHx3VHT$grJ!~>4CK=Na7%?Zwp?F(H=EwXjM|Km4Q;6K40g0)I^Td4Pl zfgA4%dorG**y%VZ>UfvQKo>%$g9AWJ7j`fF)6z2adSVVO=3QZ9f~%UBXldx~MLTP0 zNB+5d`A(0-ug^1>DM?k81T>_IcZ^#(hterk4mn$uS~xm{rWl4U%S z5#Oi(+8~yHA?+V0S{+f&fCQbx2D{=u8PmE&jlXEzkT}gACvKte``X?g8d6pQ%pJ)^ zwmZ4o3PL`6R;77vFW3b^^u#auXgT)C$KHPwG_0(me%0`Q*e-G;_h?3C&iO*^*tk)B zk+9&g>3&y{Fzj*}CFNWi+?5|c-})d;n|q(mGAblgBR0`3wr_OK&LZ~bm375D`wyB@ zos+Dxwe_uGU%jcu-4n5HA+hdM9ycFT;9l0;AkNv1UgkV1lRpghW~ncK_sMUXTlgiZ ztYz}Z&uT604~zSPz5iR*I==YVFy}HQKYQ7_i*!8=E-8x3vrm;PM}6p0+qF&HgiTL+GkKh-dN=#^2ewtc zHwtUV7rcYUJrbkXH`x|-^K+R-(w5n=4_ZAnYVr>`-xp!pyuK~3^rEPcTn)EKgvk0; zew)7gf%V&zT&olgrMhq3Ov56gt2z*nI8G$J&abo<6fgbueyKc{lBlLP?>%>9(*1fF z6P^6eD-90XKQ7U+9cjH)w154L=eipo=<^Ty*+5;(5NP)}p}t3)R^j!kr*&lMP|w&x z_>bTAewBK5)qX6ZG0Q`n^s?4HB zL;vTYP^%#RtJ1%2tQ{Fy3)n~dD*CKRY^7cL75&6`uEVqbCj*yGa+K#