diff --git a/Mk0.Software.OnlineUpdater.sln b/Mk0.Software.OnlineUpdater.sln
new file mode 100644
index 0000000..caf77b3
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29613.14
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mk0.Software.OnlineUpdater", "Mk0.Software.OnlineUpdater\Mk0.Software.OnlineUpdater.csproj", "{F59DCD1B-931C-4A49-9D55-DEAA229218F6}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F59DCD1B-931C-4A49-9D55-DEAA229218F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F59DCD1B-931C-4A49-9D55-DEAA229218F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F59DCD1B-931C-4A49-9D55-DEAA229218F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F59DCD1B-931C-4A49-9D55-DEAA229218F6}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {46EFBFE7-956E-4236-AEB1-200F0C7AE661}
+ EndGlobalSection
+EndGlobal
diff --git a/Mk0.Software.OnlineUpdater/App.config b/Mk0.Software.OnlineUpdater/App.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.Designer.cs b/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.Designer.cs
new file mode 100644
index 0000000..1eb26a5
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.Designer.cs
@@ -0,0 +1,88 @@
+namespace Mk0.Software.OnlineUpdater
+{
+ partial class DownloadUpdateDialog
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DownloadUpdateDialog));
+ this.pictureBoxIcon = new System.Windows.Forms.PictureBox();
+ this.progressBar = new System.Windows.Forms.ProgressBar();
+ this.labelInformation = new System.Windows.Forms.Label();
+ this.labelSize = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).BeginInit();
+ this.SuspendLayout();
+ //
+ // pictureBoxIcon
+ //
+ this.pictureBoxIcon.Image = Properties.Resources.download_32;
+ resources.ApplyResources(this.pictureBoxIcon, "pictureBoxIcon");
+ this.pictureBoxIcon.Name = "pictureBoxIcon";
+ this.pictureBoxIcon.TabStop = false;
+ //
+ // progressBar
+ //
+ resources.ApplyResources(this.progressBar, "progressBar");
+ this.progressBar.Name = "progressBar";
+ //
+ // labelInformation
+ //
+ resources.ApplyResources(this.labelInformation, "labelInformation");
+ this.labelInformation.Name = "labelInformation";
+ //
+ // labelSize
+ //
+ resources.ApplyResources(this.labelSize, "labelSize");
+ this.labelSize.Name = "labelSize";
+ //
+ // DownloadUpdateDialog
+ //
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.labelSize);
+ this.Controls.Add(this.labelInformation);
+ this.Controls.Add(this.progressBar);
+ this.Controls.Add(this.pictureBoxIcon);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "DownloadUpdateDialog";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DownloadUpdateDialog_FormClosing);
+ this.Load += new System.EventHandler(this.DownloadUpdateDialogLoad);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.PictureBox pictureBoxIcon;
+ private System.Windows.Forms.ProgressBar progressBar;
+ private System.Windows.Forms.Label labelInformation;
+ private System.Windows.Forms.Label labelSize;
+ }
+}
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.cs b/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.cs
new file mode 100644
index 0000000..383020e
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.cs
@@ -0,0 +1,324 @@
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+using System.Net;
+using System.Net.Cache;
+using System.Net.Mime;
+using System.Security.Cryptography;
+using System.Text;
+using System.Windows.Forms;
+using Mk0.Software.OnlineUpdater.Properties;
+
+namespace Mk0.Software.OnlineUpdater
+{
+ internal partial class DownloadUpdateDialog : Form
+ {
+ private readonly string _downloadURL;
+
+ private string _tempFile;
+
+ private MyWebClient _webClient;
+
+ private DateTime _startedAt;
+
+ public DownloadUpdateDialog(string downloadURL)
+ {
+ InitializeComponent();
+
+ _downloadURL = downloadURL;
+
+ if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.ForcedDownload)
+ {
+ ControlBox = false;
+ }
+ }
+
+ private void DownloadUpdateDialogLoad(object sender, EventArgs e)
+ {
+ var uri = new Uri(_downloadURL);
+
+ if (uri.Scheme.Equals(Uri.UriSchemeFtp))
+ {
+ _webClient = new MyWebClient { Credentials = AutoUpdater.FtpCredentials };
+ }
+ else
+ {
+ _webClient = new MyWebClient();
+
+ if (uri.Scheme.Equals(Uri.UriSchemeHttp) || uri.Scheme.Equals(Uri.UriSchemeHttps))
+ {
+ if (AutoUpdater.BasicAuthDownload != null)
+ {
+ _webClient.Headers[HttpRequestHeader.Authorization] = AutoUpdater.BasicAuthDownload.ToString();
+ }
+
+ _webClient.Headers[HttpRequestHeader.UserAgent] = AutoUpdater.GetUserAgent();
+ }
+ }
+
+ _webClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
+
+ if (AutoUpdater.Proxy != null)
+ {
+ _webClient.Proxy = AutoUpdater.Proxy;
+ }
+
+ if (string.IsNullOrEmpty(AutoUpdater.DownloadPath))
+ {
+ _tempFile = Path.GetTempFileName();
+ }
+ else
+ {
+ _tempFile = Path.Combine(AutoUpdater.DownloadPath, $"{Guid.NewGuid().ToString()}.tmp");
+ if (!Directory.Exists(AutoUpdater.DownloadPath))
+ {
+ Directory.CreateDirectory(AutoUpdater.DownloadPath);
+ }
+ }
+
+ _webClient.DownloadProgressChanged += OnDownloadProgressChanged;
+
+ _webClient.DownloadFileCompleted += WebClientOnDownloadFileCompleted;
+
+ _webClient.DownloadFileAsync(uri, _tempFile);
+ }
+
+ private void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
+ {
+ if (_startedAt == default(DateTime))
+ {
+ _startedAt = DateTime.Now;
+ }
+ else
+ {
+ var timeSpan = DateTime.Now - _startedAt;
+ long totalSeconds = (long)timeSpan.TotalSeconds;
+ if (totalSeconds > 0)
+ {
+ var bytesPerSecond = e.BytesReceived / totalSeconds;
+ labelInformation.Text =
+ string.Format(Resources.DownloadSpeedMessage, BytesToString(bytesPerSecond));
+ }
+ }
+
+ labelSize.Text = $@"{BytesToString(e.BytesReceived)} / {BytesToString(e.TotalBytesToReceive)}";
+ progressBar.Value = e.ProgressPercentage;
+ }
+
+ private void WebClientOnDownloadFileCompleted(object sender, AsyncCompletedEventArgs asyncCompletedEventArgs)
+ {
+ if (asyncCompletedEventArgs.Cancelled)
+ {
+ return;
+ }
+
+ if (asyncCompletedEventArgs.Error != null)
+ {
+ MessageBox.Show(asyncCompletedEventArgs.Error.Message,
+ asyncCompletedEventArgs.Error.GetType().ToString(), MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ _webClient = null;
+ Close();
+ return;
+ }
+
+ if (!string.IsNullOrEmpty(AutoUpdater.Checksum))
+ {
+ if (!CompareChecksum(_tempFile, AutoUpdater.Checksum))
+ {
+ _webClient = null;
+ Close();
+ return;
+ }
+ }
+
+ ContentDisposition contentDisposition = null;
+ if (_webClient.ResponseHeaders["Content-Disposition"] != null)
+ {
+ contentDisposition = new ContentDisposition(_webClient.ResponseHeaders["Content-Disposition"]);
+ }
+
+ var fileName = string.IsNullOrEmpty(contentDisposition?.FileName)
+ ? Path.GetFileName(_webClient.ResponseUri.LocalPath)
+ : contentDisposition.FileName;
+
+ var tempPath =
+ Path.Combine(
+ string.IsNullOrEmpty(AutoUpdater.DownloadPath) ? Path.GetTempPath() : AutoUpdater.DownloadPath,
+ fileName);
+
+ try
+ {
+ if (File.Exists(tempPath))
+ {
+ File.Delete(tempPath);
+ }
+
+ File.Move(_tempFile, tempPath);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
+ _webClient = null;
+ Close();
+ return;
+ }
+
+ AutoUpdater.InstallerArgs = AutoUpdater.InstallerArgs.Replace("%path%",
+ Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName));
+
+ var processStartInfo = new ProcessStartInfo
+ {
+ FileName = tempPath,
+ UseShellExecute = true,
+ Arguments = AutoUpdater.InstallerArgs
+ };
+
+ var extension = Path.GetExtension(tempPath);
+ if (extension.Equals(".zip", StringComparison.OrdinalIgnoreCase))
+ {
+ string installerPath = Path.Combine(Path.GetDirectoryName(tempPath), "ZipExtractor.exe");
+
+ try
+ {
+ File.WriteAllBytes(installerPath, Resources.Unzipper);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
+ _webClient = null;
+ Close();
+ return;
+ }
+
+ StringBuilder arguments =
+ new StringBuilder($"\"{tempPath}\" \"{Process.GetCurrentProcess().MainModule.FileName}\"");
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ if (i.Equals(1))
+ {
+ arguments.Append(" \"");
+ }
+
+ arguments.Append(args[i]);
+ arguments.Append(i.Equals(args.Length - 1) ? "\"" : " ");
+ }
+
+ processStartInfo = new ProcessStartInfo
+ {
+ FileName = installerPath,
+ UseShellExecute = true,
+ Arguments = arguments.ToString()
+ };
+ }
+ else if (extension.Equals(".msi", StringComparison.OrdinalIgnoreCase))
+ {
+ processStartInfo = new ProcessStartInfo
+ {
+ FileName = "msiexec",
+ Arguments = $"/i \"{tempPath}\""
+ };
+ if (!string.IsNullOrEmpty(AutoUpdater.InstallerArgs))
+ {
+ processStartInfo.Arguments += " " + AutoUpdater.InstallerArgs;
+ }
+ }
+
+ if (AutoUpdater.RunUpdateAsAdmin)
+ {
+ processStartInfo.Verb = "runas";
+ }
+
+ try
+ {
+ Process.Start(processStartInfo);
+ }
+ catch (Win32Exception exception)
+ {
+ _webClient = null;
+ if (exception.NativeErrorCode != 1223)
+ throw;
+ }
+
+ Close();
+ }
+
+ private static String BytesToString(long byteCount)
+ {
+ string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
+ if (byteCount == 0)
+ return "0" + suf[0];
+ long bytes = Math.Abs(byteCount);
+ int place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024)));
+ double num = Math.Round(bytes / Math.Pow(1024, place), 1);
+ return $"{(Math.Sign(byteCount) * num).ToString(CultureInfo.InvariantCulture)} {suf[place]}";
+ }
+
+ private static bool CompareChecksum(string fileName, string checksum)
+ {
+ using (var hashAlgorithm = HashAlgorithm.Create(AutoUpdater.HashingAlgorithm))
+ {
+ using (var stream = File.OpenRead(fileName))
+ {
+ if (hashAlgorithm != null)
+ {
+ var hash = hashAlgorithm.ComputeHash(stream);
+ var fileChecksum = BitConverter.ToString(hash).Replace("-", String.Empty).ToLowerInvariant();
+
+ if (fileChecksum == checksum.ToLower()) return true;
+
+ MessageBox.Show(Resources.FileIntegrityCheckFailedMessage,
+ Resources.FileIntegrityCheckFailedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ else
+ {
+ if (AutoUpdater.ReportErrors)
+ {
+ MessageBox.Show(Resources.HashAlgorithmNotSupportedMessage,
+ Resources.HashAlgorithmNotSupportedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ return false;
+ }
+ }
+ }
+
+ private void DownloadUpdateDialog_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (_webClient == null)
+ {
+ DialogResult = DialogResult.Cancel;
+ }
+ else if (_webClient.IsBusy)
+ {
+ _webClient.CancelAsync();
+ DialogResult = DialogResult.Cancel;
+ }
+ else
+ {
+ DialogResult = DialogResult.OK;
+ }
+ }
+ }
+
+ ///
+ public class MyWebClient : WebClient
+ {
+ ///
+ /// Response Uri after any redirects.
+ ///
+ public Uri ResponseUri;
+
+ ///
+ protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
+ {
+ WebResponse webResponse = base.GetWebResponse(request, result);
+ ResponseUri = webResponse.ResponseUri;
+ return webResponse;
+ }
+ }
+}
diff --git a/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.resx b/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.resx
new file mode 100644
index 0000000..cf4702a
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/DownloadUpdateDialog.resx
@@ -0,0 +1,799 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ 14, 14
+
+
+
+ 4, 4, 4, 4
+
+
+ 59, 62
+
+
+ CenterImage
+
+
+
+ 0
+
+
+ pictureBoxIcon
+
+
+ System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 3
+
+
+ 81, 45
+
+
+ 4, 4, 4, 4
+
+
+ 319, 26
+
+
+ 1
+
+
+ progressBar
+
+
+ System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 2
+
+
+ True
+
+
+ Segoe UI, 9pt
+
+
+ 78, 14
+
+
+ 4, 0, 4, 0
+
+
+ 128, 15
+
+
+ 2
+
+
+ Update wird heruntergeladen...
+
+
+ labelInformation
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 1
+
+
+ Right
+
+
+ 265, 14
+
+
+ 135, 15
+
+
+ 3
+
+
+ MiddleRight
+
+
+ labelSize
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 0
+
+
+ True
+
+
+ 7, 15
+
+
+ 413, 90
+
+
+ Segoe UI, 9pt
+
+
+
+ AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA
+ IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af//
+ /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af//
+ /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA///
+ /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA
+ AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT
+ u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5
+ 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N
+ 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R
+ 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz
+ +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6////
+ //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un
+ +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h
+ +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv
+ +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf
+ z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA
+ //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA
+ AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA
+ AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA
+ AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA
+ ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA
+ ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA
+ AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj
+ 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA
+ AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA
+ ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA
+ ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA
+ AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA
+ AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA
+ AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO
+ 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af//
+ /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL
+ 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR
+ +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af//
+ /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW
+ +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ
+ +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ
+ +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc
+ zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su
+ +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK
+ 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ
+ +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU
+ +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8////
+ ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af//
+ /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY
+ +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus
+ +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q
+ +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt
+ 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7
+ 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN
+ 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW
+ 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu
+ +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW
+ +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv
+ 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf//
+ /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb
+ zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb
+ zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA
+ AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA
+ AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA
+ ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA
+ AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA
+ ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA
+ AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA
+ ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA
+ ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1
+ dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t
+ 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA///
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA
+ AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi
+ 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA
+ AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA
+ AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA
+ ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA
+ ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf
+ ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA
+ ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af//
+ /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT
+ 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA
+ ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af//
+ /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA
+ ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM
+ 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA
+ AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA
+ AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK
+ 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw
+ bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA
+ AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT
+ 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK
+ 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S
+ +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB
+ 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j
+ +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI
+ 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS
+ 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO
+ 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss
+ +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9
+ /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92
+ 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C
+ /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb
+ zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc
+ +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR
+ 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue
+ +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO
+ 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd
+ +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2
+ /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi
+ 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v//////////////
+ ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H
+ 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs
+ /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E
+ 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS
+ 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL
+ 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn
+ +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ
+ 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i
+ +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY
+ +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax
+ +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+////
+ ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD///
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu
+ 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY
+ +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc
+ zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY
+ ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip
+ +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP
+ 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks
+ +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR
+ +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv
+ 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV
+ 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic
+ +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf
+ +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c
+ 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf
+ +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo
+ 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo
+ +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa
+ zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd
+ zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu
+ +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm
+ +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc
+ zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af//
+ /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD///
+ /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb
+ zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ
+ zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l
+ 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd
+ zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
+ AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
+ //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
+ AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
+ //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
+ AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
+ //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA
+ AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA
+ AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA
+ AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA
+ AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA
+ AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA
+ AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA
+ AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA
+ AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA
+ AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA
+ AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA
+ ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA
+ AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA
+ AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA
+ ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA
+ ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA
+ ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi
+ 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA
+ AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5
+ eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA
+ AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA
+ AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA
+ AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA
+ ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA
+ ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA
+ AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA
+ ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA
+ AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA
+ AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA
+ AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ
+ 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB
+ 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA
+ AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA
+ ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe
+ z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA
+ ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA
+ ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP
+ JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA
+ AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA
+ AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA
+ AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY
+ +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv
+ 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA
+ AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M
+ 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH
+ 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc
+ zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA
+ ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf
+ +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc
+ zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA
+ AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO
+ 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc
+ zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA
+ AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA
+ AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ
+ +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ
+ 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA
+ AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd
+ zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO
+ 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS
+ 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA
+ AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S
+ +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD
+ 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb
+ yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV
+ +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ
+ 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc
+ zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW
+ +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP
+ 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA
+ AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm
+ +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3/////////
+ ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM
+ 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T
+ +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq
+ /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI
+ 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll
+ 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic
+ +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP
+ 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc
+ +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+
+ //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa
+ +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7/////////////////
+ ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl
+ +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1
+ 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0
+ /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN
+ 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i
+ +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9
+ +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc
+ z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h
+ +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f//////////////////////////////////////////////
+ ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD
+ 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT
+ 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7/////////////////////////
+ /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK
+ 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm
+ +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM
+ 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p
+ 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao
+ +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E
+ 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k
+ +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk
+ +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5////////////////////
+ ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP
+ 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u
+ +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo
+ +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM
+ 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd
+ z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus
+ +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T
+ +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq
+ +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY
+ +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj
+ +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f//////////////
+ /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc
+ zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn
+ +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ
+ 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO
+ 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq
+ 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep
+ +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U
+ +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt
+ 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+
+ +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V
+ +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX///
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe
+ 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5
+ 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ
+ 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj
+ +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO
+ 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i
+ +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig
+ +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov
+ 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY
+ +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd
+ 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye
+ +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my
+ 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E
+ +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb
+ zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic
+ +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC
+ +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd
+ z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc
+ zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV
+ +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV
+ qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb
+ zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA
+ vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf
+ 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC
+ +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc
+ zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb
+ zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x
+ 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+
+
+ 4, 2, 4, 2
+
+
+ CenterParent
+
+
+ Software Update
+
+
+ DownloadUpdateDialog
+
+
+ System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/Mk0.Software.OnlineUpdater.csproj b/Mk0.Software.OnlineUpdater/Mk0.Software.OnlineUpdater.csproj
new file mode 100644
index 0000000..a3feaca
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/Mk0.Software.OnlineUpdater.csproj
@@ -0,0 +1,130 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {F59DCD1B-931C-4A49-9D55-DEAA229218F6}
+ Library
+ Mk0.Software.OnlineUpdater
+ OnlineUpdater
+ v4.7.2
+ 512
+ true
+ true
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ DownloadUpdateDialog.cs
+
+
+ Form
+
+
+ RemindLaterForm.cs
+
+
+ Form
+
+
+ UpdateForm.cs
+
+
+
+
+
+ DownloadUpdateDialog.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ RemindLaterForm.cs
+
+
+ UpdateForm.cs
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/OnlineUpdater.cs b/Mk0.Software.OnlineUpdater/OnlineUpdater.cs
new file mode 100644
index 0000000..39aca0c
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/OnlineUpdater.cs
@@ -0,0 +1,914 @@
+using System;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Globalization;
+using System.IO;
+using System.Net;
+using System.Net.Cache;
+using System.Reflection;
+using System.Text;
+using System.Threading;
+using System.Windows.Forms;
+using System.Xml;
+using Mk0.Software.OnlineUpdater.Properties;
+using Microsoft.Win32;
+
+namespace Mk0.Software.OnlineUpdater
+{
+ ///
+ /// Enum representing the remind later time span.
+ ///
+ public enum RemindLaterFormat
+ {
+ ///
+ /// Represents the time span in minutes.
+ ///
+ Minutes,
+
+ ///
+ /// Represents the time span in hours.
+ ///
+ Hours,
+
+ ///
+ /// Represents the time span in days.
+ ///
+ Days
+ }
+
+ ///
+ /// Enum representing the effect of Mandatory flag.
+ ///
+ public enum Mode
+ {
+ ///
+ /// In this mode, it ignores Remind Later and Skip values set previously and hide both buttons.
+ ///
+ Normal,
+
+ ///
+ /// In this mode, it won't show close button in addition to Normal mode behaviour.
+ ///
+ Forced,
+
+ ///
+ /// In this mode, it will start downloading and applying update without showing standarad update dialog in addition to Forced mode behaviour.
+ ///
+ ForcedDownload
+ }
+
+ ///
+ /// Main class that lets you auto update applications by setting some static fields and executing its Start method.
+ ///
+ public static class AutoUpdater
+ {
+ private static System.Timers.Timer _remindLaterTimer;
+
+ internal static String ChangelogURL;
+
+ internal static String DownloadURL;
+
+ internal static String InstallerArgs;
+
+ internal static String RegistryLocation;
+
+ internal static String Checksum;
+
+ internal static String HashingAlgorithm;
+
+ internal static Version CurrentVersion;
+
+ internal static Version InstalledVersion;
+
+ internal static bool IsWinFormsApplication;
+
+ internal static bool Running;
+
+ ///
+ /// Set it to folder path where you want to download the update file. If not provided then it defaults to Temp folder.
+ ///
+ public static String DownloadPath;
+
+ ///
+ /// Set the Application Title shown in Update dialog. Although AutoUpdater.NET will get it automatically, you can set this property if you like to give custom Title.
+ ///
+ public static String AppTitle;
+
+ ///
+ /// URL of the xml file that contains information about latest version of the application.
+ ///
+ public static String AppCastURL;
+
+ ///
+ /// Login/password/domain for FTP-request
+ ///
+ public static NetworkCredential FtpCredentials;
+
+ ///
+ /// Opens the download URL in default browser if true. Very usefull if you have portable application.
+ ///
+ public static bool OpenDownloadPage;
+
+ ///
+ /// Set Basic Authentication credentials required to download the file.
+ ///
+ public static IAuthentication BasicAuthDownload;
+
+ ///
+ /// Set Basic Authentication credentials required to download the XML file.
+ ///
+ public static IAuthentication BasicAuthXML;
+
+ ///
+ /// Set Basic Authentication credentials to navigate to the change log URL.
+ ///
+ public static IAuthentication BasicAuthChangeLog;
+
+ ///
+ /// Set the User-Agent string to be used for HTTP web requests.
+ ///
+ public static string HttpUserAgent;
+
+ ///
+ /// If this is true users can see the skip button.
+ ///
+ public static Boolean ShowSkipButton = true;
+
+ ///
+ /// If this is true users can see the Remind Later button.
+ ///
+ public static Boolean ShowRemindLaterButton = true;
+
+ ///
+ /// If this is true users see dialog where they can set remind later interval otherwise it will take the interval from
+ /// RemindLaterAt and RemindLaterTimeSpan fields.
+ ///
+ public static Boolean LetUserSelectRemindLater = true;
+
+ ///
+ /// Remind Later interval after user should be reminded of update.
+ ///
+ public static int RemindLaterAt = 2;
+
+ ///
+ /// AutoUpdater.NET will report errors if this is true.
+ ///
+ public static bool ReportErrors = false;
+
+ ///
+ /// Set this to false if your application doesn't need administrator privileges to replace the old version.
+ ///
+ public static bool RunUpdateAsAdmin = true;
+
+ ///
+ /// Set this to true if you want to ignore previously assigned Remind Later and Skip settings. It will also hide Remind Later and Skip buttons.
+ ///
+ public static bool Mandatory;
+
+ ///
+ /// Set this to any of the available modes to change behaviour of the Mandatory flag.
+ ///
+ public static Mode UpdateMode;
+
+ ///
+ /// Set Proxy server to use for all the web requests in AutoUpdater.NET.
+ ///
+ public static IWebProxy Proxy;
+
+ ///
+ /// Set if RemindLaterAt interval should be in Minutes, Hours or Days.
+ ///
+ public static RemindLaterFormat RemindLaterTimeSpan = RemindLaterFormat.Days;
+
+ ///
+ /// A delegate type to handle how to exit the application after update is downloaded.
+ ///
+ public delegate void ApplicationExitEventHandler();
+
+ ///
+ /// An event that developers can use to exit the application gracefully.
+ ///
+ public static event ApplicationExitEventHandler ApplicationExitEvent;
+
+ ///
+ /// A delegate type for hooking up update notifications.
+ ///
+ /// An object containing all the parameters recieved from AppCast XML file. If there will be an error while looking for the XML file then this object will be null.
+ public delegate void CheckForUpdateEventHandler(UpdateInfoEventArgs args);
+
+ ///
+ /// An event that clients can use to be notified whenever the update is checked.
+ ///
+ public static event CheckForUpdateEventHandler CheckForUpdateEvent;
+
+ ///
+ /// A delegate type for hooking up parsing logic.
+ ///
+ /// An object containing the AppCast file received from server.
+ public delegate void ParseUpdateInfoHandler(ParseUpdateInfoEventArgs args);
+
+ ///
+ /// An event that clients can use to be notified whenever the AppCast file needs parsing.
+ ///
+ public static event ParseUpdateInfoHandler ParseUpdateInfoEvent;
+
+ ///
+ /// Set if you want the default update form to have a different size.
+ ///
+ public static Size? UpdateFormSize = null;
+
+ ///
+ /// Start checking for new version of application and display dialog to the user if update is available.
+ ///
+ /// Assembly to use for version checking.
+ public static void Start(Assembly myAssembly = null)
+ {
+ Start(AppCastURL, myAssembly);
+ }
+
+ ///
+ /// Start checking for new version of application via FTP and display dialog to the user if update is available.
+ ///
+ /// FTP URL of the xml file that contains information about latest version of the application.
+ /// Credentials required to connect to FTP server.
+ /// Assembly to use for version checking.
+ public static void Start(String appCast, NetworkCredential ftpCredentials, Assembly myAssembly = null)
+ {
+ FtpCredentials = ftpCredentials;
+ Start(appCast, myAssembly);
+ }
+
+ ///
+ /// Start checking for new version of application and display dialog to the user if update is available.
+ ///
+ /// URL of the xml file that contains information about latest version of the application.
+ /// Assembly to use for version checking.
+ public static void Start(String appCast, Assembly myAssembly = null)
+ {
+ try
+ {
+ ServicePointManager.SecurityProtocol |= (SecurityProtocolType)192 |
+ (SecurityProtocolType)768 | (SecurityProtocolType)3072;
+ }
+ catch (NotSupportedException) { }
+
+ if (Mandatory && _remindLaterTimer != null)
+ {
+ _remindLaterTimer.Stop();
+ _remindLaterTimer.Close();
+ _remindLaterTimer = null;
+ }
+
+ if (!Running && _remindLaterTimer == null)
+ {
+ Running = true;
+
+ AppCastURL = appCast;
+
+ IsWinFormsApplication = Application.MessageLoop;
+
+ var backgroundWorker = new BackgroundWorker();
+
+ backgroundWorker.DoWork += BackgroundWorkerDoWork;
+
+ backgroundWorker.RunWorkerCompleted += BackgroundWorkerOnRunWorkerCompleted;
+
+ backgroundWorker.RunWorkerAsync(myAssembly ?? Assembly.GetEntryAssembly());
+ }
+ }
+
+ private static void BackgroundWorkerOnRunWorkerCompleted(object sender,
+ RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
+ {
+ if (!runWorkerCompletedEventArgs.Cancelled)
+ {
+ if (runWorkerCompletedEventArgs.Result is DateTime)
+ {
+ SetTimer((DateTime)runWorkerCompletedEventArgs.Result);
+ }
+ else
+ {
+ var args = runWorkerCompletedEventArgs.Result as UpdateInfoEventArgs;
+ if (CheckForUpdateEvent != null)
+ {
+ CheckForUpdateEvent(args);
+ }
+ else
+ {
+ if (args != null)
+ {
+ if (args.IsUpdateAvailable)
+ {
+ if (!IsWinFormsApplication)
+ {
+ Application.EnableVisualStyles();
+ }
+
+ if (Mandatory && UpdateMode == Mode.ForcedDownload)
+ {
+ DownloadUpdate();
+ Exit();
+ }
+ else
+ {
+ if (Thread.CurrentThread.GetApartmentState().Equals(ApartmentState.STA))
+ {
+ ShowUpdateForm();
+ }
+ else
+ {
+ Thread thread = new Thread(ShowUpdateForm);
+ thread.CurrentCulture = thread.CurrentUICulture = CultureInfo.CurrentCulture;
+ thread.SetApartmentState(ApartmentState.STA);
+ thread.Start();
+ thread.Join();
+ }
+ }
+
+ return;
+ }
+ else
+ {
+ if (ReportErrors)
+ {
+ MessageBox.Show(Resources.UpdateUnavailableMessage,
+ Resources.UpdateUnavailableCaption,
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ }
+ else
+ {
+ if (ReportErrors)
+ {
+ MessageBox.Show(
+ Resources.UpdateCheckFailedMessage,
+ Resources.UpdateCheckFailedCaption, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ }
+ }
+
+ Running = false;
+ }
+
+ ///
+ /// Shows standard update dialog.
+ ///
+ public static void ShowUpdateForm()
+ {
+ var updateForm = new UpdateForm();
+ if (UpdateFormSize.HasValue)
+ {
+ updateForm.Size = UpdateFormSize.Value;
+ }
+
+ if (updateForm.ShowDialog().Equals(DialogResult.OK))
+ {
+ Exit();
+ }
+ }
+
+ private static void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
+ {
+ e.Cancel = true;
+ Assembly mainAssembly = e.Argument as Assembly;
+
+ var companyAttribute =
+ (AssemblyCompanyAttribute)GetAttribute(mainAssembly, typeof(AssemblyCompanyAttribute));
+ if (string.IsNullOrEmpty(AppTitle))
+ {
+ var titleAttribute =
+ (AssemblyTitleAttribute)GetAttribute(mainAssembly, typeof(AssemblyTitleAttribute));
+ AppTitle = titleAttribute != null ? titleAttribute.Title : mainAssembly.GetName().Name;
+ }
+
+ string appCompany = companyAttribute != null ? companyAttribute.Company : "";
+
+ RegistryLocation = !string.IsNullOrEmpty(appCompany)
+ ? $@"Software\{appCompany}\{AppTitle}\AutoUpdater"
+ : $@"Software\{AppTitle}\AutoUpdater";
+
+ InstalledVersion = mainAssembly.GetName().Version;
+
+ WebRequest webRequest = WebRequest.Create(AppCastURL);
+
+ webRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
+
+ if (Proxy != null)
+ {
+ webRequest.Proxy = Proxy;
+ }
+
+ var uri = new Uri(AppCastURL);
+
+ WebResponse webResponse;
+
+ try
+ {
+ if (uri.Scheme.Equals(Uri.UriSchemeFtp))
+ {
+ var ftpWebRequest = (FtpWebRequest)webRequest;
+ ftpWebRequest.Credentials = FtpCredentials;
+ ftpWebRequest.UseBinary = true;
+ ftpWebRequest.UsePassive = true;
+ ftpWebRequest.KeepAlive = true;
+ ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
+
+ webResponse = ftpWebRequest.GetResponse();
+ }
+ else if (uri.Scheme.Equals(Uri.UriSchemeHttp) || uri.Scheme.Equals(Uri.UriSchemeHttps))
+ {
+ HttpWebRequest httpWebRequest = (HttpWebRequest)webRequest;
+
+ httpWebRequest.UserAgent = GetUserAgent();
+
+ if (BasicAuthXML != null)
+ {
+ httpWebRequest.Headers[HttpRequestHeader.Authorization] = BasicAuthXML.ToString();
+ }
+
+ webResponse = httpWebRequest.GetResponse();
+ }
+ else
+ {
+ webResponse = webRequest.GetResponse();
+ }
+ }
+ catch (Exception exception)
+ {
+ Debug.WriteLine(exception);
+ e.Cancel = false;
+ return;
+ }
+
+ UpdateInfoEventArgs args;
+
+ using (Stream appCastStream = webResponse.GetResponseStream())
+ {
+ if (appCastStream != null)
+ {
+ if (ParseUpdateInfoEvent != null)
+ {
+ using (StreamReader streamReader = new StreamReader(appCastStream))
+ {
+ string data = streamReader.ReadToEnd();
+ ParseUpdateInfoEventArgs parseArgs = new ParseUpdateInfoEventArgs(data);
+ ParseUpdateInfoEvent(parseArgs);
+ args = parseArgs.UpdateInfo;
+ }
+ }
+ else
+ {
+ XmlDocument receivedAppCastDocument = new XmlDocument { XmlResolver = null };
+ try
+ {
+ receivedAppCastDocument.Load(appCastStream);
+
+ XmlNodeList appCastItems = receivedAppCastDocument.SelectNodes("item");
+
+ args = new UpdateInfoEventArgs();
+
+ if (appCastItems != null)
+ {
+ foreach (XmlNode item in appCastItems)
+ {
+ XmlNode appCastVersion = item.SelectSingleNode("version");
+
+ try
+ {
+ CurrentVersion = new Version(appCastVersion?.InnerText);
+ }
+ catch (Exception)
+ {
+ CurrentVersion = null;
+ }
+
+ args.CurrentVersion = CurrentVersion;
+
+ XmlNode appCastChangeLog = item.SelectSingleNode("changelog");
+
+ args.ChangelogURL = appCastChangeLog?.InnerText;
+
+ XmlNode appCastUrl = item.SelectSingleNode("url");
+
+ args.DownloadURL = appCastUrl?.InnerText;
+
+ if (Mandatory.Equals(false))
+ {
+ XmlNode mandatory = item.SelectSingleNode("mandatory");
+
+ Boolean.TryParse(mandatory?.InnerText, out Mandatory);
+
+ string mode = mandatory?.Attributes["mode"]?.InnerText;
+
+ if (!string.IsNullOrEmpty(mode))
+ {
+ UpdateMode = (Mode)Enum.Parse(typeof(Mode), mode);
+ if (ReportErrors && !Enum.IsDefined(typeof(Mode), UpdateMode))
+ {
+ throw new InvalidDataException(
+ $"{UpdateMode} is not an underlying value of the Mode enumeration.");
+ }
+ }
+ }
+
+ args.Mandatory = Mandatory;
+ args.UpdateMode = UpdateMode;
+
+ XmlNode appArgs = item.SelectSingleNode("args");
+
+ args.InstallerArgs = appArgs?.InnerText;
+
+ XmlNode checksum = item.SelectSingleNode("checksum");
+
+ args.HashingAlgorithm = checksum?.Attributes["algorithm"]?.InnerText;
+
+ args.Checksum = checksum?.InnerText;
+ }
+ }
+ }
+ catch (Exception)
+ {
+ e.Cancel = false;
+ webResponse.Close();
+ return;
+ }
+ }
+ }
+ else
+ {
+ e.Cancel = false;
+ webResponse.Close();
+ return;
+ }
+ }
+
+ if (args.CurrentVersion == null || string.IsNullOrEmpty(args.DownloadURL))
+ {
+ webResponse.Close();
+ if (ReportErrors)
+ {
+ throw new InvalidDataException();
+ }
+
+ return;
+ }
+
+ CurrentVersion = args.CurrentVersion;
+ ChangelogURL = args.ChangelogURL = GetURL(webResponse.ResponseUri, args.ChangelogURL);
+ DownloadURL = args.DownloadURL = GetURL(webResponse.ResponseUri, args.DownloadURL);
+ InstallerArgs = args.InstallerArgs ?? String.Empty;
+ HashingAlgorithm = args.HashingAlgorithm ?? "MD5";
+ Checksum = args.Checksum ?? String.Empty;
+
+ webResponse.Close();
+
+ if (Mandatory)
+ {
+ ShowRemindLaterButton = false;
+ ShowSkipButton = false;
+ }
+ else
+ {
+ using (RegistryKey updateKey = Registry.CurrentUser.OpenSubKey(RegistryLocation))
+ {
+ if (updateKey != null)
+ {
+ object skip = updateKey.GetValue("skip");
+ object applicationVersion = updateKey.GetValue("version");
+ if (skip != null && applicationVersion != null)
+ {
+ string skipValue = skip.ToString();
+ var skipVersion = new Version(applicationVersion.ToString());
+ if (skipValue.Equals("1") && CurrentVersion <= skipVersion)
+ return;
+ if (CurrentVersion > skipVersion)
+ {
+ using (RegistryKey updateKeyWrite = Registry.CurrentUser.CreateSubKey(RegistryLocation))
+ {
+ if (updateKeyWrite != null)
+ {
+ updateKeyWrite.SetValue("version", CurrentVersion.ToString());
+ updateKeyWrite.SetValue("skip", 0);
+ }
+ }
+ }
+ }
+
+ object remindLaterTime = updateKey.GetValue("remindlater");
+
+ if (remindLaterTime != null)
+ {
+ DateTime remindLater = Convert.ToDateTime(remindLaterTime.ToString(),
+ CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat);
+
+ int compareResult = DateTime.Compare(DateTime.Now, remindLater);
+
+ if (compareResult < 0)
+ {
+ e.Cancel = false;
+ e.Result = remindLater;
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ args.IsUpdateAvailable = CurrentVersion > InstalledVersion;
+ args.InstalledVersion = InstalledVersion;
+
+ e.Cancel = false;
+ e.Result = args;
+ }
+
+ private static string GetURL(Uri baseUri, String url)
+ {
+ if (!string.IsNullOrEmpty(url) && Uri.IsWellFormedUriString(url, UriKind.Relative))
+ {
+ Uri uri = new Uri(baseUri, url);
+
+ if (uri.IsAbsoluteUri)
+ {
+ url = uri.AbsoluteUri;
+ }
+ }
+
+ return url;
+ }
+
+ ///
+ /// Detects and exits all instances of running assembly, including current.
+ ///
+ private static void Exit()
+ {
+ if (ApplicationExitEvent != null)
+ {
+ ApplicationExitEvent();
+ }
+ else
+ {
+ var currentProcess = Process.GetCurrentProcess();
+ foreach (var process in Process.GetProcessesByName(currentProcess.ProcessName))
+ {
+ string processPath;
+ try
+ {
+ processPath = process.MainModule.FileName;
+ }
+ catch (Win32Exception)
+ {
+ // Current process should be same as processes created by other instances of the application so it should be able to access modules of other instances.
+ // This means this is not the process we are looking for so we can safely skip this.
+ continue;
+ }
+
+ if (process.Id != currentProcess.Id &&
+ currentProcess.MainModule.FileName == processPath
+ ) //get all instances of assembly except current
+ {
+ if (process.CloseMainWindow())
+ {
+ process.WaitForExit((int)TimeSpan.FromSeconds(10)
+ .TotalMilliseconds); //give some time to process message
+ }
+
+ if (!process.HasExited)
+ {
+ process.Kill(); //TODO show UI message asking user to close program himself instead of silently killing it
+ }
+ }
+ }
+
+ if (IsWinFormsApplication)
+ {
+ MethodInvoker methodInvoker = Application.Exit;
+ methodInvoker.Invoke();
+ }
+#if NETWPF
+ else if (System.Windows.Application.Current != null)
+ {
+ System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+ System.Windows.Application.Current.Shutdown()));
+ }
+#endif
+ else
+ {
+ Environment.Exit(0);
+ }
+ }
+ }
+
+ private static Attribute GetAttribute(Assembly assembly, Type attributeType)
+ {
+ object[] attributes = assembly.GetCustomAttributes(attributeType, false);
+ if (attributes.Length == 0)
+ {
+ return null;
+ }
+
+ return (Attribute)attributes[0];
+ }
+
+ internal static string GetUserAgent()
+ {
+ return string.IsNullOrEmpty(HttpUserAgent) ? $"AutoUpdater.NET" : HttpUserAgent;
+ }
+
+ internal static void SetTimer(DateTime remindLater)
+ {
+ TimeSpan timeSpan = remindLater - DateTime.Now;
+
+ var context = SynchronizationContext.Current;
+
+ _remindLaterTimer = new System.Timers.Timer
+ {
+ Interval = (int)timeSpan.TotalMilliseconds,
+ AutoReset = false
+ };
+
+ _remindLaterTimer.Elapsed += delegate
+ {
+ _remindLaterTimer = null;
+ if (context != null)
+ {
+ try
+ {
+ context.Send(state => Start(), null);
+ }
+ catch (InvalidAsynchronousStateException)
+ {
+ Start();
+ }
+ }
+ else
+ {
+ Start();
+ }
+ };
+
+ _remindLaterTimer.Start();
+ }
+
+ ///
+ /// Opens the Download window that download the update and execute the installer when download completes.
+ ///
+ public static bool DownloadUpdate()
+ {
+ var downloadDialog = new DownloadUpdateDialog(DownloadURL);
+
+ try
+ {
+ return downloadDialog.ShowDialog().Equals(DialogResult.OK);
+ }
+ catch (TargetInvocationException)
+ {
+ }
+
+ return false;
+ }
+ }
+
+ ///
+ /// Object of this class gives you all the details about the update useful in handling the update logic yourself.
+ ///
+ public class UpdateInfoEventArgs : EventArgs
+ {
+ ///
+ /// If new update is available then returns true otherwise false.
+ ///
+ public bool IsUpdateAvailable { get; set; }
+
+ ///
+ /// Download URL of the update file.
+ ///
+ public string DownloadURL { get; set; }
+
+ ///
+ /// URL of the webpage specifying changes in the new update.
+ ///
+ public string ChangelogURL { get; set; }
+
+ ///
+ /// Returns newest version of the application available to download.
+ ///
+ public Version CurrentVersion { get; set; }
+
+ ///
+ /// Returns version of the application currently installed on the user's PC.
+ ///
+ public Version InstalledVersion { get; set; }
+
+ ///
+ /// Shows if the update is required or optional.
+ ///
+ public bool Mandatory { get; set; }
+
+ ///
+ /// Defines how the Mandatory flag should work.
+ ///
+ public Mode UpdateMode { get; set; }
+
+ ///
+ /// Command line arguments used by Installer.
+ ///
+ public string InstallerArgs { get; set; }
+
+ ///
+ /// Checksum of the update file.
+ ///
+ public string Checksum { get; set; }
+
+ ///
+ /// Hash algorithm that generated the checksum provided in the XML file.
+ ///
+ public string HashingAlgorithm { get; set; }
+ }
+
+ ///
+ /// An object of this class contains the AppCast file received from server.
+ ///
+ public class ParseUpdateInfoEventArgs : EventArgs
+ {
+ ///
+ /// Remote data received from the AppCast file.
+ ///
+ public string RemoteData { get; }
+
+ ///
+ /// Set this object with values received from the AppCast file.
+ ///
+ public UpdateInfoEventArgs UpdateInfo { get; set; }
+
+ ///
+ /// An object containing the AppCast file received from server.
+ ///
+ /// A string containing remote data received from the AppCast file.
+ public ParseUpdateInfoEventArgs(string remoteData)
+ {
+ RemoteData = remoteData;
+ }
+ }
+
+
+ ///
+ /// Interface for authentication
+ ///
+ public interface IAuthentication
+ {
+ }
+
+ ///
+ /// Provides Basic Authentication header for web request.
+ ///
+ public class BasicAuthentication : IAuthentication
+ {
+ private string Username { get; }
+
+ private string Password { get; }
+
+ ///
+ /// Initializes credentials for Basic Authentication.
+ ///
+ /// Username to use for Basic Authentication
+ /// Password to use for Basic Authentication
+ public BasicAuthentication(string username, string password)
+ {
+ Username = username;
+ Password = password;
+ }
+
+ ///
+ public override string ToString()
+ {
+ var token = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{Username}:{Password}"));
+ return $"Basic {token}";
+ }
+ }
+
+ ///
+ /// Provides Custom Authentication header for web request.
+ ///
+ public class CustomAuthentication : IAuthentication
+ {
+ private string HttpRequestHeaderAuthorizationValue { get; }
+
+ ///
+ /// Initializes authorization header value for Custom Authentication
+ ///
+ /// Value to use as http request header authorization value
+ public CustomAuthentication(string httpRequestHeaderAuthorizationValue)
+ {
+ HttpRequestHeaderAuthorizationValue = httpRequestHeaderAuthorizationValue;
+ }
+
+ ///
+ public override string ToString()
+ {
+ return HttpRequestHeaderAuthorizationValue;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/Program.cs b/Mk0.Software.OnlineUpdater/Program.cs
new file mode 100644
index 0000000..b32ad7e
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Mk0.Software.OnlineUpdater
+{
+ static class Program
+ {
+ ///
+ /// Der Haupteinstiegspunkt für die Anwendung.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new UpdateForm());
+ }
+ }
+}
diff --git a/Mk0.Software.OnlineUpdater/Properties/AssemblyInfo.cs b/Mk0.Software.OnlineUpdater/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..912b432
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Allgemeine Informationen über eine Assembly werden über die folgenden
+// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+// die einer Assembly zugeordnet sind.
+[assembly: AssemblyTitle("OnlineUpdater")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("mk0.at")]
+[assembly: AssemblyProduct("OnlineUpdater")]
+[assembly: AssemblyCopyright("Copyright © 2019-2020 by mk0.at")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
+// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
+// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
+[assembly: ComVisible(false)]
+
+// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
+[assembly: Guid("f59dcd1b-931c-4a49-9d55-deaa229218f6")]
+
+// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+//
+// Hauptversion
+// Nebenversion
+// Buildnummer
+// Revision
+//
+// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
+// indem Sie "*" wie unten gezeigt eingeben:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Mk0.Software.OnlineUpdater/Properties/Resources.Designer.cs b/Mk0.Software.OnlineUpdater/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..1d94f01
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/Properties/Resources.Designer.cs
@@ -0,0 +1,224 @@
+//------------------------------------------------------------------------------
+//
+// Dieser Code wurde von einem Tool generiert.
+// Laufzeitversion:4.0.30319.42000
+//
+// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+// der Code erneut generiert wird.
+//
+//------------------------------------------------------------------------------
+
+namespace Mk0.Software.OnlineUpdater.Properties {
+ using System;
+
+
+ ///
+ /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
+ ///
+ // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
+ // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
+ // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
+ // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Mk0.Software.OnlineUpdater.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
+ /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap clock_go {
+ get {
+ object obj = ResourceManager.GetObject("clock_go", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap clock_go_32 {
+ get {
+ object obj = ResourceManager.GetObject("clock_go_32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap clock_play {
+ get {
+ object obj = ResourceManager.GetObject("clock_play", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap download {
+ get {
+ object obj = ResourceManager.GetObject("download", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap download_32 {
+ get {
+ object obj = ResourceManager.GetObject("download_32", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Herunterladen bei {0}/s ähnelt.
+ ///
+ internal static string DownloadSpeedMessage {
+ get {
+ return ResourceManager.GetString("DownloadSpeedMessage", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Checksumme ist unterschiedlich ähnelt.
+ ///
+ internal static string FileIntegrityCheckFailedCaption {
+ get {
+ return ResourceManager.GetString("FileIntegrityCheckFailedCaption", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Die Dateiintegritätsprüfung ist fehlgeschlagen und hat einige Fehler gemeldet. ähnelt.
+ ///
+ internal static string FileIntegrityCheckFailedMessage {
+ get {
+ return ResourceManager.GetString("FileIntegrityCheckFailedMessage", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap hand_point {
+ get {
+ object obj = ResourceManager.GetObject("hand_point", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Nicht unterstützter Hash-Algorithmus ähnelt.
+ ///
+ internal static string HashAlgorithmNotSupportedCaption {
+ get {
+ return ResourceManager.GetString("HashAlgorithmNotSupportedCaption", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Der in der XML-Datei enthaltene Hash-Algorithmus wird nicht unterstützt. ähnelt.
+ ///
+ internal static string HashAlgorithmNotSupportedMessage {
+ get {
+ return ResourceManager.GetString("HashAlgorithmNotSupportedMessage", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
+ ///
+ internal static byte[] Unzipper {
+ get {
+ object obj = ResourceManager.GetObject("Unzipper", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap update {
+ get {
+ object obj = ResourceManager.GetObject("update", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Update Check fehlgeschlagen ähnelt.
+ ///
+ internal static string UpdateCheckFailedCaption {
+ get {
+ return ResourceManager.GetString("UpdateCheckFailedCaption", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Es gibt ein Problem beim Erreichen des Aktualisierungsservers. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es später noch einmal. ähnelt.
+ ///
+ internal static string UpdateCheckFailedMessage {
+ get {
+ return ResourceManager.GetString("UpdateCheckFailedMessage", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Update nicht verfügbar ähnelt.
+ ///
+ internal static string UpdateUnavailableCaption {
+ get {
+ return ResourceManager.GetString("UpdateUnavailableCaption", resourceCulture);
+ }
+ }
+
+ ///
+ /// Sucht eine lokalisierte Zeichenfolge, die Es ist kein Update vorhanden. Bitte versuchen Sie es später noch einmal. ähnelt.
+ ///
+ internal static string UpdateUnavailableMessage {
+ get {
+ return ResourceManager.GetString("UpdateUnavailableMessage", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/Mk0.Software.OnlineUpdater/Properties/Resources.resx b/Mk0.Software.OnlineUpdater/Properties/Resources.resx
new file mode 100644
index 0000000..87e3169
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/Properties/Resources.resx
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resources\clock_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\clock_go_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\clock_play.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Herunterladen bei {0}/s
+
+
+ ..\Resources\download_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Checksumme ist unterschiedlich
+
+
+ Die Dateiintegritätsprüfung ist fehlgeschlagen und hat einige Fehler gemeldet.
+
+
+ ..\Resources\hand_point.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Nicht unterstützter Hash-Algorithmus
+
+
+ Der in der XML-Datei enthaltene Hash-Algorithmus wird nicht unterstützt.
+
+
+ ..\Resources\Unzipper.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\Resources\update.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ Update Check fehlgeschlagen
+
+
+ Es gibt ein Problem beim Erreichen des Aktualisierungsservers. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es später noch einmal.
+
+
+ Update nicht verfügbar
+
+
+ Es ist kein Update vorhanden. Bitte versuchen Sie es später noch einmal.
+
+
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/Properties/Settings.Designer.cs b/Mk0.Software.OnlineUpdater/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..dc51a3e
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Mk0.Software.OnlineUpdater.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Mk0.Software.OnlineUpdater/Properties/Settings.settings b/Mk0.Software.OnlineUpdater/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Mk0.Software.OnlineUpdater/RemindLaterForm.Designer.cs b/Mk0.Software.OnlineUpdater/RemindLaterForm.Designer.cs
new file mode 100644
index 0000000..5b7280f
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/RemindLaterForm.Designer.cs
@@ -0,0 +1,146 @@
+namespace Mk0.Software.OnlineUpdater
+{
+ partial class RemindLaterForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RemindLaterForm));
+ this.labelTitle = new System.Windows.Forms.Label();
+ this.pictureBoxIcon = new System.Windows.Forms.PictureBox();
+ this.labelDescription = new System.Windows.Forms.Label();
+ this.radioButtonYes = new System.Windows.Forms.RadioButton();
+ this.radioButtonNo = new System.Windows.Forms.RadioButton();
+ this.comboBoxRemindLater = new System.Windows.Forms.ComboBox();
+ this.buttonOK = new System.Windows.Forms.Button();
+ this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).BeginInit();
+ this.tableLayoutPanel.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // labelTitle
+ //
+ resources.ApplyResources(this.labelTitle, "labelTitle");
+ this.tableLayoutPanel.SetColumnSpan(this.labelTitle, 2);
+ this.labelTitle.Name = "labelTitle";
+ //
+ // pictureBoxIcon
+ //
+ resources.ApplyResources(this.pictureBoxIcon, "pictureBoxIcon");
+ this.pictureBoxIcon.Image = Properties.Resources.clock_go_32;
+ this.pictureBoxIcon.Name = "pictureBoxIcon";
+ this.tableLayoutPanel.SetRowSpan(this.pictureBoxIcon, 2);
+ this.pictureBoxIcon.TabStop = false;
+ //
+ // labelDescription
+ //
+ resources.ApplyResources(this.labelDescription, "labelDescription");
+ this.tableLayoutPanel.SetColumnSpan(this.labelDescription, 2);
+ this.labelDescription.Name = "labelDescription";
+ //
+ // radioButtonYes
+ //
+ resources.ApplyResources(this.radioButtonYes, "radioButtonYes");
+ this.radioButtonYes.Checked = true;
+ this.radioButtonYes.Name = "radioButtonYes";
+ this.radioButtonYes.TabStop = true;
+ this.radioButtonYes.UseVisualStyleBackColor = true;
+ this.radioButtonYes.CheckedChanged += new System.EventHandler(this.RadioButtonYesCheckedChanged);
+ //
+ // radioButtonNo
+ //
+ resources.ApplyResources(this.radioButtonNo, "radioButtonNo");
+ this.tableLayoutPanel.SetColumnSpan(this.radioButtonNo, 2);
+ this.radioButtonNo.Name = "radioButtonNo";
+ this.radioButtonNo.UseVisualStyleBackColor = true;
+ //
+ // comboBoxRemindLater
+ //
+ resources.ApplyResources(this.comboBoxRemindLater, "comboBoxRemindLater");
+ this.comboBoxRemindLater.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.comboBoxRemindLater.FormattingEnabled = true;
+ this.comboBoxRemindLater.Items.AddRange(new object[] {
+ resources.GetString("comboBoxRemindLater.Items"),
+ resources.GetString("comboBoxRemindLater.Items1"),
+ resources.GetString("comboBoxRemindLater.Items2"),
+ resources.GetString("comboBoxRemindLater.Items3"),
+ resources.GetString("comboBoxRemindLater.Items4"),
+ resources.GetString("comboBoxRemindLater.Items5"),
+ resources.GetString("comboBoxRemindLater.Items6")});
+ this.comboBoxRemindLater.Name = "comboBoxRemindLater";
+ //
+ // buttonOK
+ //
+ this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ resources.ApplyResources(this.buttonOK, "buttonOK");
+ this.buttonOK.Image = Properties.Resources.clock_play;
+ this.buttonOK.Name = "buttonOK";
+ this.buttonOK.UseVisualStyleBackColor = true;
+ this.buttonOK.Click += new System.EventHandler(this.ButtonOkClick);
+ //
+ // tableLayoutPanel
+ //
+ resources.ApplyResources(this.tableLayoutPanel, "tableLayoutPanel");
+ this.tableLayoutPanel.Controls.Add(this.pictureBoxIcon, 0, 0);
+ this.tableLayoutPanel.Controls.Add(this.labelTitle, 1, 0);
+ this.tableLayoutPanel.Controls.Add(this.radioButtonNo, 1, 3);
+ this.tableLayoutPanel.Controls.Add(this.comboBoxRemindLater, 2, 2);
+ this.tableLayoutPanel.Controls.Add(this.radioButtonYes, 1, 2);
+ this.tableLayoutPanel.Controls.Add(this.labelDescription, 1, 1);
+ this.tableLayoutPanel.Controls.Add(this.buttonOK, 2, 4);
+ this.tableLayoutPanel.Name = "tableLayoutPanel";
+ //
+ // RemindLaterForm
+ //
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.tableLayoutPanel);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "RemindLaterForm";
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.Load += new System.EventHandler(this.RemindLaterFormLoad);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).EndInit();
+ this.tableLayoutPanel.ResumeLayout(false);
+ this.tableLayoutPanel.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label labelTitle;
+ private System.Windows.Forms.PictureBox pictureBoxIcon;
+ private System.Windows.Forms.Label labelDescription;
+ private System.Windows.Forms.RadioButton radioButtonYes;
+ private System.Windows.Forms.RadioButton radioButtonNo;
+ private System.Windows.Forms.ComboBox comboBoxRemindLater;
+ private System.Windows.Forms.Button buttonOK;
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+ }
+}
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/RemindLaterForm.cs b/Mk0.Software.OnlineUpdater/RemindLaterForm.cs
new file mode 100644
index 0000000..31a50aa
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/RemindLaterForm.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Windows.Forms;
+
+namespace Mk0.Software.OnlineUpdater
+{
+ internal partial class RemindLaterForm : Form
+ {
+ public RemindLaterFormat RemindLaterFormat { get; private set; }
+
+ public int RemindLaterAt { get; private set; }
+
+ public RemindLaterForm()
+ {
+ InitializeComponent();
+ }
+
+ private void RemindLaterFormLoad(object sender, EventArgs e)
+ {
+ comboBoxRemindLater.SelectedIndex = 0;
+ radioButtonYes.Checked = true;
+ }
+
+ private void ButtonOkClick(object sender, EventArgs e)
+ {
+ if (radioButtonYes.Checked)
+ {
+ switch (comboBoxRemindLater.SelectedIndex)
+ {
+ case 0:
+ RemindLaterFormat = RemindLaterFormat.Minutes;
+ RemindLaterAt = 30;
+ break;
+ case 1:
+ RemindLaterFormat = RemindLaterFormat.Hours;
+ RemindLaterAt = 12;
+ break;
+ case 2:
+ RemindLaterFormat = RemindLaterFormat.Days;
+ RemindLaterAt = 1;
+ break;
+ case 3:
+ RemindLaterFormat = RemindLaterFormat.Days;
+ RemindLaterAt = 2;
+ break;
+ case 4:
+ RemindLaterFormat = RemindLaterFormat.Days;
+ RemindLaterAt = 4;
+ break;
+ case 5:
+ RemindLaterFormat = RemindLaterFormat.Days;
+ RemindLaterAt = 8;
+ break;
+ case 6:
+ RemindLaterFormat = RemindLaterFormat.Days;
+ RemindLaterAt = 10;
+ break;
+ }
+
+ DialogResult = DialogResult.OK;
+ }
+ else
+ {
+ DialogResult = DialogResult.Abort;
+ }
+ }
+
+ private void RadioButtonYesCheckedChanged(object sender, EventArgs e)
+ {
+ comboBoxRemindLater.Enabled = radioButtonYes.Checked;
+ }
+ }
+}
diff --git a/Mk0.Software.OnlineUpdater/RemindLaterForm.resx b/Mk0.Software.OnlineUpdater/RemindLaterForm.resx
new file mode 100644
index 0000000..029701a
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/RemindLaterForm.resx
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ True
+
+
+ 3
+
+
+
+ Fill
+
+
+
+ 3, 3
+
+
+ 79, 90
+
+
+ CenterImage
+
+
+ 1
+
+
+ pictureBoxIcon
+
+
+ System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tableLayoutPanel
+
+
+ 0
+
+
+ True
+
+
+ Bottom
+
+
+ Segoe UI, 9pt, style=Bold
+
+
+ 91, 138
+
+
+ 6, 3, 3, 3
+
+
+ 406, 19
+
+
+ 4
+
+
+ Nein, Update jetzt herunterlanden (empfohlen)
+
+
+ radioButtonNo
+
+
+ System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tableLayoutPanel
+
+
+ 2
+
+
+ Bottom
+
+
+ nach 30 Minuten
+
+
+ nach 12 Stunden
+
+
+ nach 1 Tag
+
+
+ nach 2 Tagen
+
+
+ nach 4 Tagen
+
+
+ nach 8 Tagen
+
+
+ nach 10 Tagen
+
+
+ 375, 102
+
+
+ 10, 3, 10, 3
+
+
+ 115, 23
+
+
+ 5
+
+
+ comboBoxRemindLater
+
+
+ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tableLayoutPanel
+
+
+ 3
+
+
+ True
+
+
+ Bottom
+
+
+ Segoe UI, 9pt
+
+
+ 91, 106
+
+
+ 6, 3, 3, 3
+
+
+ 271, 19
+
+
+ 3
+
+
+ Ja, erinnere mich bitte wieder:
+
+
+ radioButtonYes
+
+
+ System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tableLayoutPanel
+
+
+ 4
+
+
+ True
+
+
+ Bottom
+
+
+ Segoe UI, 9pt
+
+
+ 88, 51
+
+
+ 409, 45
+
+
+ 2
+
+
+ Du solltest das Update jetzt ausführen. Dies dauert nur sehr kurze Zeit (abhängig von deiner Internetgeschwindigkeit) und stellt neue Funktionen zur Verfügung, schließt mögliche Sicherheitslücken.
+
+
+
+ labelDescription
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tableLayoutPanel
+
+
+ 5
+
+
+ Fill
+
+
+ 375, 163
+
+
+ 10, 3, 10, 3
+
+
+ 115, 32
+
+
+ 6
+
+
+ OK
+
+
+ MiddleRight
+
+
+ ImageBeforeText
+
+
+ buttonOK
+
+
+ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tableLayoutPanel
+
+
+ 6
+
+
+ Fill
+
+
+ 0, 0
+
+
+ 5
+
+
+ 499, 198
+
+
+ 7
+
+
+ tableLayoutPanel
+
+
+ System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 0
+
+
+ <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="pictureBoxIcon" Row="0" RowSpan="2" Column="0" ColumnSpan="1" /><Control Name="labelTitle" Row="0" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="radioButtonNo" Row="3" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="comboBoxRemindLater" Row="2" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="radioButtonYes" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="labelDescription" Row="1" RowSpan="1" Column="1" ColumnSpan="2" /><Control Name="buttonOK" Row="4" RowSpan="1" Column="2" ColumnSpan="1" /></Controls><Columns Styles="Absolute,85,Absolute,280,Absolute,135" /><Rows Styles="Absolute,32,Absolute,64,Absolute,32,Absolute,32,Absolute,16" /></TableLayoutSettings>
+
+
+ Bottom
+
+
+ Segoe UI, 10.5pt, style=Bold
+
+
+ 88, 13
+
+
+ 409, 19
+
+
+ 0
+
+
+ Willst du das Update später herunterladen?
+
+
+ labelTitle
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tableLayoutPanel
+
+
+ 1
+
+
+ True
+
+
+ 7, 15
+
+
+ 499, 198
+
+
+ Segoe UI, 9pt
+
+
+ 3, 4, 3, 4
+
+
+ CenterParent
+
+
+ Später an Update erinnern
+
+
+ RemindLaterForm
+
+
+ System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Mk0.Software.OnlineUpdater/Resources/Unzipper.exe b/Mk0.Software.OnlineUpdater/Resources/Unzipper.exe
new file mode 100644
index 0000000..4e23348
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/Unzipper.exe differ
diff --git a/Mk0.Software.OnlineUpdater/Resources/clock_go.png b/Mk0.Software.OnlineUpdater/Resources/clock_go.png
new file mode 100644
index 0000000..2bebf2f
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/clock_go.png differ
diff --git a/Mk0.Software.OnlineUpdater/Resources/clock_go_32.png b/Mk0.Software.OnlineUpdater/Resources/clock_go_32.png
new file mode 100644
index 0000000..ae4c9d9
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/clock_go_32.png differ
diff --git a/Mk0.Software.OnlineUpdater/Resources/clock_play.png b/Mk0.Software.OnlineUpdater/Resources/clock_play.png
new file mode 100644
index 0000000..d6aaf79
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/clock_play.png differ
diff --git a/Mk0.Software.OnlineUpdater/Resources/download.png b/Mk0.Software.OnlineUpdater/Resources/download.png
new file mode 100644
index 0000000..df01f33
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/download.png differ
diff --git a/Mk0.Software.OnlineUpdater/Resources/download_32.png b/Mk0.Software.OnlineUpdater/Resources/download_32.png
new file mode 100644
index 0000000..e3e0377
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/download_32.png differ
diff --git a/Mk0.Software.OnlineUpdater/Resources/hand_point.png b/Mk0.Software.OnlineUpdater/Resources/hand_point.png
new file mode 100644
index 0000000..7efc7c6
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/hand_point.png differ
diff --git a/Mk0.Software.OnlineUpdater/Resources/update.png b/Mk0.Software.OnlineUpdater/Resources/update.png
new file mode 100644
index 0000000..e290f91
Binary files /dev/null and b/Mk0.Software.OnlineUpdater/Resources/update.png differ
diff --git a/Mk0.Software.OnlineUpdater/UpdateForm.Designer.cs b/Mk0.Software.OnlineUpdater/UpdateForm.Designer.cs
new file mode 100644
index 0000000..4df7d53
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/UpdateForm.Designer.cs
@@ -0,0 +1,133 @@
+namespace Mk0.Software.OnlineUpdater
+{
+ partial class UpdateForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm));
+ this.webBrowser = new System.Windows.Forms.WebBrowser();
+ this.labelUpdate = new System.Windows.Forms.Label();
+ this.labelDescription = new System.Windows.Forms.Label();
+ this.labelReleaseNotes = new System.Windows.Forms.Label();
+ this.buttonUpdate = new System.Windows.Forms.Button();
+ this.buttonRemindLater = new System.Windows.Forms.Button();
+ this.pictureBoxIcon = new System.Windows.Forms.PictureBox();
+ this.buttonSkip = new System.Windows.Forms.Button();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).BeginInit();
+ this.SuspendLayout();
+ //
+ // webBrowser
+ //
+ resources.ApplyResources(this.webBrowser, "webBrowser");
+ this.webBrowser.Name = "webBrowser";
+ this.webBrowser.ScriptErrorsSuppressed = true;
+ //
+ // labelUpdate
+ //
+ resources.ApplyResources(this.labelUpdate, "labelUpdate");
+ this.labelUpdate.Name = "labelUpdate";
+ //
+ // labelDescription
+ //
+ resources.ApplyResources(this.labelDescription, "labelDescription");
+ this.labelDescription.Name = "labelDescription";
+ //
+ // labelReleaseNotes
+ //
+ resources.ApplyResources(this.labelReleaseNotes, "labelReleaseNotes");
+ this.labelReleaseNotes.Name = "labelReleaseNotes";
+ //
+ // buttonUpdate
+ //
+ resources.ApplyResources(this.buttonUpdate, "buttonUpdate");
+ this.buttonUpdate.Image = Properties.Resources.download;
+ this.buttonUpdate.Name = "buttonUpdate";
+ this.buttonUpdate.UseVisualStyleBackColor = true;
+ this.buttonUpdate.Click += new System.EventHandler(this.ButtonUpdateClick);
+ //
+ // buttonRemindLater
+ //
+ resources.ApplyResources(this.buttonRemindLater, "buttonRemindLater");
+ this.buttonRemindLater.Image = Properties.Resources.clock_go;
+ this.buttonRemindLater.Name = "buttonRemindLater";
+ this.buttonRemindLater.UseVisualStyleBackColor = true;
+ this.buttonRemindLater.Click += new System.EventHandler(this.ButtonRemindLaterClick);
+ //
+ // pictureBoxIcon
+ //
+ this.pictureBoxIcon.Image = Properties.Resources.update;
+ resources.ApplyResources(this.pictureBoxIcon, "pictureBoxIcon");
+ this.pictureBoxIcon.Name = "pictureBoxIcon";
+ this.pictureBoxIcon.TabStop = false;
+ //
+ // buttonSkip
+ //
+ resources.ApplyResources(this.buttonSkip, "buttonSkip");
+ this.buttonSkip.DialogResult = System.Windows.Forms.DialogResult.Abort;
+ this.buttonSkip.Image = Properties.Resources.hand_point;
+ this.buttonSkip.Name = "buttonSkip";
+ this.buttonSkip.UseVisualStyleBackColor = true;
+ this.buttonSkip.Click += new System.EventHandler(this.ButtonSkipClick);
+ //
+ // UpdateForm
+ //
+ this.AcceptButton = this.buttonUpdate;
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.pictureBoxIcon);
+ this.Controls.Add(this.labelReleaseNotes);
+ this.Controls.Add(this.labelDescription);
+ this.Controls.Add(this.labelUpdate);
+ this.Controls.Add(this.webBrowser);
+ this.Controls.Add(this.buttonUpdate);
+ this.Controls.Add(this.buttonSkip);
+ this.Controls.Add(this.buttonRemindLater);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "UpdateForm";
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.UpdateForm_FormClosed);
+ this.Load += new System.EventHandler(this.UpdateFormLoad);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBoxIcon)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button buttonRemindLater;
+ private System.Windows.Forms.Button buttonUpdate;
+ private System.Windows.Forms.Button buttonSkip;
+ private System.Windows.Forms.WebBrowser webBrowser;
+ private System.Windows.Forms.Label labelUpdate;
+ private System.Windows.Forms.Label labelDescription;
+ private System.Windows.Forms.Label labelReleaseNotes;
+ private System.Windows.Forms.PictureBox pictureBoxIcon;
+ }
+}
+
diff --git a/Mk0.Software.OnlineUpdater/UpdateForm.cs b/Mk0.Software.OnlineUpdater/UpdateForm.cs
new file mode 100644
index 0000000..1333166
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/UpdateForm.cs
@@ -0,0 +1,197 @@
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.Globalization;
+using System.IO;
+using System.Windows.Forms;
+using Microsoft.Win32;
+
+namespace Mk0.Software.OnlineUpdater
+{
+ internal partial class UpdateForm : Form
+ {
+ public UpdateForm()
+ {
+ InitializeComponent();
+ UseLatestIE();
+ buttonSkip.Visible = AutoUpdater.ShowSkipButton;
+ buttonRemindLater.Visible = AutoUpdater.ShowRemindLaterButton;
+ var resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateForm));
+ Text = string.Format(resources.GetString("$this.Text", CultureInfo.CurrentCulture),
+ AutoUpdater.AppTitle, AutoUpdater.CurrentVersion);
+ labelUpdate.Text = string.Format(resources.GetString("labelUpdate.Text", CultureInfo.CurrentCulture),
+ AutoUpdater.AppTitle);
+ labelDescription.Text =
+ string.Format(resources.GetString("labelDescription.Text", CultureInfo.CurrentCulture),
+ AutoUpdater.AppTitle, AutoUpdater.CurrentVersion, AutoUpdater.InstalledVersion);
+
+ if (AutoUpdater.Mandatory && AutoUpdater.UpdateMode == Mode.Forced)
+ {
+ ControlBox = false;
+ }
+ }
+
+ public sealed override string Text
+ {
+ get { return base.Text; }
+ set { base.Text = value; }
+ }
+
+ private void UseLatestIE()
+ {
+ int ieValue = 0;
+ switch (webBrowser.Version.Major)
+ {
+ case 11:
+ ieValue = 11001;
+ break;
+ case 10:
+ ieValue = 10001;
+ break;
+ case 9:
+ ieValue = 9999;
+ break;
+ case 8:
+ ieValue = 8888;
+ break;
+ case 7:
+ ieValue = 7000;
+ break;
+ }
+
+ if (ieValue != 0)
+ {
+ try
+ {
+ using (RegistryKey registryKey =
+ Registry.CurrentUser.OpenSubKey(
+ @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
+ true))
+ {
+ registryKey?.SetValue(Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName),
+ ieValue,
+ RegistryValueKind.DWord);
+ }
+ }
+ catch (Exception)
+ {
+ // ignored
+ }
+ }
+ }
+
+ private void UpdateFormLoad(object sender, EventArgs e)
+ {
+ if (string.IsNullOrEmpty(AutoUpdater.ChangelogURL))
+ {
+ var reduceHeight = labelReleaseNotes.Height + webBrowser.Height;
+ labelReleaseNotes.Hide();
+ webBrowser.Hide();
+ Height -= reduceHeight;
+ }
+ else
+ {
+ if (null != AutoUpdater.BasicAuthChangeLog)
+ {
+ webBrowser.Navigate(AutoUpdater.ChangelogURL, "", null, $"Authorization: {AutoUpdater.BasicAuthChangeLog}");
+ }
+ else
+ {
+ webBrowser.Navigate(AutoUpdater.ChangelogURL);
+ }
+ }
+
+ var labelSize = new Size(Width - 110, 0);
+ labelDescription.MaximumSize = labelUpdate.MaximumSize = labelSize;
+ }
+
+ private void ButtonUpdateClick(object sender, EventArgs e)
+ {
+ if (AutoUpdater.OpenDownloadPage)
+ {
+ var processStartInfo = new ProcessStartInfo(AutoUpdater.DownloadURL);
+
+ Process.Start(processStartInfo);
+
+ DialogResult = DialogResult.OK;
+ }
+ else
+ {
+ if (AutoUpdater.DownloadUpdate())
+ {
+ DialogResult = DialogResult.OK;
+ }
+ }
+ }
+
+ private void ButtonSkipClick(object sender, EventArgs e)
+ {
+ using (RegistryKey updateKey = Registry.CurrentUser.CreateSubKey(AutoUpdater.RegistryLocation))
+ {
+ if (updateKey != null)
+ {
+ updateKey.SetValue("version", AutoUpdater.CurrentVersion.ToString());
+ updateKey.SetValue("skip", 1);
+ }
+ }
+ }
+
+ private void ButtonRemindLaterClick(object sender, EventArgs e)
+ {
+ if (AutoUpdater.LetUserSelectRemindLater)
+ {
+ var remindLaterForm = new RemindLaterForm();
+
+ var dialogResult = remindLaterForm.ShowDialog();
+
+ if (dialogResult.Equals(DialogResult.OK))
+ {
+ AutoUpdater.RemindLaterTimeSpan = remindLaterForm.RemindLaterFormat;
+ AutoUpdater.RemindLaterAt = remindLaterForm.RemindLaterAt;
+ }
+ else if (dialogResult.Equals(DialogResult.Abort))
+ {
+ ButtonUpdateClick(sender, e);
+ return;
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ using (RegistryKey updateKey = Registry.CurrentUser.CreateSubKey(AutoUpdater.RegistryLocation))
+ {
+ if (updateKey != null)
+ {
+ updateKey.SetValue("version", AutoUpdater.CurrentVersion);
+ updateKey.SetValue("skip", 0);
+ DateTime remindLaterDateTime = DateTime.Now;
+ switch (AutoUpdater.RemindLaterTimeSpan)
+ {
+ case RemindLaterFormat.Days:
+ remindLaterDateTime = DateTime.Now + TimeSpan.FromDays(AutoUpdater.RemindLaterAt);
+ break;
+ case RemindLaterFormat.Hours:
+ remindLaterDateTime = DateTime.Now + TimeSpan.FromHours(AutoUpdater.RemindLaterAt);
+ break;
+ case RemindLaterFormat.Minutes:
+ remindLaterDateTime = DateTime.Now + TimeSpan.FromMinutes(AutoUpdater.RemindLaterAt);
+ break;
+ }
+
+ updateKey.SetValue("remindlater",
+ remindLaterDateTime.ToString(CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat));
+ AutoUpdater.SetTimer(remindLaterDateTime);
+ }
+ }
+
+ DialogResult = DialogResult.Cancel;
+ }
+
+ private void UpdateForm_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ AutoUpdater.Running = false;
+ }
+ }
+}
diff --git a/Mk0.Software.OnlineUpdater/UpdateForm.resx b/Mk0.Software.OnlineUpdater/UpdateForm.resx
new file mode 100644
index 0000000..5a15fec
--- /dev/null
+++ b/Mk0.Software.OnlineUpdater/UpdateForm.resx
@@ -0,0 +1,955 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ Top, Bottom, Left, Right
+
+
+
+ 94, 120
+
+
+ 2, 2, 2, 2
+
+
+ 23, 23
+
+
+ 538, 432
+
+
+
+ 0
+
+
+ webBrowser
+
+
+ System.Windows.Forms.WebBrowser, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 4
+
+
+ True
+
+
+ Segoe UI, 10.5pt, style=Bold
+
+
+ 91, 14
+
+
+ 550, 0
+
+
+ 227, 19
+
+
+ 5
+
+
+ Eine neue Version von {0} ist verfügbar!
+
+
+ labelUpdate
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 3
+
+
+ True
+
+
+ Segoe UI, 9pt
+
+
+ 91, 50
+
+
+ 550, 0
+
+
+ 479, 15
+
+
+ 6
+
+
+ {0} {1} ist jetzt verfügbar. Es ist die veraltete Version {2} installiert. Soll die neue Version jetzt heruntergeladen werden?
+
+
+ labelDescription
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 2
+
+
+ True
+
+
+ Segoe UI, 9.75pt, style=Bold
+
+
+ 91, 90
+
+
+ 98, 17
+
+
+ 7
+
+
+ Versionshinweise:
+
+
+ labelReleaseNotes
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 1
+
+
+ Bottom, Right
+
+
+ Segoe UI, 9pt
+
+
+ 479, 573
+
+
+ 2, 2, 2, 2
+
+
+ 153, 28
+
+
+ 2
+
+
+ Update
+
+
+ MiddleRight
+
+
+ ImageBeforeText
+
+
+ buttonUpdate
+
+
+ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 5
+
+
+ Bottom, Right
+
+
+ Segoe UI, 9pt
+
+
+ 322, 573
+
+
+ 2, 2, 2, 2
+
+
+ 153, 28
+
+
+ 3
+
+
+ Später erinnern
+
+
+ MiddleRight
+
+
+ ImageBeforeText
+
+
+ buttonRemindLater
+
+
+ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 7
+
+
+ 12, 14
+
+
+ 70, 66
+
+
+ CenterImage
+
+
+ 8
+
+
+ pictureBoxIcon
+
+
+ System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 0
+
+
+ Bottom, Left
+
+
+ Segoe UI, 9pt
+
+
+ 95, 573
+
+
+ 2, 2, 2, 2
+
+
+ 153, 28
+
+
+ 1
+
+
+ Version überspringen
+
+
+ MiddleRight
+
+
+ ImageBeforeText
+
+
+ buttonSkip
+
+
+ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 6
+
+
+ True
+
+
+ 7, 15
+
+
+ 643, 612
+
+
+ Segoe UI, 9pt
+
+
+
+ AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA
+ IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af//
+ /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAkAAAANAAAADwAAABEABQ0TAEqmPQAAAA0AAAAJAAAABf///wH///8B////Af//
+ /wH///8BAAAABwAAAA0ASKJBBVGsWwAAAB0AAAAhCV2/hxBv2MUAAAAZAAAAFQAAAA8AAAAHAAAAA///
+ /wH///8BAAAAAwAAAAkAAAARAEqnVyuO7/8Xbc2vA0ibbxuF7vsVfur7ACBILwAAABkAFzQZADR2GQAA
+ AAX///8B////Af///wEAAAAJAAAADwBKo0sokvT/IJH3/yeO8P8Wi/f/HYz1/xRs0LkWdt7LFHbj9wBT
+ u0cAAAAD////Af///wEAXM4RAFrITxJpzW8eddWlMpn0/x+U+P8ilvj/UrH6/xeN9/8Xi/b/DIP1/xh5
+ 480AAAUF////Af///wH///8BAFzPDS+F4sU/ovj/LJz4/yea+P8nmvn/f8f8//H5/v8/pvr/Foz3/x+N
+ 9f8KZtNt////Af///wH///8B////Af///wEAXM4TM4vm0zOh+f8toPn/Qab5//P5/v//////yef9/x2R
+ 9/8YjPb/IYbt+Rp13ZUAXM4b////Af///wH///8B////ASB32otEqfj/M6X6/0Ok+f+Uyfv//////2Wz
+ +v8olff/FIv3/xeJ9v8nh+z5D2nVj////wH///8B////ASB32nNGpPX/L6L6/zao+v86q/v/aLb6////
+ //8nm/j/HZL4/yuV9v8ged2pAFvOH////wH///8B////AQBbzR8yhN+3QJXp10Ga7fdGrfr/Naf6/0un
+ +f+q0vv/IJX4/xyR9/8ikff/KH3ei////wH///8B////Af///wH///8B////Af///wEAXM5DS6v4/y6h
+ +f84pPn/Jpr4/zCd+P81k+3/M5f1/zuQ6usAW84J////Af///wH///8B////Af///wH///8BAFzOU1Wv
+ +f9Gne7vOovjxTWf+P88mfH/AFvNMQJfz0kieNuFAFzOM////wH///8B////Af///wH///8B////AQNf
+ z2M/jeKtAFzOGwBbzg87kOjbP5Loz////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAW8wH////Af///wH///8BBWHQMxhu1nf///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAD//wAA
+ //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA
+ AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABwAAAAcAAAAHAAAABwAA
+ AAcAAAAFAAAAAwAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAANAAAADwAA
+ AA8AAAANAAAADQAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAAFAAAABwAAAAsAAAANAAAADwAAABEAAAATAAAAEwAA
+ ABUAAAAVAAAAFQAPJhkAWci7ACxgIQAAABEAAAARAAAADwAAAAsAAAAJAAAABwAAAAP///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAANAAAADwBHnj0AH0YdAAAAFwAA
+ ABkAAAAbAAAAHQAAAB0AAAAdAFW+mQ5v3P0ATq5rAAAAGQAAABcAAAATAAAAEQAAAA0AAAALAAAABwAA
+ AAX///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAJAAAADQAAAA8AAAATAFfEpQhj
+ 0N8ARpxVAAAAHwAAACEAAAAjAAAAJQBIoGsTduL9JIz0/wJYwa8AAAAdAAAAGwAAABcAAAAVAAAAEQAA
+ AA8AAAALAAAABwAAAAX///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAsAAAAPAAAAEQAA
+ ABUAVsCbOpfz/x984f0BVr2lABg4MwAAACkALmhJDWvX8SKO9v8XiPb/DmvY8QAIFSUAAAAfAAAAGwAA
+ ABcAAAATAAAAEQAAAA0AAAAJAAAABf///wH///8B////Af///wH///8B////AQAAAAMAAAAHAAAACwAA
+ AA8AAAATAAAAFQBUvZEylPL/IZD3/zKR8P8PadLlAESYcQZgy9ktk/T/EIb2/xCF9v8efuX9AEGPWQAA
+ AB8AAAAbAAAAFwAAABUAOH4pAE2tQQAAAAkAAAAFAAAAA////wH///8B////Af///wH///8BAAAAAwAA
+ AAcAAAALAAAADwAAABEAAAAVAFW8iTeW8f8WjPf/GY33/zOa9/8ng+X/MZDv/xqN9/8RiPb/EIf2/yqO
+ 8f8AVLufAD6JSwBRtX0AWMStCGbU4RBu3P8AWsvBAAAACQAAAAX///8B////Af///wH///8B////Af//
+ /wH///8BAAAABQAAAAkAAAANAAAADwAAABMAVbx9O5fw/xqP9/8aj/f/Go/3/ySU9/8hkvf/Foz3/xWL
+ 9/8Tivf/J5P3/xt43/8efOP9JYjt/yKL9f8difb/GXnk/QBTuUkAAAAHAAAAA////wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAkAAAALABUtEwBXwYk/mO7/HZL4/x6T+P8dkvj/HZL4/xyR
+ +P8tofn/HpP3/xaM9/8Vi/f/IZD3/xaJ9v8Mg/b/CYH1/x+L9f8JZdLRAAAKBwAAAAX///8B////Af//
+ /wH///8B////Af///wH///8BAFzOQQBczokAXMynDWfTwxlz2eUie979LYTi/02l9P8hlvj/IZb4/yGW
+ +P8glfj/L6H6/7Pf/f9Ksfv/GpD3/xeN9/8Uivf/EYj2/w6F9v8NhPb/J4Xq/QBYyGUAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM81EGvW62ez+P9Jp/n/P6P5/zig+P8xnvj/J5r4/yWZ
+ +f8lmfn/JZn5/yqd+f+Jzv3//////8jo/v8vofr/GY/3/xaM9/8Tivf/EIf2/yWQ9v8Tb9npAFi/Cf//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM45Hnfb81Gr+f8ilvj/I5j4/yWZ
+ +f8nm/n/KJz5/ymc+f8pnPn/VLX7//b7/v///////////5DR/f8kmPn/GI73/xWL9/8SiPb/NpTx/wBc
+ zrcAWs8J////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM5HJn7e91Su
+ +v8mmvn/KZz5/yqe+f8sn/n/LaD5/yuc+P/S6v3/////////////////+Pz+/1a1+/8ckfj/F433/xOK
+ 9/8ok/f/NI7s/RJu2OUAW85tAF7QB////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAXM5VL4bi/VSw+v8rn/n/LqH6/y+i+v8kmPn/i8X6////////////////////////////1+z+/yiZ
+ +P8Yjvf/FYv3/xGI9v8Sh/b/K5L3/zCL6/0Qa9fhAFzOZQBZzAX///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM6xYrD0/zCh+v8xpPr/M6X6/xmI9v+m0Pv/qtL7/+Pw/v///////////6zU
+ +/+t1fz/Vqv5/xiO9/8WjPf/Eon3/w+F9v8Lgvb/EIT1/0Cb9/8jet/9AFzNvf///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFvNeUeX6P9Pr/r/MKP6/zOm+v82qPv/K575/ySZ+f8Xjvf/rNP8////
+ ////////I5f5/xiN9/8WjPf/Go/3/xeN9/8Tiff/FIj2/zGV9/83j+z9FG3Y5wBbzXMAWcwL////Af//
+ /wH///8B////Af///wH///8B////AQBczm1Bk+f/VLD6/y2g+v8xpPr/Naf6/ziq+/87rPv/Oav7/yWY
+ +f+s0/z///////////8vofr/I5f4/x+U+P8bkPj/F433/zSa+P9Alu39F3HZ5wBbznMAXNEL////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM5jO43k/Vix+v8qnfn/LqD6/zGk+v81p/r/OKr7/zus
+ +/85q/v/JZj5/6zT/P///////////yqd+P8jl/j/H5T4/xuQ+P8Xjff/S6Dy/wBczbEAXNEL////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvNUxlz2P13uvb/aLj5/2O3+v9atPv/ULH6/z6q
+ +v82qPv/OKn7/zeo+/8jmPj/rNP8////////////JJj4/yKX+P8ek/j/G5D3/xeN9/8/n/j/GXHY2wBt
+ 2wP///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84nAFzOYwBczYEAXM6fEGrTvSR7
+ 3OMyhd/9cr34/zOl+v80pvr/M6X6/yWa+f86l/f/VaX4/1Wl+P8Zj/f/IZb4/x2S+P8aj/f/Foz3/xuN
+ 9/9Ckuj/AFzOS////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBczn9ptfX/L6L6/zCj+v8wovr/LqH6/yyf+f8pnfn/Jpr5/yOX+P8ml/j/PKH5/yeW
+ 9/8Vi/f/EYj2/0qi9v8NZdGz////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFvOjWm39/8sn/n/LaD5/y2g+f9Nrfr/OqX5/yeb+f8kmPj/IZb4/1iu
+ +f8wg+D/QpHm/VSk8v9Sp/j/Uaf4/zSG4v0AW84j////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM6babj5/yic+f85pPn/bLj4/ziJ4f1osfT/Lpz5/yGW
+ +P8flPj/X6nw/wBczXEAW845AF3OdQVg0K8dddvtLX/e/wBczov///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBczqtqufr/V7H6/1ii7P8QadTBAFzPORZv
+ 199ntvn/IJT4/zSd+P8+jOL9AFvNG////wH///8B////Af///wEAW84pAFzOP////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BBWLRt3y89v8rfdzvAFzPZf//
+ /wH///8BAFvOOS6D4PlRq/n/U6v5/xlw1sf///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wECXc7RCmTSqwBb
+ zhn///8B////Af///wH///8BAFvNc02b6v9orvP/AFzOef///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBb
+ zBv///8B////Af///wH///8B////Af///wH///8BBWHRsy5+3f0AXM4n////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW84TAFzOs////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAP///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAAAADAAAAAwAAAAMAAAADAAAABQAAAAUAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAA
+ AAcAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAUAAAAFAAAABwAAAAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAANAAAADQAA
+ AA0AAAANAAAADQAAAAsAAAALAAAACwAAAAkAAAAJAAAABwAAAAUAAAAFAAAAA////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEQAA
+ ABEAAAARAAAAEQAAABEAAAARAEWaNQBGnjcAAgQPAAAADwAAAA0AAAANAAAACwAAAAkAAAAJAAAABwAA
+ AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAANAAAADwAAABEAAAARAAAAEwAA
+ ABMAAAAVAAAAFwAAABUAAAAVAAAAFQAAABUAG0UfAFrL1wBWwZUAI04fAAAAEwAAABEAAAARAAAADwAA
+ AA0AAAANAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAsAAAALAAAADQAPIRMAP40vABo7GwAA
+ ABUAAAAXAAAAGQAAABkAAAAZAAAAGwAAABsAAAAdAAAAGwAiTykAV8KpCWnX/QVgzdMAPYc9AAAAFwAA
+ ABcAAAAVAAAAEwAAABEAAAAPAAAADQAAAA0AAAALAAAABwAAAAcAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAABQAAAAcAAAAHAAAACwAAAA0AAAAPAAAAEQA1
+ dScAWMavAFS8iQA2ejUAAQMbAAAAHQAAAB0AAAAfAAAAHwAAACEAAAAhABQsKQBQsoEHZ9bvIIbv/w5t
+ 2vcASKFdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAADwAAAA8AAAANAAAACQAAAAkAAAAHAAAAA///
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAADQAA
+ AA8AAAARAAAAEwA3fS8AWsrRD2zY9wFax8MARppXAAAAHwAAACEAAAAjAAAAJQAAACUAAAAlAEGQWwVi
+ 0OUeg+v/IYz1/xZ34f8BVLmTAAAAHwAAAB0AAAAbAAAAGQAAABcAAAAVAAAAEwAAABEAAAAPAAAACwAA
+ AAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA
+ AAsAAAALAAAADQAAABEAAAATAAAAFQAsYykAWcnNN5Xy/y2K6v0Pa9f9AVS4lwAxb0MABxEpAAAAJwAA
+ ACkAKF1DBGDN5R+B6P0hjfb/EIX2/x+D6/8GYc/hAAYPJQAAACEAAAAdAAAAGwAAABkAAAAXAAAAFQAA
+ ABMAAAAPAAAADQAAAAsAAAAJAAAABwAAAAX///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQAfRyMAWcjLM5Px/zWZ9/8yk/H/HHfe+wdf
+ ycsAR6B1AAYPLQAfRj8AUrmxGXri/ymR9f8Sh/b/D4X2/yOL8/8LaNf/ADNyQwAAACEAAAAfAAAAHQAA
+ ABkAAAAXAAAAFQAAABMAAAARAAAADwAAAAsAAAAJAAAABwAAAAMAAAAD////Af///wH///8B////Af//
+ /wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAANAAAADwAAABEAAAATAAAAFQANIh0AWcfHMJHv/yeT
+ 9/8djvf/NZf1/y6L6v8NaNLrAFO3pQBQtKENa9b1Mpb1/xuM9v8Phvb/DoX2/yKO9v8Xdd/9AE6rfwAA
+ ACEAAAAfAAAAHQAAABkAAAAXAAAAFwAdPRsAR6A9AFS+bQBAkSMAAAAJAAAABwAAAAMAAAAD////Af//
+ /wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAAAAkAAAALAAAADwAAABEAAAATAAAAFQAA
+ ABcAWsfDMZDu/yuW9/8Vi/b/F4z3/yqV9/88nfb/IHzg/RJv2v80lPH/I5H3/xKI9/8Rh/b/EIf2/xyM
+ 9v8piez/AFjFxQAkUTMAL2k5AECRSwBMqmMAVb6PBF/NyQdk1PUHZdX/AFvN6wBUvl0AAAAJAAAABwAA
+ AAX///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABwAAAAkAAAALAAAADQAA
+ AA8AAAARAAAAFQAAABcAWse5MZDs/zCZ+P8Yjff/GI73/xiO9/8ikvf/Npz3/zmb9f8vmPf/FYv3/xSK
+ 9/8Tiff/EYj2/xaK9v8ylvX/BV7M6wBWwbEDXMe/DGnW6RFw3f0XduH/HH/p/SKG7/8be+b9AFrKrwAw
+ bBUAAAAJAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAA
+ AAcAAAAJAAAACwAAAA8AAAAPAAAAEQAAABUAWsexMo7r/zSc+P8aj/f/Go/3/xqP9/8aj/f/HZH3/yGT
+ 9/8bj/f/F433/xaM9/8Vi/f/FIr3/xOJ9v8vl/f/KIXo/yWE6P8sjO39LI/y/yWN9P8cifX/FIT1/yKK
+ 9P8Oa9n/AFS7UwAAAAkAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAYNDwAdQRkAWsevMY3p/zug+f8dkvj/HZL3/x2S
+ +P8ckvj/HJH3/xyR+P8bkfj/JZn4/ySY+P8Zjvf/Foz3/xSL9/8Wi/f/KZT3/yOQ9v8Xivb/DIP2/wqB
+ 9v8IgPX/E4X1/yGB6f8GYtDPAAARCQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAF3FBwBVvBkAVr8tAFbBRwBWwVsAWMRvAFjFhQBYxZUAW8znM47p/z+j
+ +f8flPf/H5T3/x+U+P8flPf/HpP3/x6T+P8lmvn/Ubf7/1e4+/8lmvj/GI73/xaM9/8Vi/f/E4n3/xGI
+ 9v8Phvb/DYT2/wuD9v8Jgfb/JYz0/xd03vsBWcZtAAAABQAAAAMAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXM6PAFzOwwBbzcsBXc7TDmnU3Rt02uklf+D1MYnl/TuS
+ 6f9Fmu3/U6n1/zig+P8hlvf/IZb4/yGW9/8hlvf/IZX4/ySY+P83qPv/u+P9/7He/f9Gr/v/HJH4/xiO
+ 9/8Xjff/FIv3/xOJ9/8RiPb/D4X2/wyE9v8Rhfb/L43v/wtm09EAU74xAAAAA////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9zC2bT8Uia7f9ntPn/WK75/1Ss
+ +f9Oqvn/Rab5/z6j+P83oPj/LJv4/ySY+f8kmPj/JJj4/ySY+f8kmPj/JZn5/zin+/+S0f3///////v9
+ /v+Y1P3/MaP6/xyR9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8qk/b/IHvh+QBczIEAV78H////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUDAV3PgR92
+ 2u9Yp/L/QKP5/yGU+P8glPj/IZb4/yOX+P8kmPj/JZn5/yaa+f8mmvn/J5v5/yeb+f8nmvn/MKL6/23C
+ /P/k8/7////////////v+P7/Ybz8/ymd+f8bkPf/F433/xaM9/8Uivf/EYj2/xiL9v85mPX/CmXT2wBb
+ zjn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAFzOEwJf0I8adNr1XbD4/zmh+P8ilvj/I5j4/ySZ+P8mmvj/J5v4/yic+P8pnPj/KZz4/ymc
+ +P8qnfj/SrD7/8Hl/f/8/v7/////////////////w+b+/0iw+/8ilfj/GY/3/xeN9/8Vi/f/E4n2/ySR
+ 9/81j+3/AFzO4QBbzlMAWs8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBd0QkAXM6JIHnb+Vut9f8/pPn/JZn4/yeb+f8pnPj/Kp35/yue
+ +f8rn/n/LJ/5/yue+f8rnfj/otX8//7///////////////7+/v//////+vz+/6XZ/P88qfr/HJH4/xiO
+ 9/8WjPf/E4r3/xmM9/84m/f/Mo3q/xZx2v0HY9LHAFzOSwBbzhcAXs8D////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssNBWHQpSqC4PlgsPf/OqT5/ymd
+ +f8qnvn/LJ/5/y2g+v8toPn/LaD5/yOX+f9csPn/9vr+///////+/v7////////////+/v7//////+v2
+ /v9ywPv/I5f4/xqP9/8Xjff/FIv3/xKJ9/8Vifb/KZL3/zaV9P8vien9FXDZ7wRf0KkAXM1ZAFnSCf//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNIwVi
+ 0a8uheL9Z7n6/zql+f8sn/n/LaH6/y+i+v8wo/r/J5v4/zKZ+P/F4vz///////7+/v//////////////
+ ///////////////////a7v7/L534/xyS+P8Yjvf/FYz3/xOJ9/8RiPb/D4b2/xSH9v8jjvf/OZXy/y6H
+ 6P0Qa9bnAFzOqQBbzTsAWcsF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzisAW87VUKPv/1ay+v8vofr/MKP6/zGk+v8zpfr/E4b2/3i4+f/S5/3/1Oj9/9zs
+ /f/4+/7/////////////////1en9/9bq/f/W6v3/hcL6/xqP9/8Zj/f/Foz3/xSK9/8RiPf/D4X2/w2E
+ 9v8Kgvb/DIL1/yqQ9v9CnPb/LILk/QVg0P0AW82X////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFzPEQBczn8fd9rvaLb3/0es+v8wovr/MaT6/zOl+v80p/r/GIz3/yqS
+ 9/8zl/f/MZb2/1Gk+P/c7P3//v7+////////////PJ74/zWY9/80mPf/LZX3/xeM9/8Zjvf/F433/xWL
+ 9/8SiPf/D4b1/w2E9v8Rhfb/J5D2/zaV9P8wiOn9GnLb8wVg0LMAW81b////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvNdR112e9msPL/Tq76/zGj+v8xo/r/M6b6/zWn
+ +v83qfv/M6X6/y+h+v8tofr/JZn4/zSX9//V6f3///////7+/v/+/v7/LKD6/x6T+P8dkff/G5D3/xqQ
+ 9/8aj/f/F433/xWL9/8Siff/E4j2/ymS9/9Dnvj/No7r/xhx2v0IY9LNAFrNUQBbzRsAWcwD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBczQsAXM1rIHfb/2ay9f9Sr/r/LaD6/y+i
+ +v8xpPr/NKb6/zeo+/84qvv/Oqz7/zqr+/84qvv/LqD6/zaY+P/V6f3/////////////////M6b6/ySY
+ +f8ilvj/H5T4/x2S+P8akPf/F433/xmN9/8ul/j/SaD0/z6S6/8ZctntAFvOtwBczk0AXNEJ////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFrNCwBbzWcWcNjpZbD0/1ax
+ +v8voPn/LaD6/y+i+f8ypPr/NKf6/zeo+/85q/v/PK36/zus+/85q/v/LqH6/zaY+P/V6f3//v7+////
+ ////////MaP5/ySY+P8il/j/H5T3/x2S+P8akPj/F433/y6Y9/9MoPP/Hnbb8wdi0bEAXM5jAFvRD///
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzOWRNu
+ 1+deqPD/WrL6/y2e+f8qnfn/LaD6/y+i+v8xpPr/NKb6/zeo+/84qvv/Oqz6/zqr+/84qvv/LqD6/zaY
+ +P/V6f3///////7+/v/+/v7/LKD5/yOY+P8ilvj/H5T4/xyS9/8akPj/F433/zGZ+P9MnvD/AFzNzwBc
+ zSUAXNED////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBY
+ ywMAW81RC2fT+1ai7P+Bwfj/XbP5/1ax+v9Mrfn/RKr6/0Kq+v9Aqvr/O6n6/zWn+v83qfv/OKn7/zip
+ +/83qPv/LKD5/zaY+P/V6f3/////////////////Jpr4/yKX+P8ilvj/H5T4/x2S+P8akPf/F433/xyP
+ 9/9Tqfj/GnLY5QBdzlH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBdzwcAW86bCWPR3yt/3fEzheD9Po3j/0mV5v1WoOr9Yqvw/2ey9P9ruPf/ar37/0Ks
+ +v81p/r/Nqj6/zan+/81p/r/K575/y6U9/+y1vz/1Oj9/9To/f/U6P3/IZb4/yGV+P8hlvj/HpP3/xyR
+ +P8aj/f/F433/xWL9/85nPj/QZHo/QNfz5UAXc4N////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAW84dAFzOMQFdzjkAW81HAFzOawNfzocLZdKlEmzVzxZv
+ 1u0acdf9ZbP0/1e1+v8zpfr/M6X6/zOl+v8ypfr/LJ/5/xaK9v8ji/b/Ko/2/yqP9v8qj/b/Eor3/yGV
+ 9/8glfj/HZL4/xyR9/8Zj/f/Foz3/xSK9/8ZjPf/VqTx/xdv19cAXM4t////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM6/X63y/1Wz+/8wo/r/MKP6/zCj+v8wovr/L6L6/y6h+v8sn/n/Kp35/yic
+ +f8mmvj/JJj4/yGW+P8klvj/LZr4/yeW+P8ekff/FYz3/xOJ9/8RiPb/Q5/2/zeH4v8FYM97////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBZ2QUAW87DZLH0/1Cw+v8uofr/LqH6/y6h+f8uofr/LKD5/yyf
+ +f8qnfn/KJz4/yeb+f8lmfn/Ipf4/yGW+P9Lqfn/Xa31/1ut9/9Uq/j/QaD4/zCY+P8fj/b/KJL2/02c
+ 7v0RadTZAFnMCf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBb0Q8AW87HabX2/0ut+v8rn/n/LJ/5/yyf
+ +f8toPn/V7L6/2G2+v83o/n/J5v5/yWZ+f8jl/j/IZb4/y2b+P9tuPn/G3LX/xpx2P8sf9/7SJns/1mo
+ 9P9hr/j/Xa35/2iw9/8keNv7AFvORf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBdzxsAXM7Nbrn4/0Oo
+ +f8pnPn/Lp/5/0aq+v9uuvj/XKXs/1Kf6/9vufn/LJz5/yOX+P8hlvj/H5T4/0Sl+f9bpe7/AFzNsQBa
+ zCkAW85fAF3OpQBczckJY9LXJn3f80SS6P06iuP/AFzOtQBf0gv///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd
+ zyUAXM7Rcrz6/z6l+f8yoPn/XbT6/2ix8/89jOL9B2LQvQ1o1NNWou3/WbH6/yaY+P8flPj/IpX4/1iu
+ +f87ieH9AFzOY////wH///8BAF3QAwBdzRMAW805AFzOZwBbzYsCXc6vAFzOuwBczh////8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzy8AXM7Vd7/6/1aw+v9wvPr/Up7r/xtx1+8GYdGFAFzPIQBbzlsRatXnb7j3/0Sm
+ +f8elPj/Kpj4/2Gu9v8ec9f9AFnNGf///wH///8B////Af///wH///8B////AQBZywcAW84ZAFzNKQBc
+ zQf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBczjkFYtLXhcT5/2uv8f8uf9zxAFzPqQBczi////8B////Af//
+ /wEAW851I3nb+Wmz9/83nvj/OJ74/1ih7P0RatS7////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBbzkMIY9HfSJTl/Rtx1tUBXc51AFrOD///
+ /wH///8B////Af///wEAV84LB2PRsz6P5f9ksvj/WKz4/0GN4/8FYM5v////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBbzVcBXM7rCGLRowBb
+ zzMAWs4H////Af///wH///8B////Af///wH///8BAFvNNwxm0tFXo+7/cbX2/yt+3esAXM47////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBZ
+ zA8AXMwt////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBczk8KZdLhU5vp/w1l
+ 0a8AW84Z////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBd
+ zwcAXM55CmPR/wBczYkAXM0F////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAW84PAFzOmwBbzTf///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
+ AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
+ //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
+ AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
+ //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA
+ AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA
+ //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA
+ AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAADAAAABQAAAAUAAAAFAAAABQAA
+ AAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAADAAAAAwAAAAUAAAAFAAAABQAAAAcAAAAHAAAABwAA
+ AAcAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAHAAAABwAAAAcAAAAHAAAABQAA
+ AAUAAAAFAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABQAAAAcAAAAHAAAACQAA
+ AAkAAAAJAAAACwAAAAsAAAALAAAACwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAAA0AAAALAAAACwAA
+ AAsAAAALAAAACQAAAAkAAAAJAAAABwAAAAcAAAAFAAAABQAAAAMAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAUAAAAHAAAABwAA
+ AAkAAAAJAAAACwAAAAsAAAANAAAADQAAAA0AAAAPAAAADwAAAA8AAAAPAAAADwAAABEAAAARAAAAEQAA
+ AA8AAAAPAAAADwAAAA8AAAAPAAAADQAAAA0AAAANAAAACwAAAAsAAAAJAAAACQAAAAcAAAAHAAAABQAA
+ AAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAA
+ AAcAAAAJAAAACQAAAAsAAAALAAAADQAAAA0AAAAPAAAADwAAABEAAAARAAAAEQAAABMAAAATAAAAEwAA
+ ABMAAAATAAAAEwAAABMAAAATAAAAEwBIn0EAWcirAAwYFQAAABEAAAARAAAADwAAAA8AAAAPAAAADQAA
+ AA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA
+ AAMAAAAFAAAABwAAAAkAAAAJAAAACwAAAA0AAAANAAAADwAAAA8AAAARAAAAEwAAABMAAAATAAAAFQAA
+ ABUAAAAXAAAAFwAAABcAAAAXAAAAFwAAABcAAAAXAAAAFwAnYicAXM7/AFzO/wBKoU0AAAAVAAAAFQAA
+ ABMAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAAAAkAAAAHAAAABQAAAAUAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAEwAA
+ ABUAAAAXAAAAFwAAABkAAAAZAAAAGQAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAACRsAWcfBAmHR+wZi
+ 0f0AVr6VAAAAGQAAABcAAAAXAAAAFQAAABUAAAATAAAAEQAAABEAAAAPAAAADQAAAA0AAAALAAAACQAA
+ AAcAAAAHAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQA5
+ eSkAWMWrAD6NOwAAABcAAAAXAAAAGQAAABsAAAAbAAAAHQAAAB0AAAAdAAAAHwAAAB8AAAAfAAAAHwAA
+ AB8AUbaLAF3P/R6E7v8UdeL/AFzM4QAAABsAAAAbAAAAGQAAABkAAAAXAAAAFQAAABUAAAATAAAAEQAA
+ AA8AAAAPAAAADQAAAAsAAAAJAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAABwAAAAkAAAALAAAADQAA
+ AA8AAAARAAAAEQAAABMAS6dPAFzO/wBczv8AU7mFAAkaHwAAABsAAAAdAAAAHwAAAB8AAAAhAAAAIQAA
+ ACEAAAAjAAAAIwAAACMARZddAF3P/RR65v8nj/b/JIbu/wBczv8ANnU9AAAAHQAAABsAAAAbAAAAGQAA
+ ABcAAAAXAAAAFQAAABMAAAARAAAAEQAAAA8AAAANAAAACwAAAAkAAAAJAAAABwAAAAUAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAMAAAAFAAAABwAA
+ AAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAEWdRwBczv8aeOH/A1/Q/QBbydcAPYVHAAAAHwAA
+ ACEAAAAjAAAAIwAAACUAAAAlAAAAJQAAACcAKlw9AFvM8Q1v3f0skvb/HYv2/ymR9v8GYtD9AE+wgQAA
+ AB8AAAAfAAAAHQAAABsAAAAZAAAAGQAAABcAAAAVAAAAEwAAABEAAAARAAAADwAAAA0AAAALAAAACQAA
+ AAcAAAAFAAAABQAAAAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAA
+ AAMAAAAFAAAABwAAAAkAAAALAAAACwAAAA0AAAAPAAAAEQAAABMAAAAVAAAAFwA/jj0AXM7/N5Ty/zyZ
+ 8/8Tb9n7AFzO/QBTt5EADSApAAAAJQAAACcAAAAnAAAAKQAAACkACxwvAFnG0Qdl1Psukvb/Io73/wmB
+ 9v8pkfb/E3Hd/wBZx8kAAAAjAAAAIQAAAB8AAAAdAAAAGwAAABkAAAAZAAAAFwAAABUAAAATAAAAEQAA
+ AA8AAAANAAAADQAAAAsAAAAJAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAAEQAAABEAAAATAAAAFQAA
+ ABcAN3gzAFzO/zSS8P9Bn/j/QJ/4/yqH6P8FYND9AFvJ3wA6hlUAAAApAAAAKQAAACsAAAAtAFC1owFe
+ z/0rjvH/LZX3/w6E9v8Lgvb/Io73/yOE6/8AXM79ABtAMQAAACEAAAAhAAAAHwAAAB0AAAAbAAAAGQAA
+ ABcAAAAVAAAAEwAAABMAAAARAAAADwAAAA0AAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAsAAAANAAAADwAA
+ ABEAAAATAAAAFQAAABUAAAAXACZZKQBczv8uju7/NJr3/x+P9/88nfj/Ppr0/xdy2/0AXc/9AFG1nwAP
+ JDMAAAAtAEOXcwBczf8jher/N5r4/xWI9v8Nhfb/DIT2/xiJ9v8xlPb/A17Q/wBJoW0AAAAjAAAAIQAA
+ AB8AAAAdAAAAGwAAABkAAAAXAAAAFwAAABUAAAATAAAAEQAAAA8AAAANAAAACwAAAAkAAAAHAAAABQAA
+ AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABwAA
+ AAkAAAALAAAADQAAAA8AAAARAAAAEwAAABMAAAAVAAAAFwARKx8AXM7/LY7t/zqc+P8Tivf/Fov3/zCY
+ +P9Fovn/MIzr/wdi0P0AXMrlAEijfwBczfcXd+D/Pp74/x+P9/8Qh/b/D4b2/w6F9v8Phfb/NJj3/xJv
+ 2vsAVr2vAAAAIwAAACEAAAAfAAAAHQAAABsAAAAZAAAAFwAAABcAAAAVADZyJwBQtVkAWcehAE+zSwAA
+ AAsAAAAJAAAABwAAAAUAAAADAAAAA////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wEAAAADAAAABQAAAAcAAAAJAAAACwAAAA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcAAAAZAF3O/S2M
+ 7P9AoPj/FYv3/xWL9/8Vi/f/IZH3/0Cg+P9Dn/X/G3fd/QBczv8LaNb9P5/4/y+X+P8Siff/EYj3/xGH
+ 9v8Qh/b/D4b2/y2V9/8kgub/AFzN8wAHDiUAAAAhAAAAHwAAAB0ACRIdAEGRQwBRuHcAWMSpAFvM4wBc
+ zv8AXM7/AFzO/wBbzNcAAAALAAAACQAAAAcAAAAFAAAAA////wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAAAAAwAAAAUAAAAHAAAACQAAAAkAAAALAAAADQAAAA8AAAARAAAAEwAA
+ ABUAAAAXAAAAFwBdzvUriun/RaT5/xeN9/8Xjff/F433/xeN9/8Zjvf/M5v4/0mm+f84lvH/Pp32/zyf
+ +P8Wi/f/FIr3/xOK9/8Siff/EYj3/xCH9v8ij/f/N5Xy/wFdzv8AR6FlAEedXwBUuY8AWcjHAFzN9wBc
+ zv8CXs79DGva+xN24/8jhO3/Hn/q/wBczv8AS6ozAAAACwAAAAkAAAAHAAAABQAAAAP///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAAAADAAAABQAAAAcAAAAJAAAACwAA
+ AA0AAAAPAAAADwAAABEAAAATAAAAFQAAABcBXc7rKojo/0un+f8Zjvf/GY/3/xmP9/8Zj/f/GY/3/xmO
+ 9/8jk/f/O5/4/zad+P8cj/f/Foz3/xaM9/8Vi/f/FIr3/xOK9/8Siff/F4v2/z6e+P8NZNH/AFzO/wBc
+ zv8IZNP5FHTf/x6A6P8oi/H/LpL3/y2S9/8pj/f/KY/3/xJu2vsAW8y/AAAACwAAAAkAAAAHAAAABQAA
+ AAMAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAwAA
+ AAUAAAAFAAAABwAAAAkAAAALAAAADQAAAA8AAAAPAAAAEQAAABMAAAAVAV3N4SiF5v9Rq/r/G5D4/xuQ
+ +P8bkPj/G5D4/xuQ+P8bkPj/GpD4/xqQ9/8Zj/f/GY/3/xiO9/8Xjff/F433/xaM9/8Vi/f/FIr3/xKJ
+ 9/83m/j/NZTy/yyM7f84mPX/Opv4/zeZ+P8sk/f/IIz2/xSG9v8Jf/X/F4b2/ymL8f8CXc7/AFS4TwAA
+ AAkAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAAAADAAAABQAAAAcAAAAHAAAACQAAAAsAAAANAAAADQAAAA8AAAARAAAAEwFd
+ zNclg+X/WK76/xyS+P8dkvj/HZL4/x2S+P8dkvj/HJL4/xyR+P8ckfj/G5H4/xuQ+P8dkvj/I5j4/xmO
+ 9/8Xjff/Foz3/xWL9/8Uivf/GYz3/zKY+P8wl/f/JJD3/xeK9v8Ng/b/C4L2/wmB9v8IgPX/B3/1/yyS
+ 9/8ad+D/AFzN3QAAGgsAAAAHAAAABwAAAAUAAAAD////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQAAAAMAAAAFAAAABQAAAAcAAAAJAAAACwAA
+ AAsAAAANADVyHQBIoTkAXM7/IoDi/12x+v8fk/j/HpP4/x+U+P8flPj/H5T4/x6T+P8ek/j/HpP4/x2S
+ +P8elPj/Oaz7/z6v/P8wo/r/GY/3/xiO9/8Xjff/FYz3/xSK9/8Tiff/Eoj3/xCH9v8Phvb/DYT2/wyD
+ 9v8Kgvb/CYH2/xiI9v80k/T/BmHQ/QBYw2sAAAAHAAAABQAAAAUAAAAD////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBmzAUAYM8hAFnGPwBb
+ yV8AWsp9AFvMmwBczLkBXc7dAF3P9QBczv8AXM7/AFzO/ymG5f9fs/r/Ipb4/yCV+P8glfj/IJX4/yCV
+ +P8glfj/IJX4/x+U+P8flPj/M6X7/1G3/P+z4P7/Pq/8/yWb+f8Zj/f/GI73/xeN9/8WjPf/FIv3/xOJ
+ 9/8RiPf/EIf2/w6F9v8NhPb/C4P2/wqB9v8vlPf/JIHm/wBcz/MAOY4TAAAABQAAAAMAAAAD////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc
+ zv8AXM7/AFzO/wBczv8CXs/9DmnV+Rt12/sngOH/M4zn/z+V7P9KoPD/VKn1/2Cy+f9jtfr/Sqn5/yKW
+ +P8il/j/Ipf4/yKX+P8il/j/Ipf4/yKW+P8hlvj/LJ/6/z+v/P/K6f7//////4nO/f88rfz/H5T5/xqP
+ 9/8Yjvf/F433/xWM9/8Uivf/E4n3/xGI9v8Qhvb/DoX2/wyE9v8WiPb/PJr3/w5n1PsAWsuNAAAABQAA
+ AAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXc/JAFzO/ziP6v9lsff/Z7X6/2a1+v9ntfr/ZLT6/12x+v9Urfr/TKr5/0Sm
+ +f88o/n/M574/yOY+f8kmPn/JJj5/ySY+f8kmPn/JJj5/ySY+f8jmPn/J5r5/z2t/P+S0v3/////////
+ ///2+///Wbr8/zWn+/8bkPj/Go/3/xiO9/8Xjff/FYv3/xSK9/8Siff/EYf2/w+G9v8Nhfb/L5X3/zGM
+ 6/8AXc79AFi/If///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFXVBwBczrcFYtL7Z7D1/2m2+v80nfn/JJX4/x6T
+ +P8glPj/IZX4/yKW+P8jl/j/JJj5/ySZ+f8lmfn/Jpr5/yaa+f8mmvn/Jpr5/yaa+f8mmvn/Jpn5/ziq
+ /P9fvf3/+fz//////////////////9Xu/v9BsPz/K5/6/xuQ+P8Zj/f/GI73/xaM9/8Vi/f/E4r3/xKI
+ 9/8Qh/b/FYj2/0Of+P8Xcdr7AFzPq////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAZswLAF3PyQll
+ 0vtcrPb/YLL6/ySW+P8glfj/IZb4/yKX+P8jmPn/JJn5/yWZ+f8mmvn/J5v5/yeb+f8onPn/KJz5/yic
+ +f8onPn/KJv5/zKk+/9Dsfz/3PH+////////////////////////////oNf+/z2u/P8il/j/G5D4/xmP
+ 9/8Xjff/Foz3/xSL9/8Tiff/EYj2/y2V9/9AmPH/AV3O/wBbzTn///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBVzA8BXtDXDmnV+2Oy+P9es/r/JZj4/yKX+P8kmPn/JZn5/yaa+f8nm/n/KJz5/ymc
+ +f8pnfn/Kp35/yqd+f8qnfn/Kp35/yuf+f81p/v/ptn9//////////////////////////////////3+
+ //9pwf3/OKr8/x2R+P8akPj/GY73/xeN9/8Vi/f/FIr3/xKI9/88nfj/MIjn/wBczv8AXM+lAFrPJf//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAF3RFwFdz+ESbtb7arb4/12z+v8nmfn/JZn5/yaa
+ +f8om/n/KZz5/yqd+f8qnvn/K575/yuf+f8sn/n/LJ/5/yyf+f8qnvn/Y7j7//7/////////////////
+ ////////////////////////5fT+/0Wx+/8vovr/G5H4/xmP9/8Yjvf/Foz3/xSL9/8Tiff/JpP3/0yl
+ +P84kez/EmvW+wBdzv0AXM+fAGDPIf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAWssjAV3P6Rh1
+ 2/twu/r/XbP7/yea+f8onPn/KZ35/yqe+f8rn/n/LJ/6/y2g+v8toPr/LqH6/y6h+v8lmfn/MZz4/+j0
+ /v////////////////////////////////////////////////+y3f3/M6X6/yOX+f8akPj/GY73/xeN
+ 9/8Vi/f/E4r3/xKI9/8ejvf/PJz4/0uj+P81juz/D2rW+wBczvsAW86XAF7QG////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzC0BXM/xIHve/XS9+/9bs/r/KZ35/yqe+f8sn/n/LaD6/y6h+v8vofr/L6L6/y+i
+ +v8nmvr/FYv3/7PZ/P///////////////////////////////////////////////////////////2+9
+ +/8qnfn/HJL5/xmP9/8Yjvf/Foz3/xSK9/8Siff/EIf2/w+G9v8djPf/PJv4/0mh+P8xi+r/DWfU+wBc
+ z/kAXM2RAFnTF////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAF3MNwBdz/koguH9ecH7/1Wx+v8sn/r/LaD6/y6h
+ +v8vovr/MKP6/zGk+v8tofn/DYX3/2ey+f//////////////////////////////////////////////
+ ///////////////////v+P//OaH5/yGV+P8akPj/GI73/xaN9/8Vi/f/E4n3/xGI9v8Phvb/DYT2/wuD
+ 9v8civf/PJv3/0ef9/8viOn/C2bT+wBdzvcAXM6JAFnMFf///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAW85DAFzO/zuT
+ 6f99xPv/MqL6/y+h+v8wo/r/MaT6/zKk+v8zpfr/EIf2/yKL9v/y+P7/////////////////////////
+ /////////////////////////////////////////////8Lh/f8aj/f/G5D4/xmP9/8Xjff/FYv3/xOK
+ 9/8RiPf/EIb2/w6F9v8Mg/b/CoL2/wiA9f8bifb/Opn3/0Wd9v82i+n/CmTS+wBczv8AXM1t////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAF3PhQBczv9XqPL/esP8/y+h+v8wovr/MaT6/zKl+v80pvr/NKf6/wR89v8vkvf/Vab4/1Wm
+ +P9Vpvj/Vab4/5HF+////////////////////////////1qq+P9bq/n/XKz5/12t+f9ervn/II/3/xWM
+ 9/8Zj/f/F433/xaM9/8Uivf/Eoj3/xCH9v8Ohfb/DIT2/wqC9v8IgPb/GIj2/zqZ9/9In/j/PpHt/w9p
+ 1fsAXM7/AFzOjf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAFzPewBczv9Qoe7/gMX7/0ar+/8vovr/MaP6/zKl+v80pvr/Naf7/zao
+ +/8nm/n/E4r3/xKJ9/8Siff/EYn2/wZ+9f9aqPn///////////////////////////8jl/n/EIb3/w2E
+ 9v8NhPb/DYT2/w+H9v8aj/j/Go/3/xiO9/8WjPf/FIr3/xKJ9/8Qh/b/DoX2/wyE9v8di/f/QJz4/0+k
+ +P84j+z/EmvW+wBbzv8AXM6nAFnMKf///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvObQBczf9JnOz/g8b7/0ms+/8uofr/MKP6/zKk
+ +v8zpvr/Naf7/zeo+/84qvv/Oar7/zmq+/84qvv/N6n7/zao+/8Siff/Wqj5////////////////////
+ ////////Nqn7/yOY+f8kmPn/Ipb4/yCV+P8ek/j/HJH4/xqQ9/8Yjvf/Foz3/xSL9/8Siff/EIf2/yKP
+ 9/9FoPj/Vqj5/z2T7f8TbNb7AFvO/wBczqcAWcwp////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNYQBczv9Dl+v/hcf8/06u
+ +v8toPr/LqH6/zCj+v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo
+ +f///////////////////////////zmr+/8mmvn/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM
+ 9/8Ui/f/JpP4/0uk+P9crfn/Qpbt/xVu1/sAW87/AFzOpwBc0Sf///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFzNVwBd
+ z/09kuj/h8f8/1Kw+v8rnvn/LaD6/y+i+v8xo/r/M6X6/zSn+v82qPv/OKr7/zqs+/88rfv/PK77/zus
+ +/85q/v/N6n7/xOJ+P9aqPn///////////////////////////84qfv/JZn5/ySY+f8il/j/IJX4/x6T
+ +P8ckvj/GpD4/xiO9/8Wjff/N5z4/2Kw+v9Gmu7/Fm7X+wBdz/0AXM6nAFzRJ////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAFvNTQBczvs2jOb/iMf8/1ex+v8pnfn/K575/y2g+v8vovr/MaP6/zOl+v80p/r/Nqj7/ziq
+ +/86rPv/PK37/zyu+/87rPv/Oav7/zep+/8Tifj/Wqj5////////////////////////////NKX6/yOY
+ +P8kmPn/Ipf4/yCV+P8ek/j/HJL4/xqQ+P8Yjvf/Fo33/1ar+f86j+n/AFzO/wBczqcAXNEn////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8BAF3NQwBdz/kvh+P/h8b8/12z+/8nm/n/KZz5/yue+f8toPr/L6H6/zCj
+ +v8ypfr/NKb6/zao+/84qfv/Oav7/zqs+/87rPv/Oqv7/ziq+/83qPv/E4n4/1qo+f//////////////
+ /////////////y+i+v8jmPf/JJj5/yKW+P8glfj/HpP4/xyR+P8akPj/GI73/xaM9/9Kpvn/UqDv/wBc
+ zv8AXswf////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFvNOQBdzvcoguD9icb7/4rI+/9Xsfr/S6z6/0Cn
+ +v81o/n/LZ/6/y6h+v8wo/r/MqT6/zOm+v81p/v/N6j7/ziq+/85qvv/Oar7/ziq+/83qfv/Nqj7/xKJ
+ 9/9aqPn///////////////////////////8qnfn/IZf4/ySY+f8ilvj/IJX4/x6T+P8ckfj/GpD3/xiO
+ 9/8WjPf/J5X4/2iz+f8Vbdb7AF3Oh////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFnMFQBczv8AXM7/P5Hn/2Sq
+ 7/9osPP/eLz4/4jH+/+Myvz/jcv8/43L/P+Cxvz/dsL8/2u9+/9bt/v/Nqf6/zWn+/82qPv/N6n7/zep
+ +/83qPv/Nqj7/zSn+v8SiPf/Wqj5////////////////////////////Jpr5/yCV+P8jmPn/IZb4/x+U
+ +P8ek/j/HJH4/xqP9/8Yjvf/Foz3/xSK9/9ZrPn/Q5Pp/wBdz+8AbdsH////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBt
+ 2wcAW86XAFzOtwFdz9UBXc7zAFzO/wBczv8AXM7/D2nT+SR62/s3iuP/SZrq/1uo7/9ttvT/i8v8/2u+
+ +/80pvr/Naf6/zWn+/81p/v/Naf7/zSm+v8zpfr/Eon3/zyZ9/+q0vz/qtL8/6rS/P+q0vz/qtL8/x+V
+ +f8ek/j/I5f4/yGV+P8flPj/HZL4/xuR+P8Zj/f/F433/xaM9/8Uivf/NJn4/2ex9/8JYtD/AFzOX///
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQBVzA8AXtAxAFvNUQBdzXEAW86RAF7PtQFe
+ 0NkBXM73AFzO/0+k7/+DyPz/MqX6/zOl+v8zpfr/M6b6/zOl+v8ypfr/MaT6/yGW+f8CevX/AHn1/wB5
+ 9f8AefX/AHn1/wB59f8Jgvb/IZX4/yKX+P8glfj/HpP4/x2S+P8bkPj/GY/3/xeN9/8Vi/f/E4r3/xSJ
+ 9/9lsvn/M4bj/QBdzs3///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBdzv1UpO7/fcX8/zCj+v8xpPr/MaT6/zGk+v8xpPr/MaP6/zCj
+ +v8vovr/LqH6/yyg+v8rnvn/KZ35/yic+f8mmvn/JZn5/yOX+P8hlvj/H5T4/x6T+P8ckfj/GpD4/xiO
+ 9/8Wjff/FYv3/xOJ9/8RiPb/Q6D4/2Co8/8CXc7/AF3ONf///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////AQCA/wMAXM7/XKrx/3fC/P8vovr/L6L6/y+i
+ +v8vovr/L6L6/y+i+v8uofr/LaD6/yyf+v8rnvn/Kp35/yic+f8nm/n/JZn5/ySY+f8il/j/IJX4/zig
+ +f9fsvr/Wq/6/0Kj+P8ql/j/F4z3/xSK9/8Siff/EIf2/xuM9v9ttfr/JXfY+wBczqH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAVdUTAFzO/2Ov
+ 8/9wvvz/LaD6/y2g+v8uofr/LqH6/y2h+v8toPr/LKD6/yyf+f8rnvn/Kp35/yic+f8nm/n/Jpr5/ySY
+ +f8jl/j/IZb4/ySX+P98wPv/Xqnx/12p8v92uvj/er76/3O5+v9arfn/QaD5/ymU9/8Sh/b/Uqf5/1Gd
+ 7v8AXM/5AFnMFf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8BAF3RIQBczv9rtPX/abv7/yue+f8rn/n/LJ/5/yyf+f8sn/n/LqH5/161+v9+w/v/arv7/yye
+ +f8nm/n/Jpr5/ySZ+f8jl/j/IZb4/yCV+P9BpPn/f8D5/whh0P8AXM7/AV3P/xlw2fk1iub/UaDv/2my
+ 9/91ufr/cbf6/3G3+v9vtPn/EmrU+wBcz3X///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////AQBe0DEAXM7/crr3/2G2+/8pnfn/Kp35/yqd+f8qnfn/Qqj6/37E
+ +/+Fxfr/TJvq/4LD+v9ouPv/JZn5/ySY+f8jl/n/Ipb4/yCV+P8flPj/YrP6/2Go7v8AXc73AFjKHQBb
+ zVEAXM+PAF7PzwBdzv0AXM7/DmjV+SqB4v9Fluz/cLP2/0GQ5v8AXc/jAID/A////wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXM9BAFzO/3i++f9as/r/J5v5/yic
+ +f8un/n/ZLj7/4zK/P9kq+//D2jS+wBczv8shOL9isj8/02r+v8jl/j/Ipb4/yCV+P8flPj/IZT4/4HC
+ +/85h+D9AFzOrf///wH///8B////Af///wEAXdELAF3NQwBbzn8AXc+/AFzO9wBczv8EX8//AFzO/wBd
+ z0v///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAF7PTwBc
+ zv9/w/v/Uq76/yaa+f9Fqfr/gcT8/3/A+P8yhOD9AF3P/QBdz48AXM9RAF3P/U6e7f+Gxvv/NJ/5/yCV
+ +P8flPj/HpP4/zuh+f+Ewvr/DWXS/QBczln///8B////Af///wH///8B////Af///wH///8B////AQBV
+ qgMAWs0zAFzPbwBczssAXM4v////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbz18BXc/9hcX7/1Sv+v9qufv/isj7/1ei7f8JY9H9AV3P1wBbzzX///8B////AQBb
+ zoMCXs/9bLT1/3i/+/8kl/j/HZP4/xyS+P9csPr/aKzw/wBczvsAVcwP////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAXc5vBGHS+YnH+/+Jx/v/d7n1/yZ52vsAXc/5AF3PeQBA
+ vwX///8B////Af///wEAVaoDAFzPxRBq1ft9wPr/YbP6/xyR+P8ckPj/fL/6/z2N4/0AXc+7////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAFvOfw1q1fmHxfr/V5/p/wVf
+ 0P8BXc7DAFrPJf///wH///8B////Af///wH///8B////AQBYzhsBXs/tKYLh/YXE+/9Fpfn/M5z4/4PC
+ +v8TadP9AF3NZ////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AQBc
+ zo0HYM//HHHX+wBdz/MAW85j////Af///wH///8B////Af///wH///8B////Af///wH///8BAF3NRwBb
+ zv9Km+z/gcL7/2m1+v9usfP/AFvO/wBgyhn///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM25AFzO/wBdz6sAWdMX////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wEAXM2FAl7P/Wex9f+Dwvv/RpPm/wBdz8v///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFnMKQBdzUP///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAFWqAwBdz8cQa9X7gsD6/xlu1PsAXM91////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wEAXtAbAF3P7x1x
+ 2P8AXM7/AFzNJf///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////AQBbzkkAXM7/AFzO/////wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8BAF3PjwBczT3///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af//
+ /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+
+
+ 2, 2, 2, 2
+
+
+ CenterParent
+
+
+ {0} {1} ist verfügbar!
+
+
+ UpdateForm
+
+
+ System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file