Implementing progress callback

This commit is contained in:
Justin Aquadro 2013-08-09 02:02:22 -04:00
parent 1c654c66d3
commit 152213e2cf
8 changed files with 129 additions and 46 deletions

View file

@ -287,12 +287,14 @@ namespace NBTExplorer.Model.Search
if (double.Parse(Value) == tag.ToTagDouble()) {
if (!matchedNodes.Contains(childNode))
matchedNodes.Add(childNode);
return true;
}
break;
case TagType.TAG_STRING:
if (Value == tag.ToTagString()) {
if (!matchedNodes.Contains(childNode))
matchedNodes.Add(childNode);
return true;
}
break;
}

View file

@ -9,6 +9,7 @@ namespace NBTExplorer
DataNode RootNode { get; set; }
IEnumerator<DataNode> State { get; set; }
bool TerminateOnDiscover { get; set; }
void InvokeDiscoverCallback (DataNode node);
void InvokeProgressCallback (DataNode node);
@ -25,12 +26,18 @@ namespace NBTExplorer
public DataNode RootNode { get; set; }
public IEnumerator<DataNode> State { get; set; }
public bool TerminateOnDiscover { get; set; }
public abstract void InvokeDiscoverCallback (DataNode node);
public abstract void InvokeProgressCallback (DataNode node);
public abstract void InvokeCollapseCallback (DataNode node);
public abstract void InvokeEndCallback (DataNode node);
protected NameValueSearchState ()
{
TerminateOnDiscover = true;
}
public bool TestNode (DataNode node)
{
bool mName = SearchName == null;
@ -101,9 +108,12 @@ namespace NBTExplorer
TagDataNode tagNode = node as TagDataNode;
if (tagNode != null) {
InvokeProgressCallback(node);
if (_state.TestNode(tagNode)) {
InvokeDiscoverCallback(node);
yield return node;
if (_state.TerminateOnDiscover)
yield return node;
}
/*bool mName = _state.SearchName == null;
@ -139,6 +149,11 @@ namespace NBTExplorer
}
}
private void InvokeProgressCallback (DataNode node)
{
_state.InvokeProgressCallback(node);
}
private void InvokeDiscoverCallback (DataNode node)
{
_state.InvokeDiscoverCallback(node);

View file

@ -28,24 +28,35 @@
private void InitializeComponent ()
{
this._buttonCancel = new System.Windows.Forms.Button();
this._searchPathLabel = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// _buttonCancel
//
this._buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this._buttonCancel.Location = new System.Drawing.Point(124, 57);
this._buttonCancel.Location = new System.Drawing.Point(167, 57);
this._buttonCancel.Name = "_buttonCancel";
this._buttonCancel.Size = new System.Drawing.Size(75, 23);
this._buttonCancel.TabIndex = 0;
this._buttonCancel.Text = "Cancel";
this._buttonCancel.UseVisualStyleBackColor = true;
//
// _searchPathLabel
//
this._searchPathLabel.Location = new System.Drawing.Point(12, 19);
this._searchPathLabel.Name = "_searchPathLabel";
this._searchPathLabel.Size = new System.Drawing.Size(385, 23);
this._searchPathLabel.TabIndex = 1;
this._searchPathLabel.Text = "...";
this._searchPathLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// CancelSearchForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this._buttonCancel;
this.ClientSize = new System.Drawing.Size(322, 92);
this.ClientSize = new System.Drawing.Size(409, 92);
this.Controls.Add(this._searchPathLabel);
this.Controls.Add(this._buttonCancel);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
@ -59,5 +70,6 @@
#endregion
private System.Windows.Forms.Button _buttonCancel;
private System.Windows.Forms.Label _searchPathLabel;
}
}

View file

@ -8,5 +8,11 @@ namespace NBTExplorer.Windows
{
InitializeComponent();
}
public string SearchPathLabel
{
get { return _searchPathLabel.Text; }
set { _searchPathLabel.Text = value; }
}
}
}

View file

@ -112,9 +112,9 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -517,12 +517,14 @@
// _buttonReplaceAll
//
this._buttonReplaceAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this._buttonReplaceAll.Enabled = false;
this._buttonReplaceAll.Location = new System.Drawing.Point(376, 415);
this._buttonReplaceAll.Name = "_buttonReplaceAll";
this._buttonReplaceAll.Size = new System.Drawing.Size(75, 23);
this._buttonReplaceAll.TabIndex = 4;
this._buttonReplaceAll.Text = "Replace All";
this._buttonReplaceAll.UseVisualStyleBackColor = true;
this._buttonReplaceAll.Click += new System.EventHandler(this._buttonReplaceAll_Click);
//
// _buttonCancel
//
@ -533,6 +535,7 @@
this._buttonCancel.TabIndex = 5;
this._buttonCancel.Text = "Cancel";
this._buttonCancel.UseVisualStyleBackColor = true;
this._buttonCancel.Click += new System.EventHandler(this._buttonCancel_Click);
//
// FindReplace
//

View file

@ -172,6 +172,7 @@ namespace NBTExplorer.Windows
RootNode = _mainSearchRoot,
DiscoverCallback = SearchDiscoveryCallback,
CollapseCallback = SearchCollapseCallback,
ProgressCallback = SearchProgressCallback,
EndCallback = SearchEndCallback,
};
}
@ -179,6 +180,20 @@ namespace NBTExplorer.Windows
SearchNextNode();
}
private void _buttonReplaceAll_Click (object sender, EventArgs e)
{
_searchState = new ContainerRuleSearchStateWin(_main) {
RuleTags = _findController.Root,
RootNode = _mainSearchRoot,
DiscoverCallback = SearchDiscoveryReplaceAllCallback,
CollapseCallback = SearchCollapseCallback,
EndCallback = SearchEndCallback,
TerminateOnDiscover = false,
};
SearchNextNode();
}
private void SearchNextNode ()
{
if (_searchState == null)
@ -212,6 +227,22 @@ namespace NBTExplorer.Windows
_currentFindNode = node;
}
private void SearchDiscoveryReplaceAllCallback (DataNode node)
{
_mainController.SelectNode(node);
_mainController.ExpandSelectedNode();
_currentFindNode = node;
ReplaceCurrent();
}
private void SearchProgressCallback (DataNode node)
{
if (node is TagCompoundDataNode && !string.IsNullOrEmpty(node.NodeName) && node.NodeName != _searchForm.SearchPathLabel)
_searchForm.SearchPathLabel = node.NodeName;
}
private void SearchCollapseCallback (DataNode node)
{
_mainController.CollapseBelow(node);
@ -230,6 +261,11 @@ namespace NBTExplorer.Windows
private DataNode _currentFindNode;
private void _buttonReplace_Click (object sender, EventArgs e)
{
ReplaceCurrent();
}
private void ReplaceCurrent ()
{
TagCompoundDataNode node = _currentFindNode as TagCompoundDataNode;
if (node == null)
@ -253,6 +289,11 @@ namespace NBTExplorer.Windows
_mainController.RefreshTreeNode(node);
}
private void _buttonCancel_Click (object sender, EventArgs e)
{
Close();
}
private void _tbFindEdit_Click (object sender, EventArgs e)
{
//_findController.EditSelection();
@ -262,8 +303,6 @@ namespace NBTExplorer.Windows
{
_replaceController.EditSelection();
}
}
public abstract class ContainerRuleSearchState : ISearchState
@ -272,12 +311,18 @@ namespace NBTExplorer.Windows
public DataNode RootNode { get; set; }
public IEnumerator<DataNode> State { get; set; }
public bool TerminateOnDiscover { get; set; }
public abstract void InvokeDiscoverCallback (DataNode node);
public abstract void InvokeProgressCallback (DataNode node);
public abstract void InvokeCollapseCallback (DataNode node);
public abstract void InvokeEndCallback (DataNode node);
protected ContainerRuleSearchState ()
{
TerminateOnDiscover = true;
}
public bool TestNode (DataNode node)
{
if (RuleTags == null)

View file

@ -125,7 +125,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABA
QgAAAk1TRnQBSQFMAgEBFAEAAWgBAQFoAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
QgAAAk1TRnQBSQFMAgEBFAEAAYABAQGAAQEBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABYAMAAQEBAAEYBgABSP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AOEAA/8D/AP6GPgD+QP6A/wMAAP9
A/oS+AP5A/0D/2kAA/4D+QPxAboBogGKAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFWAbYBhgFW
AbYBhgFWAbYBhgFWAbwBpAGNA/cMAAP8A/YD8wG8AcoBzQFVAZUBowFVAZUBowHQAdcB2QPzA/UD+wP/
@ -443,48 +443,48 @@
<data name="_tbFindGroupAnd.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJPSURBVDhPzZHdT1JxHMbPqqsuwpdq5kVrqzbWrIvM1U1r
q6UXbbnWy2hL3VqzFluJC+zFAmvOAu0FeWkMm5qWIAwCCncwjIWGZJQVKXoQ8IAiqAlG3XTReei09R/U
b/vsfPc8z2djg/h/XnGdg7NTRO5hvuXFl8mT+JaJRw+DvzN2w2G1348JNpbdGqjoGaRV4eT3vmTqh6+7
f9F9polOAdzI0GGDLZw/MuegxFnlj6QMkfmMM5TIkIMfFz28eiqtMM5FAG5k6LDBFk72l2yvse597JpS
MaWDmk3bpxKZfr7sU+iidDze5fj6BeBGhg4bbOHAJbgXzLyxaNr2mSU4lxnYccSeutM5M3bfmHQ3Pkk4
rmtCb0t4liWbb6a163W40eihm4cC851wCS7fVE3Fv7k+hJdMYJxOk1v29f5s0Sdd19pmLECmT75CZh2J
PVSS1A1VHyV+8W5WA5fYfFZfORJcMA9PLhjs7+Nakzem5h4ypoTykLdOG7MC3Mj0Q7Ti3vOABBg8tBIu
sen009IHNr/G7KW1MkvgppoMSssF7omjIt/01baoHeBGhk76LNCgsE/eFvf47sIlCis68ov4utoOJ9Xa
Yg00NfT6Jc0GSldyanhZKI+OAtzI0GGD7bbzOgHc7F+ZX3qFu7W6Wyhq98gfOYNqw5vpdqFi4uXuqtAy
wI0MHTbYwsnKzFvJsHZVQdGunAOXKnOPKWvzTmjq846rBQX7xecAbmTosMEWDusSKxhWs0EhwwaGdQw5
DGtYchnWM6DDBls4cP/pI4hffcyTuyV8TxoAAAAASUVORK5CYII=
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJPSURBVDhPzZHdT1JxHMbPqqsuwpdq5kVrqzbW9CZj66Ju
aulFW671MtpSt9asxVbhAnux0JqzQHtBXhrDpqYlCIOAwh0MY6EhGWVFih4EPIAIaoJRN110Hjpt/Qf1
2z473z3P89nYIP6fV1bv4OwUk7uZb2XZZfIEvhWS8UPg74zdcFjt92OCzRW3hqr6hmlVOPV9IJX+4esd
XHKfbqHTADcydNhgC+ePzDnQ6KzxR9KGyELWGUpmyeGPSx5+A5VRGOcjADcydNhgCyf3S0ovWvc+ds2o
mNJBzWXsM8nsoED2KXRBOpnocXz9AnAjQ4cNtnDgEtzzZv5ENGP7zBKczw6VHran73THJ+4bU+7mJ0nH
dU3oLY9vWbb54u09r8PNRg/dOhJY6IZLcAWmWirxzfUhvGwCk3SG3Lan/2ebPuW61hG3AJk+9QqZdSz2
UElSN1QDlOTFuzkNXGLrGX31WHDRPDq9aLC/T2hN3piae9CYFslD3nptzApwI9OP0Ip7zwONwOChlXCJ
Laeelj+w+TVmL62VWQI31WRQWil0Tx0R+2avdkTtADcydNJngSaFffq2pM93Fy5RXNVVWCLQ1XU5qfY2
a6Clqd/f2GqgdLyToysieXQc4EaGDhtsd5zTCeHm/srC8ivc7bW9InGnR/7IGVQb3sx2ihRTL3k1oRWA
Gxk6bLCFk5OZt5ph/Zqikl15+y9V5x9V1hUc1zQUHFMLi/ZJzgLcyNBhgy0c1iVWMaxlg2KGTQwbGPIY
1rHkM2xkQIcNtnDg/tNHEL8AacmTsOs1fTEAAAAASUVORK5CYII=
</value>
</data>
<data name="_tbFindGroupOr.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI+SURBVDhPzZHvaxJxHMePetaDKGhB0aOIISyIHgWLiH4g
sYiBFq1tFaM9CBxELB0po3KnlXOjBzWGqTNzFyohqZvN2TaXFovFaTlnK9MT7855jrM99FH3NiP6C+oL
L+7N+/N+PTri/3lXDYKslxTs14aEXPcdtoZvL1lxgr87wY5tQ/v1Lt7OKTq1DK+1lPmn/so375sfhftO
ge7S55MAGR1u2GALpy7L+5Zl527QvIkqZ6nwZsYVEdOOGXGlx5T12YLVFEBGhxs22MKBS7R2LthVZIZ3
zYrp5+FqioqIqwMWZo50cXF0ABkdbtiggwOXaDnrz41Q3JrjdfUTcEU2v3SQqwHrqwr96KUQM1DlWbO7
tHhev+Ifdq/P6Z2laaOrHB6aYBJwiX1yb20iuPHVOlWhgTMkptu0Cd+IR4jqbJwfDHuEBXRm95/uAcXH
4BL7T3lzRgeTGfNtfDR7hNhDSogq736eMlCl6ICVDQDkeje5Pv+763+cW4JLNJ+ZtnfrkpzpRfmt2sIG
B+38zPXRtcjNJ9l5ra0YAsjocNOMswF0F9SJPFzioCIuO6xcKvWZGVpjKYb6xwsBvYNbbB9Mhu45uDhA
RoebxloMYXuoPcbDrf/KltPPFEcvZ0qXdAxza6z4wTjJvleNfl8+qUplADI6tXTDBls4dVl6WyV2NR1Q
yo8o33mP9zDMiS62duxKId/aQXsAMjrcsMEWTsMltkhsaxR7JfZINEnskNjeYKfEbgncsMEWDtx/+gji
JyzdqdCmE/4ZAAAAAElFTkSuQmCC
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI8SURBVDhPzZHda1JxHMYPdddFFLRgXUaEsCC6ChYRvSBR
xECL3HpjtIvAQcTSkTIqp1bOjS5qDFNn5k6ohKRuNmfbXNpYLI6Wc6eV6RHPyzwObZdedR4zor+gfvDh
PDzf53N1iP/nXTOJsh6j6Lw+KOY777J1fHuMFTf4uxOd2Da1X+/inbyiS8fwOluZfxasfPO//VF84Bap
S4ZCGiCjww0bbOE0ZHnvsuzcTYq3kOUcGd2kPbFq1jVdXem25AKOcC0DkNHhhg22cOAS7V3zTrWR5j0z
1eyLaC1Dxqqr/TZm1ujhkugAMjrcsEEHBy7RdjaYHya5Ndeb2ifgiW1+URlXQ/bXFerxKzFhIsszVq+w
cN6wEhzyrs8a3MKU2VOODo4zKbhEq9xfHw9vfLVPVijgjlSzZ3SpwLBPjOsdXBAM+cR5dFbvn+4hySfg
EntP+vNmF0OPBjY+Wn1i4hEpxpX3Pk+aSCHeb2dDALnRTazP/e76nuSX4BL7T085L+vTnOVl+Z3GxoYH
nPz0jZG12K2nuTmdoxQByOhw046xIXQXNKkCXOKAIik7pFwSeq0MpbWVIn1jxZDBxS10DKQj911cEiCj
w01rL0WwPdiR4OE2fmXbqeeKI1dooVPPMLdHSx/ME+yieuT78gl1hgbI6DTSDRts4TRk6W2V2NWyTyk/
rHzvP9bNMMdVbP3o1WKhXUX5ADI63LDBFk7TJbZIbGsWeyRaJVokdkhsb7JTYrcEbthgCwfuP30E8RMF
76m+HADFNQAAAABJRU5ErkJggg==
</value>
</data>
<data name="_tbFindAny.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIGSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK
ZNg2j3Hf+9cTv395NuHPtgWMu6DCKGpQwMY5TAmb5jLu2zSXefnG2cweIPbvdzP/v71T+BchxrwcJA5S
C9WGABtmMu7//mry//cP278f3KB7HsT/9qL//8vzsT/WzWRcfXCNzvm31xuALur6D5KDakOA1ZOZDtw/
Ef7j6ZXE/69uFf/fv0rjwvuHzf9vnwz8tA/Ifnmz4D9IDqQGpBaqDQGWT2SwWt7PuHLPCuWbJ7dZvHh0
KfU/CN85Hfz/4cXk/yAxkBxIDUgtVBsmWNjF7LKgm+nQ4U1WH64d9fgPwiA2SAwkB1WGCWa3MljPaWNc
vWOl0c2Tm+1fXjns8h+Eb5zwB9PHNlu/3LFE6yZIDUgtVBsCTK1nOnL3RPSPWye9/18/5vJ/6SThyye3
mH6+dy4MzAaJ3Tjh8f/cUZ8fILVQbQjQV8F09M5pl/+nD5n9WNQtdKW/knHD2cNmP+6fD/wPkgOJgeRA
akB8qDYEaC9gSGnJYTzRksu4Hsj2BtE3jtv/fXrF5z9IHCYGZadAtaECK0MGKSiToTKZ8djdM/Z/7x62
/1mZxHgKKoyiBhvgBWJFIFb3s2eoqMvkuADC9iYMiSAxIFYGYgEgZgRirIADiMWAGGQLNiwOxFxAjNMA
EgEDAwCTAhzV5uBYSQAAAABJRU5ErkJggg==
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIHSURBVDhPY6AZ2LWY2XnXYsa9ILxzMVM8VBg/2DKfQQLK
ZNg2j3Hf+9f93z8+7v2zbQHjLqgwihoUsHEOU8KmuYz7Ns1lXr5xNrMHiP373cz/r27m/UWIMS8HiYPU
QrUhwIaZjPu/v5r8//3D9u8HN+ieB/G/vej///JM9I91MxlXH1yjc/7tlYbvX551/QfJQbUhwOrJTAfu
nwj/8fRK4v9Xt4r/71+lceH9w+b/t08GftoHZL+8WfAfJAdSA1IL1YYAyycyWC3vZ1y5Z4XyzZPbLF48
upT6H4TvnA7+//Bi8n+QGEgOpAakFqoNEyzsYnZZ0M106PAmqw/Xjnr8B2EQGyQGkoMqwwSzWxms57Qx
rt6x0ujmyc32L68cdvkPwjdO+IPpY5utX+5YonUTpAakFqoNAabWMx25eyL6x62T3v+vH3P5v3SS8OWT
W0w/3zsXBmaDxG6c8Ph/+qjPD5BaqDYE6KtgOnrntMv/E4fMfizqFrrSX8m44dRhsx/3zwf+B8mBxEBy
IDUgPlQbArQXMKS05DCeaMllXA9ke4Poq0fs/z694vMfJA4Tg7JToNpQgZUhgxSUyVCZzHjs1kn7v3cP
2P+sTGI8BRVGUYMN8AKxIhCr+9kzVNRlclwAYXsThkSQGBArA7EAEDMCMVbAAcRiQAyyBRsWB2IuIMZp
AImAgQEAGUocntp9HGkAAAAASUVORK5CYII=
</value>
</data>
<data name="_tbFindByte.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -734,12 +734,12 @@
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFzSURBVDhPrdFPRINxHMfx7+MZHTtGhy6dOqfrFKOS0qGS
Sf8oIx1SjCbbOtRSJLaU0Q6tZ2yasY3ZypJFZTrUqcNsUVGyUowO+bXP/J6f57k9Uw9vD7/f5/VcHvqX
J+skU3baZDubkjfVnGbKa9PeYQvDOdHpeEPrtaPt6P1kg5Uznlp+W4cu9RwbbGE4J0pPyt333r6c9gOh
pS5RcMGs+wC2MJwTpSZM80VlrvQcdzG1hHtAFHX0iHOELQznRMkx2Ve5C/2wQpipFcJ2UX5/VpwjbGE4
J4pb5b3v2wD7uvSJMp5hUdzVr7vDFoZzophV9ldu/OwjtyMCDNsttbey2Km7wxaGc6LIqBz4vNplb9kt
EbD2rQ1bGM6JQiPyYfl8m72k1w2FLQznRMEhSXmt/qKn5KqhsIXhnCgwKEUeE272EFsxFLYwnBN5e6VU
KepgxeNlQ2ELwzm1zLRLB2sW6aKeYGDxgcZqTdWa6wwG9i8P0S9ka92cta2x/QAAAABJRU5ErkJggg==
Sf8oIx1SjCbbOtRSJLaU0Q6tjU0zno3ZypJFZZJuHWaLipKVRnTIr33m9/w8z+2Zenh7+P0+r+fy0L88
WSeZstMm29mUvKnmNFNem/YOWxjOiU7HG1qvHW1H7ycbrJzx1PLbOnSp59hgC8M5UXpS7r739uW0Hwgv
dYmCC2bdB7CF4ZwoNWGaL4bmSs+Ki6kl3AOimKNHnCNsYTgnSo7Jvspt+IcVIkytELGL8vuz4hxhC8M5
kWKV977vAqxy6RNlPMMixdWvu8MWhnOiuFX2f9342UduRwQYsVtq79Bip+4OWxjOiaKjcuDzape9ZbdE
wNq3NmxhOCcKj8iH5fNt9pJeNxS2MJwTBYek0Gv1Fz0lVw2FLQznRIFBKfqYcLOH+IqhsIXhnMjbK6VK
MQcrHi8bClsYzqllpl06WLNIF/UEA4sPNFZrqtZcZzCwf3mIfgFEYd2QbOcxhgAAAABJRU5ErkJggg==
</value>
</data>
</root>