diff options
45 files changed, 6794 insertions, 724 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a667d76..bf7b109 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,10 +23,12 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. +**Files** +Were possible attach the problematic file, both source and output file if applicable + **Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Version [e.g. 22] - + - OS: [e.g. Windows 10 x64 v2004] + **Exceptions Log file** In some unexpected exceptions errors will generate and save a log file under appfolder/Logs/AppErrors. If present you can attach the log file here. Check file name against date/time to be sure it's related to your problem. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index c749dfd..3ccda2d 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -16,5 +16,8 @@ A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. +**Screenshots** +If applicable, add screenshots to help explain your request. + **Additional context** Add any other context or screenshots about the feature request here. diff --git a/CHANGELOG.md b/CHANGELOG.md index effa949..79e48ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,19 +1,35 @@ # Changelog -## ? - v0.6 - -* (Add) UVtoolsCmd, a terminal muti-platform aplication to run almost all operations as the GUI +## 29/06/2020 - v0.6.0.0 + +* (Add) UVtools now notify when a new version available is detected +* (Add) Mutator "Flip" +* (Add) Mutator "Rotate" +* (Add) User Settings - Many parameters can now be customized to needs +* (Add) File load elapsed time into Title bar +* (Add) Outline - Print Volume bounds +* (Add) Outline - Layer bounds +* (Add) Outline - Hollow areas +* (Add) Double click layer picture to Zoom To Fit * (Improvement) Huge performance boost in layer reparing and in every mutator * (Improvement) Layer preview is now faster * (Improvement) Islands detection is now better and don't skip any pixel, more islands will show or the region will be bigger -* (Improvement) ResinTrap performance +* (Improvement) Islands search are now faster, it will jump from island to insland instead of search in every pixel by pixel +* (Improvement) ResinTrap detection and corrected some cases where it can't detect a drain * (Improvement) Better memory optimization by dispose all objects on operations -* (Change) Image engine changed to use only OpenCV Mat instead of two and avoid converting from one to another, as result there's a huge performance gain in some operations -* (Change) UVtools now rely on UVtools.Core, and drop the UVtools.Parser. The Core now perform all operations and transformations inplace of the GUI -* (Change) Islands search are now faster, it will jump from island to insland instead of search in every pixel by pixel +* (Improvement) Image engine changed to use only OpenCV Mat instead of two and avoid converting from one to another, as result there's a huge performance gain in some operations (#6) +* (Improvement) UVtools now rely on UVtools.Core, and drop the UVtools.Parser. The Core now perform all operations and transformations inplace of the GUI +* (Improvement) If error occur during save it will show a message with the error +* (Improvement) When rotate layer it will zoom to fit +* (Improvement) Allow zoom to fit to print volume area instead of whole build volume * (Removed) ImageSharp dependency * (Removed) UVtools.Parser project +* (Fix) Nova3D Elfin printer values changed to Display Width : 131mm / Height : 73mm & Screen X: 2531 / Y: 1410 (#5) * (Fix) Fade resizes make image offset a pixel from layer to layer because of integer placement, now it matain the correct position +* (Fix) sl1: AbsoluteCorrection, GammaCorrection, MinExposureTime, MaxExposureTime, FastTiltTime, SlowTiltTime and AreaFill was byte and float values prevents the file from open (#4) +* (Fix) zcodex: XCorrection and YCorrection was byte and float values prevents the file from open (#4) +* (Fix) cws: XCorrection and YCorrection was byte and float values prevents the file from open (#4) +* (Fix) cws: Wrong # char on .gcode file prevent from printing (#4) ## 21/06/2020 - v0.5.2.2 @@ -17,4 +17,9 @@ ### Jason S. McMullan (ezrec) * For ideas and permission to use his project (uv3dp) -* https://github.com/ezrec/uv3dp
\ No newline at end of file +* https://github.com/ezrec/uv3dp + +# Supporters + +* Ingo Strohmenger +* Sven Vogt
\ No newline at end of file diff --git a/CreateRelease.ps1 b/CreateRelease.ps1 index 7bffc42..fb13810 100644 --- a/CreateRelease.ps1 +++ b/CreateRelease.ps1 @@ -1,5 +1,5 @@ cd $PSScriptRoot -$version = (Get-Command UVtools.GUI\bin\Release\UVtools.Parser.dll).FileVersionInfo.ProductVersion +$version = (Get-Command UVtools.GUI\bin\Release\UVtools.Core.dll).FileVersionInfo.FileVersion Add-Type -A System.IO.Compression.FileSystem [IO.Compression.ZipFile]::CreateFromDirectory("$PSScriptRoot\UVtools.GUI\bin\Release", "$PSScriptRoot\UVtools.GUI\bin\UVtools_v$version.zip") diff --git a/PrusaSlicer/printer/Nova3D Elfin.ini b/PrusaSlicer/printer/Nova3D Elfin.ini index 78bc441..89c22f7 100644 --- a/PrusaSlicer/printer/Nova3D Elfin.ini +++ b/PrusaSlicer/printer/Nova3D Elfin.ini @@ -1,18 +1,18 @@ -# generated by PrusaSlicer 2.2.0+win64 on 2020-06-12 at 00:41:01 UTC +# generated by PrusaSlicer 2.2.0+win64 on 2020-06-26 at 17:18:51 UTC absolute_correction = 0 area_fill = 50 bed_custom_model = bed_custom_texture = -bed_shape = 0x0,132x0,132x74,0x74 +bed_shape = 0x0,131x0,131x73,0x73 default_sla_material_profile = Prusa Orange Tough 0.05 default_sla_print_profile = 0.05 Normal -display_height = 66.04 +display_height = 73 display_mirror_x = 0 display_mirror_y = 0 display_orientation = portrait -display_pixels_x = 2560 -display_pixels_y = 1440 -display_width = 120.96 +display_pixels_x = 2531 +display_pixels_y = 1410 +display_width = 131 elefant_foot_compensation = 0.2 elefant_foot_min_width = 0.2 fast_tilt_time = 5 diff --git a/UVtools.Cmd/Program.cs b/UVtools.Cmd/Program.cs index 1b8b7cc..b1224f7 100644 --- a/UVtools.Cmd/Program.cs +++ b/UVtools.Cmd/Program.cs @@ -3,8 +3,11 @@ using System.Collections.Generic; using System.CommandLine; using System.CommandLine.Invocation; using System.Diagnostics; +using System.Drawing; +using System.Globalization; using System.IO; using System.Reflection; +using System.Threading; using System.Threading.Tasks; using UVtools.Core; @@ -14,6 +17,7 @@ namespace UVtools.Cmd { public static async Task<int> Main(params string[] args) { + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); Stopwatch sw = new Stopwatch(); uint count = 0; var rootCommand = new RootCommand("MSLA/DLP, file analysis, repair, conversion and manipulation") @@ -27,12 +31,17 @@ namespace UVtools.Cmd { Argument = new Argument<FileSystemInfo>("filepath") }, + new Option(new []{"-e", "--extract"}, "Extract file content to a folder") + { + Argument = new Argument<DirectoryInfo>("folder") + }, new Option(new []{"-c", "--convert"}, "Converts input into a output file format by it extension") { Argument = new Argument<FileSystemInfo>("filepath") }, new Option(new []{"-p", "--properties"}, "Print a list of all properties/settings"), + new Option(new []{"-gcode"}, "Print the GCode if available"), new Option(new []{"-i", "--issues"}, "Compute and print a list of all issues"), new Option(new []{"-r", "--repair"}, "Attempt to repair all issues"){ Argument = new Argument<int[]>("[start layer index] [end layer index]") @@ -40,73 +49,58 @@ namespace UVtools.Cmd new Option(new []{"-mr", "--mut-resize"}, "Resizes layer images in a X and/or Y factor, starting from 100% value") { - Argument = new Argument<int[]>("[x%] [y%] [start layer index] [end layer index] [fade 0/1]") + Argument = new Argument<double[]>("[x%] [y%] [start layer index] [end layer index] [fade 0/1]") }, new Option(new []{"-ms", "--mut-solidify"}, "Closes all inner holes") { - Argument = new Argument<int[]>("[start layer index] [end layer index]") + Argument = new Argument<uint[]>("[start layer index] [end layer index]") }, new Option(new []{"-me", "--mut-erode"}, "Erodes away the boundaries of foreground object") { - Argument = new Argument<int[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") + Argument = new Argument<uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") }, new Option(new []{"-md", "--mut-dilate"}, "It is just opposite of erosion") { - Argument = new Argument<int[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") + Argument = new Argument<uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") }, new Option(new []{"-mc", "--mut-close"}, "Dilation followed by Erosion") { - Argument = new Argument<int[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") + Argument = new Argument<uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") }, new Option(new []{"-mo", "--mut-open"}, "Erosion followed by Dilation") { - Argument = new Argument<int[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") + Argument = new Argument<uint[]>("[start iterations] [end iterations] [start layer index] [end layer index] [fade 0/1]") }, new Option(new []{"-mg", "--mut-gradient"}, "The difference between dilation and erosion of an image") { - Argument = new Argument<int[]>("[kernel size] [start layer index] [end layer index] [fade 0/1]") + Argument = new Argument<uint[]>("[kernel size] [start layer index] [end layer index] [fade 0/1]") }, - new Option(new []{"-mpyr", "--mut-pyr"}, "Performs downsampling step of Gaussian pyramid decomposition") + new Option(new []{"-mpy", "--mut-py"}, "Performs downsampling step of Gaussian pyramid decomposition") { - Argument = new Argument<int[]>("[start layer index] [end layer index]") + Argument = new Argument<uint[]>("[start layer index] [end layer index]") }, new Option(new []{"-mgb", "--mut-gaussian-blur"}, "Each pixel is a sum of fractions of each pixel in its neighborhood") { - Argument = new Argument<int[]>("[aperture] [sigmaX] [sigmaY]") + Argument = new Argument<ushort[]>("[aperture] [sigmaX] [sigmaY]") }, new Option(new []{"-mmb", "--mut-median-blur"}, "Each pixel becomes the median of its surrounding pixels") { Argument = new Argument<ushort>("[aperture]") }, - - - - - /*new Option(new []{"-ls", "--layer-start"}, "Specify a start layer index to use with some operations as a range") - { - Argument = new Argument<uint>("Layer index") - }, - - new Option(new []{"-le", "--layer-end"}, "Specify a end layer index to use with some operations as a range") - { - Argument = new Argument<uint>("Layer index") - }, - - new Option(new []{"-is", "--iteration-start"}, "Specify a start layer index to use with some operations as a range") - { - Argument = new Argument<uint>("Layer index") - }, - - new Option(new []{"-fade"}, "Fade a start value towards a end value to use with some operations")*/ - }; rootCommand.Handler = CommandHandler.Create( - (FileSystemInfo file, FileSystemInfo convert, bool properties, bool issues, bool repair, uint layerStartIndex, uint layerEndIndex) => + ( + FileSystemInfo file, + FileSystemInfo convert, + DirectoryInfo extract, + bool properties, + bool gcode, + bool issues, + bool repair + ) => { - Console.WriteLine($"Reading: {file}"); - var fileFormat = FileFormat.FindByExtension(file.FullName, true, true); if (ReferenceEquals(fileFormat, null)) { @@ -114,7 +108,35 @@ namespace UVtools.Cmd } else { + Console.Write($"Reading: {file}"); + sw.Restart(); fileFormat.Decode(file.FullName); + sw.Stop(); + Console.WriteLine($", in {sw.ElapsedMilliseconds}ms"); + Console.WriteLine("----------------------"); + Console.WriteLine($"Layers: {fileFormat.LayerCount} x {fileFormat.LayerHeight}mm = {fileFormat.TotalHeight}mm"); + Console.WriteLine($"Resolution: {new Size((int) fileFormat.ResolutionX, (int) fileFormat.ResolutionY)}"); + Console.WriteLine($"AntiAlias: {fileFormat.ValidateAntiAliasingLevel()}"); + + Console.WriteLine($"Bottom Layer Count: {fileFormat.InitialLayerCount}"); + Console.WriteLine($"Bottom Exposure Time: {fileFormat.InitialExposureTime}s"); + Console.WriteLine($"Layer Exposure Time: {fileFormat.LayerExposureTime}s"); + Console.WriteLine($"Print Time: {fileFormat.PrintTime}s"); + Console.WriteLine($"Cost: {fileFormat.MaterialCost}$"); + Console.WriteLine($"Resin Name: {fileFormat.MaterialName}"); + Console.WriteLine($"Machine Name: {fileFormat.MachineName}"); + + Console.WriteLine($"Thumbnails: {fileFormat.CreatedThumbnailsCount}"); + Console.WriteLine("----------------------"); + } + + if (!ReferenceEquals(extract, null)) + { + Console.Write($"Extracting to {extract.FullName}"); + sw.Restart(); + fileFormat.Extract(extract.FullName); + sw.Stop(); + Console.WriteLine($", finished in {sw.ElapsedMilliseconds}ms"); } if (properties) @@ -140,6 +162,22 @@ namespace UVtools.Cmd Console.WriteLine($"Total properties: {count}"); } + if (gcode) + { + if (ReferenceEquals(fileFormat.GCode, null)) + { + Console.WriteLine("No GCode available"); + } + else + { + Console.WriteLine("----------------------"); + Console.WriteLine(fileFormat.GCode); + Console.WriteLine("----------------------"); + Console.WriteLine($"Total lines: {fileFormat.GCode.Length}"); + } + + } + if (issues) { Console.WriteLine("Computing Issues, please wait."); diff --git a/UVtools.Core/CWSFile.cs b/UVtools.Core/CWSFile.cs index 14e948d..bdfd0bb 100644 --- a/UVtools.Core/CWSFile.cs +++ b/UVtools.Core/CWSFile.cs @@ -202,7 +202,7 @@ namespace UVtools.Core for(uint layerIndex = 0; layerIndex < LayerCount; layerIndex++) { Layer layer = this[layerIndex]; - var layerimagePath = $"{Path.GetFileNameWithoutExtension(fileFullPath)}{layer.Index:D4}.png"; + var layerimagePath = $"{Path.GetFileNameWithoutExtension(fileFullPath)}{layer.Index.ToString().PadLeft(LayerCount.ToString().Length, '0')}.png"; outputFile.PutFileContent(layerimagePath, layer.CompressedBytes); } @@ -293,12 +293,15 @@ namespace UVtools.Core if (!zipArchiveEntry.Name.EndsWith(".png")) continue; // - .png - 4 numbers - string layerStr = zipArchiveEntry.Name.Substring(zipArchiveEntry.Name.Length - 4 - 4, 4); + int layerSize = OutputSettings.LayersNum.ToString().Length; + string layerStr = zipArchiveEntry.Name.Substring(zipArchiveEntry.Name.Length - 4 - layerSize, layerSize); uint iLayer = uint.Parse(layerStr); LayerManager[iLayer] = new Layer(iLayer, zipArchiveEntry.Open(), zipArchiveEntry.Name); } } + + var rect = LayerManager.BoundingRectangle; } public override object GetValueFromPrintParameterModifier(PrintParameterModifier modifier) @@ -437,7 +440,7 @@ namespace UVtools.Core { string arch = Environment.Is64BitOperatingSystem ? "64-bits" : "32-bits"; GCode = new StringBuilder(); - GCode.AppendLine($"# {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.Now}"); + GCode.AppendLine($"; {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.Now}"); GCode.AppendLine("(****Build and Slicing Parameters * ***)"); foreach (var propertyInfo in OutputSettings.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) diff --git a/UVtools.Core/ChituboxFile.cs b/UVtools.Core/ChituboxFile.cs index 0aed6ce..0c23d7b 100644 --- a/UVtools.Core/ChituboxFile.cs +++ b/UVtools.Core/ChituboxFile.cs @@ -1077,9 +1077,11 @@ namespace UVtools.Core Parallel.For(0, LayerCount, /*new ParallelOptions{MaxDegreeOfParallelism = 1},*/ layerIndex => { LayerData layerData = new LayerData(this, (uint) layerIndex); - var image = this[layerIndex].LayerMat; - layerData.Encode(image, aaIndex, (uint) layerIndex); - LayersDefinitions[aaIndex, layerIndex] = layerData; + using (var image = this[layerIndex].LayerMat) + { + layerData.Encode(image, aaIndex, (uint) layerIndex); + LayersDefinitions[aaIndex, layerIndex] = layerData; + } }); for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++) @@ -1218,8 +1220,8 @@ namespace UVtools.Core LayersDefinitions[aaIndex, layerIndex] = layerData; layerOffset += (uint)Helpers.Serializer.SizeOf(layerData); - Debug.Write($"LAYER {layerIndex} -> "); - Debug.WriteLine(layerData); + //Debug.Write($"LAYER {layerIndex} -> "); + //Debug.WriteLine(layerData); layerData.EncodedRle = new byte[layerData.DataSize]; inputFile.Seek(layerData.DataAddress, SeekOrigin.Begin); diff --git a/UVtools.Core/ChituboxZipFile.cs b/UVtools.Core/ChituboxZipFile.cs index 9507b77..31c8a2d 100644 --- a/UVtools.Core/ChituboxZipFile.cs +++ b/UVtools.Core/ChituboxZipFile.cs @@ -262,6 +262,8 @@ namespace UVtools.Core CvInvoke.Imdecode(entry.Open().ToArray(), ImreadModes.AnyColor, Thumbnails[CreatedThumbnailsCount]); } } + + var rect = LayerManager.BoundingRectangle; } public override object GetValueFromPrintParameterModifier(PrintParameterModifier modifier) diff --git a/UVtools.Core/Extensions/DrawingExtensions.cs b/UVtools.Core/Extensions/DrawingExtensions.cs new file mode 100644 index 0000000..8a60ee4 --- /dev/null +++ b/UVtools.Core/Extensions/DrawingExtensions.cs @@ -0,0 +1,34 @@ +using System; +using System.Drawing; + +namespace UVtools.Core.Extensions +{ + public static class DrawingExtensions + { + public static Color FactorColor(this Color color, byte pixelColor, byte min = 0, byte max = byte.MaxValue) => + FactorColor(color, pixelColor / 255f, min, max); + + public static Color FactorColor(this Color color, float factor, byte min = 0, byte max = byte.MaxValue) + { + byte r = (byte)(color.R == 0 ? 0 : + Math.Min(Math.Max(min, color.R * factor), max)); + + byte g = (byte)(color.G == 0 ? 0 : + Math.Min(Math.Max(min, color.G * factor), max)); + + byte b = (byte)(color.B == 0 ? 0 : + Math.Min(Math.Max(min, color.B * factor), max)); + return Color.FromArgb(r, g, b); + } + + public static int GetArea(this Rectangle rect) + { + return rect.Width * rect.Height; + } + + public static int GetArea(this Size size) + { + return size.Width * size.Height; + } + } +} diff --git a/UVtools.Core/Extensions/EmguExtensions.cs b/UVtools.Core/Extensions/EmguExtensions.cs index a96a50f..735c41a 100644 --- a/UVtools.Core/Extensions/EmguExtensions.cs +++ b/UVtools.Core/Extensions/EmguExtensions.cs @@ -27,11 +27,10 @@ namespace UVtools.Core.Extensions return new Span<T>(mat.DataPointer.ToPointer(), mat.GetLength()); } - public static Span<T> GetPixelRowSpan<T>(this Mat mat, int y) + public static unsafe Span<T> GetPixelRowSpan<T>(this Mat mat, int y) { - int offset = y * mat.Step; - //IntPtr ptr = IntPtr.Add(mat.DataPointer, offset); - return mat.GetPixelSpan<T>().Slice(offset, mat.Step); + return new Span<T>(IntPtr.Add(mat.DataPointer, y * mat.Step).ToPointer(), mat.Step); + //return mat.GetPixelSpan<T>().Slice(offset, mat.Step); } /// <summary> @@ -44,17 +43,19 @@ namespace UVtools.Core.Extensions /// <param name="xTrans">X translation</param> /// <param name="yTrans">Y translation</param> /// <param name="interpolation">Interpolation mode</param> - public static void ScaleFromCenter(this Mat src, double xScale, double yScale, double xTrans = 0, double yTrans = 0, Inter interpolation = Inter.Linear) + public static void TransformFromCenter(this Mat src, double xScale, double yScale, double xTrans = 0, double yTrans = 0, Inter interpolation = Inter.Linear) { //var dst = new Mat(src.Size, src.Depth, src.NumberOfChannels); - var translateTransform = new Matrix<double>(2, 3) + using (var translateTransform = new Matrix<double>(2, 3) { [0, 0] = xScale, // xScale [1, 1] = yScale, // yScale [0, 2] = xTrans + (src.Width - src.Width * xScale) / 2.0, //x translation + compensation of x scaling [1, 2] = yTrans + (src.Height - src.Height * yScale) / 2.0 // y translation + compensation of y scaling - }; - CvInvoke.WarpAffine(src, src, translateTransform, src.Size, interpolation); + }) + { + CvInvoke.WarpAffine(src, src, translateTransform, src.Size, interpolation); + } } /// <summary> diff --git a/UVtools.Core/Extensions/SpanExtensions.cs b/UVtools.Core/Extensions/SpanExtensions.cs new file mode 100644 index 0000000..0a9ffeb --- /dev/null +++ b/UVtools.Core/Extensions/SpanExtensions.cs @@ -0,0 +1,34 @@ +using System; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; + +namespace UVtools.Core.Extensions +{ + public static class SpanExtensions + { + public static unsafe void Fill<T>(this Span<T> span, Func<T> provider) where T : struct + { + int + cores = Environment.ProcessorCount, + batch = span.Length / cores, + mod = span.Length % cores, + size = Unsafe.SizeOf<T>(); + ref T r0 = ref span.GetPinnableReference(); + fixed (byte* p0 = &Unsafe.As<T, byte>(ref r0)) + { + byte* p = p0; + Parallel.For(0, cores, i => + { + byte* pi = p + i * batch * size; + for (int j = 0; j < batch; j++, pi += size) + Unsafe.Write(pi, provider()); + }); + + // Remaining values + if (mod < 1) return; + for (int i = span.Length - mod; i < span.Length; i++) + Unsafe.Write(p + i * size, provider()); + } + } + } +} diff --git a/UVtools.Core/LayerManager.cs b/UVtools.Core/LayerManager.cs index 12792fa..5b09d31 100644 --- a/UVtools.Core/LayerManager.cs +++ b/UVtools.Core/LayerManager.cs @@ -10,7 +10,6 @@ using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; @@ -23,8 +22,73 @@ using UVtools.Core.Extensions; namespace UVtools.Core { + #region LayerIssue Class + public class IslandDetectionConfiguration + { + /// <summary> + /// Gets if the detection is enabled + /// </summary> + public bool Enabled { get; set; } = true; + + /// <summary> + /// Gets or sets the binary threshold, all pixels below this value will turn in black, otherwise white + /// Set to 0 to disable this operation + /// </summary> + public byte BinaryThreshold { get; set; } = 1; + + /// <summary> + /// Gets the required area size (x*y) to consider process a island (0-255) + /// </summary> + public byte RequiredAreaToProcessCheck { get; set; } = 1; + + /// <summary> + /// Gets the required brightness for check a pixel under a island (0-255) + /// </summary> + public byte RequiredPixelBrightnessToProcessCheck { get; set; } = 10; + + /// <summary> + /// Gets the required number of pixels to support a island and discard it as a issue (0-255) + /// </summary> + public byte RequiredPixelsToSupport { get; set; } = 10; + + /// <summary> + /// Gets the required brightness of supporting pixels to count as a valid support (0-255) + /// </summary> + public byte RequiredPixelBrightnessToSupport { get; set; } = 150; + } + + public class ResinTrapDetectionConfiguration + { + /// <summary> + /// Gets if the detection is enabled + /// </summary> + public bool Enabled { get; set; } = true; + + /// <summary> + /// Gets or sets the binary threshold, all pixels below this value will turn in black, otherwise white + /// Set to 0 to disable this operation + /// </summary> + public byte BinaryThreshold { get; set; } = 127; + + /// <summary> + /// Gets the required area size (x*y) to consider process a hollow area (0-255) + /// </summary> + public byte RequiredAreaToProcessCheck { get; set; } = 1; + + /// <summary> + /// Gets the number of black pixels required to consider a drain + /// </summary> + public byte RequiredBlackPixelsToDrain { get; set; } = 10; + + /// <summary> + /// Gets the maximum pixel brightness to be a drain pixel (0-150) + /// </summary> + public byte MaximumPixelBrightnessToDrain { get; set; } = 30; + } + + public class LayerIssue : IEnumerable<Point> { public enum IssueType : byte @@ -209,10 +273,30 @@ namespace UVtools.Core public LayerManager ParentLayerManager { get; set; } /// <summary> + /// Gets the number of non zero pixels on this layer image + /// </summary> + public uint NonZeroPixelCount { get; private protected set; } + + /// <summary> + /// Gets the bounding rectangle for the image area + /// </summary> + public Rectangle BoundingRectangle { get; private protected set; } = Rectangle.Empty; + + /// <summary> /// Gets the layer index /// </summary> public uint Index { get; } + /// <summary> + /// Gets or sets the exposure time in raw value + /// </summary> + public float ExposureTime { get; set; } + + /// <summary> + /// Gets or sets the layer position on Z in raw value + /// </summary> + public float PositionZ { get; set; } + private byte[] _compressedBytes; /// <summary> /// Gets or sets layer image compressed data @@ -224,6 +308,8 @@ namespace UVtools.Core { _compressedBytes = LayerManager.CompressLayer(value); IsModified = true; + if(!ReferenceEquals(ParentLayerManager, null)) + ParentLayerManager.BoundingRectangle = Rectangle.Empty; } } @@ -254,6 +340,8 @@ namespace UVtools.Core { CvInvoke.Imencode(".png", value, vector); CompressedBytes = vector.ToArray(); + + GetBoundingRectangle(value, true); } } } @@ -276,11 +364,15 @@ namespace UVtools.Core #region Constructor public Layer(uint index, byte[] compressedBytes, string filename = null, LayerManager pararentLayerManager = null) { + ParentLayerManager = pararentLayerManager; Index = index; - CompressedBytes = compressedBytes; Filename = filename ?? $"Layer{index}.png"; + CompressedBytes = compressedBytes; IsModified = false; - ParentLayerManager = pararentLayerManager; + /*if (compressedBytes.Length > 0) + { + GetBoundingRectangle(); + }*/ } public Layer(uint index, Mat layerMat, string filename = null, LayerManager pararentLayerManager = null) : this(index, new byte[0], filename, pararentLayerManager) @@ -374,6 +466,27 @@ namespace UVtools.Core #region Methods + public Rectangle GetBoundingRectangle(Mat mat = null, bool reCalculate = false) + { + if (NonZeroPixelCount > 0 && !reCalculate) + { + return BoundingRectangle; + } + bool needDispose = false; + if (ReferenceEquals(mat, null)) + { + mat = LayerMat; + needDispose = true; + } + CvInvoke.FindNonZero(mat, mat); + NonZeroPixelCount = (uint)mat.Rows / 2; + BoundingRectangle = CvInvoke.BoundingRectangle(mat); + + if(needDispose) mat.Dispose(); + + return BoundingRectangle; + } + public Layer PreviousLayer() { if (ReferenceEquals(ParentLayerManager, null) || Index == 0) @@ -570,7 +683,67 @@ namespace UVtools.Core { using (var mat = LayerMat) { - mat.ScaleFromCenter(xScale, yScale); + mat.TransformFromCenter(xScale, yScale); + LayerMat = mat; + } + } + + public void MutateFlip(FlipType flipType, bool makeCopy = true) + { + using (var mat = LayerMat) + { + if (makeCopy) + { + using (Mat dst = new Mat()) + { + CvInvoke.Flip(mat, dst, flipType); + var spanSrc = mat.GetPixelSpan<byte>(); + var spanDst = dst.GetPixelSpan<byte>(); + for (int i = 0; i < spanSrc.Length; i++) + { + if (spanDst[i] == 0) continue; + spanSrc[i] = spanDst[i]; + } + + LayerMat = mat; + + } + } + else + { + CvInvoke.Flip(mat, mat, flipType); + } + + LayerMat = mat; + } + } + + public void MutateRotate(double angle = 90.0, Inter interpolation = Inter.Linear) + { + using (var mat = LayerMat) + { + var halfWidth = mat.Width / 2.0f; + var halfHeight = mat.Height / 2.0f; + using (var translateTransform = new Matrix<double>(2, 3)) + { + CvInvoke.GetRotationMatrix2D(new PointF(halfWidth, halfHeight), angle, 1.0, translateTransform); + /*var rect = new RotatedRect(PointF.Empty, mat.Size, (float) angle).MinAreaRect(); + translateTransform[0, 2] += rect.Width / 2.0 - mat.Cols / 2.0; + translateTransform[0, 2] += rect.Height / 2.0 - mat.Rows / 2.0;*/ + + /* var abs_cos = Math.Abs(translateTransform[0, 0]); + var abs_sin = Math.Abs(translateTransform[0, 1]); + + var bound_w = mat.Height * abs_sin + mat.Width * abs_cos; + var bound_h = mat.Height * abs_cos + mat.Width * abs_sin; + + translateTransform[0, 2] += bound_w / 2 - halfWidth; + translateTransform[1, 2] += bound_h / 2 - halfHeight;*/ + + + CvInvoke.WarpAffine(mat, mat, translateTransform, mat.Size, interpolation); + } + LayerMat = mat; } } @@ -712,18 +885,66 @@ namespace UVtools.Core #endregion + } #endregion #region LayerManager Class public class LayerManager : IEnumerable<Layer> { - #region Properties + #region Enums + public enum Mutate : byte + { + Resize, + Flip, + Rotate, + Solidify, + //LayerSmash, + Erode, + Dilate, + Opening, + Closing, + Gradient, + TopHat, + BlackHat, + HitMiss, + PyrDownUp, + SmoothMedian, + SmoothGaussian, + } + #endregion + + #region Properties /// <summary> /// Layers List /// </summary> public Layer[] Layers { get; } + private Rectangle _boundingRectangle = Rectangle.Empty; + public Rectangle BoundingRectangle + { + get + { + if(!_boundingRectangle.IsEmpty) return _boundingRectangle; + _boundingRectangle = this[0].BoundingRectangle; + if (_boundingRectangle.IsEmpty) // Safe checking + { + Parallel.For(0, Count, layerIndex => + { + this[layerIndex].GetBoundingRectangle(); + }); + _boundingRectangle = this[0].BoundingRectangle; + } + for (int i = 1; i < Count; i++) + { + _boundingRectangle = Rectangle.Union(_boundingRectangle, this[i].BoundingRectangle); + } + + return _boundingRectangle; + } + set => _boundingRectangle = value; + } + /// <summary> /// Gets the layers count /// </summary> @@ -915,6 +1136,22 @@ namespace UVtools.Core }); } + public void MutateFlip(uint startLayerIndex, uint endLayerIndex, FlipType flipType, bool makeCopy = false) + { + Parallel.For(startLayerIndex, endLayerIndex + 1, layerIndex => + { + this[layerIndex].MutateFlip(flipType, makeCopy); + }); + } + + public void MutateRotate(uint startLayerIndex, uint endLayerIndex, double angle, Inter interpolation = Inter.Linear) + { + Parallel.For(startLayerIndex, endLayerIndex + 1, layerIndex => + { + this[layerIndex].MutateRotate(angle, interpolation); + }); + } + public void MutateSolidify(uint startLayerIndex, uint endLayerIndex) { Parallel.For(startLayerIndex, endLayerIndex + 1, layerIndex => @@ -1074,29 +1311,18 @@ namespace UVtools.Core }); } - public ConcurrentDictionary<uint, List<LayerIssue>> GetAllIssues() + public ConcurrentDictionary<uint, List<LayerIssue>> GetAllIssues(IslandDetectionConfiguration islandConfig = null, ResinTrapDetectionConfiguration resinTrapConfig = null) { - const byte requiredPixelsToSupportIsland = 10; - const byte minIslandPixelToCheck = 10; - const byte minIslandSupportPixelColor = 150; + if(ReferenceEquals(islandConfig, null)) islandConfig = new IslandDetectionConfiguration(); + if(ReferenceEquals(resinTrapConfig, null)) resinTrapConfig = new ResinTrapDetectionConfiguration(); + const byte minTouchingBondsPixelColor = 200; var result = new ConcurrentDictionary<uint, List<LayerIssue>>(); - - /*Parallel.ForEach(this, layer => - { - var issues = layer.GetIssues(); - if (issues.Count > 0) - { - if (!result.TryAdd(layer.Index, issues)) - { - throw new AccessViolationException("Error while trying to add an issue to the dictionary, please try again."); - } - } - });*/ - - var task1 = new TaskFactory().StartNew(() => + var layerHollowAreas = new ConcurrentDictionary<uint, List<LayerHollowArea>>(); + Parallel.Invoke(() => { + if (!islandConfig.Enabled) return; // Detect contours Parallel.ForEach(this, //new ParallelOptions{MaxDegreeOfParallelism = 1}, @@ -1143,14 +1369,26 @@ namespace UVtools.Core }); } - if (layer.Index == 0) return; // No inslands for layer 0 + + if (layer.Index == 0) return; // No islands for layer 0 - CvInvoke.Threshold(image, image, 1, 255, ThresholdType.Binary); VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); Mat hierarchy = new Mat(); - - CvInvoke.FindContours(image, contours, hierarchy, RetrType.Ccomp, - ChainApproxMethod.ChainApproxSimple); + + if (islandConfig.BinaryThreshold > 0) + { + using (var thresholdImage = new Mat()) + { + CvInvoke.Threshold(image, thresholdImage, 1, 255, ThresholdType.Binary); + CvInvoke.FindContours(thresholdImage, contours, hierarchy, RetrType.Ccomp, + ChainApproxMethod.ChainApproxSimple); + } + } + else + { + CvInvoke.FindContours(image, contours, hierarchy, RetrType.Ccomp, + ChainApproxMethod.ChainApproxSimple); + } var arr = hierarchy.GetData(); // @@ -1162,18 +1400,19 @@ namespace UVtools.Core Mat previousImage = null; Span<byte> previousSpan = null; - Span<byte> imageSpan = null; for (int i = 0; i < contours.Size; i++) { if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1) continue; + var rect = CvInvoke.BoundingRectangle(contours[i]); + if (rect.GetArea() < islandConfig.RequiredAreaToProcessCheck) + continue; + if (ReferenceEquals(previousImage, null)) { previousImage = this[layer.Index - 1].LayerMat; previousSpan = previousImage.GetPixelSpan<byte>(); - imageSpan = image.GetPixelSpan<byte>(); } - - var rect = CvInvoke.BoundingRectangle(contours[i]); + List<Point> points = new List<Point>(); uint pixelsSupportingIsland = 0; @@ -1186,9 +1425,8 @@ namespace UVtools.Core { for (int x = rect.X; x < rect.Right; x++) { - //int pixel = image.GetPixelPos(x, y); int pixel = step * y + x; - if (imageSpan[pixel] < minIslandPixelToCheck) + if (span[pixel] < islandConfig.RequiredPixelBrightnessToProcessCheck) continue; // Low brightness, ignore if (contourImageSpan[pixel] != 255) continue; // Not inside contour, ignore @@ -1197,7 +1435,7 @@ namespace UVtools.Core //Debug.WriteLine($"Layer: {layer.Index}, Coutour: {i}, X:{x} Y:{y}"); points.Add(new Point(x, y)); - if (previousSpan[pixel] >= minIslandSupportPixelColor) + if (previousSpan[pixel] >= islandConfig.RequiredPixelBrightnessToSupport) { pixelsSupportingIsland++; } @@ -1206,9 +1444,9 @@ namespace UVtools.Core } if (points.Count == 0) continue; - if (pixelsSupportingIsland >= requiredPixelsToSupportIsland) + if (pixelsSupportingIsland >= islandConfig.RequiredPixelsToSupport) continue; // Not a island, bounding is strong, i think... - if (pixelsSupportingIsland > 0 && points.Count < requiredPixelsToSupportIsland && + if (pixelsSupportingIsland > 0 && points.Count < islandConfig.RequiredPixelsToSupport && pixelsSupportingIsland >= Math.Max(1, points.Count / 2)) continue; // Not a island, but maybe weak bounding... @@ -1227,11 +1465,9 @@ namespace UVtools.Core previousImage?.Dispose(); } }); - }); - - var layerHollowAreas = new ConcurrentDictionary<uint, List<LayerHollowArea>>(); - var task2 = new TaskFactory().StartNew(() => + }, () => { + if (!resinTrapConfig.Enabled) return; // Detect contours Parallel.ForEach(this, //new ParallelOptions{MaxDegreeOfParallelism = 1}, @@ -1239,7 +1475,10 @@ namespace UVtools.Core { using (var image = layer.LayerMat) { - CvInvoke.Threshold(image, image, 254, 255, ThresholdType.Binary); + if (resinTrapConfig.BinaryThreshold > 0) + { + CvInvoke.Threshold(image, image, resinTrapConfig.BinaryThreshold, 255, ThresholdType.Binary); + } var listHollowArea = new List<LayerHollowArea>(); @@ -1263,8 +1502,11 @@ namespace UVtools.Core { if ((int) arr.GetValue(0, i, 2) != -1 || (int) arr.GetValue(0, i, 3) == -1) continue; + var rect = CvInvoke.BoundingRectangle(contours[i]); + if(rect.GetArea() < resinTrapConfig.RequiredAreaToProcessCheck) continue; + listHollowArea.Add(new LayerHollowArea(contours[i].ToArray(), - CvInvoke.BoundingRectangle(contours[i]), + rect, layer.Index == 0 || layer.Index == Count - 1 ? LayerHollowArea.AreaType.Drain : LayerHollowArea.AreaType.Unknown)); @@ -1288,7 +1530,7 @@ namespace UVtools.Core Parallel.ForEach(from t in areas where t.Type == LayerHollowArea.AreaType.Unknown select t, area => { - //if (area.Type != LayerHollowArea.AreaType.Unknown) return; // processed, ignore + if (area.Type != LayerHollowArea.AreaType.Unknown) return; // processed, ignore area.Type = LayerHollowArea.AreaType.Trap; areaCount++; @@ -1308,11 +1550,11 @@ namespace UVtools.Core if (checkArea.Processed) continue; checkArea.Processed = true; nextLayerIndex += dir; - Debug.WriteLine($"Area Count: {areaCount} | Layer: {layerIndex} | Next Layer: {nextLayerIndex} | Dir: {dir}"); + if (nextLayerIndex < 0 && nextLayerIndex >= Count) break; // Exhausted layers bool haveNextAreas = layerHollowAreas.TryGetValue((uint) nextLayerIndex, out var nextAreas); - List<LayerHollowArea> intersectingAreas = new List<LayerHollowArea>(); + Dictionary<int, LayerHollowArea> intersectingAreas = new Dictionary<int, LayerHollowArea>(); using (var image = this[nextLayerIndex].LayerMat) { @@ -1324,110 +1566,122 @@ namespace UVtools.Core CvInvoke.DrawContours(emguImage, vec, -1, new MCvScalar(255), -1); } - if (haveNextAreas) + using (var intersectingAreasMat = image.CloneBlank()) { - foreach (var nextArea in nextAreas) + if (haveNextAreas) { - if (!checkArea.BoundingRectangle.IntersectsWith(nextArea.BoundingRectangle)) continue; - - intersectingAreas.Add(nextArea); - /*CvInvoke.DrawContours(emguImage, - new VectorOfVectorOfPoint(new VectorOfPoint(nextArea.Contour)), - -1, - new MCvScalar(intersectingAreas.Count), -1);*/ - } - if (intersectingAreas.Count == 0) - { - haveNextAreas = false; + foreach (var nextArea in nextAreas) + { + if (!checkArea.BoundingRectangle.IntersectsWith( + nextArea.BoundingRectangle)) continue; + intersectingAreas.Add(intersectingAreas.Count + 1, nextArea); + using (var vec = new VectorOfVectorOfPoint(new VectorOfPoint(nextArea.Contour))) + { + CvInvoke.DrawContours(intersectingAreasMat, vec, -1, + new MCvScalar(intersectingAreas.Count), -1); + } + } } - } - bool exitPixelLoop = false; - uint blackCount = 0; + //Debug.WriteLine($"Area Count: {areaCount} | Next Areas: {intersectingAreas.Count} | Layer: {layerIndex} | Next Layer: {nextLayerIndex} | Dir: {dir}"); - var spanContour = emguImage.GetPixelSpan<byte>(); - for (int y = checkArea.BoundingRectangle.Y; - y <= checkArea.BoundingRectangle.Bottom && - area.Type != LayerHollowArea.AreaType.Drain && !exitPixelLoop; - y++) - { - int pixelPos = image.GetPixelPos(checkArea.BoundingRectangle.X, y)-1; - for (int x = checkArea.BoundingRectangle.X; - x <= checkArea.BoundingRectangle.Right && + bool exitPixelLoop = false; + uint blackCount = 0; + + var spanContour = emguImage.GetPixelSpan<byte>(); + var spanIntersect = intersectingAreasMat.GetPixelSpan<byte>(); + for (int y = checkArea.BoundingRectangle.Y; + y < checkArea.BoundingRectangle.Bottom && area.Type != LayerHollowArea.AreaType.Drain && !exitPixelLoop; - x++) + y++) { - pixelPos++; - - if (spanContour[pixelPos] == 0) continue; // No contour - if (span[pixelPos] > 30) continue; // Threshold to ignore white area - blackCount++; - - if (haveNextAreas) // Have areas, can be on same area path or not + int pixelPos = image.GetPixelPos(checkArea.BoundingRectangle.X, y) - 1; + for (int x = checkArea.BoundingRectangle.X; + x < checkArea.BoundingRectangle.Right && + area.Type != LayerHollowArea.AreaType.Drain && !exitPixelLoop; + x++) { - /*int i = spanContour[pixelPos] - 1; - if (i == -1 || i >= 254) - continue; - - //if(queue.Contains(intersectingAreas[i])) continue; - //Debug.WriteLine($"BlackCount: {blackCount}, pixel color: {i}, layerindex: {layerIndex}"); - - if (intersectingAreas[i].Type == LayerHollowArea.AreaType.Drain) // Found a drain, stop query - { - area.Type = LayerHollowArea.AreaType.Drain; - } - else - { - queue.Enqueue(intersectingAreas[i]); - } + pixelPos++; - linkedAreas.Add(intersectingAreas[i]); + if (spanContour[pixelPos] != 255) continue; // No contour + if (span[pixelPos] > resinTrapConfig.MaximumPixelBrightnessToDrain) continue; // Threshold to ignore white area + blackCount++; - exitPixelLoop = true; - break;*/ - foreach (var nextAreaCheck in intersectingAreas) + if (intersectingAreas.Count > 0) // Have areas, can be on same area path or not { - using (var vec = new VectorOfPoint(nextAreaCheck.Contour)) - { - //Debug.WriteLine(CvInvoke.PointPolygonTest(vec, new PointF(x, y), false)); - if (CvInvoke.PointPolygonTest(vec, new PointF(x, y), false) < 0) continue; - } + byte i = spanIntersect[pixelPos]; + if (i == 0 || !intersectingAreas.ContainsKey(i)) // Black pixels + continue; + + //Debug.WriteLine($"BlackCount: {blackCount}, pixel color: {i}, layerindex: {layerIndex}"); - if (nextAreaCheck.Type == LayerHollowArea.AreaType.Drain - ) // Found a drain, stop query + if (intersectingAreas[i].Type == LayerHollowArea.AreaType.Drain) // Found a drain, stop query { area.Type = LayerHollowArea.AreaType.Drain; exitPixelLoop = true; } else { - queue.Enqueue(area); + queue.Enqueue(intersectingAreas[i]); + } + + linkedAreas.Add(intersectingAreas[i]); + intersectingAreas.Remove(i); + if (intersectingAreas.Count == 0) // Intersection areas sweep end, quit this path + { + exitPixelLoop = true; + break; } - linkedAreas.Add(nextAreaCheck); - intersectingAreas.Remove(nextAreaCheck); - haveNextAreas = intersectingAreas.Count > 0; - break; - //exitPixelLoop = true; //break; - } - } - else if (blackCount > Math.Min(checkArea.Contour.Length / 2, 10)) // Black pixel without next areas = Drain - { - area.Type = LayerHollowArea.AreaType.Drain; - exitPixelLoop = true; - break; - } - } // X loop - } // Y loop + // Old Way - if (queue.Count == 0 && blackCount > Math.Min(checkArea.Contour.Length / 2, 10)) - { + /*foreach (var nextAreaCheck in intersectingAreas) + { + using (var vec = new VectorOfPoint(nextAreaCheck.Value.Contour)) + { + //Debug.WriteLine(CvInvoke.PointPolygonTest(vec, new PointF(x, y), false)); + if (CvInvoke.PointPolygonTest(vec, new PointF(x, y), false) < 0) continue; + } + + if (nextAreaCheck.Value.Type == LayerHollowArea.AreaType.Drain) // Found a drain, stop query + { + area.Type = LayerHollowArea.AreaType.Drain; + exitPixelLoop = true; + } + else + { + queue.Enqueue(nextAreaCheck.Value); + } + + linkedAreas.Add(nextAreaCheck.Value); + intersectingAreas.Remove(nextAreaCheck.Key); + if (intersectingAreas.Count == 0) + { + haveNextAreas = false; + exitPixelLoop = true; + } + //exitPixelLoop = true; + break; + + }*/ + } + else if (blackCount > Math.Min(checkArea.Contour.Length / 2, resinTrapConfig.RequiredBlackPixelsToDrain)) // Black pixel without next areas = Drain + { + area.Type = LayerHollowArea.AreaType.Drain; + exitPixelLoop = true; + break; + } + } // X loop + } // Y loop - area.Type = LayerHollowArea.AreaType.Drain; - } + if (queue.Count == 0 && blackCount > Math.Min(checkArea.Contour.Length / 2, resinTrapConfig.RequiredBlackPixelsToDrain)) + { + area.Type = LayerHollowArea.AreaType.Drain; + } + } // Dispose intersecting image } // Dispose emgu image } // Dispose image } // Areas loop @@ -1441,9 +1695,6 @@ namespace UVtools.Core } }); - task1.Wait(); // Islands & bounds - task2.Wait(); // Resin trap - for (uint layerIndex = 0; layerIndex < Count; layerIndex++) { if (!layerHollowAreas.TryGetValue(layerIndex, out var list)) continue; @@ -1465,6 +1716,62 @@ namespace UVtools.Core return result; } + public void RepairLayers(uint layerStart, uint layerEnd, uint closingIterations = 1, uint openingIterations = 1, + bool repairIslands = true, bool repairResinTraps = true, Dictionary<uint, List<LayerIssue>> issues = null) + { + Parallel.For(layerStart, layerEnd + 1, layerIndex => + { + Layer layer = this[layerIndex]; + using (var image = layer.LayerMat) + { + if (repairResinTraps && !ReferenceEquals(issues, null)) + { + if (issues.TryGetValue((uint)layerIndex, out var issueList)) + { + foreach (var issue in issueList.Where(issue => issue.Type == LayerIssue.IssueType.ResinTrap)) + { + using (var vec = new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels))) + { + CvInvoke.DrawContours(image, + vec, + -1, + new MCvScalar(255), + -1); + } + + /*CvInvoke.DrawContours(image, + new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), + -1, + new MCvScalar(255), + 2);*/ + } + } + } + + if (repairIslands) + { + using (Mat kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(3, 3), + new Point(-1, -1))) + { + if (closingIterations > 0) + { + CvInvoke.MorphologyEx(image, image, MorphOp.Close, kernel, new Point(-1, -1), + (int) closingIterations, BorderType.Default, new MCvScalar()); + } + + if (openingIterations > 0) + { + CvInvoke.MorphologyEx(image, image, MorphOp.Open, kernel, new Point(-1, -1), + (int) closingIterations, BorderType.Default, new MCvScalar()); + } + } + } + + layer.LayerMat = image; + } + }); + } + /// <summary> /// Desmodify all layers /// </summary> diff --git a/UVtools.Core/PHZFile.cs b/UVtools.Core/PHZFile.cs index 34487a1..d12bb42 100644 --- a/UVtools.Core/PHZFile.cs +++ b/UVtools.Core/PHZFile.cs @@ -372,13 +372,12 @@ namespace UVtools.Core } } - int pixel = 0; - while (pixel < span.Length) + for (int pixel = 0; pixel < span.Length; pixel += image.NumberOfChannels) { var ncolor15 = - (span[pixel++] >> 3) - | ((span[pixel++] >> 2) << 5) - | ((span[pixel++] >> 3) << 11); + (span[pixel] >> 3) + | ((span[pixel+1] >> 2) << 5) + | ((span[pixel+2] >> 3) << 11); if (ncolor15 == color15) { @@ -526,7 +525,7 @@ namespace UVtools.Core public void Encode(Mat image, uint layerIndex) { List<byte> rawData = new List<byte>(); - var span = image.GetPixelSpan<byte>(); + //byte color = byte.MaxValue >> 1; byte color = byte.MaxValue; uint stride = 0; @@ -553,12 +552,14 @@ namespace UVtools.Core int halfWidth = image.Width / 2; - + //int pixel = 0; for (int y = 0; y < image.Height; y++) { - for (int x = 0; x < image.Width; x++) + var span = image.GetPixelRowSpan<byte>(y); + for (int x = 0; x < span.Length; x++) { - var grey7 = (byte)((span[image.GetPixelPos(x, y)] >> 1) & 0x7f); + + var grey7 = (byte)((span[x] >> 1) & 0x7f); if (grey7 > 0x7c) { grey7 = 0x7c; @@ -814,11 +815,14 @@ namespace UVtools.Core currentOffset += (uint)machineBytes.Length; } - Parallel.For(0, LayerCount, layerIndex => + Parallel.For(0, LayerCount, /*new ParallelOptions{MaxDegreeOfParallelism = 1},*/ layerIndex => { LayerData layer = new LayerData(this, (uint)layerIndex); - layer.Encode(this[layerIndex].LayerMat, (uint) layerIndex); - LayersDefinitions[layerIndex] = layer; + using (var image = this[layerIndex].LayerMat) + { + layer.Encode(image, (uint) layerIndex); + LayersDefinitions[layerIndex] = layer; + } }); HeaderSettings.LayersDefinitionOffsetAddress = currentOffset; diff --git a/UVtools.Core/PWSFile.cs b/UVtools.Core/PWSFile.cs index 2cf034a..1075d01 100644 --- a/UVtools.Core/PWSFile.cs +++ b/UVtools.Core/PWSFile.cs @@ -321,22 +321,22 @@ namespace UVtools.Core Width = (uint) image.Width, Height = (uint) image.Height, Resolution = 42, - Data = new byte[span.Length * 2] + Data = new byte[image.Width * image.Height * 2] }; - int pixel = 0; - for (int i = 0; i < span.Length; i++) + int i = 0; + for (int pixel = 0; pixel < span.Length; pixel += image.NumberOfChannels) { // BGR - int b = span[pixel++] >> 3; - int g = span[pixel++] >> 2; - int r = span[pixel++] >> 3; + int b = span[pixel] >> 3; + int g = span[pixel+1] >> 2; + int r = span[pixel+2] >> 3; ushort color = (ushort) ((r << 11) | (g << 5) | (b << 0)); - preview.Data[i * 2] = (byte) color; - preview.Data[i * 2 + 1] = (byte) (color >> 8); + preview.Data[i++] = (byte) color; + preview.Data[i++] = (byte) (color >> 8); } preview.Section.Length += (uint) preview.Data.Length; @@ -849,8 +849,11 @@ namespace UVtools.Core Parallel.For(0, LayerCount, layerIndex => { LayerData layer = new LayerData(this, (uint) layerIndex); - layer.Encode(this[layerIndex].LayerMat); - LayersDefinition.Layers[layerIndex] = layer; + using (var image = this[layerIndex].LayerMat) + { + layer.Encode(image); + LayersDefinition.Layers[layerIndex] = layer; + } }); LayersDefinition.Section.Length += (uint)Helpers.Serializer.SizeOf(LayersDefinition[0]) * LayerCount; diff --git a/UVtools.Core/SL1File.cs b/UVtools.Core/SL1File.cs index 0ddafbd..59d077f 100644 --- a/UVtools.Core/SL1File.cs +++ b/UVtools.Core/SL1File.cs @@ -72,26 +72,26 @@ namespace UVtools.Core #endregion #region Tilt - public byte FastTiltTime { get; set; } - public byte SlowTiltTime { get; set; } - public byte AreaFill { get; set; } + public float FastTiltTime { get; set; } + public float SlowTiltTime { get; set; } + public float AreaFill { get; set; } #endregion #region Corrections public string RelativeCorrection { get; set; } - public byte AbsoluteCorrection { get; set; } + public float AbsoluteCorrection { get; set; } public float ElefantFootCompensation { get; set; } public float ElefantFootMinWidth { get; set; } - public byte GammaCorrection { get; set; } + public float GammaCorrection { get; set; } #endregion #region Exposure - public byte MinExposureTime { get; set; } - public byte MaxExposureTime { get; set; } - public byte MinInitialExposureTime { get; set; } - public ushort MaxInitialExposureTime { get; set; } + public float MinExposureTime { get; set; } + public float MaxExposureTime { get; set; } + public float MinInitialExposureTime { get; set; } + public float MaxInitialExposureTime { get; set; } #endregion @@ -481,6 +481,8 @@ namespace UVtools.Core } } + var rect = LayerManager.BoundingRectangle; + Statistics.ExecutionTime.Stop(); Debug.WriteLine(Statistics); diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj index 7f4291a..eb88cd3 100644 --- a/UVtools.Core/UVtools.Core.csproj +++ b/UVtools.Core/UVtools.Core.csproj @@ -44,6 +44,7 @@ <PackageReference Include="Emgu.CV" Version="4.3.0.3890" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="System.Memory" Version="4.5.4" /> + <PackageReference Include="System.Reflection.TypeExtensions" Version="4.7.0" /> </ItemGroup> </Project> diff --git a/UVtools.Core/ZCodexFile.cs b/UVtools.Core/ZCodexFile.cs index 7cee01b..b173259 100644 --- a/UVtools.Core/ZCodexFile.cs +++ b/UVtools.Core/ZCodexFile.cs @@ -90,8 +90,8 @@ namespace UVtools.Core public float ZLiftRetractRate { get; set; } = 100; public float ZLiftFeedRate { get; set; } = 100; public byte AntiAliasing { get; set; } = 0; - public byte XCorrection { get; set; } - public byte YCorrection { get; set; } + public float XCorrection { get; set; } + public float YCorrection { get; set; } public byte HollowEnabled { get; set; } public float HollowThickness { get; set; } public byte InfillDensity { get; set; } @@ -346,6 +346,8 @@ namespace UVtools.Core } } } + + var rect = LayerManager.BoundingRectangle; } public override bool SetValueFromPrintParameterModifier(PrintParameterModifier modifier, string value) diff --git a/UVtools.GUI/App.config b/UVtools.GUI/App.config index d896ff5..6e67ee6 100644 --- a/UVtools.GUI/App.config +++ b/UVtools.GUI/App.config @@ -1,5 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <configuration> + <configSections> + <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> + <section name="UVtools.GUI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> + </sectionGroup> + </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /> </startup> @@ -23,4 +28,113 @@ </dependentAssembly> </assemblyBinding> </runtime> + <userSettings> + <UVtools.GUI.Properties.Settings> + <setting name="PreviousNextLayerColor" serializeAs="String"> + <value>Red</value> + </setting> + <setting name="IslandColor" serializeAs="String"> + <value>Yellow</value> + </setting> + <setting name="ResinTrapColor" serializeAs="String"> + <value>Orange</value> + </setting> + <setting name="TouchingBoundsColor" serializeAs="String"> + <value>Red</value> + </setting> + <setting name="PreviousLayerColor" serializeAs="String"> + <value>Magenta</value> + </setting> + <setting name="NextLayerColor" serializeAs="String"> + <value>Cyan</value> + </setting> + <setting name="UpdateSettings" serializeAs="String"> + <value>True</value> + </setting> + <setting name="StartMaximized" serializeAs="String"> + <value>False</value> + </setting> + <setting name="CheckForUpdatesOnStartup" serializeAs="String"> + <value>True</value> + </setting> + <setting name="LayerAutoRotateBestView" serializeAs="String"> + <value>True</value> + </setting> + <setting name="LayerDifferenceDefault" serializeAs="String"> + <value>False</value> + </setting> + <setting name="ComputeIssuesOnLoad" serializeAs="String"> + <value>False</value> + </setting> + <setting name="LayerZoomToFit" serializeAs="String"> + <value>True</value> + </setting> + <setting name="ComputeIslands" serializeAs="String"> + <value>True</value> + </setting> + <setting name="ComputeResinTraps" serializeAs="String"> + <value>True</value> + </setting> + <setting name="IslandRequiredAreaToProcessCheck" serializeAs="String"> + <value>1</value> + </setting> + <setting name="IslandRequiredPixelBrightnessToProcessCheck" serializeAs="String"> + <value>1</value> + </setting> + <setting name="IslandRequiredPixelsToSupport" serializeAs="String"> + <value>10</value> + </setting> + <setting name="IslandRequiredPixelBrightnessToSupport" serializeAs="String"> + <value>150</value> + </setting> + <setting name="ResinTrapRequiredAreaToProcessCheck" serializeAs="String"> + <value>17</value> + </setting> + <setting name="ResinTrapRequiredBlackPixelsToDrain" serializeAs="String"> + <value>10</value> + </setting> + <setting name="ResinTrapMaximumPixelBrightnessToDrain" serializeAs="String"> + <value>30</value> + </setting> + <setting name="AutoComputeIssuesClickOnTab" serializeAs="String"> + <value>True</value> + </setting> + <setting name="OutlinePrintVolumeBoundsColor" serializeAs="String"> + <value>Lime</value> + </setting> + <setting name="OutlinePrintVolumeBoundsLineThickness" serializeAs="String"> + <value>3</value> + </setting> + <setting name="OutlineLayerBoundsColor" serializeAs="String"> + <value>Lime</value> + </setting> + <setting name="OutlineLayerBoundsLineThickness" serializeAs="String"> + <value>3</value> + </setting> + <setting name="OutlineHollowAreasColor" serializeAs="String"> + <value>Orange</value> + </setting> + <setting name="OutlineHollowAreasLineThickness" serializeAs="String"> + <value>3</value> + </setting> + <setting name="OutlinePrintVolumeBounds" serializeAs="String"> + <value>True</value> + </setting> + <setting name="OutlineLayerBounds" serializeAs="String"> + <value>False</value> + </setting> + <setting name="OutlineHollowAreas" serializeAs="String"> + <value>False</value> + </setting> + <setting name="ZoomToFitPrintVolumeBounds" serializeAs="String"> + <value>True</value> + </setting> + <setting name="ResinTrapBinaryThreshold" serializeAs="String"> + <value>127</value> + </setting> + <setting name="IslandBinaryThreshold" serializeAs="String"> + <value>0</value> + </setting> + </UVtools.GUI.Properties.Settings> + </userSettings> </configuration> diff --git a/UVtools.GUI/Forms/FrmAbout.cs b/UVtools.GUI/Forms/FrmAbout.cs index feeb862..baeebdc 100644 --- a/UVtools.GUI/Forms/FrmAbout.cs +++ b/UVtools.GUI/Forms/FrmAbout.cs @@ -46,13 +46,7 @@ namespace UVtools.GUI.Forms } } - public static string AssemblyVersion - { - get - { - return Assembly.GetExecutingAssembly().GetName().Version.ToString(); - } - } + public static string AssemblyVersion => Assembly.GetExecutingAssembly().GetName().Version.ToString(); public static string AssemblyDescription { diff --git a/UVtools.GUI/Forms/FrmMutation.cs b/UVtools.GUI/Forms/FrmMutation.cs index 0729e88..be92c0e 100644 --- a/UVtools.GUI/Forms/FrmMutation.cs +++ b/UVtools.GUI/Forms/FrmMutation.cs @@ -8,6 +8,7 @@ using System; using System.Windows.Forms; +using UVtools.Core; namespace UVtools.GUI.Forms { @@ -49,15 +50,21 @@ namespace UVtools.GUI.Forms #endregion #region Constructors - public FrmMutation(Mutation mutation, uint defaultIterations = 1) + + public FrmMutation() { InitializeComponent(); + } + + public FrmMutation(Mutation mutation, uint defaultIterations = 1) : this() + { + Mutation = mutation; DialogResult = DialogResult.Cancel; if (defaultIterations == 0 || - mutation.Mutate == Mutation.Mutates.PyrDownUp || - mutation.Mutate == Mutation.Mutates.Solidify) + mutation.Mutate == LayerManager.Mutate.PyrDownUp || + mutation.Mutate == LayerManager.Mutate.Solidify) { lbIterationsStart.Enabled = numIterationsStart.Enabled = @@ -72,8 +79,8 @@ namespace UVtools.GUI.Forms numIterationsStart.Select(); } - if (Mutation.Mutate == Mutation.Mutates.SmoothGaussian || - Mutation.Mutate == Mutation.Mutates.SmoothMedian) + if (Mutation.Mutate == LayerManager.Mutate.SmoothGaussian || + Mutation.Mutate == LayerManager.Mutate.SmoothMedian) { lbIterationsStop.Enabled = nmIterationsEnd.Enabled = @@ -185,8 +192,8 @@ namespace UVtools.GUI.Forms return; } - if (Mutation.Mutate == Mutation.Mutates.SmoothGaussian || - Mutation.Mutate == Mutation.Mutates.SmoothMedian) + if (Mutation.Mutate == LayerManager.Mutate.SmoothGaussian || + Mutation.Mutate == LayerManager.Mutate.SmoothMedian) { if (IterationsFade) { diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs b/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs new file mode 100644 index 0000000..4742fbf --- /dev/null +++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs @@ -0,0 +1,296 @@ +using UVtools.GUI.Controls; + +namespace UVtools.GUI.Forms +{ + partial class FrmMutationOneComboBox + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationOneComboBox)); + this.lbDescription = new System.Windows.Forms.Label(); + this.lbValue = new System.Windows.Forms.Label(); + this.lbLayerRange = new System.Windows.Forms.Label(); + this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown(); + this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown(); + this.lbLayerRangeTo = new System.Windows.Forms.Label(); + this.cmLayerRange = new System.Windows.Forms.ContextMenuStrip(this.components); + this.btnLayerRangeAllLayers = new System.Windows.Forms.ToolStripMenuItem(); + this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem(); + this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem(); + this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem(); + this.btnCancel = new System.Windows.Forms.Button(); + this.btnMutate = new System.Windows.Forms.Button(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.cbValue = new System.Windows.Forms.ComboBox(); + this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton(); + this.cbMakeCopy = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit(); + this.cmLayerRange.SuspendLayout(); + this.SuspendLayout(); + // + // lbDescription + // + this.lbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.lbDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbDescription.Location = new System.Drawing.Point(13, 14); + this.lbDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbDescription.Name = "lbDescription"; + this.lbDescription.Size = new System.Drawing.Size(584, 128); + this.lbDescription.TabIndex = 0; + this.lbDescription.Text = "Description"; + // + // lbValue + // + this.lbValue.Location = new System.Drawing.Point(2, 185); + this.lbValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbValue.Name = "lbValue"; + this.lbValue.Size = new System.Drawing.Size(108, 20); + this.lbValue.TabIndex = 3; + this.lbValue.Text = "Label:"; + this.lbValue.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lbLayerRange + // + this.lbLayerRange.AutoSize = true; + this.lbLayerRange.Location = new System.Drawing.Point(13, 150); + this.lbLayerRange.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbLayerRange.Name = "lbLayerRange"; + this.lbLayerRange.Size = new System.Drawing.Size(97, 20); + this.lbLayerRange.TabIndex = 9; + this.lbLayerRange.Text = "Layer range:"; + this.toolTip.SetToolTip(this.lbLayerRange, resources.GetString("lbLayerRange.ToolTip")); + // + // nmLayerRangeStart + // + this.nmLayerRangeStart.Location = new System.Drawing.Point(118, 147); + this.nmLayerRangeStart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nmLayerRangeStart.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.nmLayerRangeStart.Name = "nmLayerRangeStart"; + this.nmLayerRangeStart.Size = new System.Drawing.Size(120, 26); + this.nmLayerRangeStart.TabIndex = 0; + // + // nmLayerRangeEnd + // + this.nmLayerRangeEnd.Location = new System.Drawing.Point(314, 147); + this.nmLayerRangeEnd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nmLayerRangeEnd.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.nmLayerRangeEnd.Name = "nmLayerRangeEnd"; + this.nmLayerRangeEnd.Size = new System.Drawing.Size(120, 26); + this.nmLayerRangeEnd.TabIndex = 1; + // + // lbLayerRangeTo + // + this.lbLayerRangeTo.AutoSize = true; + this.lbLayerRangeTo.Location = new System.Drawing.Point(275, 150); + this.lbLayerRangeTo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbLayerRangeTo.Name = "lbLayerRangeTo"; + this.lbLayerRangeTo.Size = new System.Drawing.Size(31, 20); + this.lbLayerRangeTo.TabIndex = 12; + this.lbLayerRangeTo.Text = "To:"; + // + // cmLayerRange + // + this.cmLayerRange.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.btnLayerRangeAllLayers, + this.btnLayerRangeCurrentLayer, + this.btnLayerRangeBottomLayers, + this.btnLayerRangeNormalLayers}); + this.cmLayerRange.Name = "cmLayerRange"; + this.cmLayerRange.Size = new System.Drawing.Size(226, 92); + // + // btnLayerRangeAllLayers + // + this.btnLayerRangeAllLayers.Name = "btnLayerRangeAllLayers"; + this.btnLayerRangeAllLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.A))); + this.btnLayerRangeAllLayers.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeAllLayers.Text = "&All Layers"; + this.btnLayerRangeAllLayers.Click += new System.EventHandler(this.ItemClicked); + // + // btnLayerRangeCurrentLayer + // + this.btnLayerRangeCurrentLayer.Name = "btnLayerRangeCurrentLayer"; + this.btnLayerRangeCurrentLayer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.C))); + this.btnLayerRangeCurrentLayer.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeCurrentLayer.Text = "&Current Layer"; + this.btnLayerRangeCurrentLayer.Click += new System.EventHandler(this.ItemClicked); + // + // btnLayerRangeBottomLayers + // + this.btnLayerRangeBottomLayers.Name = "btnLayerRangeBottomLayers"; + this.btnLayerRangeBottomLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.B))); + this.btnLayerRangeBottomLayers.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeBottomLayers.Text = "&Bottom Layers"; + this.btnLayerRangeBottomLayers.Click += new System.EventHandler(this.ItemClicked); + // + // btnLayerRangeNormalLayers + // + this.btnLayerRangeNormalLayers.Name = "btnLayerRangeNormalLayers"; + this.btnLayerRangeNormalLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.N))); + this.btnLayerRangeNormalLayers.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeNormalLayers.Text = "&Normal Layers"; + this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked); + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24; + this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnCancel.Location = new System.Drawing.Point(434, 230); + this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(150, 48); + this.btnCancel.TabIndex = 6; + this.btnCancel.Text = "&Cancel"; + this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.ItemClicked); + // + // btnMutate + // + this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24; + this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnMutate.Location = new System.Drawing.Point(276, 230); + this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnMutate.Name = "btnMutate"; + this.btnMutate.Size = new System.Drawing.Size(150, 48); + this.btnMutate.TabIndex = 5; + this.btnMutate.Text = "&Mutate"; + this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnMutate.UseVisualStyleBackColor = true; + this.btnMutate.Click += new System.EventHandler(this.ItemClicked); + // + // toolTip + // + this.toolTip.AutoPopDelay = 32767; + this.toolTip.InitialDelay = 500; + this.toolTip.IsBalloon = true; + this.toolTip.ReshowDelay = 100; + this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.toolTip.ToolTipTitle = "Information"; + // + // cbValue + // + this.cbValue.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbValue.FormattingEnabled = true; + this.cbValue.Location = new System.Drawing.Point(117, 181); + this.cbValue.Name = "cbValue"; + this.cbValue.Size = new System.Drawing.Size(121, 28); + this.cbValue.TabIndex = 13; + // + // btnLayerRangeSelect + // + this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146); + this.btnLayerRangeSelect.Menu = this.cmLayerRange; + this.btnLayerRangeSelect.Name = "btnLayerRangeSelect"; + this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26); + this.btnLayerRangeSelect.TabIndex = 2; + this.btnLayerRangeSelect.Text = "Select"; + this.btnLayerRangeSelect.UseVisualStyleBackColor = true; + // + // cbMakeCopy + // + this.cbMakeCopy.AutoSize = true; + this.cbMakeCopy.Location = new System.Drawing.Point(244, 183); + this.cbMakeCopy.Name = "cbMakeCopy"; + this.cbMakeCopy.Size = new System.Drawing.Size(104, 24); + this.cbMakeCopy.TabIndex = 14; + this.cbMakeCopy.Text = "Make copy"; + this.cbMakeCopy.UseVisualStyleBackColor = true; + // + // FrmMutationOneComboBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(599, 292); + this.Controls.Add(this.cbMakeCopy); + this.Controls.Add(this.cbValue); + this.Controls.Add(this.btnLayerRangeSelect); + this.Controls.Add(this.lbLayerRangeTo); + this.Controls.Add(this.nmLayerRangeEnd); + this.Controls.Add(this.nmLayerRangeStart); + this.Controls.Add(this.lbLayerRange); + this.Controls.Add(this.btnMutate); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.lbValue); + this.Controls.Add(this.lbDescription); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmMutationOneComboBox"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Form1"; + this.TopMost = true; + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit(); + this.cmLayerRange.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbDescription; + private System.Windows.Forms.Label lbValue; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Button btnMutate; + private System.Windows.Forms.Label lbLayerRange; + private System.Windows.Forms.NumericUpDown nmLayerRangeStart; + private System.Windows.Forms.NumericUpDown nmLayerRangeEnd; + private System.Windows.Forms.Label lbLayerRangeTo; + private Controls.SplitButton btnLayerRangeSelect; + private System.Windows.Forms.ContextMenuStrip cmLayerRange; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeAllLayers; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.ComboBox cbValue; + private System.Windows.Forms.CheckBox cbMakeCopy; + } +}
\ No newline at end of file diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs b/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs new file mode 100644 index 0000000..b68012f --- /dev/null +++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs @@ -0,0 +1,182 @@ +/* + * GNU AFFERO GENERAL PUBLIC LICENSE + * Version 3, 19 November 2007 + * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + */ + +using System; +using System.Windows.Forms; +using UVtools.Core; + +namespace UVtools.GUI.Forms +{ + public partial class FrmMutationOneComboBox : Form + { + #region Properties + + private Mutation Mutation { get; } + + public uint LayerRangeStart + { + get => (uint) nmLayerRangeStart.Value; + set => nmLayerRangeStart.Value = value; + } + + public uint LayerRangeEnd + { + get => (uint)Math.Min(nmLayerRangeEnd.Value, Program.SlicerFile.LayerCount-1); + set => nmLayerRangeEnd.Value = value; + } + + public int SelectedValue + { + get => cbValue.SelectedIndex; + set => cbValue.SelectedIndex = value; + } + + public bool MakeCopy + { + get => cbMakeCopy.Checked; + set => cbMakeCopy.Checked = value; + } + #endregion + + #region Constructors + public FrmMutationOneComboBox(Mutation mutation) + { + InitializeComponent(); + Mutation = mutation; + DialogResult = DialogResult.Cancel; + + Text = $"Mutate: {mutation.Mutate}"; + lbDescription.Text = Mutation.Description; + + nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1; + + switch (mutation.Mutate) + { + case LayerManager.Mutate.Flip: + lbValue.Text = "Flip Direction"; + cbValue.Items.AddRange(new object[] + { + "Horizontally", + "Vertically", + "Both" + }); + break; + } + + SelectedValue = 0; + } + #endregion + + #region Overrides + protected override void OnKeyUp(KeyEventArgs e) + { + base.OnKeyUp(e); + if (e.KeyCode == Keys.Enter) + { + btnMutate.PerformClick(); + e.Handled = true; + return; + } + + if ((ModifierKeys & Keys.Shift) == Keys.Shift && (ModifierKeys & Keys.Control) == Keys.Control) + { + if (e.KeyCode == Keys.A) + { + btnLayerRangeAllLayers.PerformClick(); + e.Handled = true; + return; + } + + if (e.KeyCode == Keys.C) + { + btnLayerRangeCurrentLayer.PerformClick(); + e.Handled = true; + return; + } + + if (e.KeyCode == Keys.B) + { + btnLayerRangeBottomLayers.PerformClick(); + e.Handled = true; + return; + } + + if (e.KeyCode == Keys.N) + { + btnLayerRangeNormalLayers.PerformClick(); + e.Handled = true; + return; + } + } + } + + #endregion + + #region Events + private void ItemClicked(object sender, EventArgs e) + { + if (ReferenceEquals(sender, btnLayerRangeAllLayers)) + { + nmLayerRangeStart.Value = 0; + nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1; + return; + } + + if (ReferenceEquals(sender, btnLayerRangeCurrentLayer)) + { + nmLayerRangeStart.Value = Program.FrmMain.ActualLayer; + nmLayerRangeEnd.Value = Program.FrmMain.ActualLayer; + return; + } + + if (ReferenceEquals(sender, btnLayerRangeBottomLayers)) + { + nmLayerRangeStart.Value = 0; + nmLayerRangeEnd.Value = Program.SlicerFile.InitialLayerCount-1; + return; + } + + if (ReferenceEquals(sender, btnLayerRangeNormalLayers)) + { + nmLayerRangeStart.Value = Program.SlicerFile.InitialLayerCount - 1; + nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount - 1; + return; + } + + if (ReferenceEquals(sender, btnMutate)) + { + if (!btnMutate.Enabled) return; + if (LayerRangeStart > LayerRangeEnd) + { + MessageBox.Show("Layer range start can't be higher than layer end.\nPlease fix and try again.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error); + nmLayerRangeStart.Select(); + return; + } + + if (MessageBox.Show($"Are you sure you want to {Mutation.Mutate}?", Text, MessageBoxButtons.YesNo, + MessageBoxIcon.Question) == DialogResult.Yes) + { + DialogResult = DialogResult.OK; + Close(); + } + + return; + } + + if (ReferenceEquals(sender, btnCancel)) + { + DialogResult = DialogResult.Cancel; + return; + } + } + + #endregion + + + } +} diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx b/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx new file mode 100644 index 0000000..ceac7ae --- /dev/null +++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>148, 17</value> + </metadata> + <data name="lbLayerRange.ToolTip" xml:space="preserve"> + <value>Selects the layers range within start layer and end layer where mutator will operate. +Select same layer start as end to operate only within that layer. +Note: "Layer Start" start can't be higher than "Layer End".</value> + </data> + <metadata name="cmLayerRange.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root>
\ No newline at end of file diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs new file mode 100644 index 0000000..8e83792 --- /dev/null +++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs @@ -0,0 +1,289 @@ +using UVtools.GUI.Controls; + +namespace UVtools.GUI.Forms +{ + partial class FrmMutationOneNumericalInput + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationOneNumericalInput)); + this.lbDescription = new System.Windows.Forms.Label(); + this.lbValue = new System.Windows.Forms.Label(); + this.lbLayerRange = new System.Windows.Forms.Label(); + this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown(); + this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown(); + this.lbLayerRangeTo = new System.Windows.Forms.Label(); + this.cmLayerRange = new System.Windows.Forms.ContextMenuStrip(this.components); + this.btnLayerRangeAllLayers = new System.Windows.Forms.ToolStripMenuItem(); + this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem(); + this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem(); + this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem(); + this.btnCancel = new System.Windows.Forms.Button(); + this.btnMutate = new System.Windows.Forms.Button(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.nmValue = new System.Windows.Forms.NumericUpDown(); + this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton(); + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit(); + this.cmLayerRange.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmValue)).BeginInit(); + this.SuspendLayout(); + // + // lbDescription + // + this.lbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.lbDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbDescription.Location = new System.Drawing.Point(13, 14); + this.lbDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbDescription.Name = "lbDescription"; + this.lbDescription.Size = new System.Drawing.Size(584, 128); + this.lbDescription.TabIndex = 0; + this.lbDescription.Text = "Description"; + // + // lbValue + // + this.lbValue.Location = new System.Drawing.Point(13, 185); + this.lbValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbValue.Name = "lbValue"; + this.lbValue.Size = new System.Drawing.Size(293, 20); + this.lbValue.TabIndex = 3; + this.lbValue.Text = "Label:"; + this.lbValue.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // lbLayerRange + // + this.lbLayerRange.AutoSize = true; + this.lbLayerRange.Location = new System.Drawing.Point(13, 150); + this.lbLayerRange.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbLayerRange.Name = "lbLayerRange"; + this.lbLayerRange.Size = new System.Drawing.Size(97, 20); + this.lbLayerRange.TabIndex = 9; + this.lbLayerRange.Text = "Layer range:"; + this.toolTip.SetToolTip(this.lbLayerRange, resources.GetString("lbLayerRange.ToolTip")); + // + // nmLayerRangeStart + // + this.nmLayerRangeStart.Location = new System.Drawing.Point(118, 147); + this.nmLayerRangeStart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nmLayerRangeStart.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.nmLayerRangeStart.Name = "nmLayerRangeStart"; + this.nmLayerRangeStart.Size = new System.Drawing.Size(120, 26); + this.nmLayerRangeStart.TabIndex = 0; + // + // nmLayerRangeEnd + // + this.nmLayerRangeEnd.Location = new System.Drawing.Point(314, 147); + this.nmLayerRangeEnd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nmLayerRangeEnd.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.nmLayerRangeEnd.Name = "nmLayerRangeEnd"; + this.nmLayerRangeEnd.Size = new System.Drawing.Size(120, 26); + this.nmLayerRangeEnd.TabIndex = 1; + // + // lbLayerRangeTo + // + this.lbLayerRangeTo.AutoSize = true; + this.lbLayerRangeTo.Location = new System.Drawing.Point(275, 150); + this.lbLayerRangeTo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lbLayerRangeTo.Name = "lbLayerRangeTo"; + this.lbLayerRangeTo.Size = new System.Drawing.Size(31, 20); + this.lbLayerRangeTo.TabIndex = 12; + this.lbLayerRangeTo.Text = "To:"; + // + // cmLayerRange + // + this.cmLayerRange.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.btnLayerRangeAllLayers, + this.btnLayerRangeCurrentLayer, + this.btnLayerRangeBottomLayers, + this.btnLayerRangeNormalLayers}); + this.cmLayerRange.Name = "cmLayerRange"; + this.cmLayerRange.Size = new System.Drawing.Size(226, 92); + // + // btnLayerRangeAllLayers + // + this.btnLayerRangeAllLayers.Name = "btnLayerRangeAllLayers"; + this.btnLayerRangeAllLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.A))); + this.btnLayerRangeAllLayers.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeAllLayers.Text = "&All Layers"; + this.btnLayerRangeAllLayers.Click += new System.EventHandler(this.ItemClicked); + // + // btnLayerRangeCurrentLayer + // + this.btnLayerRangeCurrentLayer.Name = "btnLayerRangeCurrentLayer"; + this.btnLayerRangeCurrentLayer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.C))); + this.btnLayerRangeCurrentLayer.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeCurrentLayer.Text = "&Current Layer"; + this.btnLayerRangeCurrentLayer.Click += new System.EventHandler(this.ItemClicked); + // + // btnLayerRangeBottomLayers + // + this.btnLayerRangeBottomLayers.Name = "btnLayerRangeBottomLayers"; + this.btnLayerRangeBottomLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.B))); + this.btnLayerRangeBottomLayers.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeBottomLayers.Text = "&Bottom Layers"; + this.btnLayerRangeBottomLayers.Click += new System.EventHandler(this.ItemClicked); + // + // btnLayerRangeNormalLayers + // + this.btnLayerRangeNormalLayers.Name = "btnLayerRangeNormalLayers"; + this.btnLayerRangeNormalLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.N))); + this.btnLayerRangeNormalLayers.Size = new System.Drawing.Size(225, 22); + this.btnLayerRangeNormalLayers.Text = "&Normal Layers"; + this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked); + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24; + this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnCancel.Location = new System.Drawing.Point(434, 230); + this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(150, 48); + this.btnCancel.TabIndex = 6; + this.btnCancel.Text = "&Cancel"; + this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.ItemClicked); + // + // btnMutate + // + this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24; + this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnMutate.Location = new System.Drawing.Point(276, 230); + this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnMutate.Name = "btnMutate"; + this.btnMutate.Size = new System.Drawing.Size(150, 48); + this.btnMutate.TabIndex = 5; + this.btnMutate.Text = "&Mutate"; + this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnMutate.UseVisualStyleBackColor = true; + this.btnMutate.Click += new System.EventHandler(this.ItemClicked); + // + // toolTip + // + this.toolTip.AutoPopDelay = 32767; + this.toolTip.InitialDelay = 500; + this.toolTip.IsBalloon = true; + this.toolTip.ReshowDelay = 100; + this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.toolTip.ToolTipTitle = "Information"; + // + // nmValue + // + this.nmValue.Location = new System.Drawing.Point(314, 183); + this.nmValue.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nmValue.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.nmValue.Name = "nmValue"; + this.nmValue.Size = new System.Drawing.Size(120, 26); + this.nmValue.TabIndex = 13; + // + // btnLayerRangeSelect + // + this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146); + this.btnLayerRangeSelect.Menu = this.cmLayerRange; + this.btnLayerRangeSelect.Name = "btnLayerRangeSelect"; + this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26); + this.btnLayerRangeSelect.TabIndex = 2; + this.btnLayerRangeSelect.Text = "Select"; + this.btnLayerRangeSelect.UseVisualStyleBackColor = true; + // + // FrmMutationOneNumericalInput + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(599, 292); + this.Controls.Add(this.nmValue); + this.Controls.Add(this.btnLayerRangeSelect); + this.Controls.Add(this.lbLayerRangeTo); + this.Controls.Add(this.nmLayerRangeEnd); + this.Controls.Add(this.nmLayerRangeStart); + this.Controls.Add(this.lbLayerRange); + this.Controls.Add(this.btnMutate); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.lbValue); + this.Controls.Add(this.lbDescription); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.KeyPreview = true; + this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmMutationOneNumericalInput"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "Form1"; + this.TopMost = true; + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit(); + this.cmLayerRange.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.nmValue)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lbDescription; + private System.Windows.Forms.Label lbValue; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Button btnMutate; + private System.Windows.Forms.Label lbLayerRange; + private System.Windows.Forms.NumericUpDown nmLayerRangeStart; + private System.Windows.Forms.NumericUpDown nmLayerRangeEnd; + private System.Windows.Forms.Label lbLayerRangeTo; + private Controls.SplitButton btnLayerRangeSelect; + private System.Windows.Forms.ContextMenuStrip cmLayerRange; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeAllLayers; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers; + private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers; + private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.NumericUpDown nmValue; + } +}
\ No newline at end of file diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs new file mode 100644 index 0000000..a44bc21 --- /dev/null +++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs @@ -0,0 +1,173 @@ +/* + * GNU AFFERO GENERAL PUBLIC LICENSE + * Version 3, 19 November 2007 + * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + */ + +using System; +using System.Windows.Forms; +using UVtools.Core; + +namespace UVtools.GUI.Forms +{ + public partial class FrmMutationOneNumericalInput : Form + { + #region Properties + + private Mutation Mutation { get; } + + public uint LayerRangeStart + { + get => (uint) nmLayerRangeStart.Value; + set => nmLayerRangeStart.Value = value; + } + + public uint LayerRangeEnd + { + get => (uint)Math.Min(nmLayerRangeEnd.Value, Program.SlicerFile.LayerCount-1); + set => nmLayerRangeEnd.Value = value; + } + + public decimal Value + { + get => nmValue.Value; + set => nmValue.Value = value; + } + #endregion + + #region Constructors + public FrmMutationOneNumericalInput(Mutation mutation) + { + InitializeComponent(); + Mutation = mutation; + DialogResult = DialogResult.Cancel; + + Text = $"Mutate: {mutation.Mutate}"; + lbDescription.Text = Mutation.Description; + + nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1; + + switch (mutation.Mutate) + { + case LayerManager.Mutate.Rotate: + lbValue.Text = "Rotation degrees:"; + nmValue.Maximum = 360; + nmValue.Minimum = -360; + nmValue.DecimalPlaces = 2; + + Value = 90; + break; + } + } + #endregion + + #region Overrides + protected override void OnKeyUp(KeyEventArgs e) + { + base.OnKeyUp(e); + if (e.KeyCode == Keys.Enter) + { + btnMutate.PerformClick(); + e.Handled = true; + return; + } + + if ((ModifierKeys & Keys.Shift) == Keys.Shift && (ModifierKeys & Keys.Control) == Keys.Control) + { + if (e.KeyCode == Keys.A) + { + btnLayerRangeAllLayers.PerformClick(); + e.Handled = true; + return; + } + + if (e.KeyCode == Keys.C) + { + btnLayerRangeCurrentLayer.PerformClick(); + e.Handled = true; + return; + } + + if (e.KeyCode == Keys.B) + { + btnLayerRangeBottomLayers.PerformClick(); + e.Handled = true; + return; + } + + if (e.KeyCode == Keys.N) + { + btnLayerRangeNormalLayers.PerformClick(); + e.Handled = true; + return; + } + } + } + + #endregion + + #region Events + private void ItemClicked(object sender, EventArgs e) + { + if (ReferenceEquals(sender, btnLayerRangeAllLayers)) + { + nmLayerRangeStart.Value = 0; + nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1; + return; + } + + if (ReferenceEquals(sender, btnLayerRangeCurrentLayer)) + { + nmLayerRangeStart.Value = Program.FrmMain.ActualLayer; + nmLayerRangeEnd.Value = Program.FrmMain.ActualLayer; + return; + } + + if (ReferenceEquals(sender, btnLayerRangeBottomLayers)) + { + nmLayerRangeStart.Value = 0; + nmLayerRangeEnd.Value = Program.SlicerFile.InitialLayerCount-1; + return; + } + + if (ReferenceEquals(sender, btnLayerRangeNormalLayers)) + { + nmLayerRangeStart.Value = Program.SlicerFile.InitialLayerCount - 1; + nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount - 1; + return; + } + + if (ReferenceEquals(sender, btnMutate)) + { + if (!btnMutate.Enabled) return; + if (LayerRangeStart > LayerRangeEnd) + { + MessageBox.Show("Layer range start can't be higher than layer end.\nPlease fix and try again.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error); + nmLayerRangeStart.Select(); + return; + } + + if (MessageBox.Show($"Are you sure you want to {Mutation.Mutate}?", Text, MessageBoxButtons.YesNo, + MessageBoxIcon.Question) == DialogResult.Yes) + { + DialogResult = DialogResult.OK; + Close(); + } + + return; + } + + if (ReferenceEquals(sender, btnCancel)) + { + DialogResult = DialogResult.Cancel; + return; + } + } + + #endregion + + + } +} diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx new file mode 100644 index 0000000..ceac7ae --- /dev/null +++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>148, 17</value> + </metadata> + <data name="lbLayerRange.ToolTip" xml:space="preserve"> + <value>Selects the layers range within start layer and end layer where mutator will operate. +Select same layer start as end to operate only within that layer. +Note: "Layer Start" start can't be higher than "Layer End".</value> + </data> + <metadata name="cmLayerRange.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> +</root>
\ No newline at end of file diff --git a/UVtools.GUI/Forms/FrmMutationResize.Designer.cs b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs index 97af6c4..8eb1ef1 100644 --- a/UVtools.GUI/Forms/FrmMutationResize.Designer.cs +++ b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs @@ -34,7 +34,6 @@ namespace UVtools.GUI.Forms System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationResize)); this.lbDescription = new System.Windows.Forms.Label(); this.lbX = new System.Windows.Forms.Label(); - this.nmX = new System.Windows.Forms.NumericUpDown(); this.lbLayerRange = new System.Windows.Forms.Label(); this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown(); this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown(); @@ -44,20 +43,21 @@ namespace UVtools.GUI.Forms this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem(); this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem(); this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton(); this.btnCancel = new System.Windows.Forms.Button(); this.btnMutate = new System.Windows.Forms.Button(); + this.nmX = new System.Windows.Forms.NumericUpDown(); + this.label1 = new System.Windows.Forms.Label(); this.lbY = new System.Windows.Forms.Label(); this.nmY = new System.Windows.Forms.NumericUpDown(); - this.cbConstrainXY = new System.Windows.Forms.CheckBox(); - this.toolTip = new System.Windows.Forms.ToolTip(this.components); - this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); - this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton(); + this.cbConstrainXY = new System.Windows.Forms.CheckBox(); this.cbFade = new System.Windows.Forms.CheckBox(); - ((System.ComponentModel.ISupportInitialize)(this.nmX)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit(); this.cmLayerRange.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmX)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.nmY)).BeginInit(); this.SuspendLayout(); // @@ -84,31 +84,6 @@ namespace UVtools.GUI.Forms this.lbX.Text = "X:"; this.toolTip.SetToolTip(this.lbX, resources.GetString("lbX.ToolTip")); // - // nmX - // - this.nmX.DecimalPlaces = 2; - this.nmX.Location = new System.Drawing.Point(118, 187); - this.nmX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); - this.nmX.Maximum = new decimal(new int[] { - 1000, - 0, - 0, - 0}); - this.nmX.Minimum = new decimal(new int[] { - 1, - 0, - 0, - 0}); - this.nmX.Name = "nmX"; - this.nmX.Size = new System.Drawing.Size(120, 26); - this.nmX.TabIndex = 3; - this.nmX.Value = new decimal(new int[] { - 100, - 0, - 0, - 0}); - this.nmX.ValueChanged += new System.EventHandler(this.EventValueChanged); - // // lbLayerRange // this.lbLayerRange.AutoSize = true; @@ -202,6 +177,25 @@ namespace UVtools.GUI.Forms this.btnLayerRangeNormalLayers.Text = "&Normal Layers"; this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked); // + // toolTip + // + this.toolTip.AutoPopDelay = 32767; + this.toolTip.InitialDelay = 500; + this.toolTip.IsBalloon = true; + this.toolTip.ReshowDelay = 100; + this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.toolTip.ToolTipTitle = "Information"; + // + // btnLayerRangeSelect + // + this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146); + this.btnLayerRangeSelect.Menu = this.cmLayerRange; + this.btnLayerRangeSelect.Name = "btnLayerRangeSelect"; + this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26); + this.btnLayerRangeSelect.TabIndex = 2; + this.btnLayerRangeSelect.Text = "Select"; + this.btnLayerRangeSelect.UseVisualStyleBackColor = true; + // // btnCancel // this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -233,6 +227,42 @@ namespace UVtools.GUI.Forms this.btnMutate.UseVisualStyleBackColor = true; this.btnMutate.Click += new System.EventHandler(this.ItemClicked); // + // nmX + // + this.nmX.DecimalPlaces = 2; + this.nmX.Location = new System.Drawing.Point(118, 187); + this.nmX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.nmX.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.nmX.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmX.Name = "nmX"; + this.nmX.Size = new System.Drawing.Size(120, 26); + this.nmX.TabIndex = 3; + this.nmX.Value = new decimal(new int[] { + 100, + 0, + 0, + 0}); + this.nmX.ValueChanged += new System.EventHandler(this.EventValueChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(246, 190); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(23, 20); + this.label1.TabIndex = 16; + this.label1.Text = "%"; + this.toolTip.SetToolTip(this.label1, resources.GetString("label1.ToolTip")); + // // lbY // this.lbY.AutoSize = true; @@ -269,38 +299,6 @@ namespace UVtools.GUI.Forms 0, 0}); // - // cbConstrainXY - // - this.cbConstrainXY.AutoSize = true; - this.cbConstrainXY.Checked = true; - this.cbConstrainXY.CheckState = System.Windows.Forms.CheckState.Checked; - this.cbConstrainXY.Location = new System.Drawing.Point(470, 188); - this.cbConstrainXY.Name = "cbConstrainXY"; - this.cbConstrainXY.Size = new System.Drawing.Size(126, 24); - this.cbConstrainXY.TabIndex = 15; - this.cbConstrainXY.Text = "Constrain X/Y"; - this.cbConstrainXY.CheckedChanged += new System.EventHandler(this.EventCheckedChanged); - // - // toolTip - // - this.toolTip.AutoPopDelay = 32767; - this.toolTip.InitialDelay = 500; - this.toolTip.IsBalloon = true; - this.toolTip.ReshowDelay = 100; - this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; - this.toolTip.ToolTipTitle = "Information"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(246, 190); - this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(23, 20); - this.label1.TabIndex = 16; - this.label1.Text = "%"; - this.toolTip.SetToolTip(this.label1, resources.GetString("label1.ToolTip")); - // // label2 // this.label2.AutoSize = true; @@ -312,15 +310,17 @@ namespace UVtools.GUI.Forms this.label2.Text = "%"; this.toolTip.SetToolTip(this.label2, resources.GetString("label2.ToolTip")); // - // btnLayerRangeSelect + // cbConstrainXY // - this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146); - this.btnLayerRangeSelect.Menu = this.cmLayerRange; - this.btnLayerRangeSelect.Name = "btnLayerRangeSelect"; - this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26); - this.btnLayerRangeSelect.TabIndex = 2; - this.btnLayerRangeSelect.Text = "Select"; - this.btnLayerRangeSelect.UseVisualStyleBackColor = true; + this.cbConstrainXY.AutoSize = true; + this.cbConstrainXY.Checked = true; + this.cbConstrainXY.CheckState = System.Windows.Forms.CheckState.Checked; + this.cbConstrainXY.Location = new System.Drawing.Point(470, 188); + this.cbConstrainXY.Name = "cbConstrainXY"; + this.cbConstrainXY.Size = new System.Drawing.Size(126, 24); + this.cbConstrainXY.TabIndex = 15; + this.cbConstrainXY.Text = "Constrain X/Y"; + this.cbConstrainXY.CheckedChanged += new System.EventHandler(this.EventCheckedChanged); // // cbFade // @@ -364,10 +364,10 @@ namespace UVtools.GUI.Forms this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.Text = "Form1"; this.TopMost = true; - ((System.ComponentModel.ISupportInitialize)(this.nmX)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit(); this.cmLayerRange.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.nmX)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.nmY)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -378,7 +378,6 @@ namespace UVtools.GUI.Forms private System.Windows.Forms.Label lbDescription; private System.Windows.Forms.Label lbX; - private System.Windows.Forms.NumericUpDown nmX; private System.Windows.Forms.Button btnCancel; private System.Windows.Forms.Button btnMutate; private System.Windows.Forms.Label lbLayerRange; @@ -391,12 +390,13 @@ namespace UVtools.GUI.Forms private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer; private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers; private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers; - private System.Windows.Forms.Label lbY; - private System.Windows.Forms.NumericUpDown nmY; - private System.Windows.Forms.CheckBox cbConstrainXY; private System.Windows.Forms.ToolTip toolTip; + private System.Windows.Forms.NumericUpDown nmX; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lbY; + private System.Windows.Forms.NumericUpDown nmY; private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox cbConstrainXY; private System.Windows.Forms.CheckBox cbFade; } }
\ No newline at end of file diff --git a/UVtools.GUI/Forms/FrmSettings.Designer.cs b/UVtools.GUI/Forms/FrmSettings.Designer.cs new file mode 100644 index 0000000..9456992 --- /dev/null +++ b/UVtools.GUI/Forms/FrmSettings.Designer.cs @@ -0,0 +1,1112 @@ +namespace UVtools.GUI.Forms +{ + partial class FrmSettings + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSettings)); + this.label1 = new System.Windows.Forms.Label(); + this.btnPreviousNextLayerColor = new System.Windows.Forms.Button(); + this.colorDialog = new System.Windows.Forms.ColorDialog(); + this.btnPreviousLayerColor = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.btnNextLayerColor = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.btnTouchingBoundsColor = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.btnResinTrapColor = new System.Windows.Forms.Button(); + this.btnIslandColor = new System.Windows.Forms.Button(); + this.btnSave = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.groupGeneral = new System.Windows.Forms.GroupBox(); + this.cbCheckForUpdatesOnStartup = new System.Windows.Forms.CheckBox(); + this.cbStartMaximized = new System.Windows.Forms.CheckBox(); + this.groupLayerPreview = new System.Windows.Forms.GroupBox(); + this.cbZoomToFitPrintVolumeBounds = new System.Windows.Forms.CheckBox(); + this.cbOutlineHollowAreas = new System.Windows.Forms.CheckBox(); + this.label18 = new System.Windows.Forms.Label(); + this.nmOutlineHollowAreasLineThickness = new System.Windows.Forms.NumericUpDown(); + this.label19 = new System.Windows.Forms.Label(); + this.btnOutlineHollowAreasColor = new System.Windows.Forms.Button(); + this.cbOutlineLayerBounds = new System.Windows.Forms.CheckBox(); + this.label16 = new System.Windows.Forms.Label(); + this.nmOutlineLayerBoundsLineThickness = new System.Windows.Forms.NumericUpDown(); + this.label17 = new System.Windows.Forms.Label(); + this.btnOutlineLayerBoundsColor = new System.Windows.Forms.Button(); + this.cbOutlinePrintVolumeBounds = new System.Windows.Forms.CheckBox(); + this.label15 = new System.Windows.Forms.Label(); + this.nmOutlinePrintVolumeBoundsLineThickness = new System.Windows.Forms.NumericUpDown(); + this.label14 = new System.Windows.Forms.Label(); + this.btnOutlinePrintVolumeBoundsColor = new System.Windows.Forms.Button(); + this.cbLayerZoomToFit = new System.Windows.Forms.CheckBox(); + this.cbLayerDifferenceDefault = new System.Windows.Forms.CheckBox(); + this.cbLayerAutoRotateBestView = new System.Windows.Forms.CheckBox(); + this.cbComputeIssuesOnLoad = new System.Windows.Forms.CheckBox(); + this.btnReset = new System.Windows.Forms.Button(); + this.cbComputeIslands = new System.Windows.Forms.CheckBox(); + this.cbComputeResinTraps = new System.Windows.Forms.CheckBox(); + this.gbIssues = new System.Windows.Forms.GroupBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.nmResinTrapMaximumPixelBrightnessToDrain = new System.Windows.Forms.NumericUpDown(); + this.label13 = new System.Windows.Forms.Label(); + this.nmResinTrapRequiredBlackPixelsToDrain = new System.Windows.Forms.NumericUpDown(); + this.label12 = new System.Windows.Forms.Label(); + this.nmResinTrapRequiredAreaToProcessCheck = new System.Windows.Forms.NumericUpDown(); + this.label11 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label10 = new System.Windows.Forms.Label(); + this.nmIslandRequiredPixelBrightnessToSupport = new System.Windows.Forms.NumericUpDown(); + this.label9 = new System.Windows.Forms.Label(); + this.nmIslandRequiredPixelsToSupport = new System.Windows.Forms.NumericUpDown(); + this.nmIslandRequiredAreaToProcessCheck = new System.Windows.Forms.NumericUpDown(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.nmIslandRequiredPixelBrightnessToProcessCheck = new System.Windows.Forms.NumericUpDown(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.cbAutoComputeIssuesClickOnTab = new System.Windows.Forms.CheckBox(); + this.nmResinTrapBinaryThreshold = new System.Windows.Forms.NumericUpDown(); + this.label20 = new System.Windows.Forms.Label(); + this.nmIslandBinaryThreshold = new System.Windows.Forms.NumericUpDown(); + this.label21 = new System.Windows.Forms.Label(); + this.groupGeneral.SuspendLayout(); + this.groupLayerPreview.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmOutlineHollowAreasLineThickness)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmOutlineLayerBoundsLineThickness)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmOutlinePrintVolumeBoundsLineThickness)).BeginInit(); + this.gbIssues.SuspendLayout(); + this.groupBox3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapMaximumPixelBrightnessToDrain)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredBlackPixelsToDrain)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredAreaToProcessCheck)).BeginInit(); + this.groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToSupport)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelsToSupport)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredAreaToProcessCheck)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToProcessCheck)).BeginInit(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapBinaryThreshold)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandBinaryThreshold)).BeginInit(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(7, 30); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(202, 18); + this.label1.TabIndex = 0; + this.label1.Text = "Previous and next layer color:"; + // + // btnPreviousNextLayerColor + // + this.btnPreviousNextLayerColor.BackColor = System.Drawing.Color.White; + this.btnPreviousNextLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnPreviousNextLayerColor.FlatAppearance.BorderSize = 2; + this.btnPreviousNextLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnPreviousNextLayerColor.Location = new System.Drawing.Point(217, 23); + this.btnPreviousNextLayerColor.Margin = new System.Windows.Forms.Padding(4); + this.btnPreviousNextLayerColor.Name = "btnPreviousNextLayerColor"; + this.btnPreviousNextLayerColor.Size = new System.Drawing.Size(32, 32); + this.btnPreviousNextLayerColor.TabIndex = 1; + this.btnPreviousNextLayerColor.UseVisualStyleBackColor = false; + this.btnPreviousNextLayerColor.Click += new System.EventHandler(this.EventClick); + // + // colorDialog + // + this.colorDialog.AnyColor = true; + this.colorDialog.FullOpen = true; + // + // btnPreviousLayerColor + // + this.btnPreviousLayerColor.BackColor = System.Drawing.Color.White; + this.btnPreviousLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnPreviousLayerColor.FlatAppearance.BorderSize = 2; + this.btnPreviousLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnPreviousLayerColor.Location = new System.Drawing.Point(217, 63); + this.btnPreviousLayerColor.Margin = new System.Windows.Forms.Padding(4); + this.btnPreviousLayerColor.Name = "btnPreviousLayerColor"; + this.btnPreviousLayerColor.Size = new System.Drawing.Size(32, 32); + this.btnPreviousLayerColor.TabIndex = 3; + this.btnPreviousLayerColor.UseVisualStyleBackColor = false; + this.btnPreviousLayerColor.Click += new System.EventHandler(this.EventClick); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(7, 70); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(139, 18); + this.label2.TabIndex = 2; + this.label2.Text = "Previous layer color"; + // + // btnNextLayerColor + // + this.btnNextLayerColor.BackColor = System.Drawing.Color.White; + this.btnNextLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnNextLayerColor.FlatAppearance.BorderSize = 2; + this.btnNextLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnNextLayerColor.Location = new System.Drawing.Point(217, 103); + this.btnNextLayerColor.Margin = new System.Windows.Forms.Padding(4); + this.btnNextLayerColor.Name = "btnNextLayerColor"; + this.btnNextLayerColor.Size = new System.Drawing.Size(32, 32); + this.btnNextLayerColor.TabIndex = 5; + this.btnNextLayerColor.UseVisualStyleBackColor = false; + this.btnNextLayerColor.Click += new System.EventHandler(this.EventClick); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(7, 110); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(111, 18); + this.label3.TabIndex = 4; + this.label3.Text = "Next layer color"; + // + // btnTouchingBoundsColor + // + this.btnTouchingBoundsColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnTouchingBoundsColor.BackColor = System.Drawing.Color.White; + this.btnTouchingBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnTouchingBoundsColor.FlatAppearance.BorderSize = 2; + this.btnTouchingBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnTouchingBoundsColor.Location = new System.Drawing.Point(566, 103); + this.btnTouchingBoundsColor.Margin = new System.Windows.Forms.Padding(4); + this.btnTouchingBoundsColor.Name = "btnTouchingBoundsColor"; + this.btnTouchingBoundsColor.Size = new System.Drawing.Size(32, 32); + this.btnTouchingBoundsColor.TabIndex = 7; + this.btnTouchingBoundsColor.UseVisualStyleBackColor = false; + this.btnTouchingBoundsColor.Click += new System.EventHandler(this.EventClick); + // + // label4 + // + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(402, 30); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(88, 18); + this.label4.TabIndex = 6; + this.label4.Text = "Island color:"; + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(402, 70); + this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(117, 18); + this.label5.TabIndex = 8; + this.label5.Text = "Resin trap color:"; + // + // label6 + // + this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(402, 110); + this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(156, 18); + this.label6.TabIndex = 9; + this.label6.Text = "Touching bound color:"; + // + // btnResinTrapColor + // + this.btnResinTrapColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnResinTrapColor.BackColor = System.Drawing.Color.White; + this.btnResinTrapColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnResinTrapColor.FlatAppearance.BorderSize = 2; + this.btnResinTrapColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnResinTrapColor.Location = new System.Drawing.Point(566, 63); + this.btnResinTrapColor.Margin = new System.Windows.Forms.Padding(4); + this.btnResinTrapColor.Name = "btnResinTrapColor"; + this.btnResinTrapColor.Size = new System.Drawing.Size(32, 32); + this.btnResinTrapColor.TabIndex = 10; + this.btnResinTrapColor.UseVisualStyleBackColor = false; + this.btnResinTrapColor.Click += new System.EventHandler(this.EventClick); + // + // btnIslandColor + // + this.btnIslandColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnIslandColor.BackColor = System.Drawing.Color.White; + this.btnIslandColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnIslandColor.FlatAppearance.BorderSize = 2; + this.btnIslandColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnIslandColor.Location = new System.Drawing.Point(566, 23); + this.btnIslandColor.Margin = new System.Windows.Forms.Padding(4); + this.btnIslandColor.Name = "btnIslandColor"; + this.btnIslandColor.Size = new System.Drawing.Size(32, 32); + this.btnIslandColor.TabIndex = 11; + this.btnIslandColor.UseVisualStyleBackColor = false; + this.btnIslandColor.Click += new System.EventHandler(this.EventClick); + // + // btnSave + // + this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnSave.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24; + this.btnSave.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnSave.Location = new System.Drawing.Point(290, 891); + this.btnSave.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(150, 48); + this.btnSave.TabIndex = 12; + this.btnSave.Text = "&Save"; + this.btnSave.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.EventClick); + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24; + this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnCancel.Location = new System.Drawing.Point(448, 891); + this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(150, 48); + this.btnCancel.TabIndex = 13; + this.btnCancel.Text = "&Cancel"; + this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnCancel.UseVisualStyleBackColor = true; + // + // groupGeneral + // + this.groupGeneral.Controls.Add(this.cbCheckForUpdatesOnStartup); + this.groupGeneral.Controls.Add(this.cbStartMaximized); + this.groupGeneral.Dock = System.Windows.Forms.DockStyle.Top; + this.groupGeneral.Location = new System.Drawing.Point(0, 0); + this.groupGeneral.Name = "groupGeneral"; + this.groupGeneral.Size = new System.Drawing.Size(611, 88); + this.groupGeneral.TabIndex = 14; + this.groupGeneral.TabStop = false; + this.groupGeneral.Text = "General"; + // + // cbCheckForUpdatesOnStartup + // + this.cbCheckForUpdatesOnStartup.AutoSize = true; + this.cbCheckForUpdatesOnStartup.Location = new System.Drawing.Point(6, 51); + this.cbCheckForUpdatesOnStartup.Name = "cbCheckForUpdatesOnStartup"; + this.cbCheckForUpdatesOnStartup.Size = new System.Drawing.Size(218, 22); + this.cbCheckForUpdatesOnStartup.TabIndex = 7; + this.cbCheckForUpdatesOnStartup.Text = "Check for updates on startup"; + this.cbCheckForUpdatesOnStartup.UseVisualStyleBackColor = true; + // + // cbStartMaximized + // + this.cbStartMaximized.AutoSize = true; + this.cbStartMaximized.Location = new System.Drawing.Point(6, 23); + this.cbStartMaximized.Name = "cbStartMaximized"; + this.cbStartMaximized.Size = new System.Drawing.Size(133, 22); + this.cbStartMaximized.TabIndex = 6; + this.cbStartMaximized.Text = "Start maximized"; + this.cbStartMaximized.UseVisualStyleBackColor = true; + // + // groupLayerPreview + // + this.groupLayerPreview.Controls.Add(this.cbZoomToFitPrintVolumeBounds); + this.groupLayerPreview.Controls.Add(this.cbOutlineHollowAreas); + this.groupLayerPreview.Controls.Add(this.label18); + this.groupLayerPreview.Controls.Add(this.nmOutlineHollowAreasLineThickness); + this.groupLayerPreview.Controls.Add(this.label19); + this.groupLayerPreview.Controls.Add(this.btnOutlineHollowAreasColor); + this.groupLayerPreview.Controls.Add(this.cbOutlineLayerBounds); + this.groupLayerPreview.Controls.Add(this.label16); + this.groupLayerPreview.Controls.Add(this.nmOutlineLayerBoundsLineThickness); + this.groupLayerPreview.Controls.Add(this.label17); + this.groupLayerPreview.Controls.Add(this.btnOutlineLayerBoundsColor); + this.groupLayerPreview.Controls.Add(this.cbOutlinePrintVolumeBounds); + this.groupLayerPreview.Controls.Add(this.label15); + this.groupLayerPreview.Controls.Add(this.nmOutlinePrintVolumeBoundsLineThickness); + this.groupLayerPreview.Controls.Add(this.label14); + this.groupLayerPreview.Controls.Add(this.btnOutlinePrintVolumeBoundsColor); + this.groupLayerPreview.Controls.Add(this.cbLayerZoomToFit); + this.groupLayerPreview.Controls.Add(this.cbLayerDifferenceDefault); + this.groupLayerPreview.Controls.Add(this.cbLayerAutoRotateBestView); + this.groupLayerPreview.Controls.Add(this.label1); + this.groupLayerPreview.Controls.Add(this.btnPreviousNextLayerColor); + this.groupLayerPreview.Controls.Add(this.label2); + this.groupLayerPreview.Controls.Add(this.btnPreviousLayerColor); + this.groupLayerPreview.Controls.Add(this.btnIslandColor); + this.groupLayerPreview.Controls.Add(this.label3); + this.groupLayerPreview.Controls.Add(this.btnResinTrapColor); + this.groupLayerPreview.Controls.Add(this.btnNextLayerColor); + this.groupLayerPreview.Controls.Add(this.label6); + this.groupLayerPreview.Controls.Add(this.label4); + this.groupLayerPreview.Controls.Add(this.label5); + this.groupLayerPreview.Controls.Add(this.btnTouchingBoundsColor); + this.groupLayerPreview.Dock = System.Windows.Forms.DockStyle.Top; + this.groupLayerPreview.Location = new System.Drawing.Point(0, 88); + this.groupLayerPreview.Name = "groupLayerPreview"; + this.groupLayerPreview.Size = new System.Drawing.Size(611, 348); + this.groupLayerPreview.TabIndex = 15; + this.groupLayerPreview.TabStop = false; + this.groupLayerPreview.Text = "Layer Preview"; + // + // cbZoomToFitPrintVolumeBounds + // + this.cbZoomToFitPrintVolumeBounds.AutoSize = true; + this.cbZoomToFitPrintVolumeBounds.Location = new System.Drawing.Point(325, 292); + this.cbZoomToFitPrintVolumeBounds.Name = "cbZoomToFitPrintVolumeBounds"; + this.cbZoomToFitPrintVolumeBounds.Size = new System.Drawing.Size(276, 22); + this.cbZoomToFitPrintVolumeBounds.TabIndex = 34; + this.cbZoomToFitPrintVolumeBounds.Text = "Zoom to print volume bounds instead "; + this.cbZoomToFitPrintVolumeBounds.UseVisualStyleBackColor = true; + // + // cbOutlineHollowAreas + // + this.cbOutlineHollowAreas.AutoSize = true; + this.cbOutlineHollowAreas.Location = new System.Drawing.Point(470, 228); + this.cbOutlineHollowAreas.Name = "cbOutlineHollowAreas"; + this.cbOutlineHollowAreas.Size = new System.Drawing.Size(131, 22); + this.cbOutlineHollowAreas.TabIndex = 33; + this.cbOutlineHollowAreas.Text = "Show by default"; + this.cbOutlineHollowAreas.UseVisualStyleBackColor = true; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(319, 230); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(150, 18); + this.label18.TabIndex = 32; + this.label18.Text = "Line thickness (-1-50)"; + // + // nmOutlineHollowAreasLineThickness + // + this.nmOutlineHollowAreasLineThickness.Location = new System.Drawing.Point(256, 227); + this.nmOutlineHollowAreasLineThickness.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nmOutlineHollowAreasLineThickness.Minimum = new decimal(new int[] { + 1, + 0, + 0, + -2147483648}); + this.nmOutlineHollowAreasLineThickness.Name = "nmOutlineHollowAreasLineThickness"; + this.nmOutlineHollowAreasLineThickness.Size = new System.Drawing.Size(57, 24); + this.nmOutlineHollowAreasLineThickness.TabIndex = 31; + this.nmOutlineHollowAreasLineThickness.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(7, 230); + this.label19.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(183, 18); + this.label19.TabIndex = 29; + this.label19.Text = "Outline Hollow areas color"; + // + // btnOutlineHollowAreasColor + // + this.btnOutlineHollowAreasColor.BackColor = System.Drawing.Color.White; + this.btnOutlineHollowAreasColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnOutlineHollowAreasColor.FlatAppearance.BorderSize = 2; + this.btnOutlineHollowAreasColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnOutlineHollowAreasColor.Location = new System.Drawing.Point(217, 223); + this.btnOutlineHollowAreasColor.Margin = new System.Windows.Forms.Padding(4); + this.btnOutlineHollowAreasColor.Name = "btnOutlineHollowAreasColor"; + this.btnOutlineHollowAreasColor.Size = new System.Drawing.Size(32, 32); + this.btnOutlineHollowAreasColor.TabIndex = 30; + this.btnOutlineHollowAreasColor.UseVisualStyleBackColor = false; + this.btnOutlineHollowAreasColor.Click += new System.EventHandler(this.EventClick); + // + // cbOutlineLayerBounds + // + this.cbOutlineLayerBounds.AutoSize = true; + this.cbOutlineLayerBounds.Location = new System.Drawing.Point(470, 188); + this.cbOutlineLayerBounds.Name = "cbOutlineLayerBounds"; + this.cbOutlineLayerBounds.Size = new System.Drawing.Size(131, 22); + this.cbOutlineLayerBounds.TabIndex = 28; + this.cbOutlineLayerBounds.Text = "Show by default"; + this.cbOutlineLayerBounds.UseVisualStyleBackColor = true; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(319, 190); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(145, 18); + this.label16.TabIndex = 27; + this.label16.Text = "Line thickness (1-50)"; + // + // nmOutlineLayerBoundsLineThickness + // + this.nmOutlineLayerBoundsLineThickness.Location = new System.Drawing.Point(256, 187); + this.nmOutlineLayerBoundsLineThickness.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nmOutlineLayerBoundsLineThickness.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmOutlineLayerBoundsLineThickness.Name = "nmOutlineLayerBoundsLineThickness"; + this.nmOutlineLayerBoundsLineThickness.Size = new System.Drawing.Size(57, 24); + this.nmOutlineLayerBoundsLineThickness.TabIndex = 26; + this.nmOutlineLayerBoundsLineThickness.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(7, 190); + this.label17.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(185, 18); + this.label17.TabIndex = 24; + this.label17.Text = "Outline Layer bounds color"; + // + // btnOutlineLayerBoundsColor + // + this.btnOutlineLayerBoundsColor.BackColor = System.Drawing.Color.White; + this.btnOutlineLayerBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnOutlineLayerBoundsColor.FlatAppearance.BorderSize = 2; + this.btnOutlineLayerBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnOutlineLayerBoundsColor.Location = new System.Drawing.Point(217, 183); + this.btnOutlineLayerBoundsColor.Margin = new System.Windows.Forms.Padding(4); + this.btnOutlineLayerBoundsColor.Name = "btnOutlineLayerBoundsColor"; + this.btnOutlineLayerBoundsColor.Size = new System.Drawing.Size(32, 32); + this.btnOutlineLayerBoundsColor.TabIndex = 25; + this.btnOutlineLayerBoundsColor.UseVisualStyleBackColor = false; + this.btnOutlineLayerBoundsColor.Click += new System.EventHandler(this.EventClick); + // + // cbOutlinePrintVolumeBounds + // + this.cbOutlinePrintVolumeBounds.AutoSize = true; + this.cbOutlinePrintVolumeBounds.Location = new System.Drawing.Point(470, 148); + this.cbOutlinePrintVolumeBounds.Name = "cbOutlinePrintVolumeBounds"; + this.cbOutlinePrintVolumeBounds.Size = new System.Drawing.Size(131, 22); + this.cbOutlinePrintVolumeBounds.TabIndex = 23; + this.cbOutlinePrintVolumeBounds.Text = "Show by default"; + this.cbOutlinePrintVolumeBounds.UseVisualStyleBackColor = true; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(319, 150); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(145, 18); + this.label15.TabIndex = 22; + this.label15.Text = "Line thickness (1-50)"; + // + // nmOutlinePrintVolumeBoundsLineThickness + // + this.nmOutlinePrintVolumeBoundsLineThickness.Location = new System.Drawing.Point(256, 147); + this.nmOutlinePrintVolumeBoundsLineThickness.Maximum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nmOutlinePrintVolumeBoundsLineThickness.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmOutlinePrintVolumeBoundsLineThickness.Name = "nmOutlinePrintVolumeBoundsLineThickness"; + this.nmOutlinePrintVolumeBoundsLineThickness.Size = new System.Drawing.Size(57, 24); + this.nmOutlinePrintVolumeBoundsLineThickness.TabIndex = 19; + this.nmOutlinePrintVolumeBoundsLineThickness.Value = new decimal(new int[] { + 2, + 0, + 0, + 0}); + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(7, 150); + this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(181, 18); + this.label14.TabIndex = 16; + this.label14.Text = "Print volume bounds color"; + // + // btnOutlinePrintVolumeBoundsColor + // + this.btnOutlinePrintVolumeBoundsColor.BackColor = System.Drawing.Color.White; + this.btnOutlinePrintVolumeBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black; + this.btnOutlinePrintVolumeBoundsColor.FlatAppearance.BorderSize = 2; + this.btnOutlinePrintVolumeBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnOutlinePrintVolumeBoundsColor.Location = new System.Drawing.Point(217, 143); + this.btnOutlinePrintVolumeBoundsColor.Margin = new System.Windows.Forms.Padding(4); + this.btnOutlinePrintVolumeBoundsColor.Name = "btnOutlinePrintVolumeBoundsColor"; + this.btnOutlinePrintVolumeBoundsColor.Size = new System.Drawing.Size(32, 32); + this.btnOutlinePrintVolumeBoundsColor.TabIndex = 17; + this.btnOutlinePrintVolumeBoundsColor.UseVisualStyleBackColor = false; + this.btnOutlinePrintVolumeBoundsColor.Click += new System.EventHandler(this.EventClick); + // + // cbLayerZoomToFit + // + this.cbLayerZoomToFit.AutoSize = true; + this.cbLayerZoomToFit.Location = new System.Drawing.Point(9, 292); + this.cbLayerZoomToFit.Name = "cbLayerZoomToFit"; + this.cbLayerZoomToFit.Size = new System.Drawing.Size(313, 22); + this.cbLayerZoomToFit.TabIndex = 15; + this.cbLayerZoomToFit.Text = "Zoom to fit layer on load and window resize"; + this.cbLayerZoomToFit.UseVisualStyleBackColor = true; + // + // cbLayerDifferenceDefault + // + this.cbLayerDifferenceDefault.AutoSize = true; + this.cbLayerDifferenceDefault.Location = new System.Drawing.Point(9, 320); + this.cbLayerDifferenceDefault.Name = "cbLayerDifferenceDefault"; + this.cbLayerDifferenceDefault.Size = new System.Drawing.Size(234, 22); + this.cbLayerDifferenceDefault.TabIndex = 13; + this.cbLayerDifferenceDefault.Text = "Show layer difference by default"; + this.cbLayerDifferenceDefault.UseVisualStyleBackColor = true; + // + // cbLayerAutoRotateBestView + // + this.cbLayerAutoRotateBestView.AutoSize = true; + this.cbLayerAutoRotateBestView.Location = new System.Drawing.Point(9, 264); + this.cbLayerAutoRotateBestView.Name = "cbLayerAutoRotateBestView"; + this.cbLayerAutoRotateBestView.Size = new System.Drawing.Size(327, 22); + this.cbLayerAutoRotateBestView.TabIndex = 12; + this.cbLayerAutoRotateBestView.Text = "Auto rotate layer to best fit window on file load"; + this.cbLayerAutoRotateBestView.UseVisualStyleBackColor = true; + // + // cbComputeIssuesOnLoad + // + this.cbComputeIssuesOnLoad.AutoSize = true; + this.cbComputeIssuesOnLoad.Location = new System.Drawing.Point(6, 23); + this.cbComputeIssuesOnLoad.Name = "cbComputeIssuesOnLoad"; + this.cbComputeIssuesOnLoad.Size = new System.Drawing.Size(210, 22); + this.cbComputeIssuesOnLoad.TabIndex = 14; + this.cbComputeIssuesOnLoad.Text = "Compute issues on file load"; + this.cbComputeIssuesOnLoad.UseVisualStyleBackColor = true; + // + // btnReset + // + this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnReset.Image = global::UVtools.GUI.Properties.Resources.Rotate_16x16; + this.btnReset.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.btnReset.Location = new System.Drawing.Point(13, 891); + this.btnReset.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5); + this.btnReset.Name = "btnReset"; + this.btnReset.Size = new System.Drawing.Size(158, 48); + this.btnReset.TabIndex = 16; + this.btnReset.Text = "&Reset to defaults"; + this.btnReset.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.btnReset.UseVisualStyleBackColor = true; + this.btnReset.Click += new System.EventHandler(this.EventClick); + // + // cbComputeIslands + // + this.cbComputeIslands.AutoSize = true; + this.cbComputeIslands.Location = new System.Drawing.Point(244, 23); + this.cbComputeIslands.Name = "cbComputeIslands"; + this.cbComputeIslands.Size = new System.Drawing.Size(138, 22); + this.cbComputeIslands.TabIndex = 16; + this.cbComputeIslands.Text = "Compute Islands"; + this.cbComputeIslands.UseVisualStyleBackColor = true; + // + // cbComputeResinTraps + // + this.cbComputeResinTraps.AutoSize = true; + this.cbComputeResinTraps.Location = new System.Drawing.Point(411, 23); + this.cbComputeResinTraps.Name = "cbComputeResinTraps"; + this.cbComputeResinTraps.Size = new System.Drawing.Size(172, 22); + this.cbComputeResinTraps.TabIndex = 17; + this.cbComputeResinTraps.Text = "Compute Resin Traps"; + this.cbComputeResinTraps.UseVisualStyleBackColor = true; + // + // gbIssues + // + this.gbIssues.Controls.Add(this.groupBox3); + this.gbIssues.Controls.Add(this.groupBox2); + this.gbIssues.Controls.Add(this.groupBox1); + this.gbIssues.Dock = System.Windows.Forms.DockStyle.Top; + this.gbIssues.Location = new System.Drawing.Point(0, 436); + this.gbIssues.Name = "gbIssues"; + this.gbIssues.Size = new System.Drawing.Size(611, 442); + this.gbIssues.TabIndex = 17; + this.gbIssues.TabStop = false; + this.gbIssues.Text = "Issues"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.nmResinTrapBinaryThreshold); + this.groupBox3.Controls.Add(this.label20); + this.groupBox3.Controls.Add(this.nmResinTrapMaximumPixelBrightnessToDrain); + this.groupBox3.Controls.Add(this.label13); + this.groupBox3.Controls.Add(this.nmResinTrapRequiredBlackPixelsToDrain); + this.groupBox3.Controls.Add(this.label12); + this.groupBox3.Controls.Add(this.nmResinTrapRequiredAreaToProcessCheck); + this.groupBox3.Controls.Add(this.label11); + this.groupBox3.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox3.Location = new System.Drawing.Point(3, 279); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(605, 152); + this.groupBox3.TabIndex = 24; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Resin Traps"; + // + // nmResinTrapMaximumPixelBrightnessToDrain + // + this.nmResinTrapMaximumPixelBrightnessToDrain.Location = new System.Drawing.Point(10, 113); + this.nmResinTrapMaximumPixelBrightnessToDrain.Maximum = new decimal(new int[] { + 150, + 0, + 0, + 0}); + this.nmResinTrapMaximumPixelBrightnessToDrain.Name = "nmResinTrapMaximumPixelBrightnessToDrain"; + this.nmResinTrapMaximumPixelBrightnessToDrain.Size = new System.Drawing.Size(57, 24); + this.nmResinTrapMaximumPixelBrightnessToDrain.TabIndex = 24; + this.nmResinTrapMaximumPixelBrightnessToDrain.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(73, 116); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(347, 18); + this.label13.TabIndex = 25; + this.label13.Text = "Maximum pixel brightness to be a drain pixel (0-150)"; + // + // nmResinTrapRequiredBlackPixelsToDrain + // + this.nmResinTrapRequiredBlackPixelsToDrain.Location = new System.Drawing.Point(10, 83); + this.nmResinTrapRequiredBlackPixelsToDrain.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.nmResinTrapRequiredBlackPixelsToDrain.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmResinTrapRequiredBlackPixelsToDrain.Name = "nmResinTrapRequiredBlackPixelsToDrain"; + this.nmResinTrapRequiredBlackPixelsToDrain.Size = new System.Drawing.Size(57, 24); + this.nmResinTrapRequiredBlackPixelsToDrain.TabIndex = 22; + this.nmResinTrapRequiredBlackPixelsToDrain.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(73, 86); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(441, 18); + this.label12.TabIndex = 23; + this.label12.Text = "Number of drain pixels required to promote area as a drain (1-255)"; + // + // nmResinTrapRequiredAreaToProcessCheck + // + this.nmResinTrapRequiredAreaToProcessCheck.Location = new System.Drawing.Point(10, 53); + this.nmResinTrapRequiredAreaToProcessCheck.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.nmResinTrapRequiredAreaToProcessCheck.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmResinTrapRequiredAreaToProcessCheck.Name = "nmResinTrapRequiredAreaToProcessCheck"; + this.nmResinTrapRequiredAreaToProcessCheck.Size = new System.Drawing.Size(57, 24); + this.nmResinTrapRequiredAreaToProcessCheck.TabIndex = 20; + this.nmResinTrapRequiredAreaToProcessCheck.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(73, 56); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(504, 18); + this.label11.TabIndex = 21; + this.label11.Text = "Required pixel bound area (x*y) to process and consider a resin trap (1-255)"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.nmIslandBinaryThreshold); + this.groupBox2.Controls.Add(this.label21); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.nmIslandRequiredPixelBrightnessToSupport); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.nmIslandRequiredPixelsToSupport); + this.groupBox2.Controls.Add(this.nmIslandRequiredAreaToProcessCheck); + this.groupBox2.Controls.Add(this.label7); + this.groupBox2.Controls.Add(this.label8); + this.groupBox2.Controls.Add(this.nmIslandRequiredPixelBrightnessToProcessCheck); + this.groupBox2.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox2.Location = new System.Drawing.Point(3, 103); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(605, 176); + this.groupBox2.TabIndex = 23; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Islands"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(73, 146); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(507, 18); + this.label10.TabIndex = 25; + this.label10.Text = "Minimum pixel brightness bellow island to consider it as a safe pixel (50-255)"; + // + // nmIslandRequiredPixelBrightnessToSupport + // + this.nmIslandRequiredPixelBrightnessToSupport.Location = new System.Drawing.Point(10, 143); + this.nmIslandRequiredPixelBrightnessToSupport.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.nmIslandRequiredPixelBrightnessToSupport.Minimum = new decimal(new int[] { + 50, + 0, + 0, + 0}); + this.nmIslandRequiredPixelBrightnessToSupport.Name = "nmIslandRequiredPixelBrightnessToSupport"; + this.nmIslandRequiredPixelBrightnessToSupport.Size = new System.Drawing.Size(57, 24); + this.nmIslandRequiredPixelBrightnessToSupport.TabIndex = 24; + this.nmIslandRequiredPixelBrightnessToSupport.Value = new decimal(new int[] { + 150, + 0, + 0, + 0}); + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(73, 116); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(385, 18); + this.label9.TabIndex = 23; + this.label9.Text = "Required safe pixels bellow the island to demote it (1-255)"; + // + // nmIslandRequiredPixelsToSupport + // + this.nmIslandRequiredPixelsToSupport.Location = new System.Drawing.Point(10, 113); + this.nmIslandRequiredPixelsToSupport.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.nmIslandRequiredPixelsToSupport.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmIslandRequiredPixelsToSupport.Name = "nmIslandRequiredPixelsToSupport"; + this.nmIslandRequiredPixelsToSupport.Size = new System.Drawing.Size(57, 24); + this.nmIslandRequiredPixelsToSupport.TabIndex = 22; + this.nmIslandRequiredPixelsToSupport.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // nmIslandRequiredAreaToProcessCheck + // + this.nmIslandRequiredAreaToProcessCheck.Location = new System.Drawing.Point(10, 53); + this.nmIslandRequiredAreaToProcessCheck.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.nmIslandRequiredAreaToProcessCheck.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmIslandRequiredAreaToProcessCheck.Name = "nmIslandRequiredAreaToProcessCheck"; + this.nmIslandRequiredAreaToProcessCheck.Size = new System.Drawing.Size(57, 24); + this.nmIslandRequiredAreaToProcessCheck.TabIndex = 18; + this.nmIslandRequiredAreaToProcessCheck.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(73, 56); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(481, 18); + this.label7.TabIndex = 19; + this.label7.Text = "Required pixel bound area (x*y) to process and consider a island (1-255)"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(73, 86); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(439, 18); + this.label8.TabIndex = 21; + this.label8.Text = "Minimum pixel brightness to consider that pixel on a island (1-255)"; + // + // nmIslandRequiredPixelBrightnessToProcessCheck + // + this.nmIslandRequiredPixelBrightnessToProcessCheck.Location = new System.Drawing.Point(10, 83); + this.nmIslandRequiredPixelBrightnessToProcessCheck.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.nmIslandRequiredPixelBrightnessToProcessCheck.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nmIslandRequiredPixelBrightnessToProcessCheck.Name = "nmIslandRequiredPixelBrightnessToProcessCheck"; + this.nmIslandRequiredPixelBrightnessToProcessCheck.Size = new System.Drawing.Size(57, 24); + this.nmIslandRequiredPixelBrightnessToProcessCheck.TabIndex = 20; + this.nmIslandRequiredPixelBrightnessToProcessCheck.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.cbAutoComputeIssuesClickOnTab); + this.groupBox1.Controls.Add(this.cbComputeIssuesOnLoad); + this.groupBox1.Controls.Add(this.cbComputeIslands); + this.groupBox1.Controls.Add(this.cbComputeResinTraps); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top; + this.groupBox1.Location = new System.Drawing.Point(3, 20); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(605, 83); + this.groupBox1.TabIndex = 22; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Commun"; + // + // cbAutoComputeIssuesClickOnTab + // + this.cbAutoComputeIssuesClickOnTab.AutoSize = true; + this.cbAutoComputeIssuesClickOnTab.Location = new System.Drawing.Point(6, 51); + this.cbAutoComputeIssuesClickOnTab.Name = "cbAutoComputeIssuesClickOnTab"; + this.cbAutoComputeIssuesClickOnTab.Size = new System.Drawing.Size(416, 22); + this.cbAutoComputeIssuesClickOnTab.TabIndex = 18; + this.cbAutoComputeIssuesClickOnTab.Text = "Auto compute issues when click Issues tab for the first time"; + this.cbAutoComputeIssuesClickOnTab.UseVisualStyleBackColor = true; + // + // nmResinTrapBinaryThreshold + // + this.nmResinTrapBinaryThreshold.Location = new System.Drawing.Point(10, 23); + this.nmResinTrapBinaryThreshold.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.nmResinTrapBinaryThreshold.Name = "nmResinTrapBinaryThreshold"; + this.nmResinTrapBinaryThreshold.Size = new System.Drawing.Size(57, 24); + this.nmResinTrapBinaryThreshold.TabIndex = 26; + this.nmResinTrapBinaryThreshold.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(73, 26); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(512, 18); + this.label20.TabIndex = 27; + this.label20.Text = "Pixels below this value will turn black, otherwise white. Value=0 to disable this" + + ""; + // + // nmIslandBinaryThreshold + // + this.nmIslandBinaryThreshold.Location = new System.Drawing.Point(10, 23); + this.nmIslandBinaryThreshold.Maximum = new decimal(new int[] { + 254, + 0, + 0, + 0}); + this.nmIslandBinaryThreshold.Name = "nmIslandBinaryThreshold"; + this.nmIslandBinaryThreshold.Size = new System.Drawing.Size(57, 24); + this.nmIslandBinaryThreshold.TabIndex = 28; + this.nmIslandBinaryThreshold.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(73, 26); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(512, 18); + this.label21.TabIndex = 29; + this.label21.Text = "Pixels below this value will turn black, otherwise white. Value=0 to disable this" + + ""; + // + // FrmSettings + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(611, 953); + this.Controls.Add(this.gbIssues); + this.Controls.Add(this.btnReset); + this.Controls.Add(this.groupLayerPreview); + this.Controls.Add(this.groupGeneral); + this.Controls.Add(this.btnSave); + this.Controls.Add(this.btnCancel); + this.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmSettings"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Settings"; + this.groupGeneral.ResumeLayout(false); + this.groupGeneral.PerformLayout(); + this.groupLayerPreview.ResumeLayout(false); + this.groupLayerPreview.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmOutlineHollowAreasLineThickness)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmOutlineLayerBoundsLineThickness)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmOutlinePrintVolumeBoundsLineThickness)).EndInit(); + this.gbIssues.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.groupBox3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapMaximumPixelBrightnessToDrain)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredBlackPixelsToDrain)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredAreaToProcessCheck)).EndInit(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToSupport)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelsToSupport)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredAreaToProcessCheck)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToProcessCheck)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapBinaryThreshold)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.nmIslandBinaryThreshold)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btnPreviousNextLayerColor; + private System.Windows.Forms.ColorDialog colorDialog; + private System.Windows.Forms.Button btnPreviousLayerColor; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button btnNextLayerColor; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnTouchingBoundsColor; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Button btnResinTrapColor; + private System.Windows.Forms.Button btnIslandColor; + private System.Windows.Forms.Button btnSave; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.GroupBox groupGeneral; + private System.Windows.Forms.CheckBox cbStartMaximized; + private System.Windows.Forms.CheckBox cbCheckForUpdatesOnStartup; + private System.Windows.Forms.GroupBox groupLayerPreview; + private System.Windows.Forms.CheckBox cbLayerAutoRotateBestView; + private System.Windows.Forms.Button btnReset; + private System.Windows.Forms.CheckBox cbLayerDifferenceDefault; + private System.Windows.Forms.CheckBox cbComputeIssuesOnLoad; + private System.Windows.Forms.CheckBox cbLayerZoomToFit; + private System.Windows.Forms.CheckBox cbComputeResinTraps; + private System.Windows.Forms.CheckBox cbComputeIslands; + private System.Windows.Forms.GroupBox gbIssues; + private System.Windows.Forms.NumericUpDown nmIslandRequiredAreaToProcessCheck; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelBrightnessToProcessCheck; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelsToSupport; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelBrightnessToSupport; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.NumericUpDown nmResinTrapRequiredAreaToProcessCheck; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.NumericUpDown nmResinTrapRequiredBlackPixelsToDrain; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.NumericUpDown nmResinTrapMaximumPixelBrightnessToDrain; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.CheckBox cbAutoComputeIssuesClickOnTab; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Button btnOutlinePrintVolumeBoundsColor; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.NumericUpDown nmOutlinePrintVolumeBoundsLineThickness; + private System.Windows.Forms.CheckBox cbOutlinePrintVolumeBounds; + private System.Windows.Forms.CheckBox cbOutlineLayerBounds; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.NumericUpDown nmOutlineLayerBoundsLineThickness; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Button btnOutlineLayerBoundsColor; + private System.Windows.Forms.CheckBox cbOutlineHollowAreas; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.NumericUpDown nmOutlineHollowAreasLineThickness; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Button btnOutlineHollowAreasColor; + private System.Windows.Forms.CheckBox cbZoomToFitPrintVolumeBounds; + private System.Windows.Forms.NumericUpDown nmResinTrapBinaryThreshold; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.NumericUpDown nmIslandBinaryThreshold; + private System.Windows.Forms.Label label21; + } +}
\ No newline at end of file diff --git a/UVtools.GUI/Forms/FrmSettings.cs b/UVtools.GUI/Forms/FrmSettings.cs new file mode 100644 index 0000000..222b564 --- /dev/null +++ b/UVtools.GUI/Forms/FrmSettings.cs @@ -0,0 +1,157 @@ +using System; +using System.Windows.Forms; +using UVtools.GUI.Properties; + +namespace UVtools.GUI.Forms +{ + public partial class FrmSettings : Form + { + public FrmSettings() + { + InitializeComponent(); + Init(); + } + + public void Init() + { + try + { + cbCheckForUpdatesOnStartup.Checked = Settings.Default.CheckForUpdatesOnStartup; + cbStartMaximized.Checked = Settings.Default.StartMaximized; + + btnPreviousNextLayerColor.BackColor = Settings.Default.PreviousNextLayerColor; + btnPreviousLayerColor.BackColor = Settings.Default.PreviousLayerColor; + btnNextLayerColor.BackColor = Settings.Default.NextLayerColor; + btnIslandColor.BackColor = Settings.Default.IslandColor; + btnResinTrapColor.BackColor = Settings.Default.ResinTrapColor; + btnTouchingBoundsColor.BackColor = Settings.Default.TouchingBoundsColor; + + btnOutlinePrintVolumeBoundsColor.BackColor = Settings.Default.OutlinePrintVolumeBoundsColor; + btnOutlineLayerBoundsColor.BackColor = Settings.Default.OutlineLayerBoundsColor; + btnOutlineHollowAreasColor.BackColor = Settings.Default.OutlineHollowAreasColor; + + nmOutlinePrintVolumeBoundsLineThickness.Value = Settings.Default.OutlinePrintVolumeBoundsLineThickness; + nmOutlineLayerBoundsLineThickness.Value = Settings.Default.OutlineLayerBoundsLineThickness; + nmOutlineHollowAreasLineThickness.Value = Settings.Default.OutlineHollowAreasLineThickness; + + cbOutlinePrintVolumeBounds.Checked = Settings.Default.OutlinePrintVolumeBounds; + cbOutlineLayerBounds.Checked = Settings.Default.OutlineLayerBounds; + cbOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas; + + cbLayerAutoRotateBestView.Checked = Settings.Default.LayerAutoRotateBestView; + cbLayerZoomToFit.Checked = Settings.Default.LayerZoomToFit; + cbZoomToFitPrintVolumeBounds.Checked = Settings.Default.ZoomToFitPrintVolumeBounds; + cbLayerDifferenceDefault.Checked = Settings.Default.LayerDifferenceDefault; + cbComputeIssuesOnLoad.Checked = Settings.Default.ComputeIssuesOnLoad; + cbComputeIslands.Checked = Settings.Default.ComputeIslands; + cbComputeResinTraps.Checked = Settings.Default.ComputeResinTraps; + cbAutoComputeIssuesClickOnTab.Checked = Settings.Default.AutoComputeIssuesClickOnTab; + + nmIslandBinaryThreshold.Value = Settings.Default.IslandBinaryThreshold; + nmIslandRequiredAreaToProcessCheck.Value = Settings.Default.IslandRequiredAreaToProcessCheck; + nmIslandRequiredPixelBrightnessToProcessCheck.Value = Settings.Default.IslandRequiredPixelBrightnessToProcessCheck; + nmIslandRequiredPixelsToSupport.Value = Settings.Default.IslandRequiredPixelsToSupport; + nmIslandRequiredPixelBrightnessToSupport.Value = Settings.Default.IslandRequiredPixelBrightnessToSupport; + + nmResinTrapBinaryThreshold.Value = Settings.Default.ResinTrapBinaryThreshold; + nmResinTrapRequiredAreaToProcessCheck.Value = Settings.Default.ResinTrapRequiredAreaToProcessCheck; + nmResinTrapRequiredBlackPixelsToDrain.Value = Settings.Default.ResinTrapRequiredBlackPixelsToDrain; + nmResinTrapMaximumPixelBrightnessToDrain.Value = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain; + } + catch (Exception ex) + { + MessageBox.Show($"Unable to use current settings, a reset will be performed.\n{ex.Message}", + "Unable to use current settings", MessageBoxButtons.OK, MessageBoxIcon.Error); + Settings.Default.Reset(); + Settings.Default.Save(); + Init(); + } + } + + private void EventClick(object sender, EventArgs e) + { + if ( + ReferenceEquals(sender, btnPreviousNextLayerColor) || + ReferenceEquals(sender, btnPreviousLayerColor) || + ReferenceEquals(sender, btnNextLayerColor) || + ReferenceEquals(sender, btnIslandColor) || + ReferenceEquals(sender, btnResinTrapColor) || + ReferenceEquals(sender, btnTouchingBoundsColor) || + ReferenceEquals(sender, btnOutlinePrintVolumeBoundsColor) || + ReferenceEquals(sender, btnOutlineLayerBoundsColor) || + ReferenceEquals(sender, btnOutlineHollowAreasColor) + ) + { + Button btn = sender as Button; + colorDialog.Color = btn.BackColor; + if (colorDialog.ShowDialog() != DialogResult.OK) return; + + btn.BackColor = colorDialog.Color; + + return; + + } + + if (ReferenceEquals(sender, btnReset)) + { + if (MessageBox.Show("Are you sure you want to reset the settings to the default values?", + "Reset settings?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != + DialogResult.Yes) return; + + Settings.Default.Reset(); + Init(); + + return; + } + + if (ReferenceEquals(sender, btnSave)) + { + Settings.Default.CheckForUpdatesOnStartup = cbCheckForUpdatesOnStartup.Checked; + Settings.Default.StartMaximized = cbStartMaximized.Checked; + + Settings.Default.PreviousNextLayerColor = btnPreviousNextLayerColor.BackColor; + Settings.Default.PreviousLayerColor = btnPreviousLayerColor.BackColor; + Settings.Default.NextLayerColor = btnNextLayerColor.BackColor; + Settings.Default.IslandColor = btnIslandColor.BackColor; + Settings.Default.ResinTrapColor = btnResinTrapColor.BackColor; + Settings.Default.TouchingBoundsColor = btnTouchingBoundsColor.BackColor; + + Settings.Default.OutlinePrintVolumeBoundsColor = btnOutlinePrintVolumeBoundsColor.BackColor; + Settings.Default.OutlineLayerBoundsColor = btnOutlineLayerBoundsColor.BackColor; + Settings.Default.OutlineHollowAreasColor = btnOutlineHollowAreasColor.BackColor; + + Settings.Default.OutlinePrintVolumeBoundsLineThickness = (byte) nmOutlinePrintVolumeBoundsLineThickness.Value; + Settings.Default.OutlineLayerBoundsLineThickness = (byte) nmOutlineLayerBoundsLineThickness.Value; + Settings.Default.OutlineHollowAreasLineThickness = (sbyte) nmOutlineHollowAreasLineThickness.Value; + + Settings.Default.OutlinePrintVolumeBounds = cbOutlinePrintVolumeBounds.Checked; + Settings.Default.OutlineLayerBounds = cbOutlineLayerBounds.Checked; + Settings.Default.OutlineHollowAreas = cbOutlineHollowAreas.Checked; + + Settings.Default.LayerAutoRotateBestView = cbLayerAutoRotateBestView.Checked; + Settings.Default.LayerZoomToFit = cbLayerZoomToFit.Checked; + Settings.Default.ZoomToFitPrintVolumeBounds = cbZoomToFitPrintVolumeBounds.Checked; + Settings.Default.LayerDifferenceDefault = cbLayerDifferenceDefault.Checked; + Settings.Default.ComputeIssuesOnLoad = cbComputeIssuesOnLoad.Checked; + Settings.Default.ComputeIslands = cbComputeIslands.Checked; + Settings.Default.ComputeResinTraps = cbComputeResinTraps.Checked; + Settings.Default.AutoComputeIssuesClickOnTab = cbAutoComputeIssuesClickOnTab.Checked; + + Settings.Default.IslandBinaryThreshold = (byte)nmIslandBinaryThreshold.Value; + Settings.Default.IslandRequiredAreaToProcessCheck = (byte) nmIslandRequiredAreaToProcessCheck.Value; + Settings.Default.IslandRequiredPixelBrightnessToProcessCheck = (byte)nmIslandRequiredPixelBrightnessToProcessCheck.Value; + Settings.Default.IslandRequiredPixelsToSupport = (byte)nmIslandRequiredPixelsToSupport.Value; + Settings.Default.IslandRequiredPixelBrightnessToSupport = (byte)nmIslandRequiredPixelBrightnessToSupport.Value; + + Settings.Default.ResinTrapBinaryThreshold = (byte) nmResinTrapBinaryThreshold.Value; + Settings.Default.ResinTrapRequiredAreaToProcessCheck = (byte)nmResinTrapRequiredAreaToProcessCheck.Value; + Settings.Default.ResinTrapRequiredBlackPixelsToDrain = (byte)nmResinTrapRequiredBlackPixelsToDrain.Value; + Settings.Default.ResinTrapMaximumPixelBrightnessToDrain = (byte)nmResinTrapMaximumPixelBrightnessToDrain.Value; + + Settings.Default.Save(); + DialogResult = DialogResult.OK; + return; + } + } + } +} diff --git a/UVtools.GUI/Forms/FrmSettings.resx b/UVtools.GUI/Forms/FrmSettings.resx new file mode 100644 index 0000000..ce1a023 --- /dev/null +++ b/UVtools.GUI/Forms/FrmSettings.resx @@ -0,0 +1,2204 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <metadata name="colorDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value> + AAABAAYAAAAAAAEAIAAWYQAAZgAAAICAAAABACAAKAgBAHxhAABAQAAAAQAgAChCAACkaQEAMDAAAAEA + IACoJQAAzKsBACAgAAABACAAqBAAAHTRAQAQEAAAAQAgAGgEAAAc4gEAiVBORw0KGgoAAAANSUhEUgAA + AQAAAAEACAYAAABccqhmAABg3UlEQVR42u29d5hcZfn//zrnTN3Z3je9bEjvhYSOEBENgqBgQRQ/BFTw + q8JPSoAASi9BCb0oSlGRDpFgKKEE0khIQnpvm7Jttkw/c57fH8+c2dkl2WyZLVPe17XXtpkz5zzn3Pdz + 1/etkEavghACQDF/jfysRn43AA3IBFwx37OA0shXEVAGFAL5QF7M6xyANfKltvhoAwhFvvyAB2gEaoEa + oAo4AFQCByNfDTGvM7+HW5yveQ0AQlEU0ug9SN+NXgAhhMLXhd5ELtAHGAr0i3z1BwqQwl4AZCOF3Bpz + DBMt7/Gx7rlo5XfzvSGksNcD1UilUA3sBfZFvrYDFYC7xbFilUHLz0qjm5FWAN2IyO5uwtzZzT/akAKc + A4wFxgMTgGFIJZAFZAB2pBVgxBxHifkZWlcA7T7tIxxLxHw3f1aRu38A8CKtAzewFfgSWAOsA+qQCiQY + c0wj9nPSVkL3Ib3S3YAWZr353YI02Qcgd/fjkQI/AinwxLzeaPF7b71vsQoBmis4kAphE1IhLENaCXuQ + 7oQecwxIuwvdgvQKdyFiTPvYXXIQcAIwBbnTD0YqAlvkNS1dgUS/R6ZSaGk9BJGCvxNpGawEPgN20dy6 + SbsKXYhEf7h6DVqY92YQzII06cuAmcCZSKHPBpwxr0sGQW8vYq0FA/AhYwrrgPeB/yGDjnU0WQdRSyht + HcQH6VWMAyI7PTQJcj4wGjgJOBm52+eSfLt7vHAkK8GNtAo+AT4F1iOzEVHFkbYMOo/0A9hBxPj1pomv + Iv3585G7/XHIaH1sGs98TxpHR6xQm8HBvcAWYBHwKjJuYNC09ul4QQeRXrV2Ima3V5FR+1JgKnAJ0rfP + Qpr+RuQ16TXuHARNa6kjswufAf8AViDjCKHIa9JWQTuRfjjbgBZRfJAFNWOBc4FvIKP3NppbA2nEH7G7 + fhCZTfgAeAMZO/DHvDZtFbQB6RU6CloJ6p0E/AKZthuIzMm3TPGl0bWIrUMIA7uRacW/IuMF6aBhG5Fe + lSOghX+vIn3505Bm/sk05bfTgbyeR2wA0UAGDf8BLEbGDsw4QtoiOALSK9ICLcpy+yDN/POB6UjTP73b + 907EWgV+YCkyYPgGsiQZ0jUFX0P6IeZrO76GrK8/B7gKWaiTQTqgl0gwA4deZKHRw8BbyH6FMGmLIIqU + X4EWOfwy4HvApcA4mnz/dFAvMWHEfF8L/A14DVlglK4lIIUVQGTXN315J9LU/ylwKk2mfsquT5LBjBP4 + gY+A55CugY9I7CBVrYGUu+oW5n4mMBG4ARndd5A29ZMZpmvgR2YL7gJWI1ubU9ItSKmrjQnwKUgTfzbw + faTPn97xUwemRVANvAw8hXQRTCWQMm5ByjzwMcKfCfwYuAJZr29JtbVIA2jKGujIPoMngBeJWAOpogSS + /qGPEfwMYBJwL7I5J9YaSCN1IWK+VgLXAquQGYSkVwRJ+/C38PX7I839S4C+pAU/ja/DVAL7kYVETyEL + iZI6NpB0VxVTwqsizfvjkbv+ONLR/TRaR2y2YC3SGliGdBPMZqOePse4IqmupsWuPxD4JXAZTb34SXW9 + aXQZTEXgBp4GHkf2GySdNZA8VwIIIcwU3vHAjUgGHgtp4U+j/TCVgA68B9yBtAaEoihGZw7cm5AUQhET + 6MtG+vm/RZJzxHbqpZFGR2B2HO4B/oKMD9STJAHChBeOiPCrQDnwe6TJ35KFJ400Oguzq/Bp4EFgG7KC + MKGVQMIqgJhSXpBVfLcCM5C8+Ql7XWn0agjk3IPPkc/bp5G/J2wpcUKedYzwZyFr+P8S+TldxptGV8Ms + J25AuppvRH5OSCWQcGcc4+8XAlcj8/u5pE3+NLoXBjJL8BQwDzk7MeHiAgmjAGLy+xqSdns+8B2aevXT + SKO7YXIOLAB+g6QtD0Pi1AskxFnG5PetSD//HiQTL6SFP42ehZkSXAFch4wPhEiQeoFeLzwtinvOQLK7 + TCUd6U+jd8CMO01FPptnRH5XWhDL9kr0ahUVI/w24LvAncAQ0oU9afQ+mIVDO4A5wJtI6vJebQn02jNr + IfxXIs2rAmQMII00eivCSJ6Be4BH6OVKwNL5Q3QZVKTwXw7chByymTb50+jt0JAZqpuQZcRPIpVArywf + 7nVqKSbHn4vMs/6GtPB3K9riu/bWHa0XwUBONp6PrFNx0wtrBXrV2cSY/S5kpdWvaOLpS6MTMIVaUZSv + Cbj5t3A43OzLMIxmr1VVFU3TUFUVi8US/flIxzM/s7c98N0Mk3/wMeAWmkhGevq8ouhtLoCKzOtfjWzl + ddLLlFQioaUAmoLu8/moq6vD7XZTWVlJdXU11dXVHD58mOrqaqqqqqitrcXr9TYTbkVRyM7Opri4mOLi + YgoKCigqKqKgoICCggIKCwvJyckhMzMTq9X6tXMxj5FCUJHP8C+RDUTzkEqg17gDveJutDD7b0Du/E7S + O3+7YQqarut4vV7cbjcVFRVs27aNXbt2sWvXLnbs2MH27dvx+/0IITAM+TwWFxfjdDpRFAVNk7FWVZW3 + wHyN+fpgMIjP58PtdgNSsBVFobCwkJEjRzJkyBAGDBjA4MGDKS8vJz8/n6ysLOx2e1QJpJAyMJAU5I8h + mYjd9BJ3oMfPIMbstyOF/xqkFdDj55YoMIU+GAxSVVXFli1bWLZsGZs2baKiogK3201VVRXhcBghBHl5 + edjt9qhwCyGaKYK2xgDML/M4IBVPY2MjPp8PRVFwOp0UFhZSWFjI4MGDOf744xk5ciQDBw4kKysreowU + cBcEcvd/AKkEAvQCd6BHP71Fqu8KpN+fDvgdA6aACiHQdZ3Dhw+zatUq3nvvPZYtW0ZtbW0zAbdYLM2E + 1BT4rkKscjAMA13Xo58XCARQFIWBAwcya9Yspk+fzvDhw8nIyIieY08LRRfCDAzeimQh7vEUYY99covy + 3iuBm0kLf6swhcjj8bB//36WLFnCkiVL+PTTT6mtrY364KZi6I2VaJqmYbFYCIVCHDx4kGAwyJQpU5gy + ZQqnn346o0aNIj8/H03TklURmErgT8g6gR4tG+5JBWB+9gXIEsoi0sL/NZimsRCC+vp61q5dy7///W82 + btzI3r17URSFzMxMLBZL1MRPFJhC7vV68fl8FBQUUFJSwsyZM5k1axb9+vXDarUmo3tgAJXI4bOvQM/N + KOyRVY08pFYkZ99DyPLetPC3gBCCUChEVVUV77//Pi+99BI7duxoZt6br0tkxMYBTJfBYrHw7W9/m+98 + 5zuMGzcuGpxMIkVgIMuG/x+SczDUE9fW7Z8YQ+F1MrJIYhRp4W8GU/C3bt3K22+/zYcffsiGDRsoLCzE + brcTDAZ7+hS7FKZlUFVVhaqqzJw5k5kzZ3LyySdTUFCQbEpgA7LY7RN6gGKsW1cyJt1XhGRSmdYT59Gb + IYRg9+7dvPzyy7z++uvU1dWhaRo2m+1rhTnJDrPIyO/3Y7VaGTJkCL/5zW84/vjjcTqdyeAamDdzObLZ + rYpuTg922yfFBP2KkKWRF5Lu6gOaovkVFRUsWLCAp59+Gp/PR1ZWFuFwuKdPr8dhphoNw6Curo6pU6dy + xRVXMHnyZFwuVzIoAQG8hCx9r6Qbg4LdqQBU5GDOG5DBj5Rn8jF38/r6el5//XVeeeUVNmzYQH5+frO8 + fBpNsFgseL1eVFXlrLPO4qKLLmLChAnRwqUEhcks9DCyRqCxu2YPdIsCiOHx+ymyHDKvuz67t8IU8A0b + NnD33XezdetWQqEQFoslLfjHgGkNGIaBpmlcc801zJo1i6ysrJ4+tc5AALXIMvjn6CZ+wS4XwsgupyGp + u1+jaUxXyiIcDnP48GH++te/8txzz2Gz2XA4HGlzv51QFAWr1crhw4cpLy/nD3/4AyeeeCIOhyNR3QJz + HNn3kJTj4a6+ju5QAObQjseAU0lx6m5d1/n444959tlnWb58OdnZ2SkX3Is3NE3D6/WSk5PDrFmzuPTS + SykpKQESrqrQpBz/CNkPs62rXYEuW52YiH82kh3lElJ4aIdhGDQ2NvKvf/2LRx55BKvVGi2VTaPzMGsE + fD4fY8eO5frrr2f06NGJWFFoDh/5B5IFq54uzAx0yVFjIv4qMuD3ACm88xuGwapVq3jiiSd47733KCkp + 6bWluokOMz4QDoe5+uqrOffcc8nOzk5EJWAgG+MejvzcJZmBrlYA05EBjcGkYMTfDPQtW7aM6667Drfb + jdPpTPv6XQxTUILBIOeccw7XXHMNeXl5iaYEDGAnMnC+lERRADGm/yCk9ppJ7yMe6XKYtfuvvfYaf/7z + n6MEGWmTv/ugqiqhUIhx48Zx3XXXMWLEiERLF+rAIqQVvYsucAW6QgEoSIG/HVnYYOuKz+nNEELgdrv5 + 05/+xIcffojVak3v+j0EUwnk5eVx8803c9pppzXro+jlEMiW4b8QIRmNd2owroIZk++PTfklzGrHaQ2o + rKzktttuY/HixbhcrnSUv4ehKEq0wejBBx/khBNOQFXVRHEJDGR9wPnI1GBc6wO6QjgHIKuZ8rro+L0W + Qgi2b9/OVVddxSeffEJGRkbCtegmI4QQUR6CX/7yl7zwwgtf4zvsxVCRszDvQspW3A8eF0R2fxdwGTCh + mxan10AIwY4dO7jhhhv46quvsNvtaX+/lyEUCmGz2bjnnnt48cUXE62rcgJStlwxXBqdRlwUQIwmnYLM + 96cUm68p/HPmzGHbtm1Rsz+N3gdVVbHb7cybN48PPvggUawABSlTlyBlLG7n3WkFEJPyy0KaKX17aJF6 + BEIItm7dylVXXcWGDRvQNC0t/L0YZgDw1FNPZdq0aZ08WrejL1LGsojT8NF4pOfMwN+PkP39KdXiu2fP + HubOncvevXtxOp1xF36r1YrNZiM/P5+SkhLy8/PJzc0lIyMDh8OBxSJvoa7r+P1+GhsbqampobKykoMH + D9LQ0EAoFEpnIZDCHw6HmTRpEtdffz35+fmJEgiEJpmahpS1pyK/d0oLdEoBxOT8xyGHH8SeaFJDCMG+ + ffu45ZZb2Lx5c1yE32xuycrKok+fPgwdOpTRo0czdOjQKBuQqRBUVY1Gss2SYrMCLhgMEggE8Pv97Nmz + h40bN7JhwwZ2795NVVUVgUAg5RSCWSE4efJkbrzxRgYMGJBIwm9CQQr8L5EkImuFEJ1qGOrUCkSCEZnI + Wv/ZpEjBj1nkc9VVV/HFF1+QkZHRKZ9MVVXKysoYMmQIkydPZsyYMQwfPjzKg2d+JrS9uaXl68PhMPv2 + 7WPDhg0sX76cdevWUVFRQSAQ6Onl7HKYO/+4ceOYN29eIlYFtoSOtACuQ3IHdPjh6/AqxPj+pwH/Rk5E + TehVbet1+3w+5s+fz1//+tdoN19HoCgKffr0Yfr06Zx55pkMHDiQwsLCZoUqJlmm3++nrq6O6upqampq + 8Hg8+P3+aE+BxWLB4XCQmZkZHdWVk5ODw+GInrf50NfV1bFnzx5WrlzJokWL2LZtW9JaBJqmoes6EydO + 5IYbbmDo0KGJLvwgrYAq4CJgMZ0oE+7Qu2KE3wm8DHyrM8dLJPj9fl544QUee+yx6M7SXlgsFoqLi5k1 + axYzZ86kT58+2O326P99Ph8NDQ3s27ePzZs3s3nzZvbv3099fT0NDQ14PJ5ocVHsTm9SZ7lcLrKzs8nJ + yWHQoEGMGjWKYcOG0bdvXzIyMrBYLNHimMrKSj799FPefPNNduzYkVQWgXl/pk6dyty5cykrK0ukKsDW + YO74C4HvI8eOdUgJdEYBqEgN9BQpNMrrvffe47rrrsMwjA49TPn5+Zx22mmcc845jBw5MhrEC4fDVFVV + sX37dj7//HM2bdrEzp078Xg8hEKhDp+voijYbDays7MZPXo0Y8aMYdq0aQwaNIiMjAwURSEcDlNRUcGb + b77Je++9x759+xI+k2EK//jx47n77rspLi5Ohp0/FuaosdlIC7xDfQIdVQAq0Ac53ugsJONPUkMIwYED + B/jBD36A1+tF07R2+f3mOKyf/vSnnH766dG5eABut5tFixbx6aefsm3bNqqrq7ukglBRFOx2O3379mXy + 5MmcfvrpTJo0CYvFEnVt1q5dyz/+8Q9WrFiRsErANPvHjRvHTTfdxJAhQ5Jl52+JMPAucqxeRUfIQ9qt + ACKBPw0ZibybFNj9zfr+66+/nrVr10b/1lbYbDZOO+00LrvsMgYPHhyN2ldUVPDhhx+ycOFCtm7d2maB + UxQFi8XSbOafECKaAWjrcE+n08npp5/OrFmzGD16dDSYWV9fz/PPP8+bb75JdXV1Ty9/uxBr9t9xxx3J + NkegJUwr4HrgcSSFWLt2jXatTIzvXwq8BUwkBer9g8EgTz31FA8//DCZmZnt2hldLhdnn302l112GYWF + hQB4vV6WLVvGSy+9xNq1a9vsd2uaRklJCQMHDmTo0KGUlJRE+e9CoRDV1dXs3LmT7du3c+jQIXw+3zGP + qaoqpaWlnHnmmXz/+9+nT58+gJw/uGjRIp588kkOHz7c07egTTCFf+LEidx6663069cvmYXfhAGsBs4B + DtLOWECbXxkj/AqyJvlhZNovqVdYCMHy5cu59NJLcTqd7XpvVlYWF110ERdddBF5eXkIIWhoaOBvf/sb + 7777LpWVlW3arTVNY+DAgZxxxhmceOKJlJaW4nK5ovUA5nmGQiF8Ph/V1dV8+eWXfPTRR6xYsaJN7EN2 + u52xY8fyi1/8IuoWhEIhPvroIx5//HF2797dq8tmzTz/+PHjuemmmxg0aFCymv0tIZBpwauApyO/t1kJ + dEQB9APeBMa35/2JisrKSq688ko2bdqEzWZrsxBkZmbyy1/+kgsuuCA6uHPr1q08+uijfP755206hrk7 + f/vb3+aCCy6guLg4+r/Y84hN8cXeeI/Hw/vvv89rr73Ghg0b0HX9mJ+Zn5/Pz3/+82Y022vWrOGhhx6K + uj+9DbE7/3333ZcMef72QgBrkNOF9tGFCsACXI70/V0kufnv9/v585//zHPPPYfL5Wpzys/lcnH++ecz + e/bsqF+9dOlSnnnmGdatW9fm44waNYrLL7+cKVOmRE19M3W3bds2du3ahdvtxjAMMjMz6devH+Xl5fTr + 1y+aVtR1nW3btvHss8/y/vvvt8l9yc3N5Xvf+x4/+tGPyM/PxzAM1qxZw+23387u3bt7+rY0gxnwmzRp + EnPmzInGWFIMBuBBxgKeRBKHtOmNbXpVTNpvINLMOJUkj/wLIVi2bBlXXnllu1J+VquVs88+m1/96lcU + FhZiGAYrV67krrvuoqKiok0CqKoqY8eO5dprr2XYsGGoqkowGGTnzp188MEHvPPOO80Kgcz32O12nE4n + U6ZMiQb2MjMzEUJQXV3NY489xsKFC9sUc3A4HJxxxhn87ne/Iy8vD8Mw+Pjjj5k/fz579uzpFe6AufNP + mTKFm266iX79+qWK2X8khJF04pcBu2ljWrBNQnzrrbeavv95yLxjUtN8CSFobGzkjjvuYPfu3dhstja/ + d9KkSfz+97+ntLQUwzBYvnw5DzzwQJuFRlEURo4cyR/+8AdGjBiBqqrU1dXx73//m/nz5/Pxxx/T0NAQ + rec3i4EMwyAYDOL1etm2bRuffPIJBw4coLy8nOzsbFwuF2PGjKG6uprt27cf81x0XWfr1q3U19czevRo + XC4Xffv2JTMzkzVr1uD3+3v0HpnCP2bMGO6//35KSkpSWfhBymMJsBHpDnDbbbcd803tWTENuJgUSPsp + isKyZcv44IMPcLlcbd7tsrOzufTSS6OR9L179/LMM8+0y2x2uVz87Gc/Y8SIESiKQk1NDc888wzPPvss + FRUVbT5OQ0MDCxYs4IEHHmDbtm0AFBQUcOmll9KvX782H+fdd9/lxRdfxOPxYLFYOOOMM/jOd77THbfh + qNA0Lerzz507NxV9/iNBQcrmxbTDOj+mAohhHzk18pXUMLv8brzxRoqLi9vsr9tsNs4991wmTJgAQGNj + YzRw1ta0oaqqzJw5k9NPPx1N02hoaOCpp57i5Zdfxuv1tvtaDMNgyZIl3Hfffezbtw+AAQMGMHv2bDIz + M9t0DL/fz3/+8x9effVVDMMgIyODSy65hClTpvTIjquqKrquM3XqVG6//XaGDBmSFv7miMppW5iD2noH + ncDP2vH6hEUoFOK1117D7Xa3eedXFIWhQ4fyrW99C7vdTigU4r///S+fffZZu2oGysrK+N73vhcVrMWL + F7NgwYJOUVcZhsHq1at57rnnoseZNm0aEydObLMA+3w+nn/+edauXYsQgtzcXC688MJoXUN3wTT7J0yY + wC233EJpaWmqm/1HgoqU1TblrFtdvZjg3xjkkA9Bkpv/FRUVvP766+3i9NM0jZNOOonBgwcDsHPnTt56 + 6602pd1ijzFlyhQGDJC8j9XV1bz22msd2vlbQgjB4sWLWbVqFQA5OTmceOKJ7aprqKmp4fnnn+fw4cMo + isLUqVOZMWNGt/Hsm2b/uHHjmDNnDqWlpemd/+sw+QKmI2VWPdYmdiz1qQBWZH5xAEku/EIIXnjhBbZv + 396sO+9YKCoq4uyzz8Zms+H3+3n77bejfndbkZWVxbRp06J8gosWLWLLli1xu7ba2lreeecdGhoa0DSN + yZMntysWYGZFFixYgK7rZGVlcf7555Obmxu3czwaTLN/0qRJzJs3j6FDh6Z3/qNDQcrqd5Gy26rMtkUB + lALfIAWq/iorK3nllVeiqbO2wIzamzv3oUOHWLJkSbs7+AoKCqL+bH19PWvXro0ra61hGGzcuDEaSCwo + KKCsrKxdx/D7/bz77rvRY4wYMYKxY8fG7RyPhFgar5tvvjkd8Ds2zME830DKbscUQCSAIIDjgUnHOlCi + IxwO884777B37952MfxYLBZmzJgR7cdfuXIl+/fvb/fnZ2dnk5eXB0BVVRW7du2KezdeTU0N+/btQwiB + 0+lk2LBh7T7G7t27+eCDDwBplp9xxhnRsWfxhlneO2nSJG688Ub69++fFv62QUHK7PGAaC0YeEQFEPPw + q8BPkKZEUmPfvn08+uijDB06tF0kH1lZWYwdOzbajbd06dJ2+f4mTM4/kCm8+vr6uF+jx+Nh586dGIaB + 1WqNpivbA13X+fjjj6mrqwNg3LhxHTrOsWDu/GPHjuXee+9Npdr+eMGKlF0Vjt69eqwVHQTMIMmZfsPh + MIsWLaK+vr7dDD85OTnRYJpJ29UROJ3OaEDN7/d3CUWXrut4PJ7ow2DShbUXFRUV7N69G0VRyMjIiLo/ + 8YIZ8Eub/R2GKa8zkDJ8VKjH+N+5QE5PX01Xwhzk+eGHH3aI0z+2HNdms5GT07HliiUA0TStSx54VVWj + DETmZ3YE5pgt0+ppbGyM6znqus7kyZO59dZbU7W2P17IQcrwUeX8aP9QgALkaG+NJN79FUVhw4YNrFu3 + rkM7Yk1NDVu3bo2SdJxwwgkd8olra2ujgUOXy9WuLERbYbfbKS4ujvrWbre7Q8cpKyuL7vp1dXXs3bs3 + LucXS+N155130rdv37TZ33GYxD0zkbJ8RBluTQGMBIb39FV0Bz766COqqqo6tNMEg0E+/fTT6O49derU + DpnE9fX10fr6rKysaEAwnsjMzGTgwIHR5qI9e/a0+xiKojBu3LhoJeGGDRs67PbEwjT7x48fz4033tgK + k0/El+0FzUgJguFIWW6bAohEDC3Aycje/6Td/U2ev5deeom+fft2KOouhGDFihVs374dgNLSUs477zxc + Lle7jlNVVRUVyLKyMiZNmhTX6LqiKAwYMCCa+6+rq+tQnUFZWRlnn302IGMK7733XqdIS6G52X/PPfcc + ncNPCMK1lQSW/xfha0grgWPD5O84GbAcKRugHuVNOZE3JbX5D7B69Wrq6+s7VdFWXV3N//73PwKBAJqm + ccoppzB27Nh2WRRut5uNGzei6zpWq5Vp06Z1OJ5wJNhsNmbMmBElFdm1axcHDx5s1zGsViunnHJKVIls + 2rSJzZs3d+q8YvP8t9xyC0VFRUcVfsNTj++tR/A8eyW+d/+KCPjSSqB1mG7AyUiZbl0BRMxYgWT8nUwS + C78QAq/XyyuvvEJOTk6HUncmzNTYtm3bUBSFsrIyfvjDH5KRkdHmYwQCAZYtW0ZtbS0AEyZMYOrUqXEL + gPXv358zzjgDi8VCIBBg1apV1NTUtPsYZ511Fk6nk0AgwOLFizscR4CmPP+4ceO44YYb6NOnz5GvVwhE + wIf3zccJLv0bWBz4Fz+F78N/I0KBtBJoHQpSlvsgawKa/VM9wotBBg7ye/rMuxr79u1j/fr17aL6Ohq2 + b9/Oiy++SENDA6qqctJJJ3HxxRe3ObAohGDt2rUsWbIEkDv2ZZddxvDhwzutBPLy8rjiiiuiO/eOHTtY + uHBhuyoNHQ4Hl1xyCaNHjwbgyy+/ZNGiRR1WnLE0XvPmzWvV7DfqqvD8626CH88HSyYYQTCC+P97O/73 + /wkiMenLuxH5SJmGFpt6dMVjBEADTu/pM+5qCCGiu2A8Ku4Mw+DTTz/lk08+iQrseeedx+mnn94s9dYa + /H4/L7/8MlVVVQD069eP2bNndyrPnp2dzY9+9CNOOOEEQKb+Xn311XaZ/4qicOqpp3LmmWeiqiper5c3 + 3nij3S6Eidg8/4033thqnl8EfHhfn09wxYtgdYERYTMSAgzw/fc+guuXp62AY+N0IjwBsZvdkSyAQchp + v+bvSQeTQXf16tXREt54wOPx8Le//Y2vvvoKwzAoLCzkiiuuYPr06W1OZ5n8fY2NjWiaxoknnsi1115L + eXl5u4KCqqqSm5vLr371Ky666CJsNlu04GnRokVtrgFQVZVp06Yxe/bs6ATkd999l8WLF3eojiC2seem + m25i4MCBRzX7jcY6PK/OJ7j0r6CqIGKtDQGR93levI7QltWQoINMuhjm4o5DynazxY5Gvm699Vbzxd8G + zqcNnUSJCkVRqKur44knnqC+vr7NO3RbYObFhw8fHh3QOW7cOLZu3crhw4ePaW0YhsGuXbsAGDlyJHa7 + nf79+zN16lQsFgsej+eYfndxcTEnnXQSV155JTNnzsRms0U5/R599NGohdEWTJs2jauvvpohQ4YQDodZ + uXIlf/nLXzqU+oud0nv//fcfvZ9fCIy6aryv/YXgZ0+BLQvE0TINYQh4Ce/6Akv58ahZBVHFkEYUArnZ + rwXWAcKkC4tVAGbr78+BEyJvSMqVFEKwZcsWHn30UXJycuJOcFlVVYXb7Y6y+WZmZjJs2DAOHTrUJmLQ + YDDI1q1bsVgsjBgxAqvVSk5ODuPHj2fcuHGUlJSQkZERrR602Wzk5uYyYsQIzjjjDH70ox9x7rnnRrsL + TWag+fPnt7loR1GUKDFpeXk5IHkOHn/8cbZt29buNTPN/gkTJnDjjTe2HvALBfG+/CDB5c+BZmtF+CNQ + FYz6/Yg6L7Zxp6NoWloJfB0asB94HzBMBRBdpci8v37As0hKoaQuwXrhhRe4+uqrGTRoUKcyAEeDpmmc + c845zJ49m+LiYoQQVFVV8dRTT7Fw4cI2Te3JyMjgG9/4Bj/84Q8ZOnRoNFhpjgDTdZ1gMIhhGNjtdiwW + CzabLWrRGIbBoUOHWLhwIf/85z/bHPXPyMjglFNOYfbs2QwcODBaL/HHP/6RVatWtTtmEjuuq1UmHyEw + GmrxvvkYwU8fBWvWsYXfhGIB3YPj27fgPOsSFFv8KykTHAaSNfjnwD5zjmBL27c/MLinz7Sroes6q1at + IiMjo8sGYJrtxcFgkMsuu4wBAwZQXFzMb3/7W0pKSqJBtNZ2Uq/Xy9tvv83GjRuZNWsWM2bMYODAgdhs + tmjdgrmLxo4JD4fDHDp0iPXr1/Pqq6+yZs2aNo8fy8/P57zzzuPCCy+koKAAIQS7d+/m0UcfZeXKle1e + h1gar9tuu42SkpKj+/wNbryv/4Xg0ufAli2j/W2F0MGSReCDh9FK+mCf/C3oJraiBMJgpIzvM/+gQLT6 + TwF+ihwyaCeJzf/a2lpmzZqFrutd0nUXC5vNxtSpU7n++uvp06cPQgj8fj8rVqzg6aefZv369W06jtl1 + N3nyZMaPH095eTmFhYXYbLbowBC3283u3bv58ssvWbNmDdu3b2+zv68oCkOGDOGSSy7h1FNPjZb67t69 + m4ceeojPPvus3RV/5tCOsWPHcvPNN7ea6hN6EM9LDxJc8njE7O/IfVFABFFLx5D167+iFZTG9V4mOAQQ + QA71fQ45PUiYCkBFcv3PQ44aTlrzXwjBV199xfnnn09RUVGbd8bOQFEUjjvuOH71q18xbdq06JyB2tpa + 3nrrLRYuXMiuXbvalJdXFAVN08jJySErKwuLxRLd9b1eL7W1tW2eEAyyuq+4uJhvfvObXHjhhRQVFQGy + MGn16tU8+OCD0TLn9iB2aMddd91Ffn7+0Xf+umqZ6lv6NNhymlJ9HVpsC8LfiO34i8n86W0o9qTdyzoC + A3gCuBoIKopixFoAmcBCJKFgUiuAhQsXMnv2bPr169fpOva2QlEU+vXrx0UXXcTZZ58dLfPVdZ3t27fz + 7rvvsmTJEnbv3t0lMYmWsFgs9OnThxNPPJHTTz+dUaNGRYuW6urqWLBgAf/5z3+iDELtQWyRzy233NIq + k4/hacD78v0El78AqqXtPn+rJ2AFo56MnzyNY9pZaVegCQawFPgW0KgoilBaDP38EsgjSVWmGUB7+OGH + eeaZZ3A4HF0WAzgasrOzOeWUU/jhD39IeXl5NGDn8/nYt28fn332GYsXL2bXrl34fL5mPAGdgWk5OJ1O + hg4dyoknnsj06dMZOHAgTqcTVVUJhULs2LGDf/3rX3zwwQcd6vM3y3vNaP9RmXyEQPg9eF57hOAnj4DF + 2SLP36mrledSMorMyx7CUjownRWQEEAtMAFziGiM/38WsCDywqRcLSEEHo+HX//616xdu7bbKK2PhKKi + Ir773e9y5plnMmDAgGb9/w0NDWzZsoUVK1awZcsW9u/fT3V1NcFgkFAodEyrxST+sNlsOBwO8vPz6d+/ + P8OHD2fChAkMHz68GfFpMBikoqKChQsX8s4771BRUdEhpdPmKb2R8l7vG/MJLn0WrJmdM/uPBEWFkBfb + jEtw/fg2FGvbx7slMcyb+h3gXVoogGuBO2kqGkg6mKm4yy+/PEpp1ZOwWq0MGzaMk046iW9+85v069cv + 6tODHFLidruprKzkwIED0e8HDhygsbERn8+HrusIIdA0DZvNhtPpJD8/n5KSEkpLSykqKqKoqIji4mKy + s7Ob7caKorB582Y+++wzPvnkEzZu3NhhJmIz4Ddx4kRuvPHGozP5CIEIBfC8eCfBFabZ3xUuT4TT1rCQ + dfXLWMvHkKT7WntgRBbhBuA+IgoApMC/AFwUeWFSrpSZ0rr00ktxu929hm3GZrNRWlrKjBkzOOGEExg9 + ejROpzMa4VcUJeq+6LoezV4YhtEs/acoSnT3N2m7VFWNvl8IQSAQoKGhgU2bNvHFF1/wwQcfRK2Ljroa + bZ7SGynv9b71BMGPH5I7f5cIfwSKCuEQlmEzyZx9P6orO9VdAfMG/xtJGGqYXP+5wDCSVPBNmJz7scSY + vQEmO8+ePXt45513KC8vZ+zYsYwbN46ysjKKi4vJycmJjgB3OBxHPf/YugCz58HtdnPw4EEqKipYv349 + a9euZdeuXXHh8ost773zzjuPzuQjBEZ9Dd7XHyK47O+dj/a3BcIAiwN9+4cEv1iA46QLQYtf2XcCwrwx + w5AyX2tB7v59kcE/gyQ1/02Y1XAmqWVvQ319PatWreKrr77izTffpKioiNLSUvr27cvAgQMpKyujtLSU + rKwsXC5XNKWo6zp+v5/Gxkaqq6upqqpi37597Nmzh8rKSioqKqitrcXn88Ut82Ga/RMmTGDOnDmtCr8I + BfG++SjB5c+DZu964TdhhACFwLL/YBt7Jmp+cfd8bu+FgZT1vkCdqQ4HA1k9fWZdDSFEVCAKCgp6+nRa + RTAYJBgMUltbGyUd1TQNVVWjZn1LYTN3fSEEhmFgGEa00Cneyi52Su9tt91GcXFx6zv/m48SXPKEbOxp + T4VfPKAohHcsI7D8DZzfmt29n907kYWU+Q0WpEboSxuniSYqTAFobGxs5hcnAmKFujcgNto/d+7c1st7 + G+uk2b/8ObBldr/wR84D1Yb/439gP+ki1Mzsnl7CnoYTKfOGiuwH6A84SPIYgJkGTKPjaEnjVVZWdnSz + PxiQAb9lf5fRfqN7iq6OcDJgcWIcXkdwzZIeXb9eAAUp6/0Biwq4kNNEk54AFIjLuO1URSyBZ6tTek0a + r3/eGaHxyuhgbX8cYQRRMsrwL7qdcNXBVGYQMolCBwAuUwEUIF2BpEdaAXQMscJ/TBovvxfvGw9/ncar + pyEMjJpqQps+T3UeQQMp81EFUNjTZ9TVMB/WzuS7UxWm2T958mRuuukmBgwYcHSf31OP57WHIzReWtfm + +dsLoUNIJ7jqvxjexlS2AkDKvEtFNgEVkgLmv5kXT6PtiM3z33PPPdHJQl+D2dX38gOytt+a1buE34Ql + jL71I8J7NqVyUZCClPlMFZkSyCYFFADQLZ12yQKTxmvixIncdNNNrdb2Cz0oW3qXvwAWR+8x+78GK8Jf + S2DtRz19Ij0JBSnzWSpQirQC0kgjipZ5/tZq+42GWjwvzZP9/Kql5wN+rUGEURy5hL54mnDN4VR2AzKB + UlMBJC0DcEv0lvr/3oxYs/+Pf/zj0af0mhx+r/+F4JInJY1XPPr5uxqKFaOujtCmVT19Jj22AkiZL1WB + op4+m+5EPAduJiNip/TedNNNFBUVHaO893HJ4afZeqbIpyMwgig2J6G1ryH8KT1fsEgFypBdQkm9CkII + FEXBarX2eBtwb0Ws2X/vvfceY1xXNZ5/3kXw00fAYu+dAb+jQoDiRN/1Jfqh9o9ITwKY8l6mkgIpwFi0 + Z2BnKiG2vPemm26isLDwKO6SwPA2SDKP5c9FyDwSZOdvhhDCc4jw7lWpbAEUqqTAENBYOJ1J3fLQIcTS + eM2ZM4e+ffse3ez3e/G+8Zhk8ukyMo9ugAARhNDWVQg9mKpKIN9CEwdgStjFJt11GhKxvP33339/22i8 + Pv9bpKuvt6b62gbFYqBvX4rw1KPkpVSbsHmD88xCoKSH2T5rDgNJVwM2n9J78803t57nD0am9C5/EawZ + CS/8IEB1ICq3oR/YSZKHwI6GTLMUOGVQVlYWpeROZZgBvylTpnDzzTe3PqXXU4/nlfm9s7y3U1AQRhB9 + +9oUlX9ZCpz0bcAmFEWhpKQkOio7VWGa/WPGjOHuu+9mwIABR4/211fjfWUewU8fk/38SSP8gDBQHHZC + W95DhBIxkNkpKIBDRRYEpAyys7N7LR1YdyC2vHfu3Lmtm/2hIN43Ymm8EqDIp10wwJKPUbEWo64mFQOB + 1pRSAEIIMjMzyc/PT8mKwFiz//bbb4+ODz/CQmHU1+D5930EP3tSTtpJpp2/GRSEz0/4YErWA1hVkpwE + tCUyMjJSMgYQm+e/7bbbWh/R3ejG+8ZD0ue3tWNEd0JCB6WR8IEtpGAgIPW2QYfDwaBBg45IqpmsMM3+ + sWPHcsMNN7TK4Sf0oKTxWvr3yIy9JPeNDR0UJ+EDX8g4QIq5ASmlABRFwWazMWnSJOrq6lLCDTDN/kmT + JvHggw8eg8armsYX7iD40UOypTdpzf5mFw7CRfjgfoQv9fgik18CjoABAwZgGEaPzgbsDsTSeLWa5weE + rxHvG/MJrXhRdvUlXcCvFSgGwlObsgog5cjR+vTpg8vlSupMQMspvUcd0S0EwtuA5/VHCS79WyTPn0LC + D6CEEf4qDE9dqrEEGSqQUndbURQKCwuZNm0abrc7KeMA5s4/fvx47r///lZHdBt1VXj+c3+ExivJ8vxt + hiEVgHsvKRYIDKWcAgCicYDa2tqkiwPElve2yt4bCfh5ojReziQo7+0ghAahMEbdgRSTf0IWwI8sB06+ + rfAIMM3+sWPHJh05iBnwmzx5MnPnzm2lq8+ITOl9ktDnTydfhV97oSgI3YLhrkMGBUkFV0AAfhVIqciH + mf4rLy9n6NCh+Hy+nj6luCDW7L/zzjtbH9FdX4v3tT/L8l57bu/m8OtGGA3uVLMAPCrQ+RnRCQYhBLm5 + uRx33HEEg8GEjwOYZv+4ceO48cYb2zCl9zGCy57r3im9vRoikgmIWACJ/Ti0B40qUEsKUILFQlEU7HY7 + EydOTKghoUdCLI3XPffc0zqNV301nn/dQ3DJ41L4U9nsbwFFEQhvrflbT59OV8OU91oVqOnps+kJqKrK + jBkzyM3NTVgLoGWev7i4+OjC76mX/fzL/p7ANF5dCFUgAik3LahGBap6+ix6Cv3796ewMDEpEWOpu2+4 + 4Qb69OnTCpmHX7L3LkvRPP+xICIuQKAReskI9m5ClQocIIUowUwoikJeXh4XXXQRDQ0NCVUVaAr/5MmT + mTdv3jHYe6ske+/H88GSmQ74HQ0KoPsRqaEATHk/oAKVPX02PQVVVTn++OPx+XwJUw/Qrim9Aa/k8Ott + U3p7KUQ4kGoKslIFDiKLgVLK+QFpBQwaNIiZM2dy4MCBXq8E2j2l99WHJYFnUtF4dSHCwVRxAQRS5g9a + kAqgEckOnFIQQmC1Wjn33HP5+OOPe/p0WkXLKb2ts/dWy51/6bNdwt6rG4IvDgXYXa9T6NTok6lR4NTI + sanYtAT2JBU1FQqATDQSUQANQD2QSwrGAYQQTJgwgfLycvbv398rqwM1TUPX9Whjz7FpvB6WQzss8c/z + hwUs3OXlT5/XsKMuRIFDoyzTQh+XxsgCG4OyrRRnaAzJtVLk1MiyqaiJ8lSpNqkEkh8CKfMNFqQmqAL6 + 9/RZ9RRKSko44YQT+Oc//4nNZutVdQGxef65c+dSVlbW6pRe75uPE/z8KbDGn8mnolHn7xsaeParemr9 + YbJtKiFDsKU2yIZqeH+PD4sKmqKQaVMpcKj0zbIwLNdK3ywLw/Ns9M+ykGFVyLCo2DUFq6qg9QaZE6BY + nNJdSn4IpMw3WpClwCmbCjRJQs477zz+85//YLFYCIV6R5osdmjHbbfd1iqTT3RK79LnIv388c3zb6oJ + cseyWt7f7SUQFvTJtPCbiTkUOjX2NejsadB5d6eXCo+ORQXdH+aQV2d9dZD/RY6RaVXIc2iUujQG51gp + ybAwINvCgCwLRRkaxRkW8h0qNlXpZktcAVSw2lF6eRwojqgCPKYCqCZFyUGAaG/A2Wefzdtvv43T6exx + K8A0+8eNG8ecOXMoLi5uA43XP+I+pTcs4LMKP/csr2HZAT+GkDv8gCwLZw7MYEiOlbAAX8jAoSk8sbaO + bw/O4JyhLra7Q2yuCbG3IcTOOp1qf5jGkM7eBp0VBwNoCjgtKpk2lSybQpFTo9RlYUiOlREFVvpnWRmQ + ZSHfoWHpyqdTAQxQbFmp4gKoSJmPKoA9QBjQSLE4gAmHw8H//d//8corr5CRkdGjCiDW7L/jjjtare03 + 6qplhd/Sp+O+89f4wzy9rp6n1kqTv1+WhUvHZDOjzEFxhsbAHCu6IYOCLpvKddPy+O5QF+V5VvIcGn5d + oCpSYVQ06uysD1HrN9juDrGjLsSe+hDVfoP6oMFBT5iddTqG8MtmPEBVIN+u0TfLQr+ICzGh2M5JfR1k + 2eIsqEJFcWanwtMvkLK+h4gC0IG9yLbgDFJhCY4ARVEYMmQI55xzDgsWLCAnJwejB1JCsey9rTb2xE7p + XfGc9PnjJPxCwDZ3iMfW1PHPTQ0Ew1KQLx6VxeXjcnBa5PnohuBfmxrZ06Bz8cgsBmRbmFbmAOCQN8zz + G+rJtKr8bHS2NPWzLYA89pNr67l4VBZjCu0c9oapaNTZ4Q7x9g4P29whcuwqigLV/jBV/jCrDwd4Gw8F + To1HzizizAHxnfIsDAU1w2SLNlVQUkIgZX0voFuQ5sB+wIdUACkLi8XCBRdcwLJly/D7/d3eI9CSxqtf + v35tm9Jrscct4BcWsOyAn9uX1rD6cABDgF1TCAtoCBrYY9J8tQGDh1a7OeDRGZZnpX92ZlRsNtUEeWZd + PS6ryjcHZTA4pym7smC7h+fW19MYdHHWIBejC2wIoNoXZmvEOrjguEy+M8TF3gadR7+sY3NNEEWBMpdG + gSPegTpZGKdk5sifk1r+ASnr+5HznQHYiUwHFvT0mfUkhBBMnDiRU089lQULFnRrRiB257/vvvvaMKX3 + Ycnbb41fnr/Wb/DK1gbuWe6mxh+myKnxf+OyGZlv4/MKP+cPy2yW0it0avxuci576nVO7ONoJjMj823M + HpdDplWlb6al2efMGupiv0fnG/0zyLTKdylArl3lJyOzKHVZ+PX4bHIdGmsrA+yuD6EoMLXUwV9OL2JY + XvxTtYoiUHPyZR1Acgs/SFnfCaAIIRRkEdD/gMk9fWY9DSEEa9as4ZJLLsHlchEMdn3XnBnwM83+wYMH + t9LYE8DzzztleW8cK/wOecLcv7KWV7c24g4YqAr8ZGQWd55UQIZVpvusqkIgLFh6wE+hU2NUvg2AsBBY + VIVqX5gvDgUYW2SjzGVBN0BTpTxtd4fYWRdieh8HmVYV3RBoioIBrD4UQCCYWGxHUyLWRsjgkdVunllX + T2PI4IQ+Dm49oYCJxfYuuAMKGA1k/PBeHCdfkgrFQF8A3yTSDiwAN7CVFOMFOBIURWHMmDFcdtll7Nmz + p8ubhGLHdd1yyy3RoSVfgxAYjXV4XvlLXKf06oZg+UE/V35wmOc2NODVBSMLbGTbVN7Z6WVzrXQtrJGt + f8l+H9csrmLukmp2RnZmS+R/j62p41fvHeaR1XUAWCLCf9gb5rbPa7hmcRXv7PAikO9RFNhTH+LyRYf5 + 9fuV7HDrKAr4dIM/fl7DY2vq8OqCswZlcM8phYwv6grhBxQDbBmoeYOSXfhN+d6KlHlhocngWQNcRCp4 + QMeAxWLhoosu4rXXXqOmpgar1dolrkBsee9dd91Ffn5+q7P6vK8/RHDZs5Fof+fN/kBY8O/Njcxf5WZn + XYhCp8YPhmfyoxFZPLm2LhqMi0WeQ2NAloWB2VYyWuTm+mdZGJRtpV9Wc5PfYVEYkmPFHQhT7GquUO2a + QnmuBUVRcFoV9jXqPLCyluc3NKApCmcPzuDeUwopzuhCRSw0FGc+anZp131G74Ap219GfldMF0ABzgIW + mP/o6TPtaRiGwb/+9S/mzZsHEHcFEFveO2fOHIYOHdpqea/n3/fKgJ+qxaVjrdoX5q9f1fPE2jpq/QZ9 + Mi1cOzWXc8szybSqHPLq+HXBoGzpbzeEDLJtKmEBu+pCuKwqJS4NQ0AwLHBaFDwhg30NOn0yLWTZVDwh + GTS0qArV/jC1foMBWRZsmnytQ5OR/n2N0pJRgTuW1fDWdg9hAd8d6uLaqXkMze3i8mxhRS0eTNavn0Er + LEtmK8B8iL8DvAsI0wUQwFdIerA0kK7A2WefzZQpUwiFQnHNCMTm+e+88842TOm9l+CSJ0Czdlr4wwJW + Hw5wxaLDzPvCjSckOGNABtdPy+O5DQ08sLIWvy4oc1kYnGMlZAj+vqGe77xawevbPGgKDM21UurSCIQF + v/+wkh+8eYAvDvlxWVWG59vIsqlsrQ3xi3cP86v3KnEHDAocGuW5VmyawuK9Ps78z34eWu0mEBb0y7Rg + CPjd4kpe2SIpKn8xJpu7Ti5gSFcLP4Ai0HILUJyZXf9ZPY9apKwLQKgxD54b2ESKxwBMKIpCbm4uv/vd + 73C5XHE7bmx57y233EJJSUkrU3rrpNkf7errXKrPGxK8vd3Dbz6o5MO9kg35xyOyuPfUAgqcGuurg2yo + DhI0mh6BkCHYEUnNba4JNns4fLpgXVWQTTVBDniaK6Yqf5jNNUE2VgdpCDavp9juDrGrXmebO4RfF3xZ + GeDaj6v4eJ9UIpeOyeb6aXnkO7SuN0UVFWhALRmMYnck8+4PUrY3IWUdRVEwnTUF2R+8Bpje02fZm1Be + Xs7ll1/OrbfeSnFxMeFwx3fgluW9paWlrZj9AVneu+zvEfbezmUjvLrgsTVunl3fwIFGnXyHxq8n5PCz + 0VnkOzRy7RoPn1HEoGwrWTY1KuhOixTICcV2TujjRKFph8i1qdx/aiGHvTon9HHKU0c+TOMKbTxwWiFO + i0pZxO83//e9YS6y7SqjCmwc8urc9Gk1Xxzy49BUZo/L4Zfjs+Nf6Xc0KBqEBVqfySiW3tcJ2gVYg5R1 + BRAKQEwc4KfA44CddBwAkL6/z+dj7ty5vPvuu9jt9g7FA2JpvNrUz//6Q5Hy3txOBfx0Q7DNHeL2pbW8 + s9ODGsmnXzctD7uq8MFeL+eWZzKqwBa94T5d8OrWRg55w1w2NpvsGGE87A3z4sYGBmRb+PZgFw5L0zWs + rQzw1g4vZ/R3Mr2PI/r3kCF4b7ePdVUBLhqeycBs6VosO+Dn2o+q2VwbJNeuctP0fC4dk929N1jLAN1P + 1tWvYx0yKpktAAEEgF8CzwFCURRhAVAURUSUwDYkQcgA0goAkGaS0+nkF7/4BStXrsTj8bRbAbSdxksg + /J4YGq/MTgm/Eendf3R1HSsP+3FYFM6M+PsDsi1c+X4lC3d6cVhUjsuzRlN9h71h/vyFm70NOqf2czK5 + pCn9tvKQn0e+dDMox8qYQjvHxRTlvLipkafW1nHIozdTALV+g2fW1bHiUIDiDI1LRln5YI+Pu5bVstUt + LZt8h4ZPF7yz00NRhoW+mRYKnWr0nLoMRgg1pwCtICUyAAeRMo6iKALA0uJFe5EVQgN6+mx7ExRF4bjj + jmPOnDn85je/ITc3F11vWw7eLO81hb9VGi9vI943IlN6Lc4O5/kF4A0ZvLS5kbuX11LjD5Nr1/jV+Bx+ + PDJLRu8NmDXEhaYonNDHgSXmnPIdKt8/LpMKT5jBOc0fkdEFds4ZmsmgbAulLVJ63xyYQaU3zLcGN4+Z + 5NhVvlueSbFLY2KxnU/3+7j24yr2N+poioKCYE+Dzt3La3FYFOyaQrFTNgH1z7IwqkDyCPTJtFDm0nBa + 4kQyomiIUBXqoFmoWTnJvPub2ImU8aYlMH+IWABW4D7g16RwZ+DRIITgqaee4sEHH2zTePHYPP+8efPa + SOP1t07v/Burgzy+to5XtjSiGzCqwMbVU3I5a1AGW2pC6EIwqsDWbHf1hgTrqgIUZWgMyrZGBUwgLYKt + tUFG5tsocDYX+i21QeoCBqMLbGRYm1wFny7YWB3EaVEYnm9DVWTdwatbG7l9aQ2HPGEGZluZNTQDny7Y + 26BzyBOmLmBQGwhTHzCaBRw1RdYgTCqxM+f4fMYW2jp/QxUrorGSjJ89hfO075HEj7vZAfgo8AcgdCQL + QCA7A1cimwVSZmBoe3DBBRewceNGPvroI1RVPaoSMAN+kyZN4oYbbjjmlF7v6/MJrojPlN5rPqpi9eEA + wbAgw6owsdhOmcvCF4cC3L2sFl0I5p1W1Mx8/7TCx/UfVzG5xMEDpxVG/X6/LnhufT3Pb2zg0jHZ/GZi + blQ5NAQNrv+4mv2NOneeXMAZMR1666oCXPdxNdk2lcdnFlHmsvCvTQ08sNLNQU+Y8lwrN03P55uDMiQ/ + VcCgxh/GHTBkZ2BdiD31Ovsbdb6qClLlC1PlC7Nkv499DaH4KADCKI5srAOPi+sz0gshkDK9Einj0YfW + coQXfw7UASmRFG0PzFkCV199Ndu3b2f//v1HHC0Wm+e/+eabWx3aYTS48b71uAz4xYnGS1Mg06riwcCn + C/61uYG3tntwWBQqfWHy7Cqba4Lk2FWyrCoOi4JDUxACnBalmdZXFbBqsmzXZVWbWcmqAk6rgk1TvkYG + alcVbJosBzYEPLWujruW1dIYNBiWZ+WRM4qYUOSI0oE5MrRotZ8QoAuBXxd8VRXktx9WUuULU+DUuHpy + Lif3dcbjbkI4gNpvClpx0oe8FKRMf36kfwDRSjcFafq/AZzd8jVpSAgh2LNnDxdffDH19fXNSoVjzf57 + 772XoqKiNtB4/SNC4Bmflt7D3jBfHg6wpjLImsoAO+pCHPTo1AVkPl5VZCffkBwr44rsjCm0RYt0+mdZ + KHRqeEKCkCHIsas0Bg121IUYkW/DrinU+g1smlQIh73SbB+UY0EB3AGDHLuKqijsqAthVRVe2dLAY2vq + qA8YTCl1cOsJ+UwrdbR6DSFDsGS/n1s/q2ZdVZCSDI3fT87j0jHZcWIHUhDhIPZTf4HrgjkyBZicMQBz + d3oHOBfpCgjzmWx2xZE4AMA1wL3RlUrjiFi8eDE33HADoVAIIUTU7B8/fjw33nhjqxN7RCiI56X7CX72 + TKTCL/68/bohqPEbHPaG2V4XYuXBAF8e9rO+OthMGWRYZFnv4BwrI/NtjCqw8cWhAJW+MA+cWkieo+ka + trlD3Lm0hvI8G7+ekENuTK/Af3d4eOaren40IovvH5eJPyx4ZLWbh7+Uwj+9zMEfTyxgQpH9mESgH+71 + cfOSajbXBMl3aFw7NY+fjMxqlnbsFBQVNIHr4oexTz4rWYUfmhTAtcAD0JQBgK+7AGatxiLk0ND8nj77 + 3gohBKeccgr33Xcf11xzDaFQCF3XmTx5MnfeeScFBQWtjOuqxvvGIwQ/f7JLCDxNWFSF4ohpPbrQxqwh + LkKGoNIrGXbWVAZYsMPDttoQ292SquuDPV5URcEQAiGkCX/OEBfluVaKMjTWV8n3VfsNvn9cZjMF8Ol+ + P18cCtA/y8LJ/Zw8tMrN39fXExZwWn8nD32jiD6ZllZ3lEBYsHCXl2s/qqLKF6ZPpoV5pxVyxoCMONOL + W1Dz+mIZMK5L1r6XoQYp09Ci0vdrSyqEUJHEIM8DZ5LCZKFtQTgcZtGiRVx77bXRrr6jMvmALO99ZR7B + 5c+Dau2xQZ1GpCfg+o9lwFBTFaaXObCqsLEmSKXXIBxxazIsCn2zLIzIt9E300K1L8zJ/Zx8d6irWcXe + dneIzyr8DM+38vyGBl7f5iEYFk1NPXnWYwr/fzY3cv/KWvY26AzNtXL9tDzOHxbncJSiQdiD7aRf4PrB + zSjWeAQUey0M4D3gYqBaUZRmddlHUgBmOvBaYC7SSkha+6izEEIQCoVYunQppaWllJeXH93sD/jwvDqf + 4CePgsXRY+O6fLrgre0e5q92s7kmiE1T+OGILH4/WUb4D3nCrDgUYG1lgJUHA+xrDBEMgyEENk3BZVUp + dGoMzrZwfJmDUpfGSX2dFGVo1PoN7ltRy/MbG9ANwXnlmdx6Qv4xd/6wgL+vr5d1C74wQ3Ot/OnEAk4f + 4Ix/MZDqgICbzN+8jm30lGQ3/3Xgj0iXPhRr/sNRBDtiBZwM/A0YSNoKaBVCiGg2oFUar9fnSzIPW2bc + An7tOk/kcI8Hv3Dzr00N+HRZD/CbibmcW+5qxvdnwh2QrsG6yiArD/nZXBvkQGOYGn+YYFhIn1GBvpkW + ppQ42N+os+qQH4dF5YcjMrl5ev4x6/rrgwbPflXPvStq8YcFYwvtzP9GEWPikuprCRWMEFrfSWRf8zyK + 3ZnMCsAAdgOXAp+03P3hyGlAkM/KRmAzUgGk0QqiEdWj5fkDvkie35zS2/3CL01+P/NX1/HfnV6EEBwf + CcqNL7IddZfNtatMLrEzucTOhSMyOeTR2VGns6kmyFeVAdZWBdlVH2Jfg86+BtnKa1EV/m9MNr+emHNM + 4ffrgsfX1PHk2jqCYcG0Ugc3Tc9ndJcIP6AoiKAH66RZKI6U4MDdjJTlIxastKYAqpGBgzNomieeRnsQ + mdLrffPxCIGnq0fMfr8u+O9OD3ctq2V3Q4hMq8p3h2Zy1cRcytvRb59hURicY2VwjpVT+znw6oK6iIWw + pjLAZ/v9HPaFmTnQyW8n5eKyti78jSGDP3/h5om1dQTDcFJfJ3ecXMBxebaue9iMEGrhUOxjT+m+G9Az + MKv/FiFl+YgK4GgugPm/IcBSZFAwrQDag5ZTeq2uuA/qbAv2N+r8Y30DT6ypoyFk0DfTwtVTcvnBcZnH + FND2QjcEXl2QaT12rf6+Rp2HVrl5caN0RUbm27j9pAKG59vId6hHdEc6DUUFw8A2/Se4LrxB9v8n72Nt + buLTgR3E5P5jYTnGQXYhq4e+E/k9aVcrrjCn9L75iIz2Wxw9Ivw73CFuW1rDh3t8+HSD8UX2aE9AV3TZ + WVSFbNuxj+sJGdy5VFJ/+XS5MR306tz2eQ35DkkjPizPxpAc2QxU5rKQ64hDZ6BiAZuKbfxZKLak7ng3 + Wb4+R8rwUXFEBRBT3moALyAphJM6VxI3CAOj3o33rccIfvakbOzpZrPfrws+2OvlrmW1bK4J4rKqXDQ8 + iz9MzaV/lrXHxnUbQqYK71xWw4IdHqyawrBcKz5dEAgLtruDbAgLDCGViSXCOFzo1OifJVuET+7nZOZA + J3ntHg6igO7DOuKbWMrHk8TCbyKElF0DOGpa+qgWQIQjQAWWAauA40mBVesUhMBoqMP7xl8ILuuaKb1t + wWNr6nh6XR0HPWEyrAo/GJ7JtVPzKHT27Ojr9dVB7lhaw4d7fWRYVX48Moufj87GEzKo9IbZXS+pwioa + 5QDR2sjcwD0NsjkI4PVtjTzxzWK+PbidNG2KhtCrsJ/+S1SnK5kj/yB3/1VI2VWOFP03cSwXwCQR+AA5 + NMRKWgkcGWZX39tdM6W3PXh4tRt3pNQ3FIbFe324/QaTSuxMK3UwLN9KVpz9/2Nhd73ODZ9UseJggLAh + +NnoHH47KZf8mDJjQ8hiIG/IwB0waAwZHPKGmbukmq21IVQFxhTaGZjdTuouRYWgB8uwb2EtH5MKwq8j + ZfYgx+D4bHUlIm6AhhT+F5BBwXRNQEs0o/F6Bmw5PeLzm/jvDi9v72hkQ3WISp+OO2Dg10Vk4q5Cn0yN + aaUOJpbYGVckq/vy7BrZdjXu2j0sYGmFn7lLqllTGSDHrvLrCTlcPSWv1c8yZwU+srqOR9fUoQCn9ndy + /ymF9M8+1r7VEgpYIPMXj2EbN7M7b0VPwEAG/X6CnAAUbo3R+pj3O1IZ6ASeiBy0Te9LJRjeBrz/uY/g + 8hfluMUeKu+NhTckqPBI03lTTZB1lUG+qgqwvzGMJyStA4uqUOTUGJBtYVielYnFDspzLYwqsJNrjw/r + zpL9fm5aUs26ygB5Do3/NymHn48+NunnYW+Ye5bX8tLmBnQBMwdmcOuM/PbThEci/9ax38F18e2orqxk + tgDM3f4F4ArA17Ly72vLc8wjNnUIngEsRFoASbuC7YIQCJ8Hz+uPEPzk4QiNV+eHdsQbIUPQGBS4A2F2 + 1el8st/Hl5UBttSEqI5U9GmKZADOsqn0ydSYUuJgbJGNaaWy1NeqygEfbVUKYQGfV/i47mPZ0eeyqfzx + hHx+MDyLjFY6+gRQ5Qtz4yfVLNjpIWzABcdl8ocpuQzMtrZfdjU7iqLhmv00tlFTIzTgSQuBtAC+BbwP + zTv/joQ2LWdECViQCuD0tr4vqRFnGq/uRjAs2N+oc/0n1by/2wtAtl1FU2T5rzkaoNCpMSTXythCG8eX + ORiSY6XMZSGvlVy9bghe3+bhruW17K4LMSjHyrVT87jguExaS+8bArbWhrjt82r+t8uLy6py/nGZ3HlS + Ac6OtAErFkTgII6Zt+H63lVgaa/rkHAQwIdIBaAfS/jh2EHAWISRHYLHAxmkshIw8/yvPyTLe+NA49Xd + OOgJ8+TaelYe9COAYXlWfjspF6dFYeXBABuqg2yoCVLplVRcyw/4eWlzIyUZGgOzrYwqsDG+2Ma4QjsD + sy3RAaFhAW/v8HLLZ9Uc9IQZlG1l7ox8zhqUwbFqe7bUBpm7pJpP9vtxWhUuHpUVPaf2QwEjiJo7Fsdp + F6aK8HuRMtpmM7Stq2LyBCxGphZORQYHUw9CYDS68b71pAz49UCevzMIGYKlFX7uWVHLyoMBNBXOGpTB + jdPzGZEvS3C/NciFTxdU+8OsPOhnxcEAX1UF2FWvc9ATZle9zsf7fDgsCrl2lUHZVqb3cTC9zMGG6iCP + flnHYa/k/bv31EJO7OOIKogjISwkkem1H1ex4qAfh6bwu0l5XD6uMwNCFFANHN/8eSpQfoM0/ZchZRTa + OOGrzao1khGwAJcDdyNJQ5PaoTrCIsRM6f07WDISaud3Bwze2ObhvhU1HPCEybWrXDE+h5+NzqbkGNN3 + a/0GW2qDbK4Nsb7KDCjqHPCE0SP+gk2TfIJBQzC1xMGc4/M4oa/zmGb/p/t9/GlpDasPByhwaFwxPpvf + Tso7psVwVCgqGDrW0efguviPqNm5Pb30XQ0D8ADXA08izf82vbG9CkAB+gFvAilRThWzAJEpvffJnV/t + /KDO7kSVL8y8lW7+s6WRGn+YAdkWfjcp95hBuSMsA15dFu4c9IT5qjrAsgMB1lcH2e4OoRuCEfk2HvpG + EROL7ccMGi494Of/W1zF5togmVaVG47P48cjs8jsTJ2CakVR/WRe9RbWoUmf9we5268BzgH2c5S6/yOh + IwpAAS4DHiZVyELMnf+NR2R5ry2rx4p82otgWLD6cIDbl9aw7IAfTVU4ua+TOdPzGFd4bAE9Fgwhg34+ + XbChJkiNL8y4Ijv9so5N/fX+Hh9zl1Szqy5EcYbG3BPy+cFxWR3f+UFW/AWDZPzoPpynfj9VhF8HrgKe + jvwefwUAzZRAKfAWMJFkdwOEwPDU4X3lQdnYo1l7pJ+/IwgZghc3NvL4mjq2uYNk21TOK8/k91Ny6ZfZ + c0ExAfxzUwP3Lq9lX4POoBwr103L47xyV+cafmJz/j+9Q+b8kx8GsBq5+x+kHcIP7csCxDYJVQLPAiNI + 5oyAEIigH++bsVN6E0P4a/0Gf/uqnkfX1FHrD1Pg0LhuWh4XDMsk19FzOtsQ8Ob2Rv74eQ2V3jB9XBbu + OKmA0/rHgfpLsaHmFOA46wrUjPiNdO/FMAd+PIuUSdoj/NBOBRD5ACGEMIDXkbMDziIZMwJfo/HKTpiA + 3/KDfu5f4eajfV5Akn3OnZHP8WWOTh+7M2gMGfxjfQPzvqilPmAwttDG7ScVclLfzp6XIk19ARk/fRDr + 4NE9ep3dCAP4CCmLRlvy/i3R0a3AACqQOUc/bUw5JA4Ewu/F+8bDclxXD5F5dBTXflTNh3u96AZYVRic + Y+WgR84GMPvvuxthAc+sq+fPq9zU+g0mFNu546RCZvSJg1JSFAiHcXzzN9iGT+iR6+sBCKTsPY+URaMj + B+mMIyiQE4R+iqw8MmsFEhtCyNr+Nx4j+PlfwZqRUHl+gEE5Fio8Op6QQdCA17Y1snCXhxy7RnmulRll + DiaX2BmWZyPbpmLTQFOVLrt57oB0R+avdtMYNJhQZOfPpxcxPN/WuYAfIAt+wDZpFo7TLkr2Ul8Tphb/ + GCmDHdbqHV7+mIDgacC/gcLOHK9XoJfQeHUWgbCcqbeuKsAXBwNsc4fY36hT7Q/jj1gAdk2hJENjaqmD + 0YU2xhTaGJhtpcipkW1T4xY8r/KF+fMXbv6xoZ6QAaf3d3LLjAKG57ezqedIUDSEbmAdfiquS+5CyytK + hag/RFomgIuQhT/tCvzFolOrFekRyATuAWbTOYuiZxHp5/e8eFdkaIeWcDv/kdAYNKj0hdnboLOxOsja + yiBfHPazq04nFFPAkxeh4hqcY2VysZ3RhTbGFtrJsXd8R632hblreS0vbW7EEzI4Z4iLm2fkMzgnDqxE + iorQddT8crL/39/QSvr19FJ3J3TgKeA6oLEjvr+JzioAkAHAccBfI98TzwYzB3W+9TjBTx6J25Te3gbd + EAQNycm3q07ns/0+Vhzys602RE3AoDFooBsCi6rgsMhW4ellDiYU26O5fZdVwWlRWzXdBbCzLsT9K2p5 + fZsHBfjOUBd3nVxAQbupvI4ARQGhoBYMxnXxPVjLJ6TKzg/S118L/CLyPdzR3R/iYLJHrAAFaQE8SsJR + iAuMenNK798jjT2JUeQTD5hdgVtqQ3x5OMCmmiA76kLsqtPx6k1dgUUZGsNyrRyXb2NsoY0R+TYGZVso + cGpfS9/trAtxwyfVfLDXi0VR+MmoLK6ZnEepKx7Cr4IRRMkZgOvH98kWXzX5klBHgUn2+WukBSA6s/tD + fBSAeZws4F1gGgmkBETQj+flPxP89InIlN7EKe+NN4JhQX3EZdjulgph2QE/G6qDUYoxVYEMq0qhQ6Ms + U2NMoY0T+jgZVSBHjO+oCzF3SQ0Ld3kQAn4+Opsbjo8XH6EC6KC6cF36MPZxp4CWcsK/HJl6b6ATvr+J + uAhpjBI4FfgHsl8gIRRAaPsGGu7/OVgaQQRJuoxmJ2CW+R70htlUHeSjfT7WVwXY2xCmNhDGExKEhUAF + smwqw3Kt1AQMdtaFyLap/Gx0Nr+fnNuJjr4YKCqIMEpWKa4L78Q2/mRQU4qbRgD7gEuQuf9OCz/EcfUi + roAL2ZH0eySNWO+/O0IQWP4/vC/NRfjrQEk+3z9eMATU+MPsqguxpTbEplpJNbYnwuQbjPgLuXaV/zcp + l5+Pzu5UEDEKRYNwECW7Lxk/vAvbmBkoltRoQ4nArPh7ENmJ6+ms6W8irisYUQIDkZxkM+J9/C6DHiKw + 5iO8L85BBD1AEESH6ipSBoYAf1hQFwhz2BtmXVWQlzY1sKkmxC/H5/DL8TlkWONx+6U3qWSV4frxXdhG + T0+1nR+ahnz8BNgdL+GHrlEACnAS8CqQR0JkBQQICO3ZiufxSzHqDyVNGjChoWiggzZwAq4f3oZl4IhU + ivabMIBa4HzgU+IQ+ItFXIUzcmKmtnoGOZ0kAZxqWUtuHTAM1//NRxswBXQPqOlhSD0GxYYIBLEMmULm + z+9PVeEXSBl6BilTcRV+6AI7KhIQVIFBSM6AmSRSgZARJlx9EO9bjxJc9jyK1YGkWEsAPZYUUOTOj4pt + 8vk4Z12JVlCWisIPsuBnEbLXfxey4SeuH9AlqxqTFZgOPAcMJiFcgegVIIIBfO88Q2Dxk4iQHxSR0inC + boFigbBAsWfgmHU9jhPPlRN8U1P4DWAnstdmKXGK+rdEVwvlcmA+TTnMBIGCYrPj/NYvyPjx7SjZAyHo + TbsEXQnVjggFUQtLybj4PpynXZDKwm/Ky3ykDHUZumx1Y1yBbGSvwCVAgs1kFmAIwof34X31PkIbPgSC + EWsgnSWICxQNhAaGjm3KRTi/+yu0/FKZ909d4Q8g62muA+rpAtPfRJevcGTCcDnwGLJQKCFzOIannsDn + b+B/7zFE7UGw21OqZDj+UEC1IIJ+tKLh2E+7GMeJF6A4EqN8pItgTvZZjCz33dbaZN94oDsUAMiGoZOA + 14Dc7vjcLrgShK6j71iHb8Ej6OsXgKtAUoSlYwPtg6IBVoSvCuuE88g45/dofYegWFJ++LQA3MD3kCm/ + TjX6tAXdstox9QE/BeYh6wMS805H6MEDaz/F//IcjIYGUMLpIGFboGhgGIAVtWQozrN/h23iKSiWdGwF + Kfy1wNXIwHncU35HQrcJYcQVyARuQKY1MkiozMDXLgh9/3YCS14muOItjPo9KHZXpHgogeKd3QFFk3P6 + /NWoOX2xTbkQxzcukRN71MR9BOIIAznW62HgLmSPf7cEmbpTAZifVwT8BbiQBOoaPMpFIYIB9H2b8b37 + DPq6BbI7TVHTigCQOX0bGDqEfVhnXILzlAvR+g5HsdpTNcjXEmbE/yXgt0h23y5J+R0J3XoHYjIDRUgu + s2k9cR5dcm2hEKGd6wm89wShbZ+DrxEskVbVlCopVmQ+X4QgrKO4SrEMn4791EuxlY+NlFiLtPBLmDvE + cuC7SJqvLov4Hwndfhci8QAVOBmZ5xxFIrsCzS8Ow9uIvvULAqv+S2j1fxG+KhRnDqAkJctQM6h2IIzw + ulGyS7COPgP79B9gHTIexZGRFvqvwwA2AL8BPqGD1N6dQY/ckYglYAXOBB4ChpBESkBWEgbR928luGIh + wVUvIRoOguoEhFx1kWC1UUeCEvHghIpZM6Fkl2CdfD6OGeegFfVDsdmbXpdGLAxgB/D/gPeAUHfu/CZ6 + 7K5ELAGAC5DBjyKSRQnIC5SrawjCNYcJrl5EaN27hCvWYDTUgCpQLFlIAUqkeIHM3yME6D4wVJTsIrSy + QdimXYx15PFoecUyuJc29Y8GA+nrXwW8AtFGum5HTyoA8/OtwJXAzUAOyaQEmi4WhIHRWE+4YivBrz4k + tGkJ4V1LwVBQMpygZUlFYPTGBkpVCr1iAd2D8NWClok2cAq2sadjHXkSWulg1Kxc+fK00LcGA6gD/gQ8 + QqRjtid2f+hhuyxGCdiAK4BbSVYlIC84YhUYiFAQvWInoY3LCW14GWPfTkRY7qigytoCkEJnBoq71G1Q + mpvqQo98rAXUMCg6ii0Hrc8oLGNmYR11PJbivrJb0nx404J/LJjCfyvwBBCkB4UfeoFjFqME7MgagWtI + 5oGj8qIjwiKJSITfh35oD+H9m9F3fkZ4/06Muj2IukMIfyDiLgjQMiINSRrRqlFhfm9L2tgUcrXpu9RI + sqxZb0To8m+KQ0PJ6otaMARLn6Fog6ZiGTAGrbAExZ4RPVyLH9I4OgQy1/8AMtcfoIeFH3rJnYtJD+Yi + lcCvkJyCyWkJfH0Bmn4MBRHeBoTHTfjwDvSKnYQP7SF8YBOi6itEY5VMJigCNAMsBoomgEJpLagaX5vV + KgwgLIVc1CMMHXRVfqGgWIGsvqjFI9GKhqL1GYylzyDUwsGomfkoTheKNVKtl97lOwIDyen3GFL43XRz + uu9o6PkziEGkWjADWQ55LcluCRx5EeT36MMRGblohDF8HoyGOgx3FUZ9NUZdFUbdYfBUITy7EYGDEDIQ + utF0HFUBTUWxWVDsZSgZfVCySlGyilCzC1Dzi1Gz8lCzcuVIbUVt+kzzfBRItdsQR5g7/73IMnhvd1X5 + tQW96q7GuAMZwG1IS8BBqlgCR16VyPcmlyEKRQFhIMJhCIfBCCOMsKy3j1UkqgziKZoKqoaiWSLvjTmY + EvMZTX9Io3MwkBN8HwNuQSqCHjf7Y9F7ziSCFu7Ab5FFEskbGIwXRBuCg+mdvDthBvzmI0vf3fQSsz8W + vetsYhBxB2zA5SR7diCNZENstP9JINibzP5Y9GayTgMZKX0icp7XAQV8LcKVRhq9CmGgGsmCFU319fRJ + HQ291gKAr9UJfBe4E1k2nK4tTaO3wSzS2AHMAd6kF+T5j4Xee2YRxCgBBTkU8V5kA1FaCaTRW2AK/wZk + 9upd82+9WfghAXzqyAKaC/w+sn56BU38aWmk0ZMwkM/iCuSz+T4JIvyQQDuoaIpya0A+Mrr6HRKdWSiN + RIbJ5LMAma2qQcYASAThhwRSACZi+AULkQVDs5Epw7QSSKM7YSBTe08hC3yq6CYev3gi4RQANKsVyALO + ReZZs0hQyvE0Egqm69mArFN5I/Jzr8vxtwWJd8YRxCgBkJTjtyJHkifY8JE0Egjm0I7Pkc/bp5G/J6Tw + QxIISgzFWDnwe+CyyHWlXYI04gkz2Pc08CCwjR6g8Io3El4BQLO4QDZyBNlvgQHIgGFSXGMaPQaBDOzt + Qbqa/0CO60o4f/9ISCrhiJQPK8DxwI1IzkEL6ZqBNNoPM/WsIzn77gCWIQU/adLPSSUULYqGBgK/RLoE + uaSVQBpthyn8bqTJ/ziwmwTK77cVyXMlEcTUC6jI3f94ZPXgOGRrcVoRpHE0mILvB9Yiq/qWIa0AAxIn + v99WJNfVxKCFNdAfWS9wCdCXtBJI4+swhX8/0s9/CthLEu76sUjOq4pBTIAwA5iEtAam0KQEkn4N0mgV + IuZrJXLXX0UTeUfCB/paQ8o8/DGKIBP4MZKFeDRNLdEpsxZpAE0tujqwHtm6+yLQSAoIvomUeuhjlICC + jAnMBr6P5BlIWwOpA3PHrwZeRpr7a2ky91NC+CEFH/gWsYFMYCKSifgkmvgHU25dUgRmGa8fWcV3F7Ca + yK5PEvv6R0NqXW0MYkqJBZKC/Fzgp8CppLMFyYbY6P5HwHPIGn4fkcEIqSb4JlLzqmMQM6NQAcqA7wGX + Il0Es5w4XVacmDBivq8F/ga8BhwgEgNIJXP/SEh5BQBfcws0ZEzgHCTBw2CaOAfS65UYME19L7ATOXz2 + LaTPHyZFzf0jIb0CLRATKATog3QNzgem0+QaQHrtehtEzHc/sBR4FWnqV5j/S/UdvyXSD/ER0MIiUJGF + RKchC4lOpil2kI4T9DxM/z4y5JBPkIU8i5GFPGYXX3rHPwLSK3IUiOaDNswYgAWZLfgFssR4IM07DtPr + 2T2I3e3DyDr9ZcBfkdF9PfL/aNNOWviPjPSqtAExFoEJBzAW6R58A5iApC43Z2ulg4ZdA4OmNQ4CXwIf + IM38dUjT30R6x28D0ivUTsRkDVTACpQCU5HuwQlIajIL8mFNBw47DzOgpyJ39gbgM6SZvwI4CIRoatZJ + +/jtQPrh7CBaxAnMXX8AMmA4EzgOGTtoyU6UXvPWESvApv++F9gCLEIG9vbQ3BpI7/YdRHrV4oAWtQQK + krZ8NDJecDKy+SiXpvVOBxCbIzaQZ/7uRjbnfIL069cjabfN16Z3+zgg/QDGCa0EDXOQBUYzkQxFY5HU + Zc6Y16WiMogKMnI39yGpttYhGXgWIQt26kgH9boM6VXsQsTUFJgPugoMQsYKpiCVwWBkHMEWeU2yWQlH + 2t1BBvEOIgt11iF3+8+AXTQJukI6d9+lSPSHKyHQIotgfrcgBX8AMBSZVpwAjEC6C8S83mjxe2+9b7G7 + OjTVS5hwA5uQ0ftlwHakP3+Qpl0+muJL7/Jdj/QKdyNauAlmcND8ow2ZVchBWgbjkQphGFIhZCFLku3I + 2oPYXbKlchEtPqdTp32EY8Xm4WOtmzCSN9+LjNa7ga1IgV+D3OnrkFH7YMwxjdjPSQt+9yG90r0ALcqP + Y81lkMLfB2kl9It89Uf2KxRFvmcjW5utMccw0fIeH+uei1Z+N98bQrbQ1iPr6ysj3/cC+yJf25EluO4W + x4peZ9q073mkFUAvQwt3wRQYM1hoIHf/TMAV8z0L6U6UIpVCGXJ2Yj6QF/M6B1JJWPl6sZKBFOwQsqDG + gxTyWmT0vQoZlKtEmuwHkbu8+Trze7jF+bYU+p5e4jRi8P8DJsM/cZ8f99kAAAAASUVORK5CYIIoAAAA + gAAAAAABAAABACAAAAAAAAAAAQDqFgAA6hYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8B + ////Af///xH///8v////UP///3H///+P////r////8f////c////7P////f////9///////////////9 + ////9////+z////c////x////6////+P////cf///1D///8v////Ef///wH///8B////Af///wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8B////Af///wr///8o////XP///5T////H////6f////b////+/////v////7///// + //////////////////////////////////////////////////////////////////////////7////+ + /////v////b////p////x////5T///9c////KP///wr///8B////Af///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8C////Ef///0z///+W////0v////T////+ + //////////7///////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+//////////7////0 + ////0v///5b///9M////Ef///wL///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8K + ////Uf///6X////o/////v////7///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////v////7////o////pf///1H///8K + ////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8A////Af///wP///8x////jf///+f////9/////v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+/////f///+f///+N////Mf///wP///8B////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wr///9K////uP////T////+ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////7////0////uP///0r///8K////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A + ////Af///wj///9V////xv////v////+//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+////+////8b///9V + ////CP///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wP///9L////y/////3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////3////L////S////wP///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///82 + ////uP////v///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////7////uP///zb///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wH///8T////jv////H////+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+////8f///47///8T + ////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8C////Sf///9b////+ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////v///9b///9J////Av///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8A////EP///5b////5//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////n///+W////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///zT////R/////v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////7////R////NP///wEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////AP///wX///9j////7P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////s////Y////wX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////jv////r///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////6 + ////jv///wf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A + ////Ff///7b////+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////+////tv///xX///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yD////F/////v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+////xf///yD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8n + ////0v////7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+////0v///yf///8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Jv///9z////+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////7////7/P7/6+/9/9jg+//B0fn/ + pMT4/5m99/+Yu/f/mr33/6XF9//C0vn/2OD7/+zv/f/7/P///v/////////+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+////3P///yb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yf////c + /////v////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////8/P// + 4ej8/6vF9/97pfT/UYbw/yxy7v8dZ+3/HGft/xlq7f8ia+3/JWzt/yZs7f8lbO3/Imvt/xpq7f8cZ+3/ + Hmft/y9z7v9RhvD/eqb0/67H+P/i6fz//P3///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////+ + ////3P///yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///8g////0v////7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////r7/v/T3/v/i6/1/0iD7/8obe3/I2vt/yJr7f8ka+3/I2vt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/yRr7f8ia+3/I2rt/yhu7f9LhPD/ + j7D1/9bh+//6+/7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////+////0v///yD///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////FP///8X////+ + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////v7///H1/v+owvf/T4fw/yRs7f8ha+3/ + JGvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNs7f8ia+3/J2zt/1OJ8P+rwvf/8/b+//7///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+////xf///xT///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////AP///wf///+2/////v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////H0/f+SsvX/Onfu/yFq7f8ja+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/JGzt/yFq7f83eO7/l7b2//L1/f////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+////tv///wf///8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////jv////7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////X3/v+ivPb/NHTu/yRr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8la+3/ + NXbu/6C99//4+f7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+////jv///wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////Af///2P////6//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////7+///J2Pr/ + TYXw/yZr7f8ja+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/JWvt/1GH8P/N2/r//f7///////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////6 + ////Y////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///80////6/////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////3+P7/i6z1/ylt7f8ka+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/JGzt/yxu7f+Or/X/9/n+//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////r////NP///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8A////EP///9H///////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////4Oj8/1OH8P8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f9TiPD/ + 5ev8//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////R////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///+W/////v////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////8HT+f83du7/I2vt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f86d+7/x9f6//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////7///+W////AgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8B////Sf////r///////////////////////////////////////////////////// + //////////////////////////////////////////////////////7+//+yx/j/K2/t/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJq6v8fY9v/GEyp/xZFmv8iaur/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yNr7f8wce7/tcr4//7+//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////r///9J////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///xP////W//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////sML3/ypt7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+z/IWfk/xtUuv8SOHv/Ch9E/wMLGf8DCBL/ + AgYN/xE2d/8iaur/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f8nbu3/rcT3//7+//////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////9b///8T + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8B////jv////7///////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////a4/v/OXju/yRr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFm4/8bVbz/ + EzyG/wohSP8DCBL/AwkU/wkcP/8RN3n/GlK2/yFn5P8aUbP/AwgS/w8vaf8haOf/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8jbO3/r8X4//7+//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////v///47///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zb////x//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////a4/v/OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8gZuL/HFjD/xRAjv8LI0//BA0d/wQLGf8IGjn/EDNx/xlQsP8fY9r/IWnp/yJr7f8ia+3/ + Imvt/yJr7f8bVLr/BA4e/w4rXv8hZ+T/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8rb+3/ + vc/5//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////8f///zb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8D////uP////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////W4Pv/ + O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8cWMP/DShZ/wYSJ/8DChX/BxYw/w8wav8YS6f/ + Hl/T/yFp6f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8cWMP/BhIn/wwkUP8gZuL/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f8zc+7/0d77//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////uP///wP///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///0v////7//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////W4fv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/xlPsP8DCBL/BhIn/xxYw/8iauv/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8eXc7/BhMq/wofRf8gZN3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yNr7f9Cfe//8fT9//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////7////S////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8I////yv////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/x1cy/8HFjL/BhQs/xtWv/8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8fYtj/ + BxYx/wgZOP8fYNX/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRs7f9olvL/+/z///////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////K////CP///wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///1X////9//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////Z4vv/OXju/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yBk3v8OK1//AwoX/xVDlf8iauv/Imvt/yJr7f8ia+3/Imvt/yJr7f8iaur/ + H2HX/xlNq/8QMm//Dy5m/yBl4P8ia+3/Imvt/yJr7f8fYtn/CR1A/wcVL/8eXtD/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yNq7f+mwvf///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////3///9V////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8K////xv////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6f8VQZD/ + AwkU/w8vZ/8gZuL/Imrr/yBl4P8aUbT/ETV2/wkdQf8EDBr/AwsX/wsiSv8GEyn/CR5D/yBj3P8ia+3/ + Imvt/yJr7f8gY9z/CyJL/wURJ/8dXMz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/zR27v/h6vz/ + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////8X///8K + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///0n////7//////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////X4fv/ + OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8bVLr/AwoV/wcXMv8KIEb/AwoV/wMIE/8KHkP/ + Ejl+/xpTt/8hZ+P/Imvt/x9h1/8HGDT/CBk4/x9g1f8ia+3/Imvt/yJr7f8gZuP/DCdW/wUOIP8cV8L/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/2+c8//+/v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////+////0n///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8D////uP////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////b4/v/OHju/yNr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IGbi/xtWv/8TPoj/ + CyFK/wMKF/8DChX/CRw+/xE1dv8aUbX/IGbi/yJq6/8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3f8JHkL/ + BhMr/x1czP8ia+3/Imvt/yJr7f8haej/Di1k/wQMG/8aUbT/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + J23t/8nX+v////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////uP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zH////0//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////Y4fv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/xdKo/8FDyH/AwgS/wgYNv8QMm//GU6s/x9h1v8haen/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3v8LI07/BRAk/x1byP8ia+3/Imvt/yFo5v8eX9P/ + CyRP/wMIE/8ZTq3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/VIzx//39//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////0////Mf///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8B////jf////7///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////V4Pv/Onju/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Hl3P/wgaOf8FDiD/ + G1W7/yJr7P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yBm4f8NKFj/BQ4g/xAzcf8MJlT/BxUv/wMLGP8CCBH/BREm/xQ9iP8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8eae3/ydj6//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////7///+N////AQAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr////m//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////Y4vv/OXju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IWfk/w8vZ/8CBw//FD+M/yJq6v8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8iauz/IWnp/yJr7f8ia+3/Imvt/yJq6v8PLmX/AAEC/wofRf8WRJb/ + G1a//yBj3P8iauz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRs7f9jk/H//P3///////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////+b///8K////AAAAAAAAAAAA + AAAAAAAAAAD///8A////Uf////3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////b5Pv/ + OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imrr/xZFmP8ECxn/DChY/yBl3/8ia+3/Imvt/yJr7f8ia+3/Imrr/x5g1P8YTKj/DzBr/wcWMP8GEyn/ + HFnF/yJr7f8ia+3/Imvt/yJq6v8RNXb/AwoW/xhLpv8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yRs7f/d5vz///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////f///1H///8AAAAAAAAAAAAAAAAAAAAAAP///wL///+l/////v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////f39/+bm5v/+/v7////////////X4fv/Onnu/yNr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xxXwf8HFzL/Bxcz/xxXwv8fY9v/ + GU+v/xAzcv8JGzv/BAsZ/wQNHv8KH0b/FD6K/w0qXP8EDR7/G1W8/yJr7f8ia+3/Imvt/yFp6f8SOX// + AggR/xdInv8iauz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JGvt/4qt9f////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+////pf///wIAAAAA + AAAAAAAAAAD///8A////Ev///+j///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////7+/v+rq6v/Ozs7/8zMzP////// + ///////////W4Pv/OXfu/yRr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+z/IWfk/xlOrf8DChb/AgcQ/wMLGP8AAQH/CR1A/xM7hP8NK1//F0ed/yJr7f8cWMP/ + EDFs/w8vaf8EDBr/GlCy/yJr7f8ia+3/Imvt/yJq6/8UP43/AgYO/xVCkv8ia+z/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/QX/v//f4/v////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////o////Ev///wAAAAAAAAAAAP///wD///9L/////v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////t7e3/zMzM/8zMzP/Pj4+/8jIyP/////////////////a4/v/OXju/yNs7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6P8bVb3/EzuC/wogRv8DCBP/AwkT/wkdQf8RNXb/ + GlGz/xdHnf8hZ+X/IGXg/xpTuP8dWsj/IGTe/x9i2P8YS6f/IGbh/xE0dP8DCRP/GEql/yJr7f8ia+3/ + Imvt/yJr7f8WRpv/AggR/xM7hP8ia+z/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + y9v6//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////7///9L + ////AAAAAAAAAAAA////Af///5b////+//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////8/Pz/85OTn/MjIy/zIyMv8zMzP/ + Pz8//8jIyP/////////////////b4/v/OHfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + FUKT/wEECP8EDR3/Dy9n/wUQJP8dW8r/Imrq/w4uZf8WRpv/Imvt/xlPsP8MJFH/Imvs/yFo5/8HGDX/ + HVzN/yJr7f8RNXb/FD6J/xM8hf8CCBH/FkWa/yFp6f8gZN7/HVvK/xhMp/8LIkv/AQIF/xM8hf8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f+Or/X///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////v///5b///8BAAAAAAAAAAD///8K////0v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////s7Oz/R0dH/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8vLy//+/v7////////////W4Pv/ + O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8hZuP/ETV1/wMIEv8TPIX/Hl7Q/x9h1v8aU7j/ + IGPc/yBl4f8ZTav/IWbj/x9i2f8cV8L/Hl3O/x9h1v8fYtr/GlGz/yBk3v8gZeH/GU+u/xM9hv8CBw// + CBg1/wUPIf8DChf/BA4f/wkcPv8OLWT/GlK1/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + JGzt/1GI8P/+/v////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////0v///woAAAAA////AP///yf////0//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////Pz8/21tbf8zMzP/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4fv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+z/F0mh/wMKFf8MJVL/GEqk/xAxbf8iauz/IWfj/wsjTf8gZN3/Imvt/xM7gv8XSJ7/ + Imvt/xxXv/8OLGH/Imvt/yFo5v8NKVr/HVzN/xZGm/8CBQr/DCRQ/x5dzv8haOX/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/K2/u/+/y/f////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////0////J////wD///8B////XP////7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////+qqqr/Li4u/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP////// + ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/HVzL/wgaOP8FESX/ + G1W9/xQ+iv8ZULH/Imvt/xxXwf8SOHz/Imvs/yFp6P8PL2f/H2HW/yJr7f8WRJf/GEul/yJr7f8eXtD/ + EDJu/xhLpf8DChX/EDNy/yFq6v8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8fa+3/ydj6//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////7///9c////Af///wH///+U//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////5OTk/z8/P/8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////Z4vv/OXju/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IGXg/w8uZv8DChf/DSlc/xxaxv8gZN//Hl/T/xhKpf8hZ+P/ + IWfl/xZFmP8gZN7/IGXg/xpTt/8cV8H/IGXf/x9j3P8WRpz/IGbi/xlOrP8EDBv/Dy9n/yFn5P8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f+eu/b//v////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////5T///8B////Af///8f////+ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////7+/v91dXX/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imrr/xVDlP8DChf/DCdX/wcVL/8fYtj/Imvt/xAzcv8VQZD/Imvt/xpStv8LIkv/Imvt/yFn5P8KHkT/ + HFrI/yJr7f8SOoD/Ejl//xtWv/8EDBv/DSpc/yBm4v8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/3ym9P////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+////xv///wH///8R////6f////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////zs7O/zExMf8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/////////////////X4fv/ + OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xxXwP8GEyv/BA0d/xtUuv8bVr// + H2Pc/yBm4v8aU7f/IGbi/x9g1f8dW8r/Hl/S/x5f0/8gZuH/GlO3/yBk3v8gZN7/GlO4/xtWvv8FESb/ + CyJM/yFn5P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/WZHx//7+//////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////p////Ef///y/////2 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////7+/v9kZGT/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pj4+/8fHx//////////////////b4/v/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yBk3f8NKFn/AQIE/wgbO/8iaur/IWjn/wsiTP8eXtD/Imvt/xM8hf8WRJb/ + Imvt/x1ayP8MJ1X/HV3O/xlQsv8EDRz/CyNM/wcVL/8AAAH/DzBq/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yNr7f9Lge///f7///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////b///8v////UP////7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////0dHR/y0tLf8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/ + ///////////Y4vv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6f8UPon/ + AwoW/wsjTv8ZT6//Imnp/xxZxv8RNnn/GlO5/xVDlf8OLWT/CiBG/wURJf8ECxn/BA0c/wcXMv8MJ1f/ + EzqC/xhLp/8fYdj/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/zt47v/9/v// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////v///1D///9x + /////v////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////39/f9ra2v/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8aUbT/BRAk/wYULf8LI0z/BQ8h/wEDBv8DCBP/ + BhQs/wskUP8SOHz/F0mi/xxYw/8fY9v/Imrr/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/LnPt//z8//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+////cf///4/////+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////5OTk/zMzM/8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + Pj4+/8rKyv/////////////////Y4vv/OHju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8fYtn/DSpd/xAxbf8XR57/HFnE/yBl4P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8lcO3/ + +fv+//////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////7///+P + ////r/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////+UlJT/Li4u/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx//////////////////b5Pv/ + OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yVv7f/5+v7///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////6/////H//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////+fn5/1JSUv8zMzP/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7////////////X4fv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + LHLt//v8//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////x////9z///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////X19f/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/ + ///////////W4Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f84d+7//f7///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////c////7P////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////5+fn/8uLi7/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8nJyf/////////////////a4/v/OXju/yRs7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + I2vt/0h/7//9/v////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////+z////3//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////+/v7/YWFh/zQ0NP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + Pz8//8jIyP/////////////////b5Pv/N3fu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/V43x//7+//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////9/////3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////b29v87Ozv/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7////////////W4Pv/ + O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f90ovP///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////9//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////3d3d/y0tLf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4Pv/OHfu/yNs7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JWvt/5m39v/+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////+vr6//MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP////// + ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8fa+3/wdT5//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////5GRkf8xMTH/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////a4/v/OXju/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/ydu7f/q7v3///////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////9////9/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////eXl5/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ka+3/RoLv//39//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////f////s//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////7+/v9cXFz/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/////////////////X4fv/ + OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f+BqPT///////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////7P///9z///// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////f39/1JSUv8zMzP/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pj4+/8fHx//////////////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/IWrt/8PU+f////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////c////x/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////9/f3/SUlJ/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/ + ///////////Y4vv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f85ee7/8vX+//////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////8f///+v + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////39/f9FRUX/ + MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/JGzt/3ej8/////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////r////4/////+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////f39/0VFRf8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + Pj4+/8rKyv/////////////////Y4vv/OHju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8gau3/1N77//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////7///+P + ////cf////7///////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////9/f3/ + SkpK/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx//////////////////b4/v/ + OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/I2vt/1eK8f/6+/////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////v///3H///9Q/////v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////39/f9UVFT/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7////////////X4fv/O3ju/yNr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8gau3/tcv4//////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////+ + ////UP///y/////2//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /v7+/15eXv8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NDQ0/zY2Nv83Nzf/ODg4/zc3N/82Njb/ + NDQ0/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/ + ///////////W4Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/I2vt/0OA7//7/P////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////b///8v////Ef///+n///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////f39//zExMf8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9CQkL/ + c3Nz/6Ojo//MzMz/5+fn//b29v/8/Pz/+Pj4/+vr6//V1dX/s7Oz/4aGhv9VVVX/NTU1/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8nJyf/////////////////Z4vv/OXju/yRs7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ka+3/tsz5//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////6f///xH///8B////x/////7///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////7+/v+Wlpb/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zMzM/9YWFj/rKys/+vr6//7+/v/7+/v/9fX1/+7u7v/qqqq/6SkpP+oqKj/ + tbW1/87Ozv/m5ub/+fn5//f39//T09P/f39//z8/P/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + Pz8//8fHx//////////////////b5Pv/OHfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/I2vt/1+P8f/7/P////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////7////G////Af///wH///+U//////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////7a2tv8wMDD/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9JSUn/q6ur//Pz8//y8vL/ + u7u7/3Z2dv9KSkr/OTk5/zMzM/8yMjL/MjIy/zIyMv8yMjL/NjY2/0FBQf9fX1//mJiY/9zc3P/6+vr/ + 29vb/3Z2dv81NTX/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7////////////W4fv/ + O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8scO3/1OD7//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////5T///8B////Af///1z////+//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////4eHh/ywsLP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/Z2dn/+Pj4//6+vr/srKy/1RUVP8zMzP/MjIy/zIyMv8yMjL/MzMz/z8/P/9ERET/ + QEBA/zQ0NP8yMjL/MjIy/zIyMv8yMjL/Ozs7/3d3d//c3Nz/+vr6/6ysrP87Ozv/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4Pv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imrt/4+x9f/+/v////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////+////XP///wH///8A////J/////T///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////5+fn/QEBA/zMzM/8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NDQ0/4CAgP/4+Pj/4ODg/2dnZ/8yMjL/ + MjIy/zIyMv8yMjL/Ozs7/4WFhf/Q0ND/9PT0//39/f/39/f/19fX/5SUlP9BQUH/MjIy/zIyMv8yMjL/ + MjIy/zs7O/+fn5//+fn5/8vLy/9ERET/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP////// + ///////////b4/v/OXju/yRr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f9SifD/+Pr+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////T///8n////AAAAAAD///8K////0v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////9ra2v/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zMzM/+Hh4f/+Pj4/8vLy/9JSUn/MjIy/zIyMv8yMjL/MjIy/1NTU//S0tL/+/v7/9nZ2f+pqan/ + lJSU/6SkpP/S0tL/+fn5/9/f3/9iYmL/MjIy/zIyMv8yMjL/MjIy/zQ0NP97e3v/9fX1/8nJyf9BQUH/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////a4/v/OXfu/yNr7f8ia+3/ + Imvt/yJr7f8ia+3/M3Tu/+Lp/P////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////0v///woAAAAAAAAAAP///wH///+W + /////v////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////6ioqP8tLS3/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/cHBw//T09P/Nzc3/QUFB/zIyMv8yMjL/ + MjIy/zIyMv9MTEz/39/f//Dw8P9+fn7/Ozs7/zIyMv8yMjL/MjIy/zg4OP9ubm7/5ubm/+zs7P9dXV3/ + MjIy/zIyMv8yMjL/MjIy/zIyMv94eHj/9fX1/66urv80NDT/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + PT09/8vLy//+/v7////////////W4Pv/Onnu/yNr7f8ia+3/Imvt/ytu7f+6zvn///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////7///+W////AQAAAAAAAAAA////AP///0v////+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////3t7e/zExMf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/0dHR//o6Oj/39/f/0dHR/8yMjL/MjIy/zIyMv8yMjL/NDQ0/7y8vP/19fX/Z2dn/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/7Ozs/9TU1P86Ojr/MjIy/zIyMv8yMjL/MjIy/zIyMv+Xl5f/ + +vr6/3BwcP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8vLy//////////////////X4fv/ + OXfu/yRs7f8ja+3/orz3//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////v///0v///8AAAAAAAAAAAD///8A + ////Ev///+j///////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////8/Pz/ + WVlZ/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/rq6u//f39/9nZ2f/MjIy/zIyMv8yMjL/ + MjIy/zIyMv9dXV3/9/f3/6CgoP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+EhIT/ + +/v7/3d3d/8yMjL/MjIy/zIyMv8yMjL/MjIy/zw8PP/T09P/1tbW/zg4OP8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/PT09/8jIyP/////////////////b5Pv/OXju/5Oy9f/9/f////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////o////Ev///wAAAAAAAAAAAAAAAAD///8C////pf////7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////+lpaX/LS0t/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/0tLS//19fX/tbW1/zU1Nf8yMjL/MjIy/zIyMv8yMjL/MjIy/5aWlv/19fX/V1dX/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/0VFRf/q6ur/srKy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/3p6ev/9/f3/YmJi/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP////// + ///////////n7f3/+/z///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////v///6X///8CAAAAAAAAAAAAAAAA + AAAAAP///wD///9R/////f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////+vr6/85OTn/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/h4eH//39/f9iYmL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/s7Oz/+bm5v8/Pz//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + NTU1/8zMzP/W1tb/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/Q0ND//Hx8f+bm5v/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////9////Uf///wAAAAAAAAAAAAAAAAAAAAAA////AP///wr////m//////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////v7+/3Z2dv80NDT/MjIy/zIyMv8yMjL/ + MjIy/zIyMv+VlZX/+/v7/09PT/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+3t7f/5OTk/z09Pf8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv80NDT/x8fH/9nZ2f8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv9CQkL/7+/v/6SkpP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + Pj4+/8rKyv////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////+b///8K////AAAAAAAAAAAA + AAAAAAAAAAAAAAAA////Af///43////+//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////4eHh/ykpKf8yMjL/MjIy/zIyMv8yMjL/MjIy/2NjY//+/v7/hISE/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/5+fn//x8fH/TU1N/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/z8/P//j4+P/vb29/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/4KCgv/9/f3/ZGRk/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx/////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+////jf///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Mf////T///// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////cXFx/zExMf8yMjL/ + MjIy/zIyMv8yMjL/OTk5/9vb2//W1tb/Pj4+/zIyMv8yMjL/MjIy/zIyMv8yMjL/bGxs//r6+v+Li4v/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/b29v//r6+v+Hh4f/MjIy/zIyMv8yMjL/ + MjIy/zIyMv9ERET/3t7e/9HR0f83Nzf/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////T///8x////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8D////uP////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////b29v/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/fn5+//v7+/+QkJD/ + MjIy/zIyMv8yMjL/MjIy/zIyMv85OTn/1NTU/+jo6P9LS0v/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/z8/P//X19f/5+fn/0VFRf8yMjL/MjIy/zIyMv8yMjL/NDQ0/6urq//5+fn/aGho/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////uP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9J + ////+/////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////+Li4v/ + MTEx/zIyMv8yMjL/MjIy/zIyMv82Njb/xMTE//X19f9sbGz/MjIy/zIyMv8yMjL/MjIy/zIyMv9iYmL/ + 8vLy/9ra2v9WVlb/MjIy/zIyMv8yMjL/MjIy/zIyMv9JSUn/ysrK//n5+f95eXn/MjIy/zIyMv8yMjL/ + MjIy/zIyMv+NjY3/+vr6/52dnf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8nJyf////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////v///9J////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr////G//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////+/v7/9FRUX/MzMz/zIyMv8yMjL/MjIy/zIyMv9JSUn/ + 2tra/+/v7/9qamr/MzMz/zIyMv8yMjL/MjIy/zMzM/9xcXH/7e3t//Pz8/+xsbH/d3d3/2NjY/9ycnL/ + paWl/+3t7f/z8/P/hoaG/zQ0NP8yMjL/MjIy/zIyMv82Njb/jo6O//n5+f+2trb/Ojo6/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + Pz8//8fHx/////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////xv///wr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////Af///1X////9//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////8HBwf8vLy//MjIy/zIyMv8yMjL/MjIy/zIyMv9VVVX/3t7e//Pz8/+Hh4f/ODg4/zIyMv8yMjL/ + MjIy/zIyMv9SUlL/tLS0/+7u7v/7+/v//f39//z8/P/y8vL/wsLC/19fX/8zMzP/MjIy/zIyMv8yMjL/ + QUFB/6qqqv/5+fn/tra2/z4+Pv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////3///9V////AQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////CP///8r///////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////f39/4KCgv8zMzP/MjIy/zIyMv8yMjL/ + MjIy/zIyMv9LS0v/z8/P//v7+//AwMD/WVlZ/zMzM/8yMjL/MjIy/zIyMv8zMzP/R0dH/2lpaf91dXX/ + bW1t/0tLS/80NDT/MjIy/zIyMv8yMjL/NTU1/3Fxcf/a2tr/+vr6/56env84ODj/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8zMzP/Pj4+/8zMzP////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////yv///wj///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8B////S/////v///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////+Pj4/1ZWVv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv86Ojr/mpqa//Ly8v/6+vr/ + vr6+/3Nzc/9DQ0P/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv80NDT/R0dH/4CAgP/R0dH/ + /f39/9ra2v9tbW3/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////v///9L////AQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////uP////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////4uLi/0ZGRv8zMzP/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/UlJS/6qqqv/r6+v/+/v7/+zs7P/IyMj/paWl/4eHh/93d3f/ + cnJy/3Z2dv+Hh4f/p6en/8zMzP/w8PD/+fn5/9ra2v+Hh4f/Pj4+/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////uP///wP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///82////8f////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////y8vL/zs7O/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/0hISP97e3v/tbW1/9/f3//z8/P/+fn5//z8/P/9/f3//Pz8//j4+P/x8fH/1tbW/6enp/9qamr/ + PDw8/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ + PT09/8vLy//+/v7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////H///82////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///+O + /////v////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + xMTE/zU1Nf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NjY2/0ZGRv9ZWVn/ + ZGRk/2hoaP9kZGT/WFhY/0JCQv81NTX/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+////jv///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///xP////W//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////w8PD/zg4OP8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8vLy//nJyc//////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////9b///8T////AAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////Af///0n////6//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////xsbG/z09Pf8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MzMz/6Kiov/8/Pz///////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////6////Sf///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///5b////+//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////09PT/01NTf8zMzP/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MzMz/zw8PP+zs7P//v7+//////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////v///5b///8CAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8A////EP///9H///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////7+/v/2ZmZv8vLy//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/9MTEz/1dXV//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////R////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////NP///+v///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + +/v7/6CgoP87Ozv/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/8zMzP/ + fHx8//Ly8v////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////6////zT///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Y/////r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////v7+/9nZ2f9gYGD/MzMz/zMzM/8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/TU1N/7y8vP/8/Pz///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////r///9j////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E + ////jv////7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////v7+/+ysrL/SEhI/zExMf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ODg4/5WVlf/x8fH/ + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////+////jv///wQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////tv////7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////29vb/ + paWl/0tLS/8tLS3/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zMzM/8wMDD/Ozs7/4eHh//s7Oz///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////v///7b///8H////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8U////xf////7///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////9/f3/7e3t/9iYmL/MzMz/y8vL/8zMzP/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MzMz/zIyMv8wMDD/T09P/6Ghof/u7u7//v7+//////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////7////F////FP///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8g////0v////7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////v7+//c3Nz/mZmZ/1dXV/8zMzP/MDAw/zExMf8zMzP/MzMz/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/8yMjL/MDAw/y8vL/9KSkr/ + iIiI/87Ozv/4+Pj///////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////+ + ////0v///yD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///8n////3P////7///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /f39/+fn5/+0tLT/iIiI/1lZWf87Ozv/Jycn/yUlJf8pKSn/MjIy/zMzM/80NDT/MzMz/zIyMv8uLi7/ + JSUl/yYmJv81NTX/UVFR/3x8fP+oqKj/3d3d//v7+/////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////v///9z///8n////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8m + ////3f////7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////v7+//z8/P/u7u7/ + 29vb/8bGxv+vr6//nZ2d/5iYmP+ampr/qKio/8HBwf/W1tb/6enp//n5+f////////////7+/v////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////7////c + ////Jv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8n////0v////7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+////0v///yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8g////xf////7///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////v///8X///8g + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8V////tv////7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////7///+2////Ff///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///8H////jv////r///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////6////jv///wf///8A + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8F + ////Y////+z///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////7P///2P///8F////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////NP///9H////+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////v///9H///80////AQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8A////EP///5b////5//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////n///+W////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Av///0n////W + /////v////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////7////W////Sf///wL///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///xP///+O////8f////7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////7////x + ////jv///xP///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////AP///wH///82////uP////v///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////7////uP///zb///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////S////8v////9 + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////9////y////0v///8D + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///8B////CP///1X////G////+/////7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////7////7////xv///1X///8I////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A + ////Af///wr///9K////uP////T////+//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////7////0////uP///0r///8K////Af///wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8D////Mf///43////n + /////f////7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////v////3////n + ////jf///zH///8D////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wr///9R////pf///+j////+/////v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+/////v///+j///+l////Uf///wr///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////AP///wH///8C////Ef///0z///+W////0v////T////+//////////7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////+//////////7////0////0v///5b///9M////Ef///wL///8B + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wH///8K + ////KP///1z///+U////x////+n////2/////v////7////+//////////////////////////////// + ///////////////////////////////////////////////+/////v////7////2////6f///8f///+U + ////XP///yj///8K////Af///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wH///8B////Ef///y////9Q + ////cf///4////+v////x////9z////s////9/////3///////////////3////3////7P///9z////H + ////r////4////9x////UP///y////8R////Af///wH///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA + AAD///////////////AAAAAAD/////////////+AAAAAAAH////////////+AAAAAAAAf/////////// + 8AAAAAAAAA///////////8AAAAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB///// + ////+AAAAAAAAAAAH/////////AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////gAAAAAAAAAAA + Af///////wAAAAAAAAAAAAD///////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAA + AAAAAAAP/////+AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAA + AAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAB////8AAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAB// + //gAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAA + AAAD///AAAAAAAAAAAAAAAAAA///gAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAA + AAAAAAAAAP/+AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD/4AAAA + AAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP + 8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAA + AAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAA + AAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAB + gAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAA + AAAAA+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAA + AAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAA + AAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAAD/ + /wAAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAA + AAAD///gAAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAf///4AAAAAAAA + AAAAAAAAH////AAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAA/////4AA + AAAAAAAAAAAAAf/////AAAAAAAAAAAAAAAP/////4AAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAD/// + ///4AAAAAAAAAAAAAB///////AAAAAAAAAAAAAA///////8AAAAAAAAAAAAA////////gAAAAAAAAAAA + Af///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////////4AAAAA + AAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////wAAAAAAAAD/////////// + /gAAAAAAAH////////////+AAAAAAAH/////////////8AAAAAAP//////////////8AAAAA//////// + KAAAAEAAAACAAAAAAQAgAAAAAAAAQAAA6hYAAOoWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8A////A////yH///9X////iP///6/////P////6P////j////+/////v////j////o + ////z////6////+I////V////yH///8D////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////AP///wP///8+////kf///9n////8//////////////////////////////// + ///////////////////////////////////////////////8////2f///5H///8+////A////wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Ff///3j////c/////v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////v///9z///94////Ff///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8U////if////D///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////D///+J////FP///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wX///9u////7P////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////+z///9u + ////BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yr////G + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////8b///8q////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////Af///2H////z//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////8////2H///8BAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////Bf///5L////+//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////+ + ////kv///wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///63///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////+t////CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///7f///////////////////// + //////////////////////////////////////////////////////f4/v/J2vr/nbz3/3+n9P9om/P/ + X5Ty/2KW8v90ofP/jbH1/7LK+P/k6/z//v7///////////////////////////////////////////// + /////////////////////////////////////////////////////////7f///8KAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Bf///63///// + ///////////////////////////////////////////////////////////7/P//vNH5/2mZ8v8tcu7/ + Imvt/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JGzt/0iD8P+TtPb/5+79//////////// + //////////////////////////////////////////////////////////////////////////////// + ////rf///wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////Af///5L///////////////////////////////////////////////////////////39//+yyfj/ + RYDv/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/ydu7f95o/T/5e39//////////////////////////////////////////////////////////// + //////////////////////////////+S////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////AP///2H////+//////////////////////////////////////////////// + /////9/o/P9ZjfH/I2vt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/y9y7v+hvff//f7///////////////////////////// + /////////////////////////////////////////////////////v///2H///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yr////z//////////////////////////////// + /////////////////////7bM+f8vcu7/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/2WW8v/x9f7/ + ///////////////////////////////////////////////////////////////////////////////z + ////KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wX////G//////////////// + /////////////////////////////////////6K99/8kbO3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3v8YS6b/DzFs/xM7gv8ia+z/ + Imvt/yJr7f8ia+3/TIXw/+rw/f////////////////////////////////////////////////////// + /////////////////////////8b///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9u + //////////////////////////////////////////////////////////+7z/n/KG7t/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBl4P8ZTq7/ETV1/w0qXv8QMWz/ + F0qj/yBk3f8WRpv/ETRz/yJq6/8ia+3/Imvt/yJr7f9Ig/D/7vP9//////////////////////////// + ////////////////////////////////////////////////////bv///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8U////7P////////////////////////////////////////////////////////// + /////7nO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xE2d/8LIUr/ + Fked/x9g1f8ia+z/Imvt/yJr7f8ia+3/Imvt/xhMqf8PL2j/IWnp/yJr7f8ia+3/Imvt/1qO8f/8/P// + /////////////////////////////////////////////////////////////////////////+z///8U + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////if////////////////////////////////////////// + ////////////////////////////////u8/5/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8hZ+T/Dy5n/xZElv8ia+z/Imvt/yJr7f8haOf/G1W9/x1ayP8ia+3/GlG0/w4rX/8haOb/ + Imvt/yJr7f8ja+3/i6/1//////////////////////////////////////////////////////////// + ////////////////////if///wAAAAAAAAAAAAAAAAAAAAAA////Ff////D///////////////////// + //////////////////////////////////////////////////////////+6zvn/KG7t/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7P8VQpP/Di1k/xQ+if8OK2D/Di1k/xQ/jP8NKl7/ + GlK1/yJr7f8bVr7/DSla/yBm4v8ia+3/Imvt/ydu7f/T4fv///////////////////////////////// + //////////////////////////////////////////D///8VAAAAAAAAAAAAAAAA////AP///3j///// + //////////////////////////////////////////////////////////////////////////////// + /////7rP+f8pbu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xhKpf8OLWT/Ditf/xM8hf8cV8H/ + Imrq/yJr7f8ia+3/IWnp/w8uZv8YTKn/Imvt/xxXwf8LIkz/IGTd/yJr7f8ia+3/Wo/x//7///////// + ////////////////////////////////////////////////////////////////////eP///wAAAAAA + AAAAAP///wP////c//////////////////////////////////////////////////////////////// + ////////////////////////////////us75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8aUrb/ + DCZU/x5g1P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7P8iaur/EDNy/woeQ/8PLmf/EjqA/x5g1P8ia+3/ + Imvt/yFr7f/K2vr///////////////////////////////////////////////////////////////// + /////////9z///8DAAAAAAAAAAD///8+/////v////////////////////////////////////////// + ////////////////////////////////////////////////+Pj4//////+6z/n/KW/t/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/x9h1/8NKFn/GVCw/x9i2f8XSaH/EDFt/w0pW/8NKVr/IGXh/yJr7P8SOH3/ + FUGR/yJr7f8ia+3/Imvt/yJr7f8ia+3/bJvz//////////////////////////////////////////// + ///////////////////////////////+////PgAAAAD///8A////kf////////////////////////// + ////////////////////////////////////////////////////////////////7e3t/1NTU/+0tLT/ + /////7rO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yBl4P8YTKj/EDJu/wgZN/8NKVr/F0mi/xdIn/8fYtn/ + FkSX/wwmVf8fY9v/Imvt/xQ+iP8TPIX/Imvt/yJr7f8ia+3/Imvt/ypw7f/w9P7///////////////// + /////////////////////////////////////////////////////////5H///8A////A////9n///// + //////////////////////////////////////////////////////////////////////////////// + +vr6/2BgYP8yMjL/NjY2/7S0tP//////us75/ylv7f8ia+3/Imvt/yJr7f8SOHz/CiBH/xhLpf8bU7n/ + HFnF/xlPr/8fYtn/GU6t/xtVvf8YS6f/CyRQ/xM9h/8PMGr/CRs8/xxZxf8ia+3/Imvt/yJr7f8ia+3/ + t835///////////////////////////////////////////////////////////////////////////Z + ////A////yH////8//////////////////////////////////////////////////////////////// + /////////////////////5CQkP8yMjL/MjIy/zIyMv81NTX/tLS0//////+6zvn/KW7t/yJr7f8ia+3/ + Imvt/xZGnP8MJlX/GEyo/xpRtP8cV8L/G1W9/xtUuv8aUbT/GlK1/xhNqf8KH0X/HFjE/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/4Cp9P////////////////////////////////////////////////////// + /////////////////////P///yH///9X//////////////////////////////////////////////// + /////////////////////////////////////9XV1f81NTX/MjIy/zIyMv8yMjL/MjIy/zY2Nv+0tLT/ + /////7rO+f8pbu3/Imvt/yJr7f8ia+3/HVrI/wogR/8UP4v/Hl7P/xpRsv8cWsb/GlG0/xpQsv8dXMv/ + F0qj/w0nV/8cWMT/Imvt/yJr7f8ia+3/Imvt/yJr7f9YjvH///////////////////////////////// + //////////////////////////////////////////////9X////iP////////////////////////// + //////////////////////////////////////////////////////////9lZWX/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/NTU1/7S0tP//////us/5/yhu7f8ia+3/Imvt/yJr7f8gZuL/Ditg/xAybv8hZ+T/ + GU6t/xxZxP8dW8r/GU6t/x5dz/8RNnj/BhIo/x1byv8ia+3/Imvt/yJr7f8ia+3/Onrv//7///////// + ////////////////////////////////////////////////////////////////////iP///6////// + ///////////////////////////////////////////////////////////////////////////Ozs7/ + MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv82Njb/tLS0//////+6zvn/KW7t/yJr7f8ia+3/ + Imvt/yJr7P8VQZD/DCZT/xM9h/8MJVP/DSpd/w4sYv8RNXX/FkWY/xxXwf8haej/Imvt/yJr7f8ia+3/ + Imvt/ytw7f/+/v////////////////////////////////////////////////////////////////// + /////////6/////P//////////////////////////////////////////////////////////////// + ////////////////dnZ2/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+zs7P/ + /////7vP+f8obu3/Imvt/yJr7f8ia+3/Imvt/xxYxP8bVLn/IGXg/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8kbe3//P3///////////////////////////////////////////// + ///////////////////////////////P////6P////////////////////////////////////////// + ////////////////////////////////9PT0/zo6Ov8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/NTU1/7S0tP//////uc75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/KnDt//7+//////////////////////// + ////////////////////////////////////////////////////6P////j///////////////////// + /////////////////////////////////////////////////////7+/v/8xMTH/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz//////+7z/n/KG7t/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/zp57v/+/v// + //////////////////////////////////////////////////////////////////////////j////+ + //////////////////////////////////////////////////////////////////////////+Pj4// + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+1tbX/ + /////7nO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f9VjPH///////////////////////////////////////////////////////////////// + ///////////////+/////v////////////////////////////////////////////////////////// + ////////////////aWlp/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/NTU1/7Ozs///////u8/5/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/fKf0//////////////////////////////////////////// + /////////////////////////////////////v////j///////////////////////////////////// + /////////////////////////////////////09PT/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/tbW1//////+5zvn/KG7t/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/7HJ+P////////////////////// + //////////////////////////////////////////////////////////j////o//////////////// + //////////////////////////////////////////////////////7+/v9AQED/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+zs7P/ + /////7vP+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yhu7f/t8v3/ + ///////////////////////////////////////////////////////////////////////////////o + ////z//////////////////////////////////////////////////////////////////////+/v7/ + PDw8/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/NTU1/7S0tP//////us75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f9klvL///////////////////////////////////////////////////////////////// + ////////////////////z////6////////////////////////////////////////////////////// + /////////////////v7+/0FBQf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz//////+6z/n/KW7t/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/wdT6//////////////////////////////////////////// + /////////////////////////////////////////6////+I//////////////////////////////// + //////////////////////////////////////////9QUFD/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/RkZG/3V1df+SkpL/mZmZ/4uLi/9oaGj/Ozs7/zIyMv8yMjL/MjIy/zU1Nf+0tLT/ + /////7rO+f8pbu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/UInw//7+//////////////////////// + //////////////////////////////////////////////////////////////+I////V/////////// + ////////////////////////////////////////////////////////////////bGxs/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv9WVlb/urq6/8bGxv+SkpL/c3Nz/2xsbP97e3v/oKCg/8/Pz/+lpaX/ + RERE/zIyMv8yMjL/NjY2/7S0tP//////us75/ylv7f8ia+3/Imvt/yJr7f8ia+3/JWzt/8va+v////// + //////////////////////////////////////////////////////////////////////////////// + ////V////yH////8//////////////////////////////////////////////////////////////// + /////5KSkv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+EhIT/ycnJ/1paWv8yMjL/SUlJ/42Njf+enp7/ + dHR0/zY2Nv80NDT/cHBw/9DQ0P9fX1//MjIy/zIyMv81NTX/tLS0//////+6zvn/KG7t/yJr7f8ia+3/ + Imvt/3+n9P////////////////////////////////////////////////////////////////////// + /////////////////////P///yH///8D////2f////////////////////////////////////////// + ///////////////////////////ExMT/MTEx/zIyMv8yMjL/MjIy/zIyMv+Hh4f/tLS0/zg4OP8yMjL/ + bGxs/8/Pz/98fHz/Z2dn/5ycnP/FxcX/PT09/zIyMv9FRUX/y8vL/1VVVf8yMjL/MjIy/zY2Nv+0tLT/ + /////7rO+f8pb+3/Imvt/0+H8P/4+f7///////////////////////////////////////////////// + /////////////////////////////////////////9n///8D////AP///5H///////////////////// + ////////////////////////////////////////////////9vb2/zw8PP8yMjL/MjIy/zIyMv9WVlb/ + ycnJ/zc3N/8yMjL/PT09/9LS0v8/Pz//MjIy/zIyMv8yMjL/fX19/6CgoP8yMjL/MjIy/05OTv/FxcX/ + NDQ0/zIyMv8yMjL/NTU1/7S0tP//////us/5/0WA7//n7v3///////////////////////////////// + //////////////////////////////////////////////////////////////+R////AAAAAAD///8+ + /////v////////////////////////////////////////////////////////////////////99fX3/ + MjIy/zIyMv8yMjL/sbGx/2BgYP8yMjL/MjIy/2tra/+cnJz/MjIy/zIyMv8yMjL/MjIy/zc3N//Pz8// + MjIy/zIyMv8yMjL/q6ur/1hYWP8yMjL/MjIy/zIyMv81NTX/tLS0///////4+v7///////////////// + ///////////////////////////////////////////////////////////////////////////////+ + ////PgAAAAAAAAAA////A////9z///////////////////////////////////////////////////// + ////////////////1dXV/zAwMP8yMjL/MjIy/7y8vP9OTk7/MjIy/zIyMv9ubm7/mJiY/zIyMv8yMjL/ + MjIy/zIyMv82Njb/0NDQ/zIyMv8yMjL/MjIy/6ysrP9bW1v/MjIy/zIyMv8yMjL/MjIy/zU1Nf+0tLT/ + //////////////////////////////////////////////////////////////////////////////// + ////////////////////3P///wMAAAAAAAAAAP///wD///94//////////////////////////////// + //////////////////////////////////////////9sbGz/MjIy/zIyMv9xcXH/qKio/zIyMv8yMjL/ + QkJC/9DQ0P84ODj/MjIy/zIyMv8yMjL/bm5u/6urq/8yMjL/MjIy/1VVVf/ExMT/MzMz/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/NTU1/7S0tP////////////////////////////////////////////////////// + /////////////////////////////////////////3j///8AAAAAAAAAAAAAAAAA////Ff////D///// + ////////////////////////////////////////////////////////////////3t7e/zc3N/8yMjL/ + MzMz/7e3t/9+fn7/MjIy/zIyMv9+fn7/xMTE/2NjY/9OTk7/g4OD/8/Pz/9ERET/MjIy/0pKSv/Ozs7/ + T09P/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz//////////////////////////// + //////////////////////////////////////////////////////////D///8VAAAAAAAAAAAAAAAA + AAAAAP///wD///+J//////////////////////////////////////////////////////////////// + //////////+cnJz/MjIy/zIyMv87Ozv/u7u7/5+fn/88PDz/MjIy/1tbW/+mpqb/t7e3/42Njf89PT3/ + MzMz/29vb//Pz8//V1dX/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+1tbX/ + //////////////////////////////////////////////////////////////////////////////+J + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////FP///+z///////////////////////////////////// + /////////////////////////////////f39/2xsbP8yMjL/MjIy/zQ0NP+EhIT/09PT/6enp/91dXX/ + WFhY/1NTU/9kZGT/jo6O/8nJyf+np6f/QUFB/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/NTU1/7Ozs/////////////////////////////////////////////////////// + ///////////////s////FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9u//////////////// + ///////////////////////////////////////////////////////////y8vL/WVlZ/zIyMv8yMjL/ + MjIy/zg4OP9lZWX/k5OT/62trf+xsbH/oaGh/3l5ef9CQkL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/tbW1//////////////////////////// + ////////////////////////////////////bv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////Bf///8b///////////////////////////////////////////////////////////////////// + //////Dw8P9bW1v/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/5qamv////// + ////////////////////////////////////////////////////xv///wUAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8q////8/////////////////////////////////////////// + ////////////////////////////////9PT0/3V1df8xMTH/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + OTk5/7Gxsf//////////////////////////////////////////////////////////8////yoAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///2H////+//////////////// + ///////////////////////////////////////////////////////////+/v7/rKys/z4+Pv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/XFxc/9ra2v////////////////////////////////////////////////////// + /////v///2H///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B + ////kv////////////////////////////////////////////////////////////////////////// + ///////////r6+v/hYWF/zc3N/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv9KSkr/rq6u//v7+/////////////////////////////////////// + /////////////////////////5L///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wX///+t//////////////////////////////////////////////// + ///////////////////////////////////////////r6+v/m5ub/1VVVf8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8xMTH/ODg4/25ubv+6urr/+vr6//////////////////////////// + /////////////////////////////////////////63///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///7f///////////////////// + ///////////////////////////////////////////////////////////////////////////+/v7/ + 5ubm/7e3t/+Tk5P/fHx8/2xsbP9mZmb/cnJy/4ODg/+fn5//yMjI//X19f////////////////////// + /////////////////////////////////////////////////////////7f///8KAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K + ////rf////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////63///8K + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wX///+S/////v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////v///5L///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///2H////z//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////8////2H///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A + ////Kv///8b///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////xv///yr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8F////bv///+z///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////s////bv///wUAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8U////if////D///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////D///+J////FP///wAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8V////eP///9z////+//////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+////3P///3j///8V + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////Pv///5H////Z/////P////////// + /////////////////////////////////////////////////////////////////////P///9n///+R + ////Pv///wP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A + ////A////yH///9X////iP///6/////P////6P////j////+/////v////j////o////z////6////+I + ////V////yH///8D////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///wAAD//////4AAAB/// + //+AAAAB/////gAAAAB////8AAAAAD////AAAAAAD///4AAAAAAH///AAAAAAAP//4AAAAAAAf//AAAA + AAAA//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAA/gAAAAAAAAB+AAAAAAAAAH + wAAAAAAAAAPAAAAAAAAAA4AAAAAAAAABgAAAAAAAAAGAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA8AAAAAAAAAD + 4AAAAAAAAAfgAAAAAAAAB/AAAAAAAAAP+AAAAAAAAB/4AAAAAAAAH/wAAAAAAAA//gAAAAAAAH//AAAA + AAAA//+AAAAAAAH//8AAAAAAA///4AAAAAAH///wAAAAAA////wAAAAAP////gAAAAB/////gAAAAf// + ///gAAAH//////wAAD///ygAAAAwAAAAYAAAAAEAIAAAAAAAACQAAOoWAADqFgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A + ////Av///yD///9e////lP///77////e////9P////7////+////9P///97///++////lP///17///8g + ////Av///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////AP///xj///90////y/////v///////////////////////////////////////////////////// + ///////////////7////y////3T///8Y////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8d////lv////P///////////////////////////////////////////////////// + ///////////////////////////////////////////////z////lv///x3///8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8A////Cv///33////0//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////T///99 + ////Cv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///8u////zv////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////zv///y7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////y//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////L///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////b/////v///////////////////// + //////////////////////////////////////z9///09/7/8PX+//f5/v/+/v////////////////// + ///////////////////////////////////////////////////////////////7////b////wEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9v/////P////////// + /////////////////////////////////f3//87e+/+LsPX/WI7x/zd47/8pcO7/J2/t/y1y7v9Bf+// + aZry/6TA9//o7/3///////////////////////////////////////////////////////////////// + /////P///2////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////7 + //////////////////////////////////////7+//+2zPn/TYbw/yNs7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8qcO3/cp/z/97o/P////////////////////////////////////// + //////////////////////////v///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A + ////Lv////L/////////////////////////////////////4+v9/16R8f8ja+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/ylv7f+Vtvb/+vz///////////// + ///////////////////////////////////////////////y////Lv///wAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAD///8K////zv/////////////////////////////////////K2vr/N3ju/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFo5v8bVb3/IWfk/yJr7f8ia+3/ + ZJXy//L2/v//////////////////////////////////////////////////////////zv///woAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///99//////////////////////////////////////////+HrPX/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imrq/xxZxf8VQY//EzqB/xM9iP8YTar/ + ETR0/yBl4f8ia+3/Imvt/1eN8f/2+P7///////////////////////////////////////////////// + /////////33///8AAAAAAAAAAAAAAAAAAAAAAP///x3////0//////////////////////////////// + ///////////9/f//gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8haej/CyJM/xZHnf8gZd// + Imvt/yJr7f8ia+3/IGXf/xE0dP8fY9r/Imvt/yJr7f9tm/P//f3///////////////////////////// + //////////////////////////T///8dAAAAAAAAAAAAAAAA////AP///5b///////////////////// + /////////////////////////////////P3//4Co9P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + H2Pc/xE2eP8cWMT/HFnE/xVCk/8SOH3/GU+u/yFn4/8RNXb/HmDU/yJr7f8ja+3/p8P4//////////// + //////////////////////////////////////////////+W////AAAAAAAAAAAA////GP////P///// + //////////////////////////////////////////////////////39//9/p/T/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8iaer/FUOV/xI5f/8RNHP/GE2q/x9j2/8ia+z/Fkac/xhKpP8haOX/EDRy/x1czf8ia+3/ + NXfu/+7z/v/////////////////////////////////////////////////////z////GAAAAAD///8A + ////dP/////////////////////////////////////////////////////////////////////9/f// + gKj0/yNr7f8ia+3/Imvt/yJr7f8iauz/FEGP/xdIn/8ia+z/Imvt/yFp6P8dW8n/IWjm/xhLpv8LI07/ + FUGQ/x1czP8ia+3/Imvt/5O19v////////////////////////////////////////////////////// + ////dP///wD///8C////y/////////////////////////////////////////////////////////// + //////39/f+0tLT/+Pn7/4Co9P8ia+3/Imvt/yJr7f8ia+3/Imrq/xZElv8OLGL/ETZ4/w8vaP8TPIb/ + EDRy/yBm4v8ZT6//FUKS/yJr7P8ia+3/Imvt/z187//8/f////////////////////////////////// + ////////////////////y////wL///8g////+/////////////////////////////////////////// + /////////////////////5qamv8yMjL/gICA//n6+/9+p/T/Imvt/yJr7f8haej/CyRP/xI4e/8ZTav/ + HVrH/x5dzv8bVbz/GlCy/w8wa/8XR53/DShZ/xlPrv8ia+3/Imvt/yJr7f/R3/v///////////////// + ////////////////////////////////////+////yD///9e//////////////////////////////// + ////////////////////////////////y8vL/zU1Nf8yMjL/MjIy/39/f//5+vz/gKj0/yNr7f8ia+3/ + H2LZ/xAxbP8WRZj/G1W8/xxYw/8aUbP/G1a+/xhNqv8PL2f/H2DV/yJr7f8ia+3/Imvt/yJr7f+au/f/ + /////////////////////////////////////////////////////////17///+U//////////////// + ///////////////////////////////////////////5+fn/VVVV/zIyMv8yMjL/MjIy/zIyMv+AgID/ + +fn7/4Co9P8ia+3/Imvt/yJp6v8UPon/Ejh9/xxXwP8bVLv/HVrI/xtWvv8aUrX/Dy5n/x5e0f8ia+3/ + Imvt/yJr7f91ovT//////////////////////////////////////////////////////////5T///++ + //////////////////////////////////////////////////////////+zs7P/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/gICA//r6/P9+p/T/Imvt/yJr7f8ia+3/GU2r/xAzcf8TO4P/ETR0/xE1dP8SOX// + FD2I/x1ayP8ia+3/Imvt/yJr7f9ilPL///////////////////////////////////////////////// + /////////77////e//////////////////////////////////////////////////////////9cXFz/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/35+fv/6+vz/f6f0/yNr7f8ia+3/Imvt/x9h1v8dXMz/ + Imnq/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f9ZkPH///////////////////////////////// + /////////////////////////97////0//////////////////////////////////////////////// + /////+Tk5P8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/+fn7/4Co9P8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f9klvL///////////////// + //////////////////////////////////////////T////+//////////////////////////////// + /////////////////////7CwsP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + gICA//r7/P9+pvT/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f97pvT/ + //////////////////////////////////////////////////////////7////+//////////////// + /////////////////////////////////////4uLi/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/35+fv/6+/z/gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f+jwff///////////////////////////////////////////////////////////7////0 + /////////////////////////////////////////////////////3R0dP8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/+fn7/4Cn9P8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yNr7f/c5vz///////////////////////////////////////////////// + //////////T////e/////////////////////////////////////////////////////2xsbP8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/gICA//r6/P9+p/T/ + Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/0qF8P/+/v////////////////////////////////// + /////////////////////////97///++//////////////////////////////////////////////// + /////3Fxcf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/MjIy/zIyMv8yMjL/ + MjIy/35+fv/6+vz/gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/6fD+P////////////////////// + /////////////////////////////////////////77///+U//////////////////////////////// + /////////////////////4WFhf8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf9zc3P/p6en/6urq/+qqqr/ + qqqq/5mZmf9PT0//MjIy/zIyMv+AgID/+fn7/4Co9P8ia+3/Imvt/yJr7f8ia+3/Q4Dv//f5/v////// + /////////////////////////////////////////////////////////5T///9e//////////////// + /////////////////////////////////////6ioqP8yMjL/MjIy/zIyMv8yMjL/R0dH/7Kysv91dXX/ + Pj4+/25ubv9/f3//SkpK/0lJSf+cnJz/ioqK/zMzM/8yMjL/gICA//n6/P9+p/T/Imvt/yJr7f8lbe3/ + wdT6/////////////////////////////////////////////////////////////////////17///8g + ////+////////////////////////////////////////////////9ra2v8xMTH/MjIy/zIyMv9BQUH/ + tLS0/0NDQ/85OTn/sLCw/3R0dP9eXl7/qKio/2dnZ/8yMjL/dXV1/4WFhf8yMjL/MjIy/39/f//5+vv/ + gKj0/yNr7f+NsfX///////////////////////////////////////////////////////////////// + ////+////yD///8C////y/////////////////////////////////////////////////7+/v9PT0// + MjIy/zIyMv+cnJz/UVFR/zIyMv97e3v/aWlp/zIyMv8yMjL/NjY2/6+vr/8yMjL/MjIy/6Ojo/8+Pj7/ + MjIy/zIyMv+AgID/+Pn7/7DJ+P/8/f////////////////////////////////////////////////// + ////////////////////y////wL///8A////dP////////////////////////////////////////// + //////////+goKD/MjIy/zIyMv+urq7/MzMz/zIyMv+RkZH/TU1N/zIyMv8yMjL/MjIy/6urq/8yMjL/ + MjIy/4mJif9TU1P/MjIy/zIyMv8yMjL/gICA//z8/P////////////////////////////////////// + ////////////////////////////////////dP///wAAAAAA////GP////P///////////////////// + ///////////////////////////z8/P/RkZG/zIyMv+Dg4P/bGxs/zIyMv9dXV3/lJSU/zMzM/8yMjL/ + Tk5O/6SkpP8yMjL/QkJC/62trf8zMzP/MjIy/zIyMv8yMjL/MjIy/39/f//7+/v///////////////// + ///////////////////////////////////////////////z////GAAAAAAAAAAA////AP///5b///// + ////////////////////////////////////////////////tLS0/zMzM/82Njb/p6en/2hoaP8zMzP/ + fHx8/6ysrP+kpKT/pqam/0BAQP9LS0v/r6+v/0dHR/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/ + +/v7//////////////////////////////////////////////////////////+W////AAAAAAAAAAAA + AAAAAP///x3////0/////////////////////////////////////////////////v7+/3x8fP8yMjL/ + NjY2/46Ojv+srKz/dXV1/1ZWVv9UVFT/ZmZm/5ycnP+hoaH/QUFB/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/gICA//v7+/////////////////////////////////////////////////T///8d + AAAAAAAAAAAAAAAAAAAAAP///wD///99//////////////////////////////////////////////// + //////j4+P9nZ2f/MjIy/zIyMv87Ozv/a2tr/4uLi/+QkJD/eHh4/0VFRf8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/4WFhf////////////////////////////////////// + /////////33///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K////zv////////////////////////// + ///////////////////////////19fX/cnJy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/QUFB/8bGxv////////////////////// + ////////////////////zv///woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Lv////L///// + ////////////////////////////////////////////////+/v7/6CgoP85OTn/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9iYmL/4ODg//////////// + ///////////////////////////////y////Lv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////AP///1b////7///////////////////////////////////////////////////////////j4+P/ + fn5+/zk5Of8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/VVVV/7S0tP/9/f3/ + //////////////////////////////////////////v///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wD///9v/////P////////////////////////////////////////// + /////////////////////+vr6/+qqqr/dHR0/01NTf87Ozv/NTU1/zg4OP9CQkL/YGBg/46Ojv/Ozs7/ + /Pz8/////////////////////////////////////////////////P///2////8AAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////b/////v///////////////////// + //////////////////////////////////////////////////////7+/v/4+Pj/8fHx//T09P/8/Pz/ + ///////////////////////////////////////////////////////////////7////b////wEAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////y + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////L///9W + ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8u////zv////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////zv///y7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Cv///33////0//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////T///99////Cv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8d////lv////P///// + //////////////////////////////////////////////////////////////////////////////// + ///////////////z////lv///x3///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ////AP///xj///90////y/////v///////////////////////////////////////////////////// + ///////////////7////y////3T///8Y////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Av///yD///9e////lP///77////e////9P////7////+ + ////9P///97///++////lP///17///8g////Av///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAf/8AAP/4AAAf/wAA/+AAAAf/AAD/gAAA + Af8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA + wAAAAAADAADAAAAAAAMAAIAAAAAAAQAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA + AAEAAIAAAAAAAQAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA + /AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/4AAAAH/AAD/4AAAB/8AAP/4AAAf/wAA//4AAH//AAAoAAAA + IAAAAEAAAAABACAAAAAAAAAQAADqFgAA6hYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////AP///xD///9b////nf///83////t/////f////3////t////zf///53///9b + ////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAA////AP///yf///+f////9v////////////////////////////////////////// + ///////////////2////n////yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAP///wv///+O////+v////////////////////////////////////////// + ////////////////////////////////////+v///47///8LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8m////1P////////////////////////////////////////// + /////////////////////////////////////////////////////////9T///8mAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////M////+v////////////////////////////////v9P7/ + x9j6/7HL+f+1zfn/z977//j6/v///////////////////////////////////////////////+v///8z + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yb////q//////////////////////7///+80fn/ + WpDx/yVt7f8ia+3/Imvt/yJr7f8ia+3/LHHu/3Gf8//X4/z///////////////////////////////// + /////////+r///8mAAAAAAAAAAAAAAAAAAAAAAAAAAD///8L////1P/////////////////////t8v3/ + YpXy/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yVt7f+Kr/X/+/z///////////// + /////////////////////////9T///8LAAAAAAAAAAAAAAAA////AP///47///////////////////// + /////2ua8/8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8fYtr/GU2r/xhKpf8WRZr/Hl3O/yJr7f9omfL/ + +/z//////////////////////////////////////47///8AAAAAAAAAAAD///8n////+v////////// + ////////////////7vP9/0uG8P8ia+3/Imvt/yJr7f8ia+3/HV3N/xE2ef8haOf/Imrr/x9h2P8ZTq3/ + HFrH/yJr7f+BqfT/////////////////////////////////////+v///ycAAAAA////AP///5////// + ////////////////////////////////7vP9/0uG8P8ia+3/Imvt/yJr7f8fY9v/FUGQ/xRAjf8YS6f/ + GVCw/xlOrP8ZULH/G1a+/yNs7f/L2/v/////////////////////////////////////n////wD///8Q + ////9v//////////////////////////////////////////7PH8/0uG8P8ia+3/Imvt/yBl3/8WRJb/ + H2LZ/xtUuv8XSqP/HVvK/xAybv8dXMv/Imvt/16S8v/////////////////////////////////////2 + ////EP///1v//////////////////////////////////////////9LS0v9cXFz/2+Dr/0uG8P8ia+3/ + HV3O/xI6gf8TO4T/GlCy/xpSt/8UPor/FkWa/xZHnf8ia+3/JGzt/+nw/f////////////////////// + //////////////9b////nf/////////////////////////////////////19fX/SkpK/zIyMv9UVFT/ + 2+Dr/0uG8P8ia+3/GEyp/xQ/i/8cV8D/G1S6/xpSt/8TOoH/IWbj/yJr7f8ia+3/ts35//////////// + /////////////////////////53////N/////////////////////////////////////5mZmf8yMjL/ + MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/HFrH/xRAjf8VQpP/FECO/xVDlf8YS6f/Imvt/yJr7f+Zuvb/ + ////////////////////////////////////zf///+3////////////////////////////////8/Pz/ + RUVF/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/IWbj/yBk3f8ia+3/Imvt/yJr7f8ia+3/ + Imvt/5K29v/////////////////////////////////////t/////f////////////////////////// + /////9PT0/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/Imvt/yJr7f8ia+3/ + Imvt/yJr7f8ia+3/o8H3//////////////////////////////////////3////9//////////////// + ////////////////ra2t/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/ + Imvt/yJr7f8ia+3/Imvt/yJr7f/L3Pv//////////////////////////////////////f///+3///// + //////////////////////////+enp7/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/ + 2+Dr/0uF8P8ia+3/Imvt/yJr7f8ia+3/NHfu//r8///////////////////////////////////////t + ////zf///////////////////////////////6Ojo/8yMjL/MjIy/zIyMv8yMjL/Nzc3/1tbW/9iYmL/ + QkJC/zIyMv9UVFT/2+Dr/0uG8P8ia+3/Imvt/yJr7f+MsfX///////////////////////////////// + /////////83///+d////////////////////////////////v7+//zIyMv8yMjL/MjIy/3V1df+Dg4P/ + d3d3/35+fv92dnb/ioqK/z09Pf9UVFT/2+Dr/0uG8P8ia+3/Onrv//L2/v////////////////////// + ////////////////////nf///1v////////////////////////////////u7u7/NDQ0/zIyMv92dnb/ + VVVV/2tra/9vb2//Wlpa/4iIiP83Nzf/jY2N/zIyMv9UVFT/2+Dr/1KK8f/L2/v///////////////// + //////////////////////////////9b////EP////b///////////////////////////////9tbW3/ + MjIy/4eHh/8yMjL/g4OD/zIyMv8yMjL/g4OD/zIyMv9vb2//RkZG/zIyMv9UVFT/6uvs//////////// + ////////////////////////////////////9v///xD///8A////n/////////////////////////// + /////9LS0v8zMzP/gYGB/0VFRf9xcXH/ZGRk/01NTf+Li4v/ODg4/42Njf8yMjL/MjIy/zIyMv9UVFT/ + 7Ozs//////////////////////////////////////////+f////AAAAAAD///8n////+v////////// + /////////////////////46Ojv80NDT/hISE/3p6ev90dHT/f39//3Jycv+Kior/Ozs7/zIyMv8yMjL/ + MjIy/zIyMv9UVFT/7Ozs////////////////////////////////+v///ycAAAAAAAAAAP///wD///+O + /////////////////////////////////Pz8/3Z2dv8yMjL/QEBA/2lpaf9ubm7/SEhI/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv9ubm7///////////////////////////////+O////AAAAAAAAAAAA + AAAAAP///wv////U/////////////////////////////////Pz8/5SUlP81NTX/MjIy/zIyMv8yMjL/ + MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/aGho/+vr6///////////////////////////1P///wsAAAAA + AAAAAAAAAAAAAAAAAAAAAP///yb////q/////////////////////////////////////9vb2/98fHz/ + Ozs7/zIyMv8yMjL/MjIy/zIyMv8zMzP/Y2Nj/7y8vP/+/v7//////////////////////////+r///8m + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zP////r//////////////////////////////// + ///////////5+fn/0tLS/7m5uf+2trb/yMjI/+/v7//////////////////////////////////////r + ////MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yb////U//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////1P///yYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wv///+O + ////+v////////////////////////////////////////////////////////////////////////// + ////+v///47///8LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAP///wD///8n////n/////b///////////////////////////////////////////////////// + ////9v///5////8n////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////EP///1v///+d////zf///+3////9/////f///+3////N + ////nf///1v///8Q////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAf/+AAB/ + /AAAP/gAAB/wAAAP4AAAB8AAAAOAAAABgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAAD4AAAB/AAAA/4AAAf/AAAP/4AAH//gAH/ + KAAAABAAAAAgAAAAAQAgAAAAAAAABAAA6hYAAOoWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8y + ////mP///9r////6////+v///9r///+Y////Mv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr///+b + /////v////////////////////////////////////7///+b////CgAAAAAAAAAAAAAAAP///wr////C + ///////////F2Pr/f6n0/2qc8/+FrfX/0eD7/////////////////////8L///8KAAAAAP///wD///+b + //////////93o/T/Imvt/yJr7f8haej/HVvL/x9e0P+ErPX//v7/////////////////m////wD///8y + /////v//////////ydv7/yxy7v8ia+3/GU6s/xxXwf8aU7j/HVvJ/5u89/////////////////7///8y + ////mP////////////////T09P+brc3/LHLu/xlQsf8aULL/GU2r/xZGnP8yde7/+vv///////////// + ////mP///9r///////////////+CgoL/Ozs7/5Wmxv8qat3/GEyo/xhKpP8YTKj/Imvt/9Ph+/////// + /////////9r////6///////////z8/P/Nzc3/zIyMv87Ozv/lafG/yxw6/8haen/Imvt/yJr7f/N3fv/ + ///////////////6////+v//////////0tLS/zIyMv8yMjL/MjIy/zo6Ov+Vp8b/LHLu/yJr7f8mbu3/ + 8fX+////////////////+v///9r//////////9jY2P8yMjL/Q0ND/2NjY/9mZmb/U1NT/5Wmxv8scu7/ + d6P0/////////////////////9r///+Y///////////7+/v/QUFB/2FhYf9kZGT/ZmZm/1lZWf9AQED/ + m6rH//L2/v////////////////////+Y////Mv////7//////////6SkpP9gYGD/cXFx/3Jycv9jY2P/ + MjIy/zs7O//Ly8v////////////////+////Mv///wD///+b///////////+/v7/jo6O/0RERP9GRkb/ + MjIy/zIyMv8yMjL/fX19////////////////m////wAAAAAA////Cv///8L////////////////V1dX/ + jo6O/3V1df+Hh4f/x8fH////////////////wv///woAAAAAAAAAAAAAAAD///8K////m/////7///// + ///////////////////////////////+////m////woAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8y + ////mP///9r////6////+v///9r///+Y////Mv///wAAAAAAAAAAAAAAAADgBwAAwAMAAIABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAMADAADgBwAA +</value> + </data> +</root>
\ No newline at end of file diff --git a/UVtools.GUI/FrmMain.Designer.cs b/UVtools.GUI/FrmMain.Designer.cs index f9513c9..f344d2d 100644 --- a/UVtools.GUI/FrmMain.Designer.cs +++ b/UVtools.GUI/FrmMain.Designer.cs @@ -42,6 +42,8 @@ this.menuFileExtract = new System.Windows.Forms.ToolStripMenuItem(); this.menuFileConvert = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.menuFileSettings = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); this.menuFileExit = new System.Windows.Forms.ToolStripMenuItem(); this.menuEdit = new System.Windows.Forms.ToolStripMenuItem(); this.menuMutate = new System.Windows.Forms.ToolStripMenuItem(); @@ -54,6 +56,7 @@ this.menuHelpAbout = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.menuHelpInstallPrinters = new System.Windows.Forms.ToolStripMenuItem(); + this.menuNewVersion = new System.Windows.Forms.ToolStripMenuItem(); this.statusBar = new System.Windows.Forms.StatusStrip(); this.mainTable = new System.Windows.Forms.TableLayoutPanel(); this.scCenter = new System.Windows.Forms.SplitContainer(); @@ -71,7 +74,11 @@ this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.tsLayerImageHighlightIssues = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.tsLayerImageLayerOutline = new System.Windows.Forms.ToolStripButton(); + this.tsLayerImageLayerOutline = new System.Windows.Forms.ToolStripSplitButton(); + this.tsLayerImageLayerOutlinePrintVolumeBounds = new System.Windows.Forms.ToolStripMenuItem(); + this.tsLayerImageLayerOutlineLayerBounds = new System.Windows.Forms.ToolStripMenuItem(); + this.tsLayerImageLayerOutlineHollowAreas = new System.Windows.Forms.ToolStripMenuItem(); + this.tsLayerImageLayerOutlineEdgeDetection = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); this.tsLayerImagePixelEdit = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); @@ -116,8 +123,10 @@ this.tsIssueCount = new System.Windows.Forms.ToolStripLabel(); this.tsIssueNext = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.tsIsuesRefresh = new System.Windows.Forms.ToolStripButton(); this.tsIssueRemove = new System.Windows.Forms.ToolStripButton(); + this.tsIsuesRefresh = new System.Windows.Forms.ToolStripSplitButton(); + this.tsIsuesRefreshIslands = new System.Windows.Forms.ToolStripMenuItem(); + this.tsIsuesRefreshResinTraps = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.tsIssuesRepair = new System.Windows.Forms.ToolStripButton(); this.imageList16x16 = new System.Windows.Forms.ImageList(this.components); @@ -169,7 +178,8 @@ this.menuMutate, this.menuTools, this.viewToolStripMenuItem, - this.helpToolStripMenuItem}); + this.helpToolStripMenuItem, + this.menuNewVersion}); this.menu.Location = new System.Drawing.Point(0, 0); this.menu.Name = "menu"; this.menu.Size = new System.Drawing.Size(1784, 24); @@ -189,6 +199,8 @@ this.menuFileExtract, this.menuFileConvert, this.toolStripSeparator2, + this.menuFileSettings, + this.toolStripSeparator15, this.menuFileExit}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); @@ -281,6 +293,20 @@ this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(258, 6); // + // menuFileSettings + // + this.menuFileSettings.Image = global::UVtools.GUI.Properties.Resources.settings_16x16; + this.menuFileSettings.Name = "menuFileSettings"; + this.menuFileSettings.ShortcutKeys = System.Windows.Forms.Keys.F12; + this.menuFileSettings.Size = new System.Drawing.Size(261, 22); + this.menuFileSettings.Text = "&Settings"; + this.menuFileSettings.Click += new System.EventHandler(this.EventClick); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(258, 6); + // // menuFileExit // this.menuFileExit.Image = global::UVtools.GUI.Properties.Resources.Exit_16x16; @@ -384,6 +410,15 @@ this.menuHelpInstallPrinters.Text = "Install profiles into PrusaSlicer"; this.menuHelpInstallPrinters.Click += new System.EventHandler(this.EventClick); // + // menuNewVersion + // + this.menuNewVersion.BackColor = System.Drawing.Color.Lime; + this.menuNewVersion.Name = "menuNewVersion"; + this.menuNewVersion.Size = new System.Drawing.Size(147, 20); + this.menuNewVersion.Text = "New version is available!"; + this.menuNewVersion.Visible = false; + this.menuNewVersion.Click += new System.EventHandler(this.EventClick); + // // statusBar // this.statusBar.Location = new System.Drawing.Point(0, 789); @@ -433,6 +468,7 @@ // // pbLayer // + this.pbLayer.AllowDoubleClick = true; this.pbLayer.Dock = System.Windows.Forms.DockStyle.Fill; this.pbLayer.GridScale = Cyotek.Windows.Forms.ImageBoxGridScale.Large; this.pbLayer.Location = new System.Drawing.Point(0, 25); @@ -442,6 +478,7 @@ this.pbLayer.Size = new System.Drawing.Size(1228, 705); this.pbLayer.TabIndex = 7; this.pbLayer.Zoomed += new System.EventHandler<Cyotek.Windows.Forms.ImageBoxZoomEventArgs>(this.pbLayer_Zoomed); + this.pbLayer.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.EventMouseDoubleClick); this.pbLayer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseMove); this.pbLayer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseUp); // @@ -581,14 +618,49 @@ // // tsLayerImageLayerOutline // - this.tsLayerImageLayerOutline.CheckOnClick = true; + this.tsLayerImageLayerOutline.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsLayerImageLayerOutlinePrintVolumeBounds, + this.tsLayerImageLayerOutlineLayerBounds, + this.tsLayerImageLayerOutlineHollowAreas, + this.tsLayerImageLayerOutlineEdgeDetection}); this.tsLayerImageLayerOutline.Image = global::UVtools.GUI.Properties.Resources.Geometry_16x16; this.tsLayerImageLayerOutline.ImageTransparentColor = System.Drawing.Color.Magenta; this.tsLayerImageLayerOutline.Name = "tsLayerImageLayerOutline"; - this.tsLayerImageLayerOutline.Size = new System.Drawing.Size(66, 22); + this.tsLayerImageLayerOutline.Size = new System.Drawing.Size(78, 22); this.tsLayerImageLayerOutline.Text = "Outline"; - this.tsLayerImageLayerOutline.ToolTipText = "Show layer outlines only"; - this.tsLayerImageLayerOutline.Click += new System.EventHandler(this.EventClick); + this.tsLayerImageLayerOutline.ButtonClick += new System.EventHandler(this.EventClick); + // + // tsLayerImageLayerOutlinePrintVolumeBounds + // + this.tsLayerImageLayerOutlinePrintVolumeBounds.CheckOnClick = true; + this.tsLayerImageLayerOutlinePrintVolumeBounds.Name = "tsLayerImageLayerOutlinePrintVolumeBounds"; + this.tsLayerImageLayerOutlinePrintVolumeBounds.Size = new System.Drawing.Size(185, 22); + this.tsLayerImageLayerOutlinePrintVolumeBounds.Text = "Print Volume Bounds"; + this.tsLayerImageLayerOutlinePrintVolumeBounds.Click += new System.EventHandler(this.EventClick); + // + // tsLayerImageLayerOutlineLayerBounds + // + this.tsLayerImageLayerOutlineLayerBounds.CheckOnClick = true; + this.tsLayerImageLayerOutlineLayerBounds.Name = "tsLayerImageLayerOutlineLayerBounds"; + this.tsLayerImageLayerOutlineLayerBounds.Size = new System.Drawing.Size(185, 22); + this.tsLayerImageLayerOutlineLayerBounds.Text = "Layer Bounds"; + this.tsLayerImageLayerOutlineLayerBounds.Click += new System.EventHandler(this.EventClick); + // + // tsLayerImageLayerOutlineHollowAreas + // + this.tsLayerImageLayerOutlineHollowAreas.CheckOnClick = true; + this.tsLayerImageLayerOutlineHollowAreas.Name = "tsLayerImageLayerOutlineHollowAreas"; + this.tsLayerImageLayerOutlineHollowAreas.Size = new System.Drawing.Size(185, 22); + this.tsLayerImageLayerOutlineHollowAreas.Text = "Hollow Areas"; + this.tsLayerImageLayerOutlineHollowAreas.Click += new System.EventHandler(this.EventClick); + // + // tsLayerImageLayerOutlineEdgeDetection + // + this.tsLayerImageLayerOutlineEdgeDetection.CheckOnClick = true; + this.tsLayerImageLayerOutlineEdgeDetection.Name = "tsLayerImageLayerOutlineEdgeDetection"; + this.tsLayerImageLayerOutlineEdgeDetection.Size = new System.Drawing.Size(185, 22); + this.tsLayerImageLayerOutlineEdgeDetection.Text = "&Edge Detection"; + this.tsLayerImageLayerOutlineEdgeDetection.Click += new System.EventHandler(this.EventClick); // // toolStripSeparator9 // @@ -975,8 +1047,8 @@ this.tsIssueCount, this.tsIssueNext, this.toolStripSeparator13, - this.tsIsuesRefresh, this.tsIssueRemove, + this.tsIsuesRefresh, this.toolStripSeparator12, this.tsIssuesRepair}); this.tsIssues.Location = new System.Drawing.Point(3, 3); @@ -1021,18 +1093,6 @@ this.toolStripSeparator13.Name = "toolStripSeparator13"; this.toolStripSeparator13.Size = new System.Drawing.Size(6, 25); // - // tsIsuesRefresh - // - this.tsIsuesRefresh.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.tsIsuesRefresh.Enabled = false; - this.tsIsuesRefresh.Image = global::UVtools.GUI.Properties.Resources.refresh_16x16; - this.tsIsuesRefresh.ImageTransparentColor = System.Drawing.Color.Magenta; - this.tsIsuesRefresh.Name = "tsIsuesRefresh"; - this.tsIsuesRefresh.Size = new System.Drawing.Size(61, 22); - this.tsIsuesRefresh.Text = "Detect"; - this.tsIsuesRefresh.ToolTipText = "Compute Issues"; - this.tsIsuesRefresh.Click += new System.EventHandler(this.EventClick); - // // tsIssueRemove // this.tsIssueRemove.Enabled = false; @@ -1046,6 +1106,38 @@ "tion, need reslice."; this.tsIssueRemove.Click += new System.EventHandler(this.EventClick); // + // tsIsuesRefresh + // + this.tsIsuesRefresh.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.tsIsuesRefresh.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsIsuesRefreshIslands, + this.tsIsuesRefreshResinTraps}); + this.tsIsuesRefresh.Image = global::UVtools.GUI.Properties.Resources.refresh_16x16; + this.tsIsuesRefresh.ImageTransparentColor = System.Drawing.Color.Magenta; + this.tsIsuesRefresh.Name = "tsIsuesRefresh"; + this.tsIsuesRefresh.Size = new System.Drawing.Size(73, 22); + this.tsIsuesRefresh.Text = "&Detect"; + this.tsIsuesRefresh.ToolTipText = "Compute Issues"; + this.tsIsuesRefresh.ButtonClick += new System.EventHandler(this.EventClick); + // + // tsIsuesRefreshIslands + // + this.tsIsuesRefreshIslands.Checked = true; + this.tsIsuesRefreshIslands.CheckOnClick = true; + this.tsIsuesRefreshIslands.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsIsuesRefreshIslands.Name = "tsIsuesRefreshIslands"; + this.tsIsuesRefreshIslands.Size = new System.Drawing.Size(211, 22); + this.tsIsuesRefreshIslands.Text = "Islands && Touching Bonds"; + // + // tsIsuesRefreshResinTraps + // + this.tsIsuesRefreshResinTraps.Checked = true; + this.tsIsuesRefreshResinTraps.CheckOnClick = true; + this.tsIsuesRefreshResinTraps.CheckState = System.Windows.Forms.CheckState.Checked; + this.tsIsuesRefreshResinTraps.Name = "tsIsuesRefreshResinTraps"; + this.tsIsuesRefreshResinTraps.Size = new System.Drawing.Size(211, 22); + this.tsIsuesRefreshResinTraps.Text = "Resin traps"; + // // toolStripSeparator12 // this.toolStripSeparator12.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; @@ -1364,7 +1456,6 @@ private System.Windows.Forms.ToolStripLabel tsLayerImageZoom; private System.Windows.Forms.ToolStripButton tsLayerImagePixelEdit; private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private System.Windows.Forms.ToolStripButton tsLayerImageLayerOutline; private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; private System.Windows.Forms.ToolStripMenuItem menuMutate; private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; @@ -1378,7 +1469,6 @@ private System.Windows.Forms.ColumnHeader lvIssuesCount; private System.Windows.Forms.ColumnHeader lvIssuesXY; private System.Windows.Forms.ColumnHeader lvIssuesPixels; - private System.Windows.Forms.ToolStripButton tsIsuesRefresh; private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; private System.Windows.Forms.ToolStripLabel tsLayerImageMouseLocation; private System.Windows.Forms.ColumnHeader lvIssuesLayerHeader; @@ -1408,6 +1498,17 @@ private System.Windows.Forms.ToolStripSplitButton tsLayerImageExport; private System.Windows.Forms.ToolStripMenuItem tsLayerImageExportFile; private System.Windows.Forms.ToolStripMenuItem tsLayerImageExportClipboard; + private System.Windows.Forms.ToolStripMenuItem menuNewVersion; + private System.Windows.Forms.ToolStripMenuItem menuFileSettings; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator15; + private System.Windows.Forms.ToolStripSplitButton tsIsuesRefresh; + private System.Windows.Forms.ToolStripMenuItem tsIsuesRefreshIslands; + private System.Windows.Forms.ToolStripMenuItem tsIsuesRefreshResinTraps; + private System.Windows.Forms.ToolStripSplitButton tsLayerImageLayerOutline; + private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineEdgeDetection; + private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlinePrintVolumeBounds; + private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineLayerBounds; + private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineHollowAreas; } } diff --git a/UVtools.GUI/FrmMain.cs b/UVtools.GUI/FrmMain.cs index 6d74a8b..0633508 100644 --- a/UVtools.GUI/FrmMain.cs +++ b/UVtools.GUI/FrmMain.cs @@ -11,7 +11,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; -using System.Linq; +using System.Net; using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -23,6 +23,7 @@ using Emgu.CV.Util; using UVtools.Core; using UVtools.Core.Extensions; using UVtools.GUI.Forms; +using UVtools.GUI.Properties; namespace UVtools.GUI { @@ -33,37 +34,43 @@ namespace UVtools.GUI #region Properties - public static readonly Dictionary<Mutation.Mutates, Mutation> Mutations = - new Dictionary<Mutation.Mutates, Mutation> + public static readonly Dictionary<LayerManager.Mutate, Mutation> Mutations = + new Dictionary<LayerManager.Mutate, Mutation> { - {Mutation.Mutates.Resize, new Mutation(Mutation.Mutates.Resize, + {LayerManager.Mutate.Resize, new Mutation(LayerManager.Mutate.Resize, "Resizes layer images in a X and/or Y factor, starting from 100% value\n" + "NOTE 1: Build volume bounds are not validated after operation, please ensure scaling stays inside your limits.\n" + "NOTE 2: X and Y are applied to original image, not to the rotated preview (If enabled)." )}, - {Mutation.Mutates.Solidify, new Mutation(Mutation.Mutates.Solidify, + {LayerManager.Mutate.Flip, new Mutation(LayerManager.Mutate.Flip, + "Flips layer images vertically and/or horizontally" + )}, + {LayerManager.Mutate.Rotate, new Mutation(LayerManager.Mutate.Rotate, + "Rotate layer images in a certain degrees" + )}, + {LayerManager.Mutate.Solidify, new Mutation(LayerManager.Mutate.Solidify, "Solidifies the selected layers, closes all inner holes.\n" + "Warning: All surrounded holes are filled, no exceptions! Make sure you don't require any of holes in layer path.", Properties.Resources.mutation_solidify )}, - {Mutation.Mutates.Erode, new Mutation(Mutation.Mutates.Erode, + {LayerManager.Mutate.Erode, new Mutation(LayerManager.Mutate.Erode, "The basic idea of erosion is just like soil erosion only, it erodes away the boundaries of foreground object (Always try to keep foreground in white). " + "So what happends is that, all the pixels near boundary will be discarded depending upon the size of kernel. So the thickness or size of the foreground object decreases or simply white region decreases in the image. It is useful for removing small white noises, detach two connected objects, etc.", Properties.Resources.mutation_erosion )}, - {Mutation.Mutates.Dilate, new Mutation(Mutation.Mutates.Dilate, + {LayerManager.Mutate.Dilate, new Mutation(LayerManager.Mutate.Dilate, "It is just opposite of erosion. Here, a pixel element is '1' if atleast one pixel under the kernel is '1'. So it increases the white region in the image or size of foreground object increases. Normally, in cases like noise removal, erosion is followed by dilation. Because, erosion removes white noises, but it also shrinks our object. So we dilate it. Since noise is gone, they won't come back, but our object area increases. It is also useful in joining broken parts of an object.", Properties.Resources.mutation_dilation )}, - {Mutation.Mutates.Opening, new Mutation(Mutation.Mutates.Opening, + {LayerManager.Mutate.Opening, new Mutation(LayerManager.Mutate.Opening, "Opening is just another name of erosion followed by dilation. It is useful in removing noise.", Properties.Resources.mutation_opening )}, - {Mutation.Mutates.Closing, new Mutation(Mutation.Mutates.Closing, + {LayerManager.Mutate.Closing, new Mutation(LayerManager.Mutate.Closing, "Closing is reverse of Opening, Dilation followed by Erosion. It is useful in closing small holes inside the foreground objects, or small black points on the object.", Properties.Resources.mutation_closing )}, - {Mutation.Mutates.Gradient, new Mutation(Mutation.Mutates.Gradient, + {LayerManager.Mutate.Gradient, new Mutation(LayerManager.Mutate.Gradient, "It's the difference between dilation and erosion of an image.", Properties.Resources.mutation_gradient )}, @@ -79,16 +86,16 @@ namespace UVtools.GUI "The Hit-or-Miss transformation is useful to find patterns in binary images. In particular, it finds those pixels whose neighbourhood matches the shape of a first structuring element B1 while not matching the shape of a second structuring element B2 at the same time.", null )},*/ - {Mutation.Mutates.PyrDownUp, new Mutation(Mutation.Mutates.PyrDownUp, + {LayerManager.Mutate.PyrDownUp, new Mutation(LayerManager.Mutate.PyrDownUp, "Performs downsampling step of Gaussian pyramid decomposition.\n" + "First it convolves image with the specified filter and then downsamples the image by rejecting even rows and columns.\n" + "After performs up-sampling step of Gaussian pyramid decomposition\n" )}, - {Mutation.Mutates.SmoothMedian, new Mutation(Mutation.Mutates.SmoothMedian, + {LayerManager.Mutate.SmoothMedian, new Mutation(LayerManager.Mutate.SmoothMedian, "Each pixel becomes the median of its surrounding pixels. Also a good way to remove noise.\n" + "Note: Iterations must be a odd number." )}, - {Mutation.Mutates.SmoothGaussian, new Mutation(Mutation.Mutates.SmoothGaussian, + {LayerManager.Mutate.SmoothGaussian, new Mutation(LayerManager.Mutate.SmoothGaussian, "Each pixel is a sum of fractions of each pixel in its neighborhood\n" + "Very fast, but does not preserve sharp edges well.\n" + "Note: Iterations must be a odd number." @@ -108,7 +115,7 @@ namespace UVtools.GUI public Mat ActualLayerImage { get; private set; } - public Mat ActualLayerImageBgr { get; private set; } + public Mat ActualLayerImageBgr { get; private set; } = new Mat(); public Dictionary<uint, List<LayerIssue>> Issues { get; set; } @@ -125,10 +132,24 @@ namespace UVtools.GUI FrmLoading = new FrmLoading(); Program.SetAllControlsFontSize(Controls, 11); Program.SetAllControlsFontSize(FrmLoading.Controls, 11); - + + if (Settings.Default.UpdateSettings) + { + Settings.Default.Upgrade(); + Settings.Default.UpdateSettings = false; + Settings.Default.Save(); + } + Clear(); - if (Width >= Screen.FromControl(this).WorkingArea.Width || + tsLayerImageLayerDifference.Checked = Settings.Default.LayerDifferenceDefault; + tsIsuesRefreshIslands.Checked = Settings.Default.ComputeIslands; + tsIsuesRefreshResinTraps.Checked = Settings.Default.ComputeResinTraps; + tsLayerImageLayerOutlinePrintVolumeBounds.Checked = Settings.Default.OutlinePrintVolumeBounds; + tsLayerImageLayerOutlineLayerBounds.Checked = Settings.Default.OutlineLayerBounds; + tsLayerImageLayerOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas; + + if (Settings.Default.StartMaximized || Width >= Screen.FromControl(this).WorkingArea.Width || Height >= Screen.FromControl(this).WorkingArea.Height) { WindowState = FormWindowState.Maximized; @@ -138,7 +159,7 @@ namespace UVtools.GUI DragEnter += (s, e) => { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; }; DragDrop += (s, e) => { ProcessFile((string[])e.Data.GetData(DataFormats.FileDrop)); }; - foreach (Mutation.Mutates mutate in (Mutation.Mutates[])Enum.GetValues(typeof(Mutation.Mutates))) + foreach (LayerManager.Mutate mutate in (LayerManager.Mutate[])Enum.GetValues(typeof(LayerManager.Mutate))) { if(!Mutations.ContainsKey(mutate)) continue; var item = new ToolStripMenuItem(mutate.ToString()) @@ -155,6 +176,41 @@ namespace UVtools.GUI var group = new ListViewGroup(issueType.ToString(), $"{issueType}s"){HeaderAlignment = HorizontalAlignment.Center}; lvIssues.Groups.Add(group); } + + if (Settings.Default.CheckForUpdatesOnStartup) + { + Task.Factory.StartNew(AppLoadTask); + } + } + + private void AppLoadTask() + { + try + { + using (WebClient client = new WebClient()) + { + string htmlCode = client.DownloadString($"{About.Website}/releases"); + const string searchFor = "/releases/tag/"; + var startIndex = htmlCode.IndexOf(searchFor, StringComparison.InvariantCultureIgnoreCase) + searchFor.Length; + var endIndex = htmlCode.IndexOf("\"", startIndex, StringComparison.InvariantCultureIgnoreCase); + var version = htmlCode.Substring(startIndex, endIndex- startIndex); + if (string.Compare(version, $"v{FrmAbout.AssemblyVersion}", StringComparison.OrdinalIgnoreCase) > 0) + { + Invoke((MethodInvoker)delegate + { + // Running on the UI thread + menuNewVersion.Text = $"New version {version} is available!"; + menuNewVersion.Tag = $"{About.Website}/releases/tag/{version}"; + menuNewVersion.Visible = true; + }); + } + //Debug.WriteLine(version); + } + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } } #endregion @@ -233,7 +289,7 @@ namespace UVtools.GUI if (e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.D0) { - pbLayer.ZoomToFit(); + ZoomToFit(); e.Handled = true; return; } @@ -265,7 +321,11 @@ namespace UVtools.GUI protected override void OnResize(EventArgs e) { base.OnResize(e); - pbLayer.ZoomToFit(); + if (Settings.Default.LayerZoomToFit) + { + ZoomToFit(); + } + lbLayerActual.Location = new Point(lbLayerActual.Location.X, Math.Max(1, Math.Min(tbLayer.Height - 40, @@ -273,6 +333,7 @@ namespace UVtools.GUI )); } + #endregion #region Events @@ -345,8 +406,10 @@ namespace UVtools.GUI SlicerFile.Save(); result = true; } - catch (Exception) + catch (Exception ex) { + MessageBox.Show(ex.Message, "Error while saving the file", MessageBoxButtons.OK, + MessageBoxIcon.Error); } finally { @@ -389,8 +452,10 @@ namespace UVtools.GUI SlicerFile.SaveAs(dialog.FileName); result = true; } - catch (Exception) + catch (Exception ex) { + MessageBox.Show(ex.Message, "Error while saving the file", MessageBoxButtons.OK, + MessageBoxIcon.Error); } finally { @@ -433,6 +498,15 @@ namespace UVtools.GUI return; } + if (ReferenceEquals(sender, menuFileSettings)) + { + using (FrmSettings frmSettings = new FrmSettings()) + { + if (frmSettings.ShowDialog() != DialogResult.OK) return; + } + return; + } + if (ReferenceEquals(sender, menuFileExit)) { if (menuFileSave.Enabled) @@ -483,7 +557,7 @@ namespace UVtools.GUI "Extraction completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - Process.Start(finalPath); + using (Process.Start(finalPath)){} } } catch (Exception exception) @@ -529,9 +603,9 @@ namespace UVtools.GUI } - if (item.Tag.GetType() == typeof(Mutation.Mutates)) + if (item.Tag.GetType() == typeof(LayerManager.Mutate)) { - Mutation.Mutates mutate = (Mutation.Mutates) item.Tag; + LayerManager.Mutate mutate = (LayerManager.Mutate) item.Tag; MutateLayers(mutate); return; } @@ -562,7 +636,7 @@ namespace UVtools.GUI if (repairResinTraps && ReferenceEquals(Issues, null)) { - ComputeIssues(); + ComputeIssues(new IslandDetectionConfiguration {Enabled = false}); // Ignore islands as we dont require it } DisableGUI(); @@ -573,49 +647,7 @@ namespace UVtools.GUI bool result = false; try { - - Parallel.For(layerStart, layerEnd + 1, layerIndex => - { - Layer layer = SlicerFile[layerIndex]; - using (var image = layer.LayerMat) - { - if (repairResinTraps) - { - if (Issues.TryGetValue((uint) layerIndex, out var issues)) - { - foreach (var issue in issues.Where(issue => issue.Type == LayerIssue.IssueType.ResinTrap)) - { - CvInvoke.DrawContours(image, - new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), - -1, - new MCvScalar(255), - -1); - /*CvInvoke.DrawContours(image, - new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), - -1, - new MCvScalar(255), - 2);*/ - } - } - } - - if (repairIslands) - { - Mat kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(3, 3), new Point(1, 1)); - if (closingIterations > 0) - { - CvInvoke.MorphologyEx(image, image, MorphOp.Close, kernel, new Point(-1, -1), (int) closingIterations, BorderType.Default, new MCvScalar()); - } - - if (openingIterations > 0) - { - CvInvoke.MorphologyEx(image, image, MorphOp.Open, kernel, new Point(-1, -1), (int)closingIterations, BorderType.Default, new MCvScalar()); - } - } - - layer.LayerMat = image; - } - }); + SlicerFile.LayerManager.RepairLayers(layerStart, layerEnd, closingIterations, openingIterations, repairIslands, repairResinTraps, Issues); result = true; } catch (Exception ex) @@ -638,7 +670,7 @@ namespace UVtools.GUI ShowLayer(); - ComputeIssues(); + ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration()); menuFileSave.Enabled = menuFileSaveAs.Enabled = true; @@ -654,7 +686,7 @@ namespace UVtools.GUI if (ReferenceEquals(sender, menuHelpWebsite)) { - Process.Start(About.Website); + using (Process.Start(About.Website)){} return; } @@ -665,7 +697,7 @@ namespace UVtools.GUI "If you're happy to contribute for a better program and for my work i will appreciate the tip.\n" + "A browser window will be open and forward to my paypal address after you click 'OK'.\nHappy Printing!", "Donation", MessageBoxButtons.OK, MessageBoxIcon.Information); - Process.Start(About.Donate); + using (Process.Start(About.Donate)){} return; } @@ -684,7 +716,9 @@ namespace UVtools.GUI switch (result) { case DialogResult.OK: - Process.Start("https://www.prusa3d.com/prusaslicer/"); + using (Process.Start("https://www.prusa3d.com/prusaslicer/")) + { } + return; default: return; @@ -700,6 +734,12 @@ namespace UVtools.GUI } } + if (ReferenceEquals(sender, menuNewVersion)) + { + using (Process.Start(menuNewVersion.Tag.ToString())) { } + return; + } + /************************ * Thumbnail Menu * ***********************/ @@ -818,7 +858,7 @@ namespace UVtools.GUI "Properties save completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - Process.Start(dialog.FileName); + using (Process.Start(dialog.FileName)){} } } @@ -850,7 +890,7 @@ namespace UVtools.GUI "GCode save completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - Process.Start(dialog.FileName); + using (Process.Start(dialog.FileName)){} } } @@ -938,9 +978,13 @@ namespace UVtools.GUI } else if (issue.Type == LayerIssue.IssueType.ResinTrap) { - var contours = new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)); - CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), -1); - //CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), 2); + using (var contours = + new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels))) + { + CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), -1); + //CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), 2); + } + edited = true; } @@ -1004,7 +1048,7 @@ namespace UVtools.GUI if (MessageBox.Show("Are you sure you want to compute issues?", "Issues Compute", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) return; - ComputeIssues(); + ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration()); return; } @@ -1012,11 +1056,27 @@ namespace UVtools.GUI /************************ * Layer Menu * ***********************/ - if (ReferenceEquals(sender, tsLayerImageRotate) || ReferenceEquals(sender, tsLayerImageLayerDifference) || + if (ReferenceEquals(sender, tsLayerImageRotate) || + ReferenceEquals(sender, tsLayerImageLayerDifference) || ReferenceEquals(sender, tsLayerImageHighlightIssues) || - ReferenceEquals(sender, tsLayerImageLayerOutline)) + ReferenceEquals(sender, tsLayerImageLayerOutlinePrintVolumeBounds) || + ReferenceEquals(sender, tsLayerImageLayerOutlineLayerBounds) || + ReferenceEquals(sender, tsLayerImageLayerOutlineHollowAreas) || + ReferenceEquals(sender, tsLayerImageLayerOutlineEdgeDetection) + + ) { ShowLayer(); + if (ReferenceEquals(sender, tsLayerImageRotate)) + { + ZoomToFit(); + } + return; + } + + if (ReferenceEquals(sender, tsLayerImageLayerOutline)) + { + tsLayerImageLayerOutline.ShowDropDown(); return; } @@ -1231,7 +1291,7 @@ namespace UVtools.GUI if (issue.Type == LayerIssue.IssueType.TouchingBound) { - pbLayer.ZoomToFit(); + ZoomToFit(); } else if (issue.X >= 0 && issue.Y >= 0) { @@ -1448,7 +1508,10 @@ namespace UVtools.GUI lbInitialLayer.Text = $"{SlicerFile.LayerHeight}mm\n0"; - tsLayerImageRotate.Checked = ActualLayerImage.Height > ActualLayerImage.Width; + if (Settings.Default.LayerAutoRotateBestView) + { + tsLayerImageRotate.Checked = ActualLayerImage.Height > ActualLayerImage.Width; + } if (!ReferenceEquals(SlicerFile.ConvertToFormats, null)) { @@ -1464,7 +1527,7 @@ namespace UVtools.GUI new ToolStripMenuItem(fileFormat.GetType().Name.Replace("File", extensions)) { Tag = fileFormat, - Image = Properties.Resources.layers_16x16 + Image = Resources.layers_16x16 }; menuItem.Click += ConvertToItemOnClick; menuFileConvert.DropDownItems.Add(menuItem); @@ -1542,16 +1605,24 @@ namespace UVtools.GUI RefreshInfo(); - pbLayer.ZoomToFit(); + if (Settings.Default.LayerZoomToFit) + { + ZoomToFit(); + } UpdateTitle(); + + if (Settings.Default.ComputeIssuesOnLoad) + { + ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration()); + } } void UpdateTitle() { - Text = $"{FrmAbout.AssemblyTitle} File: {Path.GetFileName(SlicerFile.FileFullPath)} Version: {FrmAbout.AssemblyVersion}"; + Text = $"{FrmAbout.AssemblyTitle} File: {Path.GetFileName(SlicerFile.FileFullPath)} ({FrmLoading.StopWatch.ElapsedMilliseconds}ms) Version: {FrmAbout.AssemblyVersion}"; } - + void RefreshInfo() { menuEdit.DropDownItems.Clear(); @@ -1686,65 +1757,22 @@ namespace UVtools.GUI Stopwatch watch = Stopwatch.StartNew(); ActualLayerImage?.Dispose(); - ActualLayerImageBgr?.Dispose(); ActualLayerImage = SlicerFile[layerNum].LayerMat; - ActualLayerImageBgr = new Mat(); + CvInvoke.CvtColor(ActualLayerImage, ActualLayerImageBgr, ColorConversion.Gray2Bgr); var imageSpan = ActualLayerImage.GetPixelSpan<byte>(); var imageBgrSpan = ActualLayerImageBgr.GetPixelSpan<byte>(); - if (tsLayerImageLayerOutline.Checked) - { -#if DEBUG - using (Mat grayscale = new Mat()) - { - CvInvoke.Threshold(ActualLayerImage, grayscale, 1, 255, ThresholdType.Binary); - using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint()) - { - using (Mat hierarchy = new Mat()) - { - CvInvoke.FindContours(grayscale, contours, hierarchy, RetrType.Ccomp, - ChainApproxMethod.ChainApproxSimple); - /* - * hierarchy[i][0]: the index of the next contour of the same level - * hierarchy[i][1]: the index of the previous contour of the same level - * hierarchy[i][2]: the index of the first child - * hierarchy[i][3]: the index of the parent - */ - var arr = hierarchy.GetData(); - for (int i = 0; i < contours.Size; i++) - { - //if ((int)arr.GetValue(0, i, 2) == -1 && (int)arr.GetValue(0, i, 3) > -1) continue; - /*Debug.WriteLine($"[0] {arr.GetValue(0, i, 0)}"); - Debug.WriteLine($"[1] {arr.GetValue(0, i, 1)}"); - Debug.WriteLine($"[2] {arr.GetValue(0, i, 2)}"); - Debug.WriteLine($"[3] {arr.GetValue(0, i, 3)}");*/ - //if ((int)arr.GetValue(0, i, 2) > -1 || (int)arr.GetValue(0, i, 3) > -1) continue; - //if (((int)arr.GetValue(0, i, 2) > -1 && (int)arr.GetValue(0, i, 3) > -1)) continue; - - // if ((int) arr.GetValue(0, i, 3) >= 0) continue; - if ((int)arr.GetValue(0, i, 2) != -1 || (int)arr.GetValue(0, i, 3) == -1) - continue; - var r = CvInvoke.BoundingRectangle(contours[i]); - CvInvoke.Rectangle(ActualLayerImageBgr, r, new MCvScalar(0, 0, 255), 5); - CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(125, 125, 125), -1); - - //if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1) - // CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(0, 0, 0), -1); - } - } - } - } -#else + if (tsLayerImageLayerOutlineEdgeDetection.Checked) + { using (var grayscale = new Mat()) { CvInvoke.Canny(ActualLayerImage, grayscale, 80, 40, 3, true); CvInvoke.CvtColor(grayscale, ActualLayerImageBgr, ColorConversion.Gray2Bgr); } -#endif } else if (tsLayerImageLayerDifference.Checked) { @@ -1759,27 +1787,26 @@ namespace UVtools.GUI for (int pixel = 0; pixel < imageSpan.Length; pixel++) { - if (imageSpan[pixel] == 0) + if (imageSpan[pixel] != 0) continue; + Color color = Color.Empty; + if (previousSpan[pixel] > 0 && nextSpan[pixel] > 0) { - if (previousSpan[pixel] > 0 && nextSpan[pixel] > 0) - { - imageBgrSpan[pixel * 3] = 0; // B - imageBgrSpan[pixel * 3 + 1] = 0; // G - imageBgrSpan[pixel * 3 + 2] = 255; // R - } - else if (previousSpan[pixel] > 0) - { - imageBgrSpan[pixel * 3] = previousSpan[pixel]; // B - imageBgrSpan[pixel * 3 + 1] = 0; // G - imageBgrSpan[pixel * 3 + 2] = previousSpan[pixel]; // R - } - else if (nextSpan[pixel] > 0) - { - imageBgrSpan[pixel * 3] = nextSpan[pixel]; // B - imageBgrSpan[pixel * 3 + 1] = nextSpan[pixel]; // G - imageBgrSpan[pixel * 3 + 2] = 0; // R - } + color = Settings.Default.PreviousNextLayerColor; + } + else if (previousSpan[pixel] > 0) + { + color = Settings.Default.PreviousLayerColor; + } + else if (nextSpan[pixel] > 0) + { + color = Settings.Default.NextLayerColor; } + + if (color.IsEmpty) continue; + var bgrPixel = pixel * 3; + imageBgrSpan[bgrPixel] = color.B; // B + imageBgrSpan[++bgrPixel] = color.G; // G + imageBgrSpan[++bgrPixel] = color.R; // R } } } @@ -1790,54 +1817,111 @@ namespace UVtools.GUI !ReferenceEquals(Issues, null) && Issues.TryGetValue(ActualLayer, out var issues)) { - byte brightness; - foreach (var issue in issues) { if (ReferenceEquals(issue, null)) continue; // Removed issue if(!issue.HaveValidPoint) continue; - + Color color = Settings.Default.ResinTrapColor; + if (issue.Type == LayerIssue.IssueType.ResinTrap) { - CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 180, 255), -1); - //CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 0, 255), 1); - + using (var vec = new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels))) + { + CvInvoke.DrawContours(ActualLayerImageBgr, vec, -1, + new MCvScalar(color.B, color.G, color.R), -1); + //CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 0, 255), 1); + } + continue; } foreach (var pixel in issue) { int pixelPos = ActualLayerImage.GetPixelPos(pixel); + byte brightness = imageSpan[pixelPos]; + if (brightness == 0) continue; + int pixelBgrPos = pixelPos*ActualLayerImageBgr.NumberOfChannels; + + switch (issue.Type) { - /*case LayerIssue.IssueType.ResinTrap: - break;*/ case LayerIssue.IssueType.Island: - brightness = imageSpan[pixelPos]; - if (brightness == 0) continue; - // alpha, Color.Yellow - brightness = Math.Max((byte)80, brightness); - imageBgrSpan[pixelBgrPos] = 0; // B - imageBgrSpan[pixelBgrPos + 1] = brightness; // G - imageBgrSpan[pixelBgrPos + 2] = brightness; // R + color = Settings.Default.IslandColor; break; - default: - brightness = imageSpan[pixelPos]; - if (brightness == 0) continue; - // alpha, Color.Yellow - brightness = Math.Max((byte)80, brightness); - imageBgrSpan[pixelBgrPos] = 0; // B - imageBgrSpan[pixelBgrPos + 1] = 0; // G - imageBgrSpan[pixelBgrPos + 2] = brightness; // R + case LayerIssue.IssueType.TouchingBound: + color = Settings.Default.TouchingBoundsColor; break; } - + + + var newColor = color.FactorColor(brightness, 80); + + imageBgrSpan[pixelBgrPos] = newColor.B; // B + imageBgrSpan[pixelBgrPos + 1] = newColor.G; // G + imageBgrSpan[pixelBgrPos + 2] = newColor.R; // R } } } + if (tsLayerImageLayerOutlinePrintVolumeBounds.Checked) + { + CvInvoke.Rectangle(ActualLayerImageBgr, SlicerFile.LayerManager.BoundingRectangle, + new MCvScalar(Settings.Default.OutlinePrintVolumeBoundsColor.B, Settings.Default.OutlinePrintVolumeBoundsColor.G, Settings.Default.OutlinePrintVolumeBoundsColor.R), Settings.Default.OutlinePrintVolumeBoundsLineThickness); + } + + if (tsLayerImageLayerOutlineLayerBounds.Checked) + { + CvInvoke.Rectangle(ActualLayerImageBgr, SlicerFile[layerNum].BoundingRectangle, + new MCvScalar(Settings.Default.OutlineLayerBoundsColor.B, Settings.Default.OutlineLayerBoundsColor.G, Settings.Default.OutlineLayerBoundsColor.R), Settings.Default.OutlineLayerBoundsLineThickness); + } + + if (tsLayerImageLayerOutlineHollowAreas.Checked) + { + using (Mat grayscale = new Mat()) + { + //CvInvoke.Threshold(ActualLayerImage, grayscale, 1, 255, ThresholdType.Binary); + using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint()) + { + using (Mat hierarchy = new Mat()) + { + CvInvoke.FindContours(ActualLayerImage, contours, hierarchy, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple); + + /* + * hierarchy[i][0]: the index of the next contour of the same level + * hierarchy[i][1]: the index of the previous contour of the same level + * hierarchy[i][2]: the index of the first child + * hierarchy[i][3]: the index of the parent + */ + var arr = hierarchy.GetData(); + for (int i = 0; i < contours.Size; i++) + { + if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1) + { + //var r = CvInvoke.BoundingRectangle(contours[i]); + //CvInvoke.Rectangle(ActualLayerImageBgr, r, new MCvScalar(0, 0, 255), 2); + CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, + new MCvScalar(Settings.Default.OutlineHollowAreasColor.B, + Settings.Default.OutlineHollowAreasColor.G, Settings.Default.OutlineHollowAreasColor.R), + Settings.Default.OutlineHollowAreasLineThickness); + } + /*else + { + CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, + new MCvScalar(Settings.Default.ResinTrapColor.B, + Settings.Default.IslandColor.G, Settings.Default.IslandColor.R), + 2); + }*/ + + //if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1) + // CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(0, 0, 0), -1); + } + } + } + } + } + if (tsLayerImageRotate.Checked) { CvInvoke.Rotate(ActualLayerImageBgr, ActualLayerImageBgr, RotateFlags.Rotate90Clockwise); @@ -1936,8 +2020,8 @@ namespace UVtools.GUI { if(ReferenceEquals(tabControlLeft.SelectedTab, tabPageIssues)) { - if (!ReferenceEquals(tabPageIssues.Tag, null)) return; - ComputeIssues(); + if (!ReferenceEquals(tabPageIssues.Tag, null) || !Settings.Default.AutoComputeIssuesClickOnTab) return; + ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration()); } return; } @@ -2056,7 +2140,48 @@ namespace UVtools.GUI return; } } -#endregion + + private void EventMouseDown(object sender, MouseEventArgs e) + { + if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer)) + { + layerScrollTimer.Tag = ReferenceEquals(sender, btnNextLayer); + layerScrollTimer.Start(); + return; + } + } + + private void EventMouseUp(object sender, MouseEventArgs e) + { + if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer)) + { + layerScrollTimer.Stop(); + return; + } + } + + private void EventTimerTick(object sender, EventArgs e) + { + if (ReferenceEquals(sender, layerScrollTimer)) + { + ShowLayer((bool)layerScrollTimer.Tag); + return; + } + } + + private void EventMouseDoubleClick(object sender, MouseEventArgs e) + { + if (ReferenceEquals(sender, pbLayer)) + { + if ((e.Button & MouseButtons.Left) != 0) + { + ZoomToFit(); + return; + } + return; + } + } + #endregion @@ -2104,7 +2229,7 @@ namespace UVtools.GUI - public void MutateLayers(Mutation.Mutates type) + public void MutateLayers(LayerManager.Mutate mutator) { uint layerStart; uint layerEnd; @@ -2115,10 +2240,10 @@ namespace UVtools.GUI double x = 0; double y = 0; - switch (type) + switch (mutator) { - case Mutation.Mutates.Resize: - using (FrmMutationResize inputBox = new FrmMutationResize(Mutations[type])) + case LayerManager.Mutate.Resize: + using (FrmMutationResize inputBox = new FrmMutationResize(Mutations[mutator])) { if (inputBox.ShowDialog() != DialogResult.OK) return; layerStart = inputBox.LayerRangeStart; @@ -2129,8 +2254,27 @@ namespace UVtools.GUI } break; + case LayerManager.Mutate.Flip: + using (FrmMutationOneComboBox inputBox = new FrmMutationOneComboBox(Mutations[mutator])) + { + if (inputBox.ShowDialog() != DialogResult.OK) return; + layerStart = inputBox.LayerRangeStart; + layerEnd = inputBox.LayerRangeEnd; + iterationsStart = (uint) inputBox.SelectedValue; + fade = inputBox.MakeCopy; + } + break; + case LayerManager.Mutate.Rotate: + using (FrmMutationOneNumericalInput inputBox = new FrmMutationOneNumericalInput(Mutations[mutator])) + { + if (inputBox.ShowDialog() != DialogResult.OK) return; + layerStart = inputBox.LayerRangeStart; + layerEnd = inputBox.LayerRangeEnd; + x = (double) inputBox.Value; + } + break; default: - using (FrmMutation inputBox = new FrmMutation(Mutations[type])) + using (FrmMutation inputBox = new FrmMutation(Mutations[mutator])) { if (inputBox.ShowDialog() != DialogResult.OK) return; iterationsStart = inputBox.Iterations; @@ -2146,34 +2290,53 @@ namespace UVtools.GUI DisableGUI(); - FrmLoading.SetDescription($"Mutating - {type}"); + FrmLoading.SetDescription($"Mutating - {mutator}"); Task<bool> task = Task<bool>.Factory.StartNew(() => { bool result = false; try { - switch (type) + switch (mutator) { - case Mutation.Mutates.Resize: + case LayerManager.Mutate.Resize: SlicerFile.LayerManager.MutateResize(layerStart, layerEnd, x / 100.0, y / 100.0, fade); break; - case Mutation.Mutates.Solidify: + case LayerManager.Mutate.Flip: + FlipType flipType = FlipType.Horizontal; + switch (iterationsStart) + { + case 0: + flipType = FlipType.Horizontal; + break; + case 1: + flipType = FlipType.Vertical; + break; + case 2: + flipType = FlipType.Horizontal | FlipType.Vertical; + break; + } + SlicerFile.LayerManager.MutateFlip(layerStart, layerEnd, flipType, fade); + break; + case LayerManager.Mutate.Rotate: + SlicerFile.LayerManager.MutateRotate(layerStart, layerEnd, x); + break; + case LayerManager.Mutate.Solidify: SlicerFile.LayerManager.MutateSolidify(layerStart, layerEnd); break; - case Mutation.Mutates.Erode: + case LayerManager.Mutate.Erode: SlicerFile.LayerManager.MutateErode(layerStart, layerEnd, (int) iterationsStart, (int) iterationsEnd, fade); break; - case Mutation.Mutates.Dilate: + case LayerManager.Mutate.Dilate: SlicerFile.LayerManager.MutateDilate(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade); break; - case Mutation.Mutates.Opening: + case LayerManager.Mutate.Opening: SlicerFile.LayerManager.MutateOpen(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade); break; - case Mutation.Mutates.Closing: + case LayerManager.Mutate.Closing: SlicerFile.LayerManager.MutateClose(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade); break; - case Mutation.Mutates.Gradient: + case LayerManager.Mutate.Gradient: SlicerFile.LayerManager.MutateGradient(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade); break; /*case Mutation.Mutates.TopHat: @@ -2192,13 +2355,13 @@ namespace UVtools.GUI CvInvoke.MorphologyEx(image, image, MorphOp.HitMiss, Program.KernelFindIsolated, new Point(-1, -1), (int) iterations, BorderType.Default, new MCvScalar()); break;*/ - case Mutation.Mutates.PyrDownUp: + case LayerManager.Mutate.PyrDownUp: SlicerFile.LayerManager.MutatePyrDownUp(layerStart, layerEnd); break; - case Mutation.Mutates.SmoothMedian: + case LayerManager.Mutate.SmoothMedian: SlicerFile.LayerManager.MutateMedianBlur(layerStart, layerEnd, (int)iterationsStart); break; - case Mutation.Mutates.SmoothGaussian: + case LayerManager.Mutate.SmoothGaussian: SlicerFile.LayerManager.MutateGaussianBlur(layerStart, layerEnd, new Size((int) iterationsStart, (int) iterationsStart)); break; } @@ -2252,7 +2415,7 @@ namespace UVtools.GUI } - private void ComputeIssues() + private void ComputeIssues(IslandDetectionConfiguration islandConfig = null, ResinTrapDetectionConfiguration resinTrapConfig = null) { tabPageIssues.Tag = true; TotalIssues = 0; @@ -2269,7 +2432,7 @@ namespace UVtools.GUI bool result = false; try { - var issues = SlicerFile.LayerManager.GetAllIssues(); + var issues = SlicerFile.LayerManager.GetAllIssues(islandConfig, resinTrapConfig); Issues = new Dictionary<uint, List<LayerIssue>>(); for (uint i = 0; i < SlicerFile.LayerCount; i++) @@ -2337,32 +2500,53 @@ namespace UVtools.GUI ShowLayer(); } - private void EventMouseDown(object sender, MouseEventArgs e) + private void ZoomToFit() { - if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer)) + if (ReferenceEquals(SlicerFile, null)) return; + if (Settings.Default.ZoomToFitPrintVolumeBounds) { - layerScrollTimer.Tag = ReferenceEquals(sender, btnNextLayer); - layerScrollTimer.Start(); - return; + if (!tsLayerImageRotate.Checked) + { + pbLayer.ZoomToRegion(SlicerFile.LayerManager.BoundingRectangle); + } + else + { + pbLayer.ZoomToRegion(ActualLayerImage.Height - 1 - SlicerFile.LayerManager.BoundingRectangle.Bottom, + SlicerFile.LayerManager.BoundingRectangle.X, + SlicerFile.LayerManager.BoundingRectangle.Height, + SlicerFile.LayerManager.BoundingRectangle.Width + ); + } + } + else + { + pbLayer.ZoomToFit(); } } - private void EventMouseUp(object sender, MouseEventArgs e) + public IslandDetectionConfiguration GetIslandDetectionConfiguration() { - if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer)) - { - layerScrollTimer.Stop(); - return; - } + return new IslandDetectionConfiguration + { + Enabled = tsIsuesRefreshIslands.Checked, + BinaryThreshold = Settings.Default.IslandBinaryThreshold, + RequiredAreaToProcessCheck = Settings.Default.IslandRequiredAreaToProcessCheck, + RequiredPixelBrightnessToProcessCheck = Settings.Default.IslandRequiredPixelBrightnessToProcessCheck, + RequiredPixelsToSupport = Settings.Default.IslandRequiredPixelsToSupport, + RequiredPixelBrightnessToSupport = Settings.Default.IslandRequiredPixelBrightnessToSupport + }; } - private void EventTimerTick(object sender, EventArgs e) + public ResinTrapDetectionConfiguration GetResinTrapDetectionConfiguration() { - if (ReferenceEquals(sender, layerScrollTimer)) + return new ResinTrapDetectionConfiguration { - ShowLayer((bool)layerScrollTimer.Tag); - return; - } + Enabled = tsIsuesRefreshResinTraps.Checked, + BinaryThreshold = Settings.Default.ResinTrapBinaryThreshold, + RequiredAreaToProcessCheck = Settings.Default.ResinTrapRequiredAreaToProcessCheck, + RequiredBlackPixelsToDrain = Settings.Default.ResinTrapRequiredBlackPixelsToDrain, + MaximumPixelBrightnessToDrain = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain + }; } } } diff --git a/UVtools.GUI/FrmMain.resx b/UVtools.GUI/FrmMain.resx index a2492a8..1eff9b4 100644 --- a/UVtools.GUI/FrmMain.resx +++ b/UVtools.GUI/FrmMain.resx @@ -145,68 +145,68 @@ <value> AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA4 - DgAAAk1TRnQBSQFMAgEBBAEAAUABBAFAAQQBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAs + DgAAAk1TRnQBSQFMAgEBBAEAAbgBBAG4AQQBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AZgADUAGjA1IBqQNS - AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAWwBcwH1 - AUgBgQGHAfcDQwF3A1sByAJCAW8B9QJYAV8B4wNKAYwDCgENBAADVQG0A1kBxwMvAUkDAAEBAxsBJgMc - AScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDAgEDBAADUgGpMAADUgGpEAADJwE6 - AzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDJwE6FAADBQEHA0wBkgFWAlgBwQMVAR0DPQFp - AQUByAHzAf8BEwGQAeYB/wIpAdwB/wIpAd0B/wJeAeMB/wI0Ad4B/wIpAd0B/wJYAVsBywMGAQgDAAH/ - AwAB/wNDAXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFR - BAADUgGpBAADUAGdA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1ABnQwAA1IBqRAAA04B+wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A04B+xQAATACMQFNAQYByQHzAf8BBgHJAfQB/wFZAWIBZAHr - AVsCXgHZAQkBwAHxAf8BKgEyAd8B/wIsAeAB/wIsAeAB/wJlAekB/wI3AeIB/wIsAeAB/wIsAeAB/wNA - AXEDUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEAEW - CAADUgGpBAADUAGdA1MBqgNTAaoDHwEsHAADUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/xQAAwcBCgFWAWkBbwHyAQgBygH0Af8BCAHKAfQB/wEIAcoB9AH/ARQBoQHuAf8CLwHj - Af8CLwHjAf8CLwHjAf8CqQHvAf8CNgHjAf8CLwHjAf8CLwHjAf8CVgFYAbkDCgEOAxEBFwMAAQE4AANS - AakwAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADFQEdAz0BaQM6 - AWIBXAJgAdQBCQHLAfUB/wEJAcsB9QH/AQkBywH1Af8BFwGgAfAB/wIyAeYB/wIyAeYB/wIyAeYB/wLC - AfYB/wJKAegB/wIyAeYB/wIyAeYB/wJXAVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwNDAXcDQwF3 - A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNS - AakDUgGpA1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wwAAUsCTAGQAQoBywH2Af8BCgHLAfYB/wEKAcsB9gH/AQoBywH2Af8BKQGGAZwB+gND - AXgDIgEyAksBmAH7AjUB6QH/AjUB6QH/As0B+AH/AlkB7QH/AjUB6QH/AjUB6QH/A1ABngMAAf4DAAH/ - A0MBdwMeASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANS - AakDNAFVAzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ - AwAB/wwAA1EBoAEMAcwB9wH/AQwBzAH3Af8BDAHMAfcB/wEMAcwB9wH/A0MBdwgAA0oBjQI4AewB/wI4 - AewB/wJUAe8B/wI8AewB/wI4AewB/wE0AUUB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0 - AVUDRgGAA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BfwGQAfgBDQHNAfcB/wENAc0B9wH/ - AxIBGAgAAwEBAgNGAX4CUgFnAfACOwHuAf8BOwE8Ae4B/wFAAU4BugH9AUUCRgF+AwMBBAMzAVMDPAFn - AxQBHDgAA1IBqQM0AVUDNAFVAz8BbgMyAVAQAAMnATsDRAF8AzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/ - AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w8AAQEBPwJAAW8BPgF/AZAB+AEOAc4B+AH/AQ4BzgH4 - Af8DEgEYEAADFwEgARUBvAH3Af8BEgHEAfcB/wE6Aa4BvAH9AUUCRgF+AwMBBAMAAf4DAAH/A0MBdwMf - ASwDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFV - AzQBVQMFAQcDVQG1AxEBFwNSAakDKQE+BAADUAGfAxEBFwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8MAANRAaABEAHOAfgB/wEQAc8B+QH/ARABzwH5Af8BEAHP - AfkB/wNDAXcQAANEAXoBEAHPAfkB/wEQAc8B+QH/ARABzwH5Af8BEAHOAfgB/wFSAlMBqANSAfQDAAH/ - Az4BbAMOARMDQgF1A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwMUARsEAANS - AakDNAFVAzQBVQQAAzwBaANWAb4DIwE0A1UBtQMSARkDUQGgBAADNAFVAzQBVQNSAakTAAH/AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfDAABSwJMAZABEQHQAfoB/wERAdAB+gH/AREB0AH6 - Af8BEQHQAfoB/wEpAYYBnAH6A0MBeAMSARkDEwEaA0QBegEoAZEBnQH7AREB0AH6Af8BEQHQAfoB/wER - AdAB+gH/AREB0AH6Af8DSgGMAwoBDgMRARcDAAEBOAADUgGpAzQBVQM0AVUDAAEBAy0BRgMKAQ4EAAM5 - AV8DXAHOAygBPAQAAzQBVQM0AVUDUgGpEwAB/wOCAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHf - AxcBIAwAAxUBHQM9AWkDOgFiAVwCYAHUARIB0QH6Af8BEgHRAfoB/wESAdAB+gH/ARIBywHzAf8BEgHL - AfMB/wESAdAB+gH/ARIB0QH6Af8BEgHRAfoB/wFdAmEB4gM6AWIDPQFpAxQBHANRAaIDVgG2AyoBQAQA - AxABFQMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQARYIAANSAakDNAFVAzQBVQMz - AVMDUgGmA0oBjAcAAQEDRwGDCAADNAFVAzQBVQNSAakTAAH/A5kB/wOFAf8DAAH/AwAB/wMAAf8DAAH/ - A1wB3wMXASAYAAMHAQoBWAFpAW8B8gEUAdIB+wH/ARQB0gH7Af8BFAHSAfsB/wEUAdIB+wH/ARQB0gH7 - Af8BFAHSAfsB/wEUAdIB+wH/ARQB0gH7Af8BKwGSAZ0B+wMRARcLAAH/AwAB/wNDAXcDKQE+AwAB/wMA - Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFRBAADUgGpAzQBVQM0AVUDEQEX - A1ABngMkATYUAAM0AVUDNAFVA1IBqRAAA1AB+wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wMXASAcAAEw - AjEBTQEVAdIB/AH/ARUB0gH8Af8BWQFjAWYB6wFbAl4B2QEVAdIB/AH/ARUB0gH8Af8BWwJhAeEBXQJh - AeIBFQHSAfwB/wEVAdIB/AH/AzgBXggAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEn - AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqQMiATIDUgGpA1IBqQNSAakDUgGpA1IBqQNS - AakDUgGpA1IBqQNSAakDUgGpAyIBMgNSAakQAAMgAS4DKQE/AykBPwMpAT8DKQE/AykBPwMRARcgAAMF - AQcDTAGSAVYCWAHBAxUBHQM9AWkBFgHTAfwB/wEWAdMB/AH/AUUCRgF/AxABFQNWAbMBSwJMAY8DBAEG - TAADUAGjA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wA - AxUBHQFCAW8BewH1AVEBhQGKAfcDIAEvGAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEB - FgAD/4EAAv8BgAEBAv8B/AEBAgABvwH9AeABBwHAAwABoAEdAeABBwHAAQABEAEBAaEB/QHgAQcBwAEA - AR8B/wG/Af0B4AEHBAABgAEBAeABBwQAAY8B8QHgAQcBAwEAAR8B/wGAAQEB4AEHAQMBAAEfAf8BgwHB - AeABBwEDAcACAAGAAUEB4AEHAQMBwAIAAYgBEQHgAQcCAAEfAf8BgQERAeABBwIAARABAQGBATEB4AEP - AcABAwIAAYEB8QHgAR8BwAEDAgABgAEBAeABPwHAAQMC/wGAAQEC/wH8AT8L + AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAVkBXgH1 + AVECbQH3A0MBdwNbAcgCQgFaAfUCWAFfAeMDSgGMAwoBDQQAA1UBtANZAccDLwFJAwABAQMbASYDHAEn + AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqTAAA1IBqRAAAycBOgMw + AUwDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAycBOhQAAwUBBwNMAZIBVgJYAcEDFQEdAz0BaQEA + AcgB8wH/AQQBkAHmAf8CGgHcAf8CGgHdAf8CTwHjAf8CJQHeAf8CGgHdAf8CWAFbAcsDBgEIAwAB/wMA + Af8DQwF3AykBPgMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AzIBUQQA + A1IBqQQAA1ABnQNTAaoDUwGqA1MBqgNTAaoDUwGqA1MBqgNQAZ0MAANSAakQAANOAfsDAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wNOAfsUAAEwAjEBTQEAAckB8wH/AQAByQH0Af8BWQJgAesBWwJe + AdkBAAHAAfEB/wEbASMB3wH/Ah0B4AH/Ah0B4AH/AlYB6QH/AigB4gH/Ah0B4AH/Ah0B4AH/A0ABcQNR + AaIDVgG2AyoBQAQAAxABFQMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQARYIAANS + AakEAANQAZ0DUwGqA1MBqgMfASwcAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/FAADBwEKAVkCZwHyAQABygH0Af8BAAHKAfQB/wEAAcoB9AH/AQUBoQHuAf8CIAHjAf8CIAHj + Af8CIAHjAf8CqQHvAf8CJwHjAf8CIAHjAf8CIAHjAf8CVgFYAbkDCgEOAxEBFwMAAQE4AANSAakwAANS + AakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADFQEdAz0BaQM6AWIBXAJg + AdQBAAHLAfUB/wEAAcsB9QH/AQABywH1Af8BCAGgAfAB/wIjAeYB/wIjAeYB/wIjAeYB/wLCAfYB/wI7 + AegB/wIjAeYB/wIjAeYB/wJXAVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwNDAXcDQwF3A0MBdwND + AXcDQwF3A0MBdwNDAXcDQwF3A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNSAakDUgGp + A1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wwAAUsCTAGQAQABywH2Af8BAAHLAfYB/wEAAcsB9gH/AQABywH2Af8BKQFyAXoB+gNDAXgDIgEy + AksBiAH7AiYB6QH/AiYB6QH/As0B+AH/AkoB7QH/AiYB6QH/AiYB6QH/A1ABngMAAf4DAAH/A0MBdwMe + ASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFV + AzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwA + A1EBoAEAAcwB9wH/AQABzAH3Af8BAAHMAfcB/wEAAcwB9wH/A0MBdwgAA0oBjQIpAewB/wIpAewB/wJF + Ae8B/wItAewB/wIpAewB/wElATYB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0AVUDRgGA + A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BcAF1AfgBAAHNAfcB/wEAAc0B9wH/AxIBGAgA + AwEBAgNGAX4CUgFdAfACLAHuAf8BLAEtAe4B/wJAAasB/QFFAkYBfgMDAQQDMwFTAzwBZwMUARw4AANS + AakDNAFVAzQBVQM/AW4DMgFQEAADJwE7A0QBfAM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BcAF1AfgBAAHOAfgB/wEAAc4B+AH/AxIBGBAA + AxcBIAEGAbwB9wH/AQMBxAH3Af8BQAGoAa0B/QFFAkYBfgMDAQQDAAH+AwAB/wNDAXcDHwEsA1cBxQNZ + AccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNYAcYDJgE5BAADUgGpAzQBVQM0AVUDBQEH + A1UBtQMRARcDUgGpAykBPgQAA1ABnwMRARcDNAFVAzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/DAADUQGgAQEBzgH4Af8BAQHPAfkB/wEBAc8B+QH/AQEBzwH5Af8DQwF3 + EAADRAF6AQEBzwH5Af8BAQHPAfkB/wEBAc8B+QH/AQEBzgH4Af8BUgJTAagDUgH0AwAB/wM+AWwDDgET + A0IBdQNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDFAEbBAADUgGpAzQBVQM0 + AVUEAAM8AWgDVgG+AyMBNANVAbUDEgEZA1EBoAQAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMA + Af8DAAH/AwAB/wMAAf8DAAH/A1wB3wwAAUsCTAGQAQIB0AH6Af8BAgHQAfoB/wECAdAB+gH/AQIB0AH6 + Af8BKQFyAXoB+gNDAXgDEgEZAxMBGgNEAXoBKAGCAYsB+wECAdAB+gH/AQIB0AH6Af8BAgHQAfoB/wEC + AdAB+gH/A0oBjAMKAQ4DEQEXAwABATgAA1IBqQM0AVUDNAFVAwABAQMtAUYDCgEOBAADOQFfA1wBzgMo + ATwEAAM0AVUDNAFVA1IBqRMAAf8DggH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wMXASAMAAMV + AR0DPQFpAzoBYgFcAmAB1AEDAdEB+gH/AQMB0QH6Af8BAwHQAfoB/wEDAcsB8wH/AQMBywHzAf8BAwHQ + AfoB/wEDAdEB+gH/AQMB0QH6Af8BXQJhAeIDOgFiAz0BaQMUARwDUQGiA1YBtgMqAUAEAAMQARUDEQEX + AxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEAEWCAADUgGpAzQBVQM0AVUDMwFTA1IBpgNK + AYwHAAEBA0cBgwgAAzQBVQM0AVUDUgGpEwAB/wOZAf8DhQH/AwAB/wMAAf8DAAH/AwAB/wNcAd8DFwEg + GAADBwEKAVkCZwHyAQUB0gH7Af8BBQHSAfsB/wEFAdIB+wH/AQUB0gH7Af8BBQHSAfsB/wEFAdIB+wH/ + AQUB0gH7Af8BBQHSAfsB/wErAYMBiwH7AxEBFwsAAf8DAAH/A0MBdwMpAT4DAAH/AwAB/wMAAf8DAAH/ + AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMyAVEEAANSAakDNAFVAzQBVQMRARcDUAGeAyQBNhQA + AzQBVQM0AVUDUgGpEAADUAH7AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfAxcBIBwAATACMQFNAQYB0gH8 + Af8BBgHSAfwB/wFZAmAB6wFbAl4B2QEGAdIB/AH/AQYB0gH8Af8BWwJhAeEBXQJhAeIBBgHSAfwB/wEG + AdIB/AH/AzgBXggAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEn + AxwBJwMcAScDHAEnAwIBAwQAA1IBqQMiATIDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNS + AakDUgGpAyIBMgNSAakQAAMgAS4DKQE/AykBPwMpAT8DKQE/AykBPwMRARcgAAMFAQcDTAGSAVYCWAHB + AxUBHQM9AWkBBwHTAfwB/wEHAdMB/AH/AUUCRgF/AxABFQNWAbMBSwJMAY8DBAEGTAADUAGjA1IBqQNS + AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAVoBYgH1 + AVEBbQF0AfcDIAEvGAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAv8BgAEB + Av8B/AEBAgABvwH9AeABBwHAAwABoAEdAeABBwHAAQABEAEBAaEB/QHgAQcBwAEAAR8B/wG/Af0B4AEH + BAABgAEBAeABBwQAAY8B8QHgAQcBAwEAAR8B/wGAAQEB4AEHAQMBAAEfAf8BgwHBAeABBwEDAcACAAGA + AUEB4AEHAQMBwAIAAYgBEQHgAQcCAAEfAf8BgQERAeABBwIAARABAQGBATEB4AEPAcABAwIAAYEB8QHg + AR8BwAEDAgABgAEBAeABPwHAAQMC/wGAAQEC/wH8AT8L </value> </data> <metadata name="toolTipInformation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> diff --git a/UVtools.GUI/Images/settings-16x16.png b/UVtools.GUI/Images/settings-16x16.png Binary files differnew file mode 100644 index 0000000..83e560c --- /dev/null +++ b/UVtools.GUI/Images/settings-16x16.png diff --git a/UVtools.GUI/Mutation.cs b/UVtools.GUI/Mutation.cs index 0ae56d7..e9ba085 100644 --- a/UVtools.GUI/Mutation.cs +++ b/UVtools.GUI/Mutation.cs @@ -6,35 +6,15 @@ * of this license document, but changing it is not allowed. */ using System.Drawing; +using UVtools.Core; namespace UVtools.GUI { public class Mutation { - #region Enum - public enum Mutates : byte - { - Resize, - Solidify, - //LayerSmash, - Erode, - Dilate, - Opening, - Closing, - Gradient, - TopHat, - BlackHat, - HitMiss, - PyrDownUp, - SmoothMedian, - SmoothGaussian, - - } - #endregion - #region Properties - public Mutates Mutate { get; } + public LayerManager.Mutate Mutate { get; } public string Description { get; } @@ -43,7 +23,7 @@ namespace UVtools.GUI #region Constructor - public Mutation(Mutates mutate, string description, Image image = null) + public Mutation(LayerManager.Mutate mutate, string description, Image image = null) { Mutate = mutate; Description = description; diff --git a/UVtools.GUI/Properties/Resources.Designer.cs b/UVtools.GUI/Properties/Resources.Designer.cs index d20e24b..67e7df1 100644 --- a/UVtools.GUI/Properties/Resources.Designer.cs +++ b/UVtools.GUI/Properties/Resources.Designer.cs @@ -563,6 +563,16 @@ namespace UVtools.GUI.Properties { /// <summary> /// Looks up a localized resource of type System.Drawing.Bitmap. /// </summary> + internal static System.Drawing.Bitmap settings_16x16 { + get { + object obj = ResourceManager.GetObject("settings-16x16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// <summary> + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// </summary> internal static System.Drawing.Bitmap UVtools { get { object obj = ResourceManager.GetObject("UVtools", resourceCulture); diff --git a/UVtools.GUI/Properties/Resources.resx b/UVtools.GUI/Properties/Resources.resx index a53bad9..00ef478 100644 --- a/UVtools.GUI/Properties/Resources.resx +++ b/UVtools.GUI/Properties/Resources.resx @@ -121,14 +121,17 @@ <data name="Error-128x128" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Error-128x128.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="arrow-top-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\arrow-top-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="eye-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\eye-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -163,9 +166,6 @@ <data name="warning-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\warning-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="Wrench-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Wrench-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> @@ -178,8 +178,8 @@ <data name="arrow-up" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\arrow-up.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Ok-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Ok-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -187,6 +187,9 @@ <data name="Button-Info-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Button-Info-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="Next-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Next-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> @@ -199,11 +202,14 @@ <data name="Open-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Open-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="File-Close-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\File-Close-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Cancel-32x32" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Cancel-32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -211,20 +217,17 @@ <data name="eye-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\eye-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> <data name="Geometry-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Geometry-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="plus" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\plus.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="layers-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\layers-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -247,23 +250,23 @@ <data name="checkbox-unmarked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\checkbox-unmarked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> + <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> <data name="delete-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\delete-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> - </data> - <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="mutation_blackhat" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\gui\mutation_blackhat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + </data> + <data name="clipboard-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="arrow-down" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\arrow-down.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> @@ -274,7 +277,7 @@ <data name="island-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\island-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> - <data name="clipboard-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> - <value>..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> + <data name="settings-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms"> + <value>..\Images\settings-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> </root>
\ No newline at end of file diff --git a/UVtools.GUI/Properties/Settings.Designer.cs b/UVtools.GUI/Properties/Settings.Designer.cs index c398559..6cc1d6a 100644 --- a/UVtools.GUI/Properties/Settings.Designer.cs +++ b/UVtools.GUI/Properties/Settings.Designer.cs @@ -22,5 +22,425 @@ namespace UVtools.GUI.Properties { return defaultInstance; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Red")] + public global::System.Drawing.Color PreviousNextLayerColor { + get { + return ((global::System.Drawing.Color)(this["PreviousNextLayerColor"])); + } + set { + this["PreviousNextLayerColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Yellow")] + public global::System.Drawing.Color IslandColor { + get { + return ((global::System.Drawing.Color)(this["IslandColor"])); + } + set { + this["IslandColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Orange")] + public global::System.Drawing.Color ResinTrapColor { + get { + return ((global::System.Drawing.Color)(this["ResinTrapColor"])); + } + set { + this["ResinTrapColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Red")] + public global::System.Drawing.Color TouchingBoundsColor { + get { + return ((global::System.Drawing.Color)(this["TouchingBoundsColor"])); + } + set { + this["TouchingBoundsColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Magenta")] + public global::System.Drawing.Color PreviousLayerColor { + get { + return ((global::System.Drawing.Color)(this["PreviousLayerColor"])); + } + set { + this["PreviousLayerColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Cyan")] + public global::System.Drawing.Color NextLayerColor { + get { + return ((global::System.Drawing.Color)(this["NextLayerColor"])); + } + set { + this["NextLayerColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool UpdateSettings { + get { + return ((bool)(this["UpdateSettings"])); + } + set { + this["UpdateSettings"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool StartMaximized { + get { + return ((bool)(this["StartMaximized"])); + } + set { + this["StartMaximized"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool CheckForUpdatesOnStartup { + get { + return ((bool)(this["CheckForUpdatesOnStartup"])); + } + set { + this["CheckForUpdatesOnStartup"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool LayerAutoRotateBestView { + get { + return ((bool)(this["LayerAutoRotateBestView"])); + } + set { + this["LayerAutoRotateBestView"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool LayerDifferenceDefault { + get { + return ((bool)(this["LayerDifferenceDefault"])); + } + set { + this["LayerDifferenceDefault"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool ComputeIssuesOnLoad { + get { + return ((bool)(this["ComputeIssuesOnLoad"])); + } + set { + this["ComputeIssuesOnLoad"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool LayerZoomToFit { + get { + return ((bool)(this["LayerZoomToFit"])); + } + set { + this["LayerZoomToFit"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ComputeIslands { + get { + return ((bool)(this["ComputeIslands"])); + } + set { + this["ComputeIslands"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ComputeResinTraps { + get { + return ((bool)(this["ComputeResinTraps"])); + } + set { + this["ComputeResinTraps"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public byte IslandRequiredAreaToProcessCheck { + get { + return ((byte)(this["IslandRequiredAreaToProcessCheck"])); + } + set { + this["IslandRequiredAreaToProcessCheck"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public byte IslandRequiredPixelBrightnessToProcessCheck { + get { + return ((byte)(this["IslandRequiredPixelBrightnessToProcessCheck"])); + } + set { + this["IslandRequiredPixelBrightnessToProcessCheck"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("10")] + public byte IslandRequiredPixelsToSupport { + get { + return ((byte)(this["IslandRequiredPixelsToSupport"])); + } + set { + this["IslandRequiredPixelsToSupport"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("150")] + public byte IslandRequiredPixelBrightnessToSupport { + get { + return ((byte)(this["IslandRequiredPixelBrightnessToSupport"])); + } + set { + this["IslandRequiredPixelBrightnessToSupport"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("17")] + public byte ResinTrapRequiredAreaToProcessCheck { + get { + return ((byte)(this["ResinTrapRequiredAreaToProcessCheck"])); + } + set { + this["ResinTrapRequiredAreaToProcessCheck"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("10")] + public byte ResinTrapRequiredBlackPixelsToDrain { + get { + return ((byte)(this["ResinTrapRequiredBlackPixelsToDrain"])); + } + set { + this["ResinTrapRequiredBlackPixelsToDrain"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("30")] + public byte ResinTrapMaximumPixelBrightnessToDrain { + get { + return ((byte)(this["ResinTrapMaximumPixelBrightnessToDrain"])); + } + set { + this["ResinTrapMaximumPixelBrightnessToDrain"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool AutoComputeIssuesClickOnTab { + get { + return ((bool)(this["AutoComputeIssuesClickOnTab"])); + } + set { + this["AutoComputeIssuesClickOnTab"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Lime")] + public global::System.Drawing.Color OutlinePrintVolumeBoundsColor { + get { + return ((global::System.Drawing.Color)(this["OutlinePrintVolumeBoundsColor"])); + } + set { + this["OutlinePrintVolumeBoundsColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("3")] + public byte OutlinePrintVolumeBoundsLineThickness { + get { + return ((byte)(this["OutlinePrintVolumeBoundsLineThickness"])); + } + set { + this["OutlinePrintVolumeBoundsLineThickness"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Lime")] + public global::System.Drawing.Color OutlineLayerBoundsColor { + get { + return ((global::System.Drawing.Color)(this["OutlineLayerBoundsColor"])); + } + set { + this["OutlineLayerBoundsColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("3")] + public byte OutlineLayerBoundsLineThickness { + get { + return ((byte)(this["OutlineLayerBoundsLineThickness"])); + } + set { + this["OutlineLayerBoundsLineThickness"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Orange")] + public global::System.Drawing.Color OutlineHollowAreasColor { + get { + return ((global::System.Drawing.Color)(this["OutlineHollowAreasColor"])); + } + set { + this["OutlineHollowAreasColor"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("3")] + public sbyte OutlineHollowAreasLineThickness { + get { + return ((sbyte)(this["OutlineHollowAreasLineThickness"])); + } + set { + this["OutlineHollowAreasLineThickness"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool OutlinePrintVolumeBounds { + get { + return ((bool)(this["OutlinePrintVolumeBounds"])); + } + set { + this["OutlinePrintVolumeBounds"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool OutlineLayerBounds { + get { + return ((bool)(this["OutlineLayerBounds"])); + } + set { + this["OutlineLayerBounds"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool OutlineHollowAreas { + get { + return ((bool)(this["OutlineHollowAreas"])); + } + set { + this["OutlineHollowAreas"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ZoomToFitPrintVolumeBounds { + get { + return ((bool)(this["ZoomToFitPrintVolumeBounds"])); + } + set { + this["ZoomToFitPrintVolumeBounds"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("127")] + public byte ResinTrapBinaryThreshold { + get { + return ((byte)(this["ResinTrapBinaryThreshold"])); + } + set { + this["ResinTrapBinaryThreshold"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public byte IslandBinaryThreshold { + get { + return ((byte)(this["IslandBinaryThreshold"])); + } + set { + this["IslandBinaryThreshold"] = value; + } + } } } diff --git a/UVtools.GUI/Properties/Settings.settings b/UVtools.GUI/Properties/Settings.settings index 3964565..1a40bbb 100644 --- a/UVtools.GUI/Properties/Settings.settings +++ b/UVtools.GUI/Properties/Settings.settings @@ -1,7 +1,111 @@ <?xml version='1.0' encoding='utf-8'?> -<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)"> - <Profiles> - <Profile Name="(Default)" /> - </Profiles> - <Settings /> -</SettingsFile> +<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="UVtools.GUI.Properties" GeneratedClassName="Settings"> + <Profiles /> + <Settings> + <Setting Name="PreviousNextLayerColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Red</Value> + </Setting> + <Setting Name="IslandColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Yellow</Value> + </Setting> + <Setting Name="ResinTrapColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Orange</Value> + </Setting> + <Setting Name="TouchingBoundsColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Red</Value> + </Setting> + <Setting Name="PreviousLayerColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Magenta</Value> + </Setting> + <Setting Name="NextLayerColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Cyan</Value> + </Setting> + <Setting Name="UpdateSettings" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="StartMaximized" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="CheckForUpdatesOnStartup" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="LayerAutoRotateBestView" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="LayerDifferenceDefault" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="ComputeIssuesOnLoad" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="LayerZoomToFit" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="ComputeIslands" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="ComputeResinTraps" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="IslandRequiredAreaToProcessCheck" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">1</Value> + </Setting> + <Setting Name="IslandRequiredPixelBrightnessToProcessCheck" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">1</Value> + </Setting> + <Setting Name="IslandRequiredPixelsToSupport" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">10</Value> + </Setting> + <Setting Name="IslandRequiredPixelBrightnessToSupport" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">150</Value> + </Setting> + <Setting Name="ResinTrapRequiredAreaToProcessCheck" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">17</Value> + </Setting> + <Setting Name="ResinTrapRequiredBlackPixelsToDrain" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">10</Value> + </Setting> + <Setting Name="ResinTrapMaximumPixelBrightnessToDrain" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">30</Value> + </Setting> + <Setting Name="AutoComputeIssuesClickOnTab" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="OutlinePrintVolumeBoundsColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Lime</Value> + </Setting> + <Setting Name="OutlinePrintVolumeBoundsLineThickness" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">3</Value> + </Setting> + <Setting Name="OutlineLayerBoundsColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Lime</Value> + </Setting> + <Setting Name="OutlineLayerBoundsLineThickness" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">3</Value> + </Setting> + <Setting Name="OutlineHollowAreasColor" Type="System.Drawing.Color" Scope="User"> + <Value Profile="(Default)">Orange</Value> + </Setting> + <Setting Name="OutlineHollowAreasLineThickness" Type="System.SByte" Scope="User"> + <Value Profile="(Default)">3</Value> + </Setting> + <Setting Name="OutlinePrintVolumeBounds" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="OutlineLayerBounds" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="OutlineHollowAreas" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">False</Value> + </Setting> + <Setting Name="ZoomToFitPrintVolumeBounds" Type="System.Boolean" Scope="User"> + <Value Profile="(Default)">True</Value> + </Setting> + <Setting Name="ResinTrapBinaryThreshold" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">127</Value> + </Setting> + <Setting Name="IslandBinaryThreshold" Type="System.Byte" Scope="User"> + <Value Profile="(Default)">0</Value> + </Setting> + </Settings> +</SettingsFile>
\ No newline at end of file diff --git a/UVtools.GUI/UVtools.GUI.csproj b/UVtools.GUI/UVtools.GUI.csproj index cb1c952..66274c8 100644 --- a/UVtools.GUI/UVtools.GUI.csproj +++ b/UVtools.GUI/UVtools.GUI.csproj @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> @@ -63,9 +62,6 @@ <Reference Include="ApplicationManagement"> <HintPath>Libraries\ApplicationManagement.dll</HintPath> </Reference> - <Reference Include="BinarySerializer, Version=8.5.1.0, Culture=neutral, processorArchitecture=MSIL"> - <HintPath>..\packages\BinarySerializer.8.5.1\lib\net46\BinarySerializer.dll</HintPath> - </Reference> <Reference Include="Cyotek.Windows.Forms.ImageBox, Version=1.2.0.0, Culture=neutral, PublicKeyToken=58daa28b0b2de221, processorArchitecture=MSIL"> <HintPath>..\packages\CyotekImageBox.1.3.0-Alpha1\lib\net20\Cyotek.Windows.Forms.ImageBox.dll</HintPath> </Reference> @@ -75,9 +71,6 @@ <Reference Include="Emgu.CV.Platform.NetStandard, Version=4.3.0.3890, Culture=neutral, PublicKeyToken=7281126722ab4438, processorArchitecture=MSIL"> <HintPath>..\packages\Emgu.CV.4.3.0.3890\lib\net461\Emgu.CV.Platform.NetStandard.dll</HintPath> </Reference> - <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> - <HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath> - </Reference> <Reference Include="System" /> <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath> @@ -94,16 +87,6 @@ <Reference Include="System.IO.Compression.FileSystem" /> <Reference Include="System.Deployment" /> <Reference Include="System.Drawing" /> - <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> - <HintPath>..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath> - <Private>True</Private> - <Private>True</Private> - </Reference> - <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> - <HintPath>..\packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath> - <Private>True</Private> - <Private>True</Private> - </Reference> <Reference Include="System.Management" /> <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath> @@ -126,7 +109,7 @@ <Private>True</Private> </Reference> <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> - <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0-preview.5.20278.1\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath> + <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0-preview.6.20305.6\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath> </Reference> <Reference Include="System.Runtime.Extensions, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <HintPath>..\packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll</HintPath> @@ -149,6 +132,18 @@ <Compile Include="Forms\FrmInstallPEProfiles.Designer.cs"> <DependentUpon>FrmInstallPEProfiles.cs</DependentUpon> </Compile> + <Compile Include="Forms\FrmMutationOneNumericalInput.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\FrmMutationOneNumericalInput.Designer.cs"> + <DependentUpon>FrmMutationOneNumericalInput.cs</DependentUpon> + </Compile> + <Compile Include="Forms\FrmMutationOneComoboBox.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\FrmMutationOneComoboBox.Designer.cs"> + <DependentUpon>FrmMutationOneComoboBox.cs</DependentUpon> + </Compile> <Compile Include="Forms\FrmMutationResize.cs"> <SubType>Form</SubType> </Compile> @@ -185,6 +180,12 @@ <Compile Include="Forms\FrmLoading.Designer.cs"> <DependentUpon>FrmLoading.cs</DependentUpon> </Compile> + <Compile Include="Forms\FrmSettings.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="Forms\FrmSettings.Designer.cs"> + <DependentUpon>FrmSettings.cs</DependentUpon> + </Compile> <Compile Include="FrmMain.cs"> <SubType>Form</SubType> </Compile> @@ -201,6 +202,12 @@ <EmbeddedResource Include="Forms\FrmInstallPEProfiles.resx"> <DependentUpon>FrmInstallPEProfiles.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="Forms\FrmMutationOneNumericalInput.resx"> + <DependentUpon>FrmMutationOneNumericalInput.cs</DependentUpon> + </EmbeddedResource> + <EmbeddedResource Include="Forms\FrmMutationOneComoboBox.resx"> + <DependentUpon>FrmMutationOneComoboBox.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="Forms\FrmMutationResize.resx"> <DependentUpon>FrmMutationResize.cs</DependentUpon> </EmbeddedResource> @@ -216,6 +223,9 @@ <EmbeddedResource Include="Forms\FrmLoading.resx"> <DependentUpon>FrmLoading.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="Forms\FrmSettings.resx"> + <DependentUpon>FrmSettings.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="FrmMain.resx"> <DependentUpon>FrmMain.cs</DependentUpon> </EmbeddedResource> @@ -263,6 +273,7 @@ <None Include="Images\checkbox-unmarked-16x16.png" /> <None Include="Images\file-image-16x16.png" /> <None Include="Images\clipboard-16x16.png" /> + <None Include="Images\settings-16x16.png" /> <Content Include="UVtools.ico" /> <None Include="UVtools.png" /> <None Include="Images\Exit-16x16.png" /> @@ -337,14 +348,14 @@ </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <PropertyGroup> - <PostBuildEvent>xcopy /i /y /d /s $(ProjectDir)..\PrusaSlicer $(ProjectDir)$(OutDir)\PrusaSlicer</PostBuildEvent> + <PostBuildEvent>xcopy /i /y /d /s $(ProjectDir)..\PrusaSlicer $(ProjectDir)$(OutDir)\PrusaSlicer +xcopy /d /y $(ProjectDir)..\UVtools.Cmd\$(OutDir)netcoreapp3.1\* $(ProjectDir)$(OutDir)</PostBuildEvent> </PropertyGroup> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets'))" /> - <Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props'))" /> </Target> <Import Project="..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets" Condition="Exists('..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets')" /> </Project>
\ No newline at end of file diff --git a/UVtools.GUI/packages.config b/UVtools.GUI/packages.config index cb19e0e..1289075 100644 --- a/UVtools.GUI/packages.config +++ b/UVtools.GUI/packages.config @@ -1,24 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> <packages> - <package id="BinarySerializer" version="8.5.1" targetFramework="net48" /> <package id="CyotekImageBox" version="1.3.0-Alpha1" targetFramework="net48" /> <package id="Emgu.CV" version="4.3.0.3890" targetFramework="net48" /> <package id="Emgu.CV.runtime.windows" version="4.3.0.3890" targetFramework="net48" /> - <package id="Microsoft.Net.Compilers.Toolset" version="3.7.0-2.final" targetFramework="net48" developmentDependency="true" /> - <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net48" /> <package id="System.Buffers" version="4.5.1" targetFramework="net48" /> - <package id="System.Collections" version="4.3.0" targetFramework="net48" /> <package id="System.IO" version="4.3.0" targetFramework="net48" /> - <package id="System.Linq" version="4.3.0" targetFramework="net48" /> - <package id="System.Linq.Expressions" version="4.3.0" targetFramework="net48" /> <package id="System.Memory" version="4.5.4" targetFramework="net48" /> <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" /> <package id="System.Reflection" version="4.3.0" targetFramework="net48" /> - <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net48" /> <package id="System.Reflection.TypeExtensions" version="4.7.0" targetFramework="net48" /> <package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" /> <package id="System.Runtime" version="4.3.1" targetFramework="net48" /> - <package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0-preview.5.20278.1" targetFramework="net48" /> + <package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0-preview.6.20305.6" targetFramework="net48" /> <package id="System.Runtime.Extensions" version="4.3.1" targetFramework="net48" /> <package id="System.Text.Encoding" version="4.3.0" targetFramework="net48" /> <package id="System.Threading" version="4.3.0" targetFramework="net48" /> diff --git a/UVtools.InstallerMM/UVtools.InstallerMM.wxs b/UVtools.InstallerMM/UVtools.InstallerMM.wxs index 2d04643..879293b 100644 --- a/UVtools.InstallerMM/UVtools.InstallerMM.wxs +++ b/UVtools.InstallerMM/UVtools.InstallerMM.wxs @@ -3,7 +3,7 @@ <?define ComponentRules="OneToOne"?> <!-- SourceDir instructs IsWiX the location of the directory that contains files for this merge module --> <?define SourceDir="..\UVtools.GUI\bin\Release"?> - <Module Id="UVtools" Language="1033" Version="0.5.2.2"> + <Module Id="UVtools" Language="1033" Version="0.6.0.0"> <Package Id="12aaa1cf-ff06-4a02-abd5-2ac01ac4f83b" Manufacturer="PTRTECH" InstallerVersion="200" Keywords="MSLA, DLP" Description="MSLA/DLP, file analysis, repair, conversion and manipulation" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="DesktopFolder" /> @@ -26,6 +26,9 @@ <Component Id="owc25ABE3DF1B281670E77FD3B882B58B9F" Guid="de5c6697-501a-2e10-da10-134ad4f060ad"> <File Id="owf25ABE3DF1B281670E77FD3B882B58B9F" Source="$(var.SourceDir)\Cyotek.Windows.Forms.ImageBox.xml" KeyPath="yes" /> </Component> + <Component Id="owc0F288E77993D555E272ECFA1DF023DDA" Guid="ad374cb5-9215-37cb-d59d-88e4b3bc61bb"> + <File Id="owf0F288E77993D555E272ECFA1DF023DDA" Source="$(var.SourceDir)\Emgu.CV.Platform.NetCore.dll" KeyPath="yes" /> + </Component> <Component Id="owc5A25DAF599EFAF9BDE0A414028049BB5" Guid="08486262-cc80-60a3-c6b2-f5c1bba4699d"> <File Id="owf5A25DAF599EFAF9BDE0A414028049BB5" Source="$(var.SourceDir)\Emgu.CV.Platform.NetFramework.dll" KeyPath="yes" /> </Component> @@ -44,27 +47,15 @@ <Component Id="owc3FC8434C1A84605AEEBC6A100CA2F3E1" Guid="47d7e276-db6d-424e-d797-1a69e1e24b3b"> <File Id="owf3FC8434C1A84605AEEBC6A100CA2F3E1" Source="$(var.SourceDir)\Newtonsoft.Json.dll" KeyPath="yes" /> </Component> - <Component Id="owcDE8FDCCF922CA433A075036DF5C1BE38" Guid="3a65cb72-6e09-91ed-08ba-4f7eadd88867"> - <File Id="owfDE8FDCCF922CA433A075036DF5C1BE38" Source="$(var.SourceDir)\Newtonsoft.Json.xml" KeyPath="yes" /> - </Component> - <Component Id="owcCE9BC93A259754292A772FFBD0707880" Guid="0fd9f7f4-8ed5-a50f-352f-a7fcc169d9ee"> - <File Id="owfCE9BC93A259754292A772FFBD0707880" Source="$(var.SourceDir)\SixLabors.Core.dll" KeyPath="yes" /> - </Component> - <Component Id="owc2D7EC5C1FE4514E7C7CCB37E8D125A40" Guid="08ff79c4-bff0-c6d4-ffba-1f1fcbb32f8b"> - <File Id="owf2D7EC5C1FE4514E7C7CCB37E8D125A40" Source="$(var.SourceDir)\SixLabors.Core.xml" KeyPath="yes" /> - </Component> - <Component Id="owc36F067EBBAC4A5B55BCC215DAB0D892B" Guid="31c6f4c4-ace8-5e28-4ae1-0d8f4f7122b9"> - <File Id="owf36F067EBBAC4A5B55BCC215DAB0D892B" Source="$(var.SourceDir)\SixLabors.ImageSharp.dll" KeyPath="yes" /> - </Component> - <Component Id="owc71BB2593A187E41D45ACB014E6A21293" Guid="672fc09e-6ff6-3166-9614-516281a7e144"> - <File Id="owf71BB2593A187E41D45ACB014E6A21293" Source="$(var.SourceDir)\SixLabors.ImageSharp.xml" KeyPath="yes" /> - </Component> <Component Id="owc266C4DEC591C8A54CCC1D3C61FC512AA" Guid="2224179c-4d85-88a2-23e2-bc0c27cadd0e"> <File Id="owf266C4DEC591C8A54CCC1D3C61FC512AA" Source="$(var.SourceDir)\System.Buffers.dll" KeyPath="yes" /> </Component> <Component Id="owcB3975236E57AF3476C692D6E3C40D3A7" Guid="5d90e46b-650b-92f7-6d00-2dd61f8a4944"> <File Id="owfB3975236E57AF3476C692D6E3C40D3A7" Source="$(var.SourceDir)\System.Buffers.xml" KeyPath="yes" /> </Component> + <Component Id="owc0517117239E80E566282BE4546F8180F" Guid="c6cee878-746b-dc34-9583-946f27cba26a"> + <File Id="owf0517117239E80E566282BE4546F8180F" Source="$(var.SourceDir)\System.CommandLine.dll" KeyPath="yes" /> + </Component> <Component Id="owcF2B199C7800AE0BBCC0001E0A61F6988" Guid="405dfe99-fffe-4059-26e0-c7d1bd0a0bed"> <File Id="owfF2B199C7800AE0BBCC0001E0A61F6988" Source="$(var.SourceDir)\System.Memory.dll" KeyPath="yes" /> </Component> @@ -89,17 +80,38 @@ <Component Id="owc912B341D759C6D4043ED430D16F8011A" Guid="fab0f014-28b2-d48f-5aa8-5a8e3bcf3ffb"> <File Id="owf912B341D759C6D4043ED430D16F8011A" Source="$(var.SourceDir)\System.Runtime.CompilerServices.Unsafe.xml" KeyPath="yes" /> </Component> + <Component Id="owc540CF8CDBE6617C60879532E387E1716" Guid="bd0331df-7b7e-28be-f87a-809cdbfa07f0"> + <File Id="owf540CF8CDBE6617C60879532E387E1716" Source="$(var.SourceDir)\UVtools.Core.dll" KeyPath="yes" /> + </Component> + <Component Id="owcBD6C2CB73106BCF8D5385465839D3344" Guid="efab6672-7297-cbab-c613-743b21593319"> + <File Id="owfBD6C2CB73106BCF8D5385465839D3344" Source="$(var.SourceDir)\UVtools.Core.pdb" KeyPath="yes" /> + </Component> <Component Id="owc21B8C8C0F69E3CD1398B9A0674DF07BD" Guid="1e472543-e636-904d-da5b-cddaac2d36b1"> - <File Id="owf21B8C8C0F69E3CD1398B9A0674DF07BD" Source="$(var.SourceDir)\UVtools.exe" KeyPath="yes"> - <Shortcut Id="sc6327849DA5C02D2396E91B8B1892E03C" Name="UVtools" Directory="DesktopFolder" /> - <Shortcut Id="sc218BF75801887335D1B30BAFB94BA631" Name="UVtools" Directory="scd220707349D4C8FA275285514283F3E2A" /> - </File> + <File Id="owf21B8C8C0F69E3CD1398B9A0674DF07BD" Source="$(var.SourceDir)\UVtools.exe" KeyPath="yes" /> </Component> <Component Id="owcFD68A2B6BB01205FB923D13D9A1EB333" Guid="a2bfa40e-e0f8-47b6-2570-e609ea5e428d"> <File Id="owfFD68A2B6BB01205FB923D13D9A1EB333" Source="$(var.SourceDir)\UVtools.exe.config" KeyPath="yes" /> </Component> - <Component Id="owcB6603ABDC143C6488F777606A4A341B1" Guid="040f11b5-152d-c7f3-9cd1-5ad8b731e02a"> - <File Id="owfB6603ABDC143C6488F777606A4A341B1" Source="$(var.SourceDir)\UVtools.Parser.dll" KeyPath="yes" /> + <Component Id="owc0C1077539E2B54F2460D2C0993613EFB" Guid="fc6ae2db-2865-9eb4-5753-4f2f941fdf16"> + <File Id="owf0C1077539E2B54F2460D2C0993613EFB" Source="$(var.SourceDir)\UVtools.pdb" KeyPath="yes" /> + </Component> + <Component Id="owcE56A1A43062CD54830A538D93042A2F9" Guid="97edfcac-9e9e-3019-6b8f-d6377d7dc1a1"> + <File Id="owfE56A1A43062CD54830A538D93042A2F9" Source="$(var.SourceDir)\UVtoolsCmd.deps.json" KeyPath="yes" /> + </Component> + <Component Id="owc0E305B983BD1AF09581ED4997D7E85ED" Guid="c24bfcd6-55aa-0509-f1f0-86b87d4f7d17"> + <File Id="owf0E305B983BD1AF09581ED4997D7E85ED" Source="$(var.SourceDir)\UVtoolsCmd.dll" KeyPath="yes" /> + </Component> + <Component Id="owcF3C69C370296234BECE8A6E9414BA938" Guid="91dd69f3-350b-ffc9-6030-3ec11aac16dc"> + <File Id="owfF3C69C370296234BECE8A6E9414BA938" Source="$(var.SourceDir)\UVtoolsCmd.exe" KeyPath="yes" /> + </Component> + <Component Id="owc0BA04EBA55A828242AC648F3806CE8F3" Guid="68bb485f-4b09-d863-394c-cd87049021a0"> + <File Id="owf0BA04EBA55A828242AC648F3806CE8F3" Source="$(var.SourceDir)\UVtoolsCmd.pdb" KeyPath="yes" /> + </Component> + <Component Id="owc59F6487971C89DDBCF40A8A690169334" Guid="b83137d1-2f79-c6e5-0e72-fb84e2059f28"> + <File Id="owf59F6487971C89DDBCF40A8A690169334" Source="$(var.SourceDir)\UVtoolsCmd.runtimeconfig.dev.json" KeyPath="yes" /> + </Component> + <Component Id="owc76C7AC737F3567A5F2C89DBE21A3BE39" Guid="01949189-492b-8d45-dc95-3e341f5d690c"> + <File Id="owf76C7AC737F3567A5F2C89DBE21A3BE39" Source="$(var.SourceDir)\UVtoolsCmd.runtimeconfig.json" KeyPath="yes" /> </Component> <Directory Id="owdF7EC390A16A84F49221C0816B06C7316" Name="PrusaSlicer"> <Directory Id="owd6830BAD7B93348EE48856553BF6B1294" Name="printer"> diff --git a/UVtools.sln b/UVtools.sln index f048516..a39a495 100644 --- a/UVtools.sln +++ b/UVtools.sln @@ -4,6 +4,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 16.0.29926.136 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UVtools.GUI", "UVtools.GUI\UVtools.GUI.csproj", "{E7389EE3-CF56-464B-9BA1-816B31D1E6FF}" + ProjectSection(ProjectDependencies) = postProject + {36E5877E-6AA6-4368-A9EA-46D7C7C90302} = {36E5877E-6AA6-4368-A9EA-46D7C7C90302} + EndProjectSection EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "UVtools.InstallerMM", "UVtools.InstallerMM\UVtools.InstallerMM.wixproj", "{E53BAA5D-29A8-4287-B3AA-1AFF5A4BDC6C}" EndProject |