Lua Writer - implement saving and fix so that the text only redraws when it needs to.

This commit is contained in:
adelikat 2012-07-22 22:24:02 +00:00
parent 0eba6e53e4
commit 09fb9c88f4
3 changed files with 416 additions and 16 deletions

View File

@ -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;
}
}

View File

@ -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();
}
}
}

View File

@ -120,4 +120,174 @@
<metadata name="timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>97, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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=
</value>
</data>
</root>