diff --git a/BizHawk.MultiClient/tools/LuaWriter.Designer.cs b/BizHawk.MultiClient/tools/LuaWriter.Designer.cs
index 608a7f758a..f33672451e 100644
--- a/BizHawk.MultiClient/tools/LuaWriter.Designer.cs
+++ b/BizHawk.MultiClient/tools/LuaWriter.Designer.cs
@@ -29,40 +29,146 @@
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
- this.LuaText = new BizHawk.MultiClient.LuaWriterBox();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LuaWriter));
this.timer = new System.Windows.Forms.Timer(this.components);
+ this.menuStrip1 = new System.Windows.Forms.MenuStrip();
+ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.MessageLabel = new System.Windows.Forms.Label();
+ this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.configToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.syntaxHighlightingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.fontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.LuaText = new BizHawk.MultiClient.LuaWriterBox();
+ this.menuStrip1.SuspendLayout();
this.SuspendLayout();
//
- // LuaText
- //
- this.LuaText.AcceptsTab = true;
- this.LuaText.Location = new System.Drawing.Point(12, 12);
- this.LuaText.Name = "LuaText";
- this.LuaText.Size = new System.Drawing.Size(819, 417);
- this.LuaText.TabIndex = 0;
- this.LuaText.Text = "";
- this.LuaText.WordWrap = false;
- this.LuaText.ZoomFactor = 2F;
- //
// timer
//
this.timer.Enabled = true;
this.timer.Interval = 1000;
this.timer.Tick += new System.EventHandler(this.timer_Tick);
//
+ // menuStrip1
+ //
+ this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fileToolStripMenuItem,
+ this.configToolStripMenuItem});
+ this.menuStrip1.Location = new System.Drawing.Point(0, 0);
+ this.menuStrip1.Name = "menuStrip1";
+ this.menuStrip1.Size = new System.Drawing.Size(843, 24);
+ this.menuStrip1.TabIndex = 1;
+ this.menuStrip1.Text = "menuStrip1";
+ //
+ // fileToolStripMenuItem
+ //
+ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.saveToolStripMenuItem,
+ this.saveAsToolStripMenuItem,
+ this.toolStripSeparator1,
+ this.exitToolStripMenuItem});
+ this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
+ this.fileToolStripMenuItem.Text = "&File";
+ //
+ // saveToolStripMenuItem
+ //
+ this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+ this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+ this.saveToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+ this.saveToolStripMenuItem.Text = "&Save";
+ this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(192, 6);
+ //
+ // exitToolStripMenuItem
+ //
+ this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+ this.exitToolStripMenuItem.ShortcutKeyDisplayString = "Alt+F4";
+ this.exitToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+ this.exitToolStripMenuItem.Text = "E&xit";
+ //
+ // MessageLabel
+ //
+ this.MessageLabel.AutoSize = true;
+ this.MessageLabel.Location = new System.Drawing.Point(16, 424);
+ this.MessageLabel.Name = "MessageLabel";
+ this.MessageLabel.Size = new System.Drawing.Size(91, 13);
+ this.MessageLabel.TabIndex = 2;
+ this.MessageLabel.Text = " ";
+ //
+ // saveAsToolStripMenuItem
+ //
+ this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+ this.saveAsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.S)));
+ this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+ this.saveAsToolStripMenuItem.Text = "Save &As...";
+ this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
+ //
+ // configToolStripMenuItem
+ //
+ this.configToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fontToolStripMenuItem,
+ this.syntaxHighlightingToolStripMenuItem});
+ this.configToolStripMenuItem.Name = "configToolStripMenuItem";
+ this.configToolStripMenuItem.Size = new System.Drawing.Size(55, 20);
+ this.configToolStripMenuItem.Text = "&Config";
+ //
+ // syntaxHighlightingToolStripMenuItem
+ //
+ this.syntaxHighlightingToolStripMenuItem.Enabled = false;
+ this.syntaxHighlightingToolStripMenuItem.Name = "syntaxHighlightingToolStripMenuItem";
+ this.syntaxHighlightingToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
+ this.syntaxHighlightingToolStripMenuItem.Text = "Syntax Highlighting";
+ //
+ // fontToolStripMenuItem
+ //
+ this.fontToolStripMenuItem.Enabled = false;
+ this.fontToolStripMenuItem.Name = "fontToolStripMenuItem";
+ this.fontToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
+ this.fontToolStripMenuItem.Text = "Font";
+ //
+ // LuaText
+ //
+ this.LuaText.AcceptsTab = true;
+ this.LuaText.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.LuaText.EnableAutoDragDrop = true;
+ this.LuaText.Location = new System.Drawing.Point(24, 27);
+ this.LuaText.Name = "LuaText";
+ this.LuaText.Size = new System.Drawing.Size(819, 392);
+ this.LuaText.TabIndex = 0;
+ this.LuaText.Text = "";
+ this.LuaText.WordWrap = false;
+ this.LuaText.ZoomFactor = 2F;
+ this.LuaText.TextChanged += new System.EventHandler(this.LuaText_TextChanged);
+ this.LuaText.KeyUp += new System.Windows.Forms.KeyEventHandler(this.LuaText_KeyUp);
+ //
// LuaWriter
//
this.AllowDrop = true;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(843, 441);
+ this.Controls.Add(this.MessageLabel);
this.Controls.Add(this.LuaText);
+ this.Controls.Add(this.menuStrip1);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MainMenuStrip = this.menuStrip1;
this.Name = "LuaWriter";
this.Text = "LuaWriter";
this.Load += new System.EventHandler(this.LuaWriter_Load);
this.DragDrop += new System.Windows.Forms.DragEventHandler(this.LuaWriter_DragDrop);
this.DragEnter += new System.Windows.Forms.DragEventHandler(this.LuaWriter_DragEnter);
+ this.menuStrip1.ResumeLayout(false);
+ this.menuStrip1.PerformLayout();
this.ResumeLayout(false);
+ this.PerformLayout();
}
@@ -70,5 +176,15 @@
private LuaWriterBox LuaText;
private System.Windows.Forms.Timer timer;
+ private System.Windows.Forms.MenuStrip menuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+ private System.Windows.Forms.Label MessageLabel;
+ private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem configToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem fontToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem syntaxHighlightingToolStripMenuItem;
}
}
\ No newline at end of file
diff --git a/BizHawk.MultiClient/tools/LuaWriter.cs b/BizHawk.MultiClient/tools/LuaWriter.cs
index 06c868e436..520f1c1af4 100644
--- a/BizHawk.MultiClient/tools/LuaWriter.cs
+++ b/BizHawk.MultiClient/tools/LuaWriter.cs
@@ -14,16 +14,33 @@ namespace BizHawk.MultiClient
public partial class LuaWriter : Form
{
public string CurrentFile = "";
+
+ bool changes = false;
+ bool hasChanged;
+ public Regex keyWords = new Regex("and|break|do|else|if|end|false|for|function|in|local|nil|not|or|repeat|return|then|true|until|while|elseif");
Regex keyWords = new Regex("and|break|do|else|if|end|false|for|function|in|local|nil|not|or|repeat|return|then|true|until|while|elseif");
char[] Symbols = { '+','-','*','/','%','^','#','=','<','>','(',')','{','}','[',']',';',':',',','.' };
+
public LuaWriter()
{
InitializeComponent();
}
private void timer_Tick(object sender, EventArgs e)
+ {
+ if (!hasChanged)
+ {
+ return;
+ }
+
+ ProcessText();
+
+ hasChanged = false;
+ }
+
+ private void ProcessText()
{
int selPos = LuaText.SelectionStart;
int selChars = LuaText.SelectedText.Length;
@@ -32,11 +49,8 @@ namespace BizHawk.MultiClient
LuaText.SelectionColor = Color.FromArgb(Global.Config.LuaDefaultTextColor);
ColorReservedWords();
-
ColorComments();
-
ColorStrings();
-
ColorSymbols();
LuaText.Select(selPos, selChars);
@@ -167,7 +181,7 @@ namespace BizHawk.MultiClient
}
}
}
-
+
private void ColorReservedWords()
{
foreach (Match keyWordMatch in keyWords.Matches(LuaText.Text))
@@ -195,9 +209,17 @@ namespace BizHawk.MultiClient
if (!String.IsNullOrWhiteSpace(CurrentFile))
{
LoadCurrentFile();
+ ProcessText();
+ NoChanges();
}
}
+ private void NoChanges()
+ {
+ changes = false;
+ MessageLabel.Text = CurrentFile;
+ }
+
private void LoadCurrentFile()
{
var file = new FileInfo(CurrentFile);
@@ -221,6 +243,8 @@ namespace BizHawk.MultiClient
LuaText.Text = luaText.ToString();
}
}
+
+ MessageLabel.Text = CurrentFile;
}
private void LuaWriter_DragEnter(object sender, DragEventArgs e)
@@ -238,5 +262,95 @@ namespace BizHawk.MultiClient
LoadCurrentFile();
}
}
+
+ private void saveToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (!String.IsNullOrWhiteSpace(CurrentFile))
+ {
+ SaveScript();
+ }
+ else if (changes)
+ {
+ SaveScriptAs();
+ MessageLabel.Text = Path.GetFileName(CurrentFile) + " saved.";
+ }
+ }
+
+ private void SaveScript()
+ {
+ var file = new FileInfo(CurrentFile);
+
+ using (StreamWriter sw = new StreamWriter(CurrentFile))
+ {
+ foreach (string s in LuaText.Lines)
+ {
+ sw.WriteLine(s + '\n');
+ }
+ }
+
+ NoChanges();
+ }
+
+ private void SaveScriptAs()
+ {
+ var file = GetSaveFileFromUser(CurrentFile);
+ if (file != null)
+ {
+ CurrentFile = file.FullName;
+ SaveScript();
+ MessageLabel.Text = Path.GetFileName(CurrentFile) + " saved.";
+ Global.Config.RecentWatches.Add(file.FullName);
+ }
+ }
+
+ public static FileInfo GetSaveFileFromUser(string currentFile)
+ {
+ var sfd = new SaveFileDialog();
+ if (currentFile.Length > 0)
+ {
+ sfd.FileName = Path.GetFileNameWithoutExtension(currentFile);
+ sfd.InitialDirectory = Path.GetDirectoryName(currentFile);
+ }
+ else if (!(Global.Emulator is NullEmulator))
+ {
+ sfd.FileName = PathManager.FilesystemSafeName(Global.Game);
+ sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.LuaPath, "");
+ }
+ else
+ {
+ sfd.FileName = "NULL";
+ sfd.InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.LuaPath, "");
+ }
+ sfd.Filter = "Watch Files (*.lua)|*.lua|All Files|*.*";
+ sfd.RestoreDirectory = true;
+ Global.Sound.StopSound();
+ var result = sfd.ShowDialog();
+ Global.Sound.StartSound();
+ if (result != DialogResult.OK)
+ return null;
+ var file = new FileInfo(sfd.FileName);
+ return file;
+ }
+
+ private void LuaText_KeyUp(object sender, KeyEventArgs e)
+ {
+ hasChanged = true;
+ }
+
+ private void Changes()
+ {
+ changes = true;
+ MessageLabel.Text = CurrentFile + " *";
+ }
+
+ private void LuaText_TextChanged(object sender, EventArgs e)
+ {
+ Changes();
+ }
+
+ private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ SaveScriptAs();
+ }
}
}
\ No newline at end of file
diff --git a/BizHawk.MultiClient/tools/LuaWriter.resx b/BizHawk.MultiClient/tools/LuaWriter.resx
index b351ef9fea..1afba62822 100644
--- a/BizHawk.MultiClient/tools/LuaWriter.resx
+++ b/BizHawk.MultiClient/tools/LuaWriter.resx
@@ -120,4 +120,174 @@
17, 17
+
+ 97, 17
+
+
+
+
+ AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA
+ AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA
+ AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAA/AAAAPQAAAD0AAAA9AAAAPQAA
+ AD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAA
+ AD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAPwAA
+ ADQAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2FhYb7R0dH/x8fH+8PD
+ w/vCwsL7wsLC+7+/v/u/v7/7vr6++7y8vPu7u7v7u7u7+7i4uPu2trb7tra2+7W1tfu1tbX7sbGx+7Cw
+ sPuvr6/7r6+v+66urvutra37ra2t+6mpqfuoqKj7p6en+6enp/umpqb7paWl+6WlpfuhoaH7oKCg+6Cg
+ oPufn5/7oKCg/ZiYmP8TExNVAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8
+ /P/8/Pz/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw/+7u7v/u7u7/7u7u/+7u7v/u7u7/7Ozs/+zs
+ 7P/s7Oz/7Ozs/+zs7P/s7Oz/6enp/+np6f/p6en/6enp/+np6f/p6en/6Ojo/+jo6P/o6Oj/6Ojo/+fn
+ 5//n5+f/5+fn/+fn5//n5+f/5+fn/+np6f9XV1elAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAEPz8/P/u7u7/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li
+ 4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Li4v/i4uL/4uLi/+Pj
+ 4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fn//Dw8P9VVVWlAAAABAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/w8PD/4+Pj/+Pj4//j4+P/4+Pj/9ra2v/j4+P/4+Pj/+Pj
+ 4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
+ 4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fn//Ly8v9VVVWlAAAABAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/w8PD/AAAA/+Pj4/8AAAD/4+Pj/9ra
+ 2v/j4+P/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xM
+ TP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/4+Pj/+Pj4//j4+P/5+fn//Pz
+ 8/9YWFilAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/y8vL/5OTk/+fn
+ 5//n5+f/5+fn/9ra2v/n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+ 5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn
+ 5//n5+f/6Ojo//X19f9ZWVmlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8
+ /P/y8vL/AAAA/+fn5/8AAAD/5+fn/9ra2v/n5+f//wAA//8AAP//AAD//wAA//8AAP//AAD/5+fn/0xM
+ TP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xM
+ TP9MTEz/5+fn/+fn5//n5+f/6Ojo//X19f9aWlqlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAEPz8/P/z8/P/5eXl/+jo6P/o6Oj/6Ojo/9ra2v/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+ 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo
+ 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo//n5+f9cXFylAAAABAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/y8vL/AAAA/+jo6P8AAAD/6Ojo/9ra2v/o6Oj/6Ojo/+jo
+ 6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo//Dw8P/19fX/+/v7//39/f/+/v7//v7+//z8/P/4+Pj/8/Pz/+rq
+ 6v/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6Ojo//n5+f9eXl6lAAAABAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/z8/P/6enp/+np6f/p6en/6enp/9ra
+ 2v/p6en/6enp/+np6f/p6en/6enp/+np6f/w8PD/+vr6////////////////////////////////////
+ //////////////39/f/19fX/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp//v7
+ +/9fX1+lAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/z8/P/AAAA/+np
+ 6f8AAAD/6enp/9ra2v/p6en/TExM/0xMTP9MTEz/TExM/6ioqP///////////+7e3v+4dHT/lzIy/4gT
+ E/+GDQ3/hg0N/48hIf+pVFT/2bS0////////////19fX/2tra//p6en/6enp/+np6f/p6en/6enp/+np
+ 6f/p6en/6enp//z8/P9hYWGlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8
+ /P/19fX/6+vr/+zs7P/s7Oz/7Ozs/9ra2v/s7Oz/7Ozs/+zs7P/s7Oz/9vb2////////////uXR0/34A
+ AP98AAD/fgAA/38AAP9/AAD/fwAA/38AAP98AAD/fAAA/5w8PP/mz8////////39/f/v7+//7Ozs/+zs
+ 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
+ /P/8/Pz/9/f3//f39//39/f/9/f3/9ra2v/39/f//Pz8//////+zZ2f/fAAA/4ABAf+DBwf/gAEB/38A
+ AP9/AAD/fwAA/38AAP9/AAD/fAAA/8CCgv/////////////////s2Nj/gw4O/34AAP98AAD/7+Dg////
+ ///4+Pj/9/f3//f39//39/f/9/f3//z8/P9xcXGlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAEPz8/P/8/Pz/AAAA//n5+f8AAAD/+fn5/9ra2v/5+fn/kZGR///////WrKz/eQAA/38A
+ AP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP9+AAD/ihgY/////////////7a2///Ozv//////zJmZ/3cA
+ AP+YMjL///////7+/v/5+fn/+fn5//n5+f/5+fn/+fn5//z8/P9xcXGlAAAABAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+fn5//n5+f/5+fn/+fn5/9ra2v/5+fn/+vr6////
+ ///69fX/fwcH/30AAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP99AAD/pUlJ///////9/f3/+fn5//v7
+ +///////59DQ/3UAAP/Vq6v///////39/f/5+fn/+fn5//n5+f/5+fn/+fn5//z8/P9ycnKlAAAABAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/AAAA//n5+f8AAAD/+fn5/9ra
+ 2v/5+fn/TExM/9DQ0P//////1Kio/3gAAP9/AAD/fwAA/38AAP9/AAD/fwAA/38AAP99AAD/ihgY////
+ /////////f39////////////tGlp/3wAAP////////////v7+//6+vr/+fn5//n5+f/5+fn/+fn5//z8
+ /P9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+Pj4//v7
+ +//7+/v/+/v7/9ra2v/7+/v/+/v7//z8/P///////////6xaWv93AAD/fwAA/38AAP9/AAD/fwAA/38A
+ AP9/AAD/ewAA/7hycv/////////////////buLj/fgMD/+3b2////////////////////////Pz8//v7
+ +//7+/v/+/v7//z8/P9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8
+ /P/8/Pz/+Pj4//v7+/8AAAD/+/v7/9ra2v/7+/v/+/v7//v7+//9/f3///////////+iTU3/fAAA/38A
+ AP9/AAD/fwAA/38AAP9/AAD/fwAA/3oAAP+aNzf/sWNj/5o2Nv93AAD/3Lm5///////HkZH/tWxs/9Kn
+ p/////////////z8/P/7+/v/+/v7//z8/P90dHSlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAEPz8/P/8/Pz/+/v7//v7+//7+/v/+/v7/9ra2v/7+/v/+/v7//v7+//7+/v//f39////
+ ////////woaG/4UNDf97AAD/fAAA/34AAP9/AAD/fgAA/30AAP96AAD/ewAA/40gIP/o0dH//////6xb
+ W/94AAD/fgAA/3cAAP/Hj4////////7+/v/7+/v/+/v7//z8/P90dHSlAAAABAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+/v7//v7+/8AAAD/+/v7/9ra2v/7+/v/TExM/0xM
+ TP9MTEz/TExM/6CgoP////////////Po6P/DiIj/pk1N/4wbG/+CBgb/hg4O/5o2Nv+0aWn/3by8////
+ ////////4sXF/3wAAP9/AAD/fwAA/38AAP98AAD////////////7+/v/+/v7//z8/P90dHSlAAAABAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz/+/v7//v7+//7+/v/+/v7/9ra
+ 2v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8/Pz//v7+//////////////////37+//06Oj/+PDw////
+ ////////////////////////1q6u/34AAP9/AAD/fwAA/4AAAP99AAD////////////7+/v/+/v7//z8
+ /P9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8
+ /P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/3t7e/+mpqb/z8/P////
+ /////////////9vb2/+7u7v/kJCQ/11dXf//////+/j4/4oXF/97AAD/fwAA/3oAAP+jSEj///////7+
+ /v/8/Pz//Pz8//f39/9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/+/v7//////+/g4P+lTU3/jSEh/69j
+ Y//58vL///////7+/v/8/Pz//Pz8//X19f9zc3OlAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//v7+////
+ /////////////////////////v7+//z8/P/8/Pz//Pz8//Pz8/9zc3OjAAAABAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//39/f/+/v7///////7+/v/9/f3//Pz8//z8/P/8/Pz//Pz8/+Li4v9kZGSVAAAAAgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra
+ 2v/8/Pz/TExM/0xMTP9MTEz//Pz8//8AAP//AAD//wAA//z8/P/8/Pz/TExM/0xMTP9MTEz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/7+/v/29vb/8TExP/ExMT/xMTE/8bGxv/Gxsb/xcXF/8DAwP/Jycn/yMjI/8vL
+ y/8vLy8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/wMDA/9vb2//s7Oz/7Ozs/+7u7v/w8PD/8PDw/+fn
+ 5//T09P/1dXV/0RERDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8
+ /P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/xMTE//n5+f/8/Pz//Pz8//z8
+ /P/8/Pz/9/f3/+Li4v/c3Nz/R0dHLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/ycnJ//v7
+ +//8/Pz//Pz8//z8/P/19fX/3Nzc/9vb2/9ISEgvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xM
+ TP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz//Pz8//8AAP//AAD//wAA//8AAP/8/Pz//Pz8//z8
+ /P/7+/v/zMzM//v7+//8/Pz//Pz8//X19f/c3Nz/3Nzc/0lJSTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra
+ 2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/7+/v/0tLS//v7+//8/Pz/9fX1/9zc3P/h4eH/SkpKLwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8
+ /P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP9MTEz/TExM/0xM
+ TP9MTEz/TExM/0xMTP9MTEz/TExM//z8/P/7+/v/2NjY//z8/P/19fX/3Nzc/+Pj4/9NTU0vAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8/9ra2v/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/3Nzc//Pz8//c3Nz/4uLi/05O
+ TjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P8AAAD//Pz8/9ra2v/8/Pz/TExM/0xMTP9MTEz/TExM/0xM
+ TP/8/Pz//Pz8//z8/P9MTEz/TExM/0xMTP9MTEz/TExM/0xMTP/8/Pz//Pz8//z8/P/8/Pz/4+Pj/+Li
+ 4v/o6Oj/W1tbOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAEPz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/7+/v/9/f3//X1
+ 9f/y8vL/6Ojo//Pz8/9jY2NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
+ /P/8/Pz//Pz8//z8/P/39/f//Pz8/2ZmZkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALa2tn7Z2dnv1NTU5NTU
+ 1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU
+ 1OTU1NTk1NTU5NTU1OTU1NTk1NTU5NTU1ObX19fpb29vOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA+AAAAAA/
+ AAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgA
+ AAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAf
+ AAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgA
+ AAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAf
+ AAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAD8AAPgAAAAAfwAA+AAAAAD/AAD4AAAAAf8AAPgA
+ AAAD/wAA+AAAAAf/AAD4AAAAD/8AAPgAAAAf/wAA+AAAAD//AAD4AAAAf/8AAPgAAAD//wAA/AAAAf//
+ AAA=
+
+
\ No newline at end of file