finish mod package creator

This commit is contained in:
Bitl 2022-07-29 15:07:45 -07:00
parent 977783e220
commit cdc24c65a5
10 changed files with 2019 additions and 128 deletions

View File

@ -6,39 +6,70 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
#endregion
#region Mod Manager
public class ModManager
{
private readonly OpenFileDialog openFileDialog1;
public enum ModMode
{
ModInstallation,
ModCreation
}
private ModMode globalMode;
private OpenFileDialog openFileDialog1;
private SaveFileDialog saveFileDialog1;
private string installOutcome = "";
private int fileListDisplay = 0;
private RichTextBox consoleBox;
private CancellationTokenSource tokenSource;
private int pastPercentage = 0;
//extracting mode
public ModManager(RichTextBox box)
public ModManager(ModMode mode)
{
Application.ApplicationExit += new EventHandler(OnApplicationExit);
consoleBox = box;
openFileDialog1 = new OpenFileDialog()
{
FileName = "Select an addon .zip file",
Filter = "Compressed zip files (*.zip)|*.zip",
Title = "Open addon .zip"
};
Init(mode);
}
public void setInstallOutcome(string text)
public ModManager(ModMode mode, RichTextBox box)
{
consoleBox = box;
Init(mode);
}
public void Init(ModMode mode)
{
Application.ApplicationExit += new EventHandler(OnApplicationExit);
globalMode = mode;
switch (globalMode)
{
case ModMode.ModCreation:
saveFileDialog1 = new SaveFileDialog()
{
FileName = "Specify the place where you will save your .zip file",
Filter = "Compressed zip files (*.zip)|*.zip",
Title = "Save mod .zip"
};
break;
case ModMode.ModInstallation:
default:
openFileDialog1 = new OpenFileDialog()
{
FileName = "Select a mod .zip file",
Filter = "Compressed zip files (*.zip)|*.zip",
Title = "Open mod .zip"
};
break;
}
}
public void setOutcome(string text)
{
installOutcome = text;
}
public string getInstallOutcome()
public string getOutcome()
{
return installOutcome;
}
@ -48,11 +79,14 @@ public class ModManager
fileListDisplay = number;
}
public async Task LoadAddon()
public async Task LoadMod()
{
if (globalMode == ModMode.ModCreation)
return;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
MessageBox.Show("Your addon is loading. You will recieve a notification when it is installed. Please keep the launcher open. You can see the installation progress in the Console.", "Novetus - Addon Loading");
MessageBox.Show("Your mod is loading. You will recieve a notification when it is installed. Please keep the launcher open. You can see the installation progress in the Console.", "Novetus - Mod Loading");
try
{
@ -93,17 +127,17 @@ public class ModManager
if (filecount > fileListDisplay)
{
installOutcome = "Addon " + openFileDialog1.SafeFileName + " installed! " + filecount + " files copied!" + Environment.NewLine + "Files added/modified:" + Environment.NewLine + Environment.NewLine + filelistcutdown + Environment.NewLine + "and " + (filecount - fileListDisplay) + " more files!";
installOutcome = "Mod " + openFileDialog1.SafeFileName + " installed! " + filecount + " files copied!" + Environment.NewLine + "Files added/modified:" + Environment.NewLine + Environment.NewLine + filelistcutdown + Environment.NewLine + "and " + (filecount - fileListDisplay) + " more files!";
}
else
{
installOutcome = "Addon " + openFileDialog1.SafeFileName + " installed! " + filecount + " files copied!" + Environment.NewLine + "Files added/modified:" + Environment.NewLine + Environment.NewLine + filelist;
installOutcome = "Mod " + openFileDialog1.SafeFileName + " installed! " + filecount + " files copied!" + Environment.NewLine + "Files added/modified:" + Environment.NewLine + Environment.NewLine + filelist;
}
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
installOutcome = "Error when installing addon: " + ex.Message;
installOutcome = "Error when installing mod: " + ex.Message;
}
}
}
@ -111,6 +145,9 @@ public class ModManager
//https://stackoverflow.com/questions/38948801/dotnetzip-display-progress-of-extraction
void ExtractProgress(object sender, ExtractProgressEventArgs e)
{
if (globalMode == ModMode.ModCreation)
return;
if (e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten)
{
double percentage = Math.Round(e.BytesTransferred / (0.01 * e.TotalBytesToTransfer), 2);
@ -136,5 +173,69 @@ public class ModManager
{
tokenSource.Cancel();
}
public async Task CreateModPackage(string[] filesToPackage, string modName)
{
if (globalMode == ModMode.ModInstallation)
return;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
string outputSavePath = Path.GetDirectoryName(saveFileDialog1.FileName) + @"\" + modName;
int filecount = 0;
foreach (string file in filesToPackage)
{
string originalPath = GlobalPaths.RootPath + file;
string destPath = outputSavePath + file;
FileInfo fileInfo = new FileInfo(destPath);
if (!Directory.Exists(fileInfo.DirectoryName))
{
Directory.CreateDirectory(fileInfo.DirectoryName);
}
GlobalFuncs.FixedFileMove(originalPath, destPath, true);
++filecount;
}
ZipFile zip = new ZipFile(outputSavePath + ".zip");
DirectoryInfo dinfo = new DirectoryInfo(outputSavePath);
FileInfo[] Files = dinfo.GetFiles("*.*", SearchOption.AllDirectories);
foreach (FileInfo file in Files)
{
try
{
zip.AddDirectory(outputSavePath, "");
}
catch (ArgumentException)
{
continue;
}
}
zip.ParallelDeflateThreshold = -1;
tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
await Task.Factory.StartNew(() => zip.Save(), token);
zip.Dispose();
Directory.Delete(outputSavePath, true);
installOutcome = filecount + " files have been successfully moved and compressed into " + outputSavePath + ".zip!";
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
installOutcome = "Error when creating mod: " + ex.Message;
}
}
}
}
#endregion

View File

@ -1101,35 +1101,35 @@ namespace NovetusLauncher
public async void InstallAddon()
{
ModManager addon = new ModManager(ConsoleBox);
ModManager addon = new ModManager(ModManager.ModMode.ModInstallation, ConsoleBox);
addon.setFileListDisplay(10);
try
{
await addon.LoadAddon();
if (!string.IsNullOrWhiteSpace(addon.getInstallOutcome()))
await addon.LoadMod();
if (!string.IsNullOrWhiteSpace(addon.getOutcome()))
{
GlobalFuncs.ConsolePrint("AddonLoader - " + addon.getInstallOutcome(), 3, ConsoleBox);
GlobalFuncs.ConsolePrint("ModManager - " + addon.getOutcome(), 3, ConsoleBox);
}
}
catch (Exception ex)
{
GlobalFuncs.LogExceptions(ex);
if (!string.IsNullOrWhiteSpace(addon.getInstallOutcome()))
if (!string.IsNullOrWhiteSpace(addon.getOutcome()))
{
GlobalFuncs.ConsolePrint("AddonLoader - " + addon.getInstallOutcome(), 2, ConsoleBox);
GlobalFuncs.ConsolePrint("ModManager - " + addon.getOutcome(), 2, ConsoleBox);
}
}
if (!string.IsNullOrWhiteSpace(addon.getInstallOutcome()))
if (!string.IsNullOrWhiteSpace(addon.getOutcome()))
{
MessageBoxIcon boxicon = MessageBoxIcon.Information;
if (addon.getInstallOutcome().Contains("Error"))
if (addon.getOutcome().Contains("Error"))
{
boxicon = MessageBoxIcon.Error;
}
MessageBox.Show(addon.getInstallOutcome(), "Novetus - Addon Installed", MessageBoxButtons.OK, boxicon);
MessageBox.Show(addon.getOutcome(), "Novetus - Mod Installed", MessageBoxButtons.OK, boxicon);
}
}

View File

@ -1477,9 +1477,9 @@ partial class ItemCreationSDK
//
// CreateItemButton
//
this.CreateItemButton.Location = new System.Drawing.Point(12, 382);
this.CreateItemButton.Location = new System.Drawing.Point(11, 382);
this.CreateItemButton.Name = "CreateItemButton";
this.CreateItemButton.Size = new System.Drawing.Size(118, 23);
this.CreateItemButton.Size = new System.Drawing.Size(189, 23);
this.CreateItemButton.TabIndex = 6;
this.CreateItemButton.Text = "Create and Test Item";
this.CreateItemButton.UseVisualStyleBackColor = true;
@ -1544,11 +1544,11 @@ partial class ItemCreationSDK
//
// SettingsButton
//
this.SettingsButton.Location = new System.Drawing.Point(243, 382);
this.SettingsButton.Location = new System.Drawing.Point(207, 382);
this.SettingsButton.Name = "SettingsButton";
this.SettingsButton.Size = new System.Drawing.Size(57, 23);
this.SettingsButton.Size = new System.Drawing.Size(93, 23);
this.SettingsButton.TabIndex = 15;
this.SettingsButton.Text = "Settings";
this.SettingsButton.Text = "Item Settings";
this.SettingsButton.UseVisualStyleBackColor = true;
this.SettingsButton.Click += new System.EventHandler(this.SettingsButton_Click);
//

View File

@ -26,25 +26,29 @@
/// </summary>
private void InitializeComponent()
{
this.AddonFilesListing = new System.Windows.Forms.ListBox();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ModCreator));
this.ModFilesListing = new System.Windows.Forms.ListBox();
this.SavePackageButton = new System.Windows.Forms.Button();
this.FileListingLabel = new System.Windows.Forms.Label();
this.ModNameBox = new System.Windows.Forms.TextBox();
this.ModNameLabel = new System.Windows.Forms.Label();
this.RefreshFileListButton = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// AddonFilesListing
// ModFilesListing
//
this.AddonFilesListing.FormattingEnabled = true;
this.AddonFilesListing.Location = new System.Drawing.Point(10, 25);
this.AddonFilesListing.Name = "AddonFilesListing";
this.AddonFilesListing.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
this.AddonFilesListing.Size = new System.Drawing.Size(407, 303);
this.AddonFilesListing.TabIndex = 0;
this.ModFilesListing.FormattingEnabled = true;
this.ModFilesListing.Location = new System.Drawing.Point(10, 56);
this.ModFilesListing.Name = "ModFilesListing";
this.ModFilesListing.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended;
this.ModFilesListing.Size = new System.Drawing.Size(407, 316);
this.ModFilesListing.TabIndex = 0;
//
// SavePackageButton
//
this.SavePackageButton.Location = new System.Drawing.Point(10, 334);
this.SavePackageButton.Location = new System.Drawing.Point(10, 378);
this.SavePackageButton.Name = "SavePackageButton";
this.SavePackageButton.Size = new System.Drawing.Size(407, 23);
this.SavePackageButton.Size = new System.Drawing.Size(308, 23);
this.SavePackageButton.TabIndex = 4;
this.SavePackageButton.Text = "Save Package";
this.SavePackageButton.UseVisualStyleBackColor = true;
@ -53,23 +57,53 @@
// FileListingLabel
//
this.FileListingLabel.AutoSize = true;
this.FileListingLabel.Location = new System.Drawing.Point(6, 7);
this.FileListingLabel.Location = new System.Drawing.Point(11, 35);
this.FileListingLabel.Name = "FileListingLabel";
this.FileListingLabel.Size = new System.Drawing.Size(416, 13);
this.FileListingLabel.Size = new System.Drawing.Size(406, 13);
this.FileListingLabel.TabIndex = 5;
this.FileListingLabel.Text = "Select which files you wish to include in your addon, then click \"Save Package\" b" +
"elow";
this.FileListingLabel.Text = "Select which files you wish to include in your mod, then click \"Save Package\" bel" +
"ow";
//
// ModNameBox
//
this.ModNameBox.Location = new System.Drawing.Point(80, 9);
this.ModNameBox.Name = "ModNameBox";
this.ModNameBox.Size = new System.Drawing.Size(337, 20);
this.ModNameBox.TabIndex = 6;
//
// ModNameLabel
//
this.ModNameLabel.AutoSize = true;
this.ModNameLabel.Location = new System.Drawing.Point(12, 12);
this.ModNameLabel.Name = "ModNameLabel";
this.ModNameLabel.Size = new System.Drawing.Size(62, 13);
this.ModNameLabel.TabIndex = 7;
this.ModNameLabel.Text = "Mod Name:";
//
// RefreshFileListButton
//
this.RefreshFileListButton.Location = new System.Drawing.Point(324, 378);
this.RefreshFileListButton.Name = "RefreshFileListButton";
this.RefreshFileListButton.Size = new System.Drawing.Size(93, 23);
this.RefreshFileListButton.TabIndex = 8;
this.RefreshFileListButton.Text = "Refresh File List";
this.RefreshFileListButton.UseVisualStyleBackColor = true;
this.RefreshFileListButton.Click += new System.EventHandler(this.RefreshFileListButton_Click);
//
// ModCreator
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.ClientSize = new System.Drawing.Size(429, 364);
this.ClientSize = new System.Drawing.Size(429, 410);
this.Controls.Add(this.RefreshFileListButton);
this.Controls.Add(this.ModNameLabel);
this.Controls.Add(this.ModNameBox);
this.Controls.Add(this.FileListingLabel);
this.Controls.Add(this.SavePackageButton);
this.Controls.Add(this.AddonFilesListing);
this.Controls.Add(this.ModFilesListing);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ModCreator";
this.Text = "Mod Package Creator";
this.Load += new System.EventHandler(this.ModCreator_Load);
@ -80,7 +114,10 @@
#endregion
private System.Windows.Forms.ListBox AddonFilesListing;
private System.Windows.Forms.ListBox ModFilesListing;
private System.Windows.Forms.Button SavePackageButton;
private System.Windows.Forms.Label FileListingLabel;
private System.Windows.Forms.TextBox ModNameBox;
private System.Windows.Forms.Label ModNameLabel;
private System.Windows.Forms.Button RefreshFileListButton;
}

View File

@ -22,9 +22,48 @@ public partial class ModCreator : Form
ListFiles();
}
private void SavePackageButton_Click(object sender, EventArgs e)
private async void SavePackageButton_Click(object sender, EventArgs e)
{
AddonFilesListing.Items.Clear();
if (string.IsNullOrWhiteSpace(ModNameBox.Text))
{
MessageBox.Show("Please specify a mod name.", "Mod Creator - No Mod Name", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (ModFilesListing.SelectedItems.Count <= 0)
{
MessageBox.Show("Please select the files you wish to include in your mod.", "Mod Creator - No Mod Files", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
string[] selectedFileList = ModFilesListing.SelectedItems.OfType<string>().ToArray();
ModManager manager = new ModManager(ModManager.ModMode.ModCreation);
await manager.CreateModPackage(selectedFileList, ModNameBox.Text);
if (!string.IsNullOrWhiteSpace(manager.getOutcome()))
{
MessageBoxIcon boxicon = MessageBoxIcon.Information;
if (manager.getOutcome().Contains("Error"))
{
boxicon = MessageBoxIcon.Error;
}
MessageBox.Show(manager.getOutcome(), "Mod Creator - Mod Created", MessageBoxButtons.OK, boxicon);
}
RefreshFiles();
}
private void RefreshFileListButton_Click(object sender, EventArgs e)
{
RefreshFiles();
}
private void RefreshFiles()
{
ModFilesListing.Items.Clear();
ListFiles();
}
@ -38,7 +77,7 @@ public partial class ModCreator : Form
else
{
MessageBox.Show("The initial file list has not been generated. Please launch the Novetus Launcher to initalize it.\n\nNote: Use a fresh Novetus install for this process. Do NOT use a client with mods (Addon scripts, items, maps, etc.) already created, as they won't show up in the file listing. After initalizing a fresh copy of Novetus, you are free to build Mod Packages for it.",
"Mod Creator - Initial file list not found.", MessageBoxButtons.OK, MessageBoxIcon.Error);
"Mod Creator - Initial file list not found", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
}
@ -46,15 +85,15 @@ public partial class ModCreator : Form
private void FillFileListing()
{
string fileLoadString = "Loading files...";
AddonFilesListing.Items.Add(fileLoadString);
ModFilesListing.Items.Add(fileLoadString);
string[] files = GetUnlistedFiles();
foreach (string file in files)
{
AddonFilesListing.Items.Add(file);
ModFilesListing.Items.Add(file);
}
AddonFilesListing.Items.Remove(fileLoadString);
ModFilesListing.Items.Remove(fileLoadString);
}
private string[] GetUnlistedFiles()
@ -67,7 +106,7 @@ public partial class ModCreator : Form
List<string> newArray = new List<string>();
DirectoryInfo dinfo = new DirectoryInfo(GlobalPaths.BasePath);
DirectoryInfo dinfo = new DirectoryInfo(GlobalPaths.RootPath);
FileInfo[] Files = dinfo.GetFiles("*.*", SearchOption.AllDirectories);
foreach (FileInfo file in Files)
{
@ -77,7 +116,8 @@ public partial class ModCreator : Form
!fileListToIgnore.Contains(directory, StringComparer.InvariantCultureIgnoreCase) &&
!initalFileListLines.Contains(file.FullName, StringComparer.InvariantCultureIgnoreCase))
{
newArray.Add(file.FullName);
string fixedFileName = file.FullName.Replace(GlobalPaths.RootPath, "");
newArray.Add(fixedFileName);
}
else
{

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@
System.Windows.Forms.ListViewItem listViewItem5 = new System.Windows.Forms.ListViewItem(new string[] {
"Item SDK"}, "ItemCreationSDK.png", System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("Microsoft Sans Serif", 9.75F));
System.Windows.Forms.ListViewItem listViewItem6 = new System.Windows.Forms.ListViewItem(new string[] {
"Mod Package Creator"}, -1, System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("Microsoft Sans Serif", 9.75F));
"Mod Package Creator"}, "ModCreator.png", System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("Microsoft Sans Serif", 9.75F));
System.Windows.Forms.ListViewItem listViewItem7 = new System.Windows.Forms.ListViewItem(new string[] {
"ClientScript Documentation"}, "ClientScriptTester.png", System.Drawing.Color.Empty, System.Drawing.Color.Empty, new System.Drawing.Font("Microsoft Sans Serif", 9.75F));
System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem(new string[] {
@ -64,7 +64,9 @@
//
// label1
//
this.label1.Location = new System.Drawing.Point(12, 329);
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.label1.Location = new System.Drawing.Point(12, 365);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(414, 16);
this.label1.TabIndex = 12;
@ -73,6 +75,8 @@
//
// pictureBox2
//
this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox2.BackgroundImage = global::NovetusLauncher.Properties.Resources.NOVETUS_small;
this.pictureBox2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.pictureBox2.Location = new System.Drawing.Point(12, 12);
@ -83,6 +87,9 @@
//
// listView1
//
this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1});
this.listView1.HideSelection = false;
@ -102,7 +109,7 @@
listViewItem13});
this.listView1.Location = new System.Drawing.Point(12, 102);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(414, 224);
this.listView1.Size = new System.Drawing.Size(414, 260);
this.listView1.SmallImageList = this.imageList1;
this.listView1.TabIndex = 15;
this.listView1.UseCompatibleStateImageBehavior = false;
@ -130,13 +137,14 @@
this.imageList1.Images.SetKeyName(9, "XMLContentEditor.png");
this.imageList1.Images.SetKeyName(10, "MeshConverter.png");
this.imageList1.Images.SetKeyName(11, "AssetDownloader.png");
this.imageList1.Images.SetKeyName(12, "ModCreator.png");
//
// NovetusSDK
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.ClientSize = new System.Drawing.Size(438, 352);
this.ClientSize = new System.Drawing.Size(438, 390);
this.Controls.Add(this.listView1);
this.Controls.Add(this.label1);
this.Controls.Add(this.pictureBox2);

View File

@ -124,8 +124,8 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAk
FQAAAk1TRnQBSQFMAgEBDAEAAUgBAAFIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACw
FgAAAk1TRnQBSQFMAgEBDQEAAVABAAFQAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAAUADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -153,69 +153,75 @@
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8ALQAB/wGY
GgAEswGtAccBAAWtAbwEtQq0AbwFAANtAkkBbQwAAnILAAKsArMCxwEAAscCrQHHAbQBvAzwAbwBtAMA
BW0CcgNJAewB8wcAAXICTwFyDAABrQG0AawBxwIAAccCrQHHAbQF8gHwAfIF/wH0AfABkQIAAW0B/QFt
Af0BTwFyBZgCcgHzBAAB/wJyApcBTwFyAf8KAAGsAa0BswGtAawBxwGtAbQBrQHHAbQB8gO1AvAB8gb/
AfEBtAEABm0BUAJyAU8BSQFyAZgBcgHvBAABmAFQAXICeAFQAUkB7QsAAawDtAGzArQBrQHHAbQB8wMJ
AfIB8AG8B/EBtAEAAW0B/QFtAv0BbQH9AesBTwL9A0kBcgUAAfQBUAGYAXgBSQYAAbsBCQG7AbQBAAHH
AbQBCQK0AawBAAGsAbQBrQEAAbQF8wHyCPEBtAFtAf0BbQL9AW0D/QHrAW0C/QFtAf0BbQYAAU8CmAFP
BgABrQG0AQkBrQIAAccCtAKzAqwBtAGtAQABtAHzBPQB8gHzBvQB8gG0AW0B/QFtAv0BbQT9AW0B6wH9
AW0B/QFtBgABUAKYAU8GAAKtAQkBswKtAccBCQG0Aa0BtAGzAawBtAGtAQABtAHzAwkB8gHwAfIG/wHy
AbQFbQOXAXICbQJQA20GAAFyApgBTwgAAbMECQEZAbQBxwGzAbQBswG0Aa0BrAG0AfQBCQK1AfEC8Afz
AbQBbQH9AW0C/QFyAZgBCAF4AnIClwFQAf0BbQYAAXICmAFQCAABrQHbAQkCrQEJAbMCrQGzAdsB1QGt
AawBtAX0AfEG8AHxAfMBtAFtAf0BbQL9AesB7QGYAggDmAGXAXIBbQYAAZcCmAFQCQABswEJAq0BugGz
Aa0FswGtAbQB8QwZAd0BtAEAAW0B/QFtAv0B6wHtA5cBeAGXAewBbQcAAZcCmAFyCQACswEJAbMBugGz
Aa0GABC0AQAKbQJyAm0HAAGXApgBlwoAAbMB2wIZAbMCrQUAAbsNCQG7AbUCAAFtAf0BbQH9AW0C/QFt
Af0BcgH9AW0IAAGXApgBlwkAAbMBtAHbAgkBugG0Aa0FAAHxAQkBuwe1BLQBuwHyAwAEbQL9BG0JAASX
KwAGbRkAAfIB/wIAAfIB8xkAAf8B9AG8AW8CRgFvAgcB8AkAAfMBvAHwAvEB8gHxAfMHAAHvAgABFAFt
GAAB/wEaAUYCIAHpASABRgFvAeMBkwH/CAABbAHwA/MBGQEJAfEGAAFDAesCAAHtAQ4IAAH/AfQB8gHx
AfIB9AL/BgAC/wGTAiABRgFvARYCvQH/AfQBRgGTAf8HAAFDAbUECQEZAfIGAAHsAQ8CAAHwAQAB/wYA
AfQB7AFtAewDFQEUAesBBwH0Af8DAAHyAm8BFgG3Ab0G/wHjASABGgIAARoCkwFFAQABBwG1BRkB7AUA
AQcB7AEAAQcBvAHvAQABkgG8AQcB/wMAAe0EEAIRA0MBEQHsAfMB/wEAAb0BFgH0Cf8BlAEgAUYB9AEA
ARoC9AFFAQABGgG1BRkBtQHyBAABDwkAAfQDAAHsAQ4BFAESBQ8BEAEVARMBFAG8AQABGgHjAfQD/wH0
Ab0BlAG9Av8BvQHpASABBwEAARoC9AFFAQABGgG8BRkBCQFmAfIDAAL/AQ4B7AL/AesBEQL/BAAB7wET
AW4BRQTpAR8BAQFEAREB7AHvAQABbwFHAb0C/wG9ARcCRgHjAv8B9AFGAR8BbwEAARoC9AFFAQABkwHw
BBkB9AEJAbsBBwUAAeoBEwIAAe8HAAH/AZICbwFFBUQB6QFFAbwB/wEAAUYBRwGUAv8BvQHpAQEBHwEX
Ab0C/wFvAR8BRgEAARoC9AFFAfMBbwHwBfQB8wG7AQcFAAGSAwAB8QEAAfQHAAHsAesCQwIRAhABDgEH
AwACRgEWAv8BvQFGAgEBRgG9Av8BlAEgAUYBAAEaAvQCvQH0AQcB7AKuAmwBZgHsBAACbQEUAQAB6wJt
AQAB6wFtAfQFAAHsAesDQwIRARABDwHvAwABbwEgARcB9AL/AW8CRgHjAb0C/wG9AUYBbwEAARoC9AFv
AUUBkwH0ARoBRQkAARUBFAETAQABQwEVARMBAAFDARUB9AUAAe0B7AHrA0MCEQEQAfcDAAEHASABRgG9
Av8CvQHzBP8B9AFGAQcBAAEaAvQBRQEAAQcBGgH0Ab0BBwwAAZICAAFtARUGAAH/Ae0B7AHtARQBFQJD
AREBEAHtAwAB9AFGAUcBlAn/Ab0B4wEaAQABGgL0AUUBAAHzAZMB9AEbAQcLAAFtARQCAAHvBwAB/wHs
ARMCEQQQAREB6wQAAbwBRgEWBf8B8wG9AZQB4wEXAZQB9AEAARoC9AFFAQcBkwL0AZMB8wsAAe8DAAHy
AQAB8wYAAe8C7QXsARMBBwQAAf8BkwEXAb0B8wG9AZQB4wJGAiABkwH/AgABGgLzAr0BGgG9AW8BBwwA
AfIB6wH0AQAB/wHsAfAHAAH/AfMD8gHzAfQB/wYAAf8BlAHjARcBRwQgAUYBvAH/AwAB8wYHKwAB9AEb
AZMBbwJGAW8BkwH0Af8oAAHzAm8BkwGRAc8CrgHwAgAB/wG8Ae8BtQG0AZEFiwKRAfQnAAF0AZMBmgF0
Ae0BuwK0AYsBkQHzAfEBtAG7AQkB8AHxAfMB9AL/ARkB9AG0AfAUAAHzAgcB9AMAAf8B8gEHAbwB/wYA
Af8BdAGaARoBmgF0ARwEtAGLAbwBtQj/AbUBGQG1AbwCABBLAgAB8AJpAfMDAAHzA40B/wMAAf8B8QJy
AXMBdAIaAZoBbwS0Ac8B8gGLCbQBGQEJAQcCAAFLAXQEUgEbAnkBGgJSAkwBUgFLAgAB8AJpAfMB/wEA
AfQB9wFuAm8B/wIAAfQB7AFyApgBcgHtAZMBGgF0AZMB7AKRAbQBzwH/AbsBtQH0AwkEGQH0AQkBtQIA
AUwBdAFSC0sBTAFLAv8BuwK0AbsCCQG1AewBbgFvAWkB/wIAAXIEmAFyAYsBBwKTAfABBwL3AewBrgEA
AfQBtAH/CBkB8QG0AgABTAF0AUsKeAFLAVIBSwH/AdoBtAFuAUwB8wH/AQcBbgGRArQBbgH/AgABcgII
AQcBmAFyAewBbwEXAe0BvAHwAbwB8AEHAewBAAH/AbQB/wgZAfMBtAIAAVIBdAFMBngBVwNWAUsBUgFL
Af8B2wG1AkwBGwHwA28BkwFvAbQBCQH/AQABcgIIAZgBHAFvARcB4wGUAW8B7wHwAe0B7AEHAewBAAH/
AbMB/wgZAf8BswH/AQABUgF0AUwBlwFVAZcCVgF3AZ0BswLUAUsBUgFLAQAB/wHvAUwBRgEHAW8BaQFv
AfQB7wJvAQkB3AEAAXIBCAGYAXIBbwHjA5QBbwHvAfIB7QFuAQcBvAIAAbQB/wgZAf8BtAH/AQABUgF0
AVIClwJVAboF2wFLAVIBSwIAAfACRgFvAmkBvAH/Ae8CbgLcAQABcgKYAXIBFwG9A5QBbwGSAfIB8AFz
AfQDAAG0AfMIGQH/AbQB/wEAAVIBdAFSAZcCVQTbAbsBmAF6AUsBUgFLAgAB8AFGAkwBbwEHAfMBGQHt
AW4BbwH0Af8BAAHvAXgCcgEXAb0BlAPjAW8CkgFvAfQDAAG7ARkB9AcZAf8CtAH0AVIBdAFSApYBugTb
AZkBegGaAUsBUgFLAgAB8ANMAZMB/wEAAf8B7wFuAW8B/wIAAf8B9AHyAXIBFwGUAuMClALjAW8BFwH0
AwACCQH/BxkB/wG0ARkBtAFSAXQBUgfbAXoCmgFLAVIBSwIAAfABRgFpAW8B/wIAAf8B7wFuAW8B/wYA
AW8BFgGUAeMCFwHjAZQBFgFMAf8DAAIJAf8EGQP0Af8BtAH/AbsBUgF5BVICTAVLAXQBSwIAAfMCkwH0
AwAB/wG8ApMB/wYAAZMD4wIWA+MBkwQAAfEBCQH/BPQF/wEZAbQBUgN5C3QBSxQAAf8B9AHzAW8CFwFv
AfMB9AH/BAAB8gHcBf8B9AMZAQkBugHzCVICTAVLIgAB9AEJAdwB2wG6AbQCugG7AwkB9AH/EAABQgFN
AT4HAAE+AwABKAMAAUADAAFAAwABAQEAAQEGAAECFgAD/4EABf8BPwL/AfABIAIAAfgBHwH+AX8B8AEg
AgAB4AEBAfwBPwH8ATACAAHAAQAB8AEPAfwDAAGAAQAB8AEPAf4DAAGAAQAB+AE/AQgBEQQAAfwBPwEM
AQEEAAH8AT8BAAEBBAAB/AE/AcAFAAH8AT8BwAUAAfwBPwHgAwABgAEBAfwBPwHgAT8CAAGAAQEB/AE/
AfABHwIAAcABAwH8AT8B4AEfAgAB4AEHAfwBPwT/AfgBHwL/AfMBPwL/AeABBwH8AQMB8wE/Av8BwAED
AfwBAwHzAT8BwAE/AQABAQH8AQMB8wEfAYABBwEAAQEBhAEDAeABAwGAAQECAAGEAQEB4AEDAYABAQIA
AYQBAAHgAQcBgAEBAgABhAEAAfkBnwGAAQECAAGAAQAB+QGPAeABBwIAAYABAQHgAQMB4AEHAgABgAE/
AeABAwHgAQcCAAGEAR8B/AHPAcABBwIAAYQBHwH8Ac8BwAEHAYABAAGAAR8B/AHHAeABBwGAAQEBgAE/
AfwBRwHwAQ8BwAEDAYAF/wHgAQcE/wH4AQMBAAEDBP8B+AIAAQMC/wHDAYMB8AIAAQMCAAHDAYMBgAIA
AQMCAAHBAQMDAAEDAwABAwIAAYABAwMAAQMCAAGAAQMDAAEBAgABgAEBAgABgAEBAgABwAEBAgABwAEB
AQABAQHAAQECAAHAAQEBAAEBAcADAAHAAYMBAAEBAcADAAHBAYMB8AEBAcADAAHDAYMB8AEDAcADAAL/
AfABAwHAAwAE/wHAAQAC/ws=
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wYAAd0BtAHdBf8B3QG0
Ad01AAG0AdYBtAHuAQcB+ALrAbQB1gG0NAAB/wHxAbQB8AH0AfMB6wJtAfABtAHxNAAB/wHvAvgC6wHt
AfcB6wH0MgABGwdSARwBkgHtAfcB6wH0MgABUgblAVkBUgH0AfgB7wHrAfQyAAFSAeUCWAM3AeUBUgH0
AfgB7wHrAfQyAAFSAeUBWAOgATcB5QFSAf8B7AHvAfgB9DIAAVIB5QVeAeUBUgH/AewB7wH4AfQyAAFS
AeUFWAHlAVIB/wHtAe8B7AH0MgABUgHlAVgDoAFYAeUBUgH/Ae0B7wHsAfQyAAFSBOUCXgHlAVIB/wGS
Ae8B7AH0MgABeQdYAXkB8gHtAe8B7AH0MgABGwFSAVgBHAH3BZIC7wHsAfQzAAHzAZkBHAH3Ae8FBwHv
Ae0B/zQAAv8B9AHvAvcEkgG8Af9aAAH/AZgaAASzAa0BxwEABa0BvAS1CrQBvAUAA20CSQFtDAACcgsA
AqwCswLHAQACxwKtAccBtAG8DPABvAG0AwAFbQJyA0kB7AHzBwABcgJPAXIMAAGtAbQBrAHHAgABxwKt
AccBtAXyAfAB8gX/AfQB8AGRAgABbQH9AW0B/QFPAXIFmAJyAfMEAAH/AnIClwFPAXIB/woAAawBrQGz
Aa0BrAHHAa0BtAGtAccBtAHyA7UC8AHyBv8B8QG0AQAGbQFQAnIBTwFJAXIBmAFyAe8EAAGYAVABcgJ4
AVABSQHtCwABrAO0AbMCtAGtAccBtAHzAwkB8gHwAbwH8QG0AQABbQH9AW0C/QFtAf0B6wFPAv0DSQFy
BQAB9AFQAZgBeAFJBgABuwEJAbsBtAEAAccBtAEJArQBrAEAAawBtAGtAQABtAXzAfII8QG0AW0B/QFt
Av0BbQP9AesBbQL9AW0B/QFtBgABTwKYAU8GAAGtAbQBCQGtAgABxwK0ArMCrAG0Aa0BAAG0AfME9AHy
AfMG9AHyAbQBbQH9AW0C/QFtBP0BbQHrAf0BbQH9AW0GAAFQApgBTwYAAq0BCQGzAq0BxwEJAbQBrQG0
AbMBrAG0Aa0BAAG0AfMDCQHyAfAB8gb/AfIBtAVtA5cBcgJtAlADbQYAAXICmAFPCAABswQJARkBtAHH
AbMBtAGzAbQBrQGsAbQB9AEJArUB8QLwB/MBtAFtAf0BbQL9AXIBmAEIAXgCcgKXAVAB/QFtBgABcgKY
AVAIAAGtAdsBCQKtAQkBswKtAbMB2wHVAa0BrAG0BfQB8QbwAfEB8wG0AW0B/QFtAv0B6wHtAZgCCAOY
AZcBcgFtBgABlwKYAVAJAAGzAQkCrQG6AbMBrQWzAa0BtAHxDBkB3QG0AQABbQH9AW0C/QHrAe0DlwF4
AZcB7AFtBwABlwKYAXIJAAKzAQkBswG6AbMBrQYAELQBAAptAnICbQcAAZcCmAGXCgABswHbAhkBswKt
BQABuw0JAbsBtQIAAW0B/QFtAf0BbQL9AW0B/QFyAf0BbQgAAZcCmAGXCQABswG0AdsCCQG6AbQBrQUA
AfEBCQG7B7UEtAG7AfIDAARtAv0EbQkABJcrAAZtGQAB8gH/AgAB8gHzGQAB/wH0AbwBbwJGAW8CBwHw
CQAB8wG8AfAC8QHyAfEB8wcAAe8CAAEUAW0YAAH/ARoBRgIgAekBIAFGAW8B4wGTAf8IAAFsAfAD8wEZ
AQkB8QYAAUMB6wIAAe0BDggAAf8B9AHyAfEB8gH0Av8GAAL/AZMCIAFGAW8BFgK9Af8B9AFGAZMB/wcA
AUMBtQQJARkB8gYAAewBDwIAAfABAAH/BgAB9AHsAW0B7AMVARQB6wEHAfQB/wMAAfICbwEWAbcBvQb/
AeMBIAEaAgABGgKTAUUBAAEHAbUFGQHsBQABBwHsAQABBwG8Ae8BAAGSAbwBBwH/AwAB7QQQAhEDQwER
AewB8wH/AQABvQEWAfQJ/wGUASABRgH0AQABGgL0AUUBAAEaAbUFGQG1AfIEAAEPCQAB9AMAAewBDgEU
ARIFDwEQARUBEwEUAbwBAAEaAeMB9AP/AfQBvQGUAb0C/wG9AekBIAEHAQABGgL0AUUBAAEaAbwFGQEJ
AWYB8gMAAv8BDgHsAv8B6wERAv8EAAHvARMBbgFFBOkBHwEBAUQBEQHsAe8BAAFvAUcBvQL/Ab0BFwJG
AeMC/wH0AUYBHwFvAQABGgL0AUUBAAGTAfAEGQH0AQkBuwEHBQAB6gETAgAB7wcAAf8BkgJvAUUFRAHp
AUUBvAH/AQABRgFHAZQC/wG9AekBAQEfARcBvQL/AW8BHwFGAQABGgL0AUUB8wFvAfAF9AHzAbsBBwUA
AZIDAAHxAQAB9AcAAewB6wJDAhECEAEOAQcDAAJGARYC/wG9AUYCAQFGAb0C/wGUASABRgEAARoC9AK9
AfQBBwHsAq4CbAFmAewEAAJtARQBAAHrAm0BAAHrAW0B9AUAAewB6wNDAhEBEAEPAe8DAAFvASABFwH0
Av8BbwJGAeMBvQL/Ab0BRgFvAQABGgL0AW8BRQGTAfQBGgFFCQABFQEUARMBAAFDARUBEwEAAUMBFQH0
BQAB7QHsAesDQwIRARAB9wMAAQcBIAFGAb0C/wK9AfME/wH0AUYBBwEAARoC9AFFAQABBwEaAfQBvQEH
DAABkgIAAW0BFQYAAf8B7QHsAe0BFAEVAkMBEQEQAe0DAAH0AUYBRwGUCf8BvQHjARoBAAEaAvQBRQEA
AfMBkwH0ARsBBwsAAW0BFAIAAe8HAAH/AewBEwIRBBABEQHrBAABvAFGARYF/wHzAb0BlAHjARcBlAH0
AQABGgL0AUUBBwGTAvQBkwHzCwAB7wMAAfIBAAHzBgAB7wLtBewBEwEHBAAB/wGTARcBvQHzAb0BlAHj
AkYCIAGTAf8CAAEaAvMCvQEaAb0BbwEHDAAB8gHrAfQBAAH/AewB8AcAAf8B8wPyAfMB9AH/BgAB/wGU
AeMBFwFHBCABRgG8Af8DAAHzBgcrAAH0ARsBkwFvAkYBbwGTAfQB/ygAAfMCbwGTAZEBzwKuAfACAAH/
AbwB7wG1AbQBkQWLApEB9CcAAXQBkwGaAXQB7QG7ArQBiwGRAfMB8QG0AbsBCQHwAfEB8wH0Av8BGQH0
AbQB8BQAAfMCBwH0AwAB/wHyAQcBvAH/BgAB/wF0AZoBGgGaAXQBHAS0AYsBvAG1CP8BtQEZAbUBvAIA
EEsCAAHwAmkB8wMAAfMDjQH/AwAB/wHxAnIBcwF0AhoBmgFvBLQBzwHyAYsJtAEZAQkBBwIAAUsBdARS
ARsCeQEaAlICTAFSAUsCAAHwAmkB8wH/AQAB9AH3AW4CbwH/AgAB9AHsAXICmAFyAe0BkwEaAXQBkwHs
ApEBtAHPAf8BuwG1AfQDCQQZAfQBCQG1AgABTAF0AVILSwFMAUsC/wG7ArQBuwIJAbUB7AFuAW8BaQH/
AgABcgSYAXIBiwEHApMB8AEHAvcB7AGuAQAB9AG0Af8IGQHxAbQCAAFMAXQBSwp4AUsBUgFLAf8B2gG0
AW4BTAHzAf8BBwFuAZECtAFuAf8CAAFyAggBBwGYAXIB7AFvARcB7QG8AfABvAHwAQcB7AEAAf8BtAH/
CBkB8wG0AgABUgF0AUwGeAFXA1YBSwFSAUsB/wHbAbUCTAEbAfADbwGTAW8BtAEJAf8BAAFyAggBmAEc
AW8BFwHjAZQBbwHvAfAB7QHsAQcB7AEAAf8BswH/CBkB/wGzAf8BAAFSAXQBTAGXAVUBlwJWAXcBnQGz
AtQBSwFSAUsBAAH/Ae8BTAFGAQcBbwFpAW8B9AHvAm8BCQHcAQABcgEIAZgBcgFvAeMDlAFvAe8B8gHt
AW4BBwG8AgABtAH/CBkB/wG0Af8BAAFSAXQBUgKXAlUBugXbAUsBUgFLAgAB8AJGAW8CaQG8Af8B7wJu
AtwBAAFyApgBcgEXAb0DlAFvAZIB8gHwAXMB9AMAAbQB8wgZAf8BtAH/AQABUgF0AVIBlwJVBNsBuwGY
AXoBSwFSAUsCAAHwAUYCTAFvAQcB8wEZAe0BbgFvAfQB/wEAAe8BeAJyARcBvQGUA+MBbwKSAW8B9AMA
AbsBGQH0BxkB/wK0AfQBUgF0AVIClgG6BNsBmQF6AZoBSwFSAUsCAAHwA0wBkwH/AQAB/wHvAW4BbwH/
AgAB/wH0AfIBcgEXAZQC4wKUAuMBbwEXAfQDAAIJAf8HGQH/AbQBGQG0AVIBdAFSB9sBegKaAUsBUgFL
AgAB8AFGAWkBbwH/AgAB/wHvAW4BbwH/BgABbwEWAZQB4wIXAeMBlAEWAUwB/wMAAgkB/wQZA/QB/wG0
Af8BuwFSAXkFUgJMBUsBdAFLAgAB8wKTAfQDAAH/AbwCkwH/BgABkwPjAhYD4wGTBAAB8QEJAf8E9AX/
ARkBtAFSA3kLdAFLFAAB/wH0AfMBbwIXAW8B8wH0Af8EAAHyAdwF/wH0AxkBCQG6AfMJUgJMBUsiAAH0
AQkB3AHbAboBtAK6AbsDCQH0Af8QAAFCAU0BPgcAAT4DAAEoAwABQAMAAUADAAEBAQABAQYAAQIWAAP/
AQAB+AcAAfgHAAHwBwAB8AEDBwABAwcAAQMHAAEDBwABAwcAAQMHAAEDBwABAwcAAQMHAAEDBwABAwYA
AYABAwYAAcABAwYABf8BPwL/AfABIAIAAfgBHwH+AX8B8AEgAgAB4AEBAfwBPwH8ATACAAHAAQAB8AEP
AfwDAAGAAQAB8AEPAf4DAAGAAQAB+AE/AQgBEQQAAfwBPwEMAQEEAAH8AT8BAAEBBAAB/AE/AcAFAAH8
AT8BwAUAAfwBPwHgAwABgAEBAfwBPwHgAT8CAAGAAQEB/AE/AfABHwIAAcABAwH8AT8B4AEfAgAB4AEH
AfwBPwT/AfgBHwL/AfMBPwL/AeABBwH8AQMB8wE/Av8BwAEDAfwBAwHzAT8BwAE/AQABAQH8AQMB8wEf
AYABBwEAAQEBhAEDAeABAwGAAQECAAGEAQEB4AEDAYABAQIAAYQBAAHgAQcBgAEBAgABhAEAAfkBnwGA
AQECAAGAAQAB+QGPAeABBwIAAYABAQHgAQMB4AEHAgABgAE/AeABAwHgAQcCAAGEAR8B/AHPAcABBwIA
AYQBHwH8Ac8BwAEHAYABAAGAAR8B/AHHAeABBwGAAQEBgAE/AfwBRwHwAQ8BwAEDAYAF/wHgAQcE/wH4
AQMBAAEDBP8B+AIAAQMC/wHDAYMB8AIAAQMCAAHDAYMBgAIAAQMCAAHBAQMDAAEDAwABAwIAAYABAwMA
AQMCAAGAAQMDAAEBAgABgAEBAgABgAEBAgABwAEBAgABwAEBAQABAQHAAQECAAHAAQEBAAEBAcADAAHA
AYMBAAEBAcADAAHBAYMB8AEBAcADAAHDAYMB8AEDAcADAAL/AfABAwHAAwAE/wHAAQAC/ws=
</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B