diff --git a/.vs/VisionEdit/v14/.suo b/.vs/VisionEdit/v14/.suo
index 37388b0..7a038c5 100644
Binary files a/.vs/VisionEdit/v14/.suo and b/.vs/VisionEdit/v14/.suo differ
diff --git a/CaliperTool/CaliperTool.csproj b/CaliperTool/CaliperTool.csproj
index c880084..4d97414 100644
--- a/CaliperTool/CaliperTool.csproj
+++ b/CaliperTool/CaliperTool.csproj
@@ -44,6 +44,7 @@
+
diff --git a/CaliperTool/CaliperToolRun.cs b/CaliperTool/CaliperToolRun.cs
index 58d8fc7..4308cc3 100644
--- a/CaliperTool/CaliperToolRun.cs
+++ b/CaliperTool/CaliperToolRun.cs
@@ -30,10 +30,10 @@ namespace CaliperTool
{
public class CaliperRun : IToolRun
{
- public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList)
+ public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
Caliper myCaliper = (Caliper)L_toolList[toolIndex].tool;
- VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName];
+ VisionJob myJob = (VisionJob)runJob;
for (int j = 0; j < inputItemNum; j++)
{
if (L_toolList[toolIndex].toolInput[j].IOName == "InputImage" && L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null)
@@ -73,13 +73,14 @@ namespace CaliperTool
myCaliper.Run(SoftwareRunState.Release);
if (myCaliper.toolRunStatu == ToolRunStatu.Succeed)
{
- myCaliper.DispMainWindow(FormImageWindow.Instance.myHWindow);
+ myCaliper.DispMainWindow(((FormImageWindow)myHalconWindowForm).myHWindow);
myJob.FormLogDisp(L_toolList[toolIndex].toolName + " 运行成功", Color.Green, selectNode);
}
else
{
myJob.FormLogDisp(L_toolList[toolIndex].toolName + " 运行失败", Color.Red, selectNode);
}
+ L_toolList[toolIndex].toolRunStatu = myCaliper.toolRunStatu;
}
}
diff --git a/CommonMethods/Interface/ToolRun.cs b/CommonMethods/Interface/ToolRun.cs
index 09e4df5..f0f1dd8 100644
--- a/CommonMethods/Interface/ToolRun.cs
+++ b/CommonMethods/Interface/ToolRun.cs
@@ -22,6 +22,6 @@ namespace CommonMethods.Interface
{
public interface IToolRun
{
- void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList);
+ void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindow);
}
}
diff --git a/EyeHandCalibTool/EyeHandCalibRun.cs b/EyeHandCalibTool/EyeHandCalibRun.cs
index 31d5ff5..854cbbd 100644
--- a/EyeHandCalibTool/EyeHandCalibRun.cs
+++ b/EyeHandCalibTool/EyeHandCalibRun.cs
@@ -11,9 +11,10 @@ namespace EyeHandCalibTool
{
public class EyeHandCalibRun : IToolRun
{
- public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList)
+ public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
// throw new NotImplementedException();
+
}
}
}
diff --git a/FindLine/FindLine.cs b/FindLine/FindLine.cs
index 1682b4a..5315c73 100644
--- a/FindLine/FindLine.cs
+++ b/FindLine/FindLine.cs
@@ -227,11 +227,15 @@ namespace FindLineTool
public void UpdateModelLineLocation()
{
// 计算新的位置线和转换之后位置线之间的差异,再将差异补偿到模板位置线中
- HOperatorSet.VectorToSimilarity(new HTuple(newExpectLineStartRow, newExpectLineEndRow), new HTuple(newExpectLineStartCol, newExpectLineEndCol),
+ if(newExpectLineStartRow.Type != HTupleType.EMPTY)
+ {
+ HOperatorSet.VectorToSimilarity(new HTuple(newExpectLineStartRow, newExpectLineEndRow), new HTuple(newExpectLineStartCol, newExpectLineEndCol),
new HTuple(expectLineStartRow, expectLineEndRow), new HTuple(expectLineStartCol, expectLineEndCol), out changePoseHomMat2D);
- // 更新位置
- HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelStartRow, modelStartCol, out modelStartRow, out modelStartCol);
- HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelEndRow, modelEndCol, out modelEndRow, out modelEndCol);
+ // 更新位置
+ HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelStartRow, modelStartCol, out modelStartRow, out modelStartCol);
+ HOperatorSet.AffineTransPixel(changePoseHomMat2D, modelEndRow, modelEndCol, out modelEndRow, out modelEndCol);
+ }
+
}
public override void Run(SoftwareRunState softwareRunState)
@@ -253,7 +257,7 @@ namespace FindLineTool
{
UpdateImage();
}
- if (inputPoseHomMat2D != null)
+ if (inputPoseHomMat2D.Type != HTupleType.EMPTY)
{
//对预期线的起始点做放射变换
HOperatorSet.AffineTransPixel(inputPoseHomMat2D, modelStartRow, modelStartCol, out newExpectLineStartRow, out newExpectLineStartCol);
diff --git a/FindLine/FindLineTool.csproj b/FindLine/FindLineTool.csproj
index 5b451a7..6e5d676 100644
--- a/FindLine/FindLineTool.csproj
+++ b/FindLine/FindLineTool.csproj
@@ -47,6 +47,7 @@
+
diff --git a/FindLine/FindLineToolRun.cs b/FindLine/FindLineToolRun.cs
index 1511e39..2b72051 100644
--- a/FindLine/FindLineToolRun.cs
+++ b/FindLine/FindLineToolRun.cs
@@ -31,10 +31,10 @@ namespace FindLineTool
{
public class FindLineRun : IToolRun
{
- public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList)
+ public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
FindLine myFindLine = (FindLine)L_toolList[toolIndex].tool;
- VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName];
+ VisionJob myJob = (VisionJob)runJob;
for (int j = 0; j < inputItemNum; j++)
{
if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null)
@@ -74,8 +74,9 @@ namespace FindLineTool
else
{
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myFindLine.runTime}", Color.Green, selectNode);
- myFindLine.DispMainWindow(FormImageWindow.Instance.myHWindow);
+ myFindLine.DispMainWindow(((FormImageWindow)myHalconWindowForm).myHWindow);
}
+ L_toolList[toolIndex].toolRunStatu = myFindLine.toolRunStatu;
}
}
}
diff --git a/FindLine/FormFindLine.cs b/FindLine/FormFindLine.cs
index 65befc5..6f01142 100644
--- a/FindLine/FormFindLine.cs
+++ b/FindLine/FormFindLine.cs
@@ -87,7 +87,7 @@ namespace FindLineTool
chBDispRec.Checked = myFindLine.dispRec;
chBDispCross.Checked = myFindLine.dispCross;
//// 将要编辑的线显示
- selected_drawing_object = myFindLine.inputPoseHomMat2D != null? HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, new HTuple[] { myFindLine.newExpectLineStartRow, myFindLine.newExpectLineStartCol, myFindLine.newExpectLineEndRow, myFindLine.newExpectLineEndCol })
+ selected_drawing_object = myFindLine.inputPoseHomMat2D.Length != 0? HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, new HTuple[] { myFindLine.newExpectLineStartRow, myFindLine.newExpectLineStartCol, myFindLine.newExpectLineEndRow, myFindLine.newExpectLineEndCol })
:HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.LINE, new HTuple[] {myFindLine.modelStartRow, myFindLine.modelStartCol, myFindLine.modelEndRow, myFindLine.modelEndCol });
GC.KeepAlive(selected_drawing_object);
selected_drawing_object.OnSelect(OnSelectDrawingObject);
diff --git a/FormLib/FormHalconWindow.Designer.cs b/FormLib/FormHalconWindow.Designer.cs
new file mode 100644
index 0000000..142670a
--- /dev/null
+++ b/FormLib/FormHalconWindow.Designer.cs
@@ -0,0 +1,65 @@
+namespace FormLib
+{
+ partial class FormHalconWindow
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormHalconWindow));
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.SuspendLayout();
+ //
+ // panel1
+ //
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel1.Location = new System.Drawing.Point(0, 0);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(831, 549);
+ this.panel1.TabIndex = 0;
+ //
+ // FormHalconWindow
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(831, 549);
+ this.Controls.Add(this.panel1);
+ this.Font = new System.Drawing.Font("微软雅黑", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FormHalconWindow";
+ this.Text = "图像显示";
+ this.Load += new System.EventHandler(this.FormHalconWindow_Load);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel panel1;
+ }
+}
\ No newline at end of file
diff --git a/FormLib/FormHalconWindow.cs b/FormLib/FormHalconWindow.cs
new file mode 100644
index 0000000..6f6f839
--- /dev/null
+++ b/FormLib/FormHalconWindow.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using ViewROI;
+
+namespace FormLib
+{
+ public partial class FormHalconWindow : Form
+ {
+ public HWindowTool_Smart myHWindow = new HWindowTool_Smart();
+ public string WindowName { get; set; }
+
+ public FormHalconWindow(string inputName)
+ {
+ InitializeComponent();
+ WindowName = inputName;
+ }
+
+ private void FormHalconWindow_Load(object sender, EventArgs e)
+ {
+ panel1.Controls.Add(myHWindow);
+ myHWindow.Dock = DockStyle.Fill;
+ }
+ public void ClearWindow()
+ {
+ myHWindow.DispHWindow.ClearWindow();
+ }
+ }
+}
diff --git a/FormLib/FormHalconWindow.resx b/FormLib/FormHalconWindow.resx
new file mode 100644
index 0000000..34500af
--- /dev/null
+++ b/FormLib/FormHalconWindow.resx
@@ -0,0 +1,569 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAIAMDAAAAEAIACoJQAAJgAAAEBAAAABACAAKEIAAM4lAAAoAAAAMAAAAGAAAAABACAAAAAAAFAl
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACogIE83LCu6Mykn5DMp
+ JugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSboMykm6DMp
+ JugzKSboMykm6DMpJugzKSboMykm6DMpJugzKSfkNywruSshHk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5HBwJNSoou0c7
+ OvGSg4T/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66d
+ nv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/rp2e/66dnv+unZ7/koOD/0Y7OfE1Kii4ORwcCQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAA0KimwZFhX98Cwsf+hkY//ZFpO/1lOQP9ZTkD/WU5A/1lOQP9ZTkD/TEIz/0U8Lf9FPC3/RTwt/0U8
+ Lf9FPC3/RTwt/0U8Lf9FPC3/RTwt/0U8Lf9FPC3/RTwt/0U8Lf9NRTn/WFBE/1hQRP9kW1L/o5OQ/8Gv
+ sP9iV1b2NCsprQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAACsjH0I/NTPywK+v/3NpWf9YUiL/k5ME/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/o6MB/2FgHv+TrUv/oL5S/6C+
+ Uv+PpUv/Vlc3/3VsYP+/r7D/PzQz8i0gID8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUqKamJeXn+qpuY/1ZQJP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+jowH/YmAe/5Ot
+ S/+gvlL/oL5S/6C+Uv+gvlL/oL5S/1NTN/+snZz/h3d3/jUrKqUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADctK9SklJX/dmtf/4N/Cf+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6Sk
+ Af9iYB7/k6xM/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32PRP92a2P/o5SU/zgtK9IAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OT
+ BP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/paQA/2VkHP+QqEn/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/42nSv9kXFD/qpqa/zUr
+ KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr
+ Ktyqmpr/ZFpL/5OTBP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+lpAD/ZWQc/5CoSf+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/42n
+ Sv9kXFD/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OTBP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6WkAP9lZB3/kKhJ/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/n71R/2tvRv+Bd23/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OTBP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/paQA/15ZG/+QqEn/oL5S/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/oL5S/6C+Uv+fvVL/cnZJ/723mf+QhHv/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZFpL/5OTBP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+lpAD/cGov/6ymh/9zekj/oL5S/6C+
+ Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/5+9Uv9ydkn/ysOk/93Yt/+QhHv/qpqa/zUrKtwAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/ZVtM/5CP
+ Bf+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6SkAP9waTL/1M6u/+3n
+ xP/CvJz/c3pI/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/n71S/3F2Sf/JxKX/7efE/93Yt/+QhHv/qpqa/zUr
+ KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr
+ Ktyqmpr/iH10/2diMf+goAH/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pKQA/25p
+ L//Tza3/7efE/+3nxP/t58T/wryc/3N6SP+gvlL/oL5S/6C+Uv+fvVL/cHVI/8rFpf/t58T/7efE/93Y
+ t/+QhHv/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAADUrKtyqmpr/kIR7/8zFp/9vaDT/oqIB/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+lpQD/cGov/9DKqf/t58T/7efE/+3nxP/t58T/7efE/8K8nP9zekj/oL5S/5+9Uv9wdUj/ysWl/+3n
+ xP/t58T/7efE/+fiwP+1qJ7/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//b1LT/cGk0/6KiAf+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6WlAP9vaS//zMWm/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/Jw6P/amxI/2ts
+ Sv/Sy6v/7efE/+3nxP/t58T/7efE/+jjwP+6raL/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/2tOz/3Bp
+ Nf+jowH/pqYA/6amAP+mpgD/paUA/29pL//Mxab/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/93Yt/+QhHv/qpqa/zUrKtwAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Y
+ t//t58T/7efE/9rTs/9waTX/o6MB/6amAP+lpQD/dG4w/8zFpv/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+Lbuv+ckYf/qpqa/zUr
+ KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr
+ Ktyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/d2Lf/cWk7/4yKBv9wajP/08yt/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/SxLf/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/5t+9/7Coif/g2rn/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/xcOp/3qIfv98iX3/19Kz/+3n
+ xP/t58T/7efE/97Yt/+RhXz/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/AvqT/U4yR/1zl
+ +P9a4fP/Vn1+/9nTtP/t58T/7efE/+vkwv/FuKz/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP9yhX3/XOb5/1zm+f9c5vn/Wt3u/4aQgv/t58T/7efE/+3nxP/Txrn/qpqa/zUrKtwAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUrKtyqmpr/kIR7/93Y
+ t//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP9yhn7/XOb5/1zm+f9c5vn/Wt3u/4eQg//t58T/7efE/+3nxP/Txrn/qpqa/zUr
+ KtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUr
+ Ktyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP+8uqL/UYqO/1zl+P9a4fP/U3h5/9jSs//t58T/7efE/+3n
+ xP/Txrn/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAADUrKtyqmpr/kIR7/93Yt//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/wsCl/3qIfv98iX3/08+x/+3n
+ xP/t58T/7efE/+3nxP/Txrn/qpqa/zUrKtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADctK9SklJX/m4+H/8/Iqv/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/Pwbf/o5SU/zgtK9IAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUqKamJeXn+t6il/5aPe//t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+vkw//FtrT/h3d3/jUrKqUAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkiHkRCNzbywLCx/5uP
+ hf+ak37/1tCx/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7OXD/9HEuf/Br7D/QDY08isf
+ H0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAA0Kym6ZllY9sCwsf+zo6D/kIN7/3xyaf98cmn/fHJp/3xyaf98cmn/fHJp/3xyaf98cmn/fHJp/3xy
+ af98cmn/fHJp/3xyaf98cmn/fHJp/3xyaf98cmn/fHJp/3xyaf9/dGv/18y5/9nOvP/Ux7n/yLi0/8Gv
+ sP9lWFf2NSoptgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAzGhoKNSoou0c7OvGSg4T/r56f/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7in
+ qP+4p6j/uKeo/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7inqP+4p6j/uKeo/7in
+ qP+vnp//koOD/0Y7OfE1Kii4ORwcCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACogIE83LCu6Mykn5C8lI/UvJSP1LyUj9S8l
+ I/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8lI/UvJSP1LyUj9S8l
+ I/UvJSP1LyUj9S8lI/UzKSfkNywruSshHk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+ AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP//
+ /////wAA/+AAAAf/AAD/gAAAAf8AAP8AAAAA/wAA/wAAAAD/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/
+ AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4A
+ AAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/
+ AAD+AAAAAH8AAP4AAAAAfwAA/gAAAAB/AAD+AAAAAH8AAP8AAAAA/wAA/wAAAAD/AAD/gAAAAf8AAP/g
+ AAAH/wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
+ AAD///////8AAP///////wAAKAAAAEAAAACAAAAAAQAgAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAABKSIfSi0gHp8vJSTJLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8l
+ JNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8lJNMvJSTTLyUk0y8l
+ JNMvJSTTLyUk0y8lJNMvJSTTLyUkyS0gHp8pIh9KAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAsHx8pLyUjziwiIf1RRkX5dWhn/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3tt
+ bf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3tt
+ bf97bW3/e21t/3ttbf97bW3/e21t/3ttbf97bW3/e21t/3VoZ/9RRUT5KyIg/jAmI8wuISEnAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsIx86LSQh9FNHRvusnJz/wrGy/8Kxsv/CsbL/wrGy/8Kx
+ sv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kx
+ sv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/6uc
+ nP9RRkX7LSQi8y0fHzkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHx8ZLiQi7mRYWP3AsLH/wrGy/4J4
+ cP9KQTb/RTwx/0U8Mf9FPDH/RTwx/0U8Mf9FPDH/RTwx/z40Kv84LyT/OC8k/zgvJP84LyT/OC8k/zgv
+ JP84LyT/OC8k/zgvJP84LyT/OC8k/zgvJP84LyT/OC8k/zgvJP84LyT/OC8k/zgvJP8/Ni//RT00/0U9
+ NP9FPTT/SkI5/4R4c//CsbL/wLCx/2RWVvwuJSLtLCEhFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCIgnT81
+ M/m+ra7/wa6u/0M5Lv9NRR3/jIoI/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/4+N
+ Bv9PTSX/mrZQ/6C+Uv+gvlL/oL5S/4ecSP9LSjD/RDw0/8Gurv+9rK3/PjMx+S0jIJkAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAMxoaCiwjIfmNf37/wrGy/1RKPv9mYRT/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/4+NBv9PTSX/mbZP/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/2NrOv9WTUP/wrGy/4x9
+ ff8tIyH4ORwcCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAACsjH0IsIiD+uqqr/7ysrf87MiT/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/5COBv9QTiX/mbZP/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/OzMp/72urv+6qar/KyEf/y0gID8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsIR5dNSsp+cKxsv+Zi4f/T0kf/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5COBv9PTiX/mbZP/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/05NMv+bjYr/wrGy/zQqKPksIR5cAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjou
+ LPjCsbL/koV//1RNHf+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5OSBf9OSyT/l7JO/6C+
+ Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv9SVDP/koV//8Kxsv86Liz4KyEeZgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAACshHmY6Liz4wrGy/5KFf/9UTR3/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5OS
+ Bf9OSyT/l7JO/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/UlQz/5KF
+ f//CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+ShX//VE0d/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/5OSBf9OSyT/l7JO/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/oL5S/01MMv+ThoH/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/koV//1RN
+ Hf+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/5OSBf9OSyT/l7JO/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/3yLRf9UTUD/qZ2W/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsh
+ HmY6Liz4wrGy/5KFf/9UTR3/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5OSBP9NSSP/l7JO/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32MRv90b1n/lo96/6udl//CsbL/Oi4s+Csh
+ HmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+ShX//VE0d/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5STBf9WTjP/V1Q8/5m0
+ T/+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32MRv90b1n/6+XC/5eQ
+ e/+rnZf/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/koV//1RNHf+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5ST
+ Bf9bUjb/3ti3/9LMrP9bWT//mrVP/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/6C+Uv+gvlL/oL5S/32N
+ Rv91b1n/6+XC/+3nxP+XkHv/q52X/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/5KF
+ gP9RSh7/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/5KQB/9dVTr/4tu6/+3nxP/t58T/0sys/1tZP/+atU//oL5S/6C+Uv+gvlL/oL5S/6C+
+ Uv+gvlL/oL5S/36NRv92cFr/7ObD/+3nxP/t58T/l5B7/6udl//CsbL/Oi4s+CshHmYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAArIR5mOi4s+MKxsv+qnJX/UUk3/4eDDP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/5KQBv9dVDj/4tu6/+3nxP/t58T/7efE/+3nxP/SzKz/XFo//5q1
+ T/+gvlL/oL5S/6C+Uv+gvlL/oL5S/36NRv92cFr/7ObD/+3nxP/t58T/7efE/5eQe/+rnZf/wrGy/zou
+ LPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/q52X/5WNef9rZEb/i4gL/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5STBf9bUzf/3di3/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/9LMrP9cWj//mrVP/6C+Uv+gvlL/oL5S/3+NR/93cVv/7ObD/+3nxP/t58T/7efE/+3n
+ xP+akXz/rZ+a/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/6udl/+XkHv/6ePB/2pj
+ R/+LiAv/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5WUBf9bUjf/3di3/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/0sys/1xaP/+atU//oL5S/4GTSP93c1z/7ObD/+3n
+ xP/t58T/7efE/+3nxP/t58T/6uTB/8q8tf/CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKx
+ sv+rnZf/l5B7/+3nxP/n4sD/ZV5D/4uIC/+mpgD/pqYA/6amAP+mpgD/pqYA/6amAP+mpgD/pqYA/5WU
+ Bf9bUzf/3di3/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/X0bL/ZWFJ/2Bg
+ Qv+OiW7/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/721m/+5rKb/wrGy/zouLPgrIR5mAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAKyEeZjouLPjCsbL/q52X/5eQe//t58T/7efE/+fiwP9lXkP/jIkL/6amAP+mpgD/pqYA/6am
+ AP+mpgD/pqYA/5aVBf9dVTn/3di3/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP+XkHv/q52X/8Kx
+ sv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/6udl/+XkHv/7efE/+3nxP/t58T/5+LA/2Vd
+ RP+MiQv/pqYA/6amAP+mpgD/pqYA/5eWBf9dVTn/3di3/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/l5B7/6udl//CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+rnZf/l5B7/+3n
+ xP/t58T/7efE/+3nxP/n4b//ZVxD/4yJC/+mpgD/pqYA/5eWBf9dVTn/3di3/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/8K7oP+8rqj/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjou
+ LPjCsbL/q52X/5eQe//t58T/7efE/+3nxP/t58T/7efE/+njwf9qYUj/fnoT/4SADf9eVjv/4Nq5/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/m373/yLu0/8Kxsv86Liz4KyEeZgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAACshHmY6Liz4wrGy/6udl/+XkHv/7efE/+3nxP/t58T/7efE/+3nxP/t58T/6+XC/7Cp
+ jP+ooYT/5+G//+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/r5cL/sq6V/4yPfv+tqJH/6OPA/+3nxP/t58T/7efE/+3nxP/t58T/mZB8/6ue
+ mP/CsbL/Oi4s+CshHmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+rnZf/l5B7/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/j3bz/WGBa/02Zov9UxdX/TqKt/1JeWf/Z0rL/7efE/+3n
+ xP/t58T/7efE/7Gpkf+2qKL/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/q52X/5eQ
+ e//t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/dXpu/1XC0P9c5vn/XOb5/1zm
+ +f9X0OH/ZGtk/+3nxP/t58T/7efE/+3nxP/t58T/yry1/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsh
+ HmY6Liz4wrGy/6udl/+XkHv/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/1Rn
+ ZP9c5vn/XOb5/1zm+f9c5vn/XOb5/1Bsav/q5MH/7efE/+3nxP/t58T/7efE/8q8tf/CsbL/Oi4s+Csh
+ HmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAArIR5mOi4s+MKxsv+rnZf/l5B7/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP9UaGX/XOb5/1zm+f9c5vn/XOb5/1zm+f9QbGr/6uTB/+3nxP/t58T/7efE/+3n
+ xP/KvLX/wrGy/zouLPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyEeZjouLPjCsbL/q52X/5eQe//t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/dXpu/1XC0P9c5vn/XOb5/1zm+f9X0OH/ZGtk/+3n
+ xP/t58T/7efE/+3nxP/t58T/yry1/8Kxsv86Liz4KyEeZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACshHmY6Liz4wrGy/6ud
+ l/+XkHv/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+PdvP9YYFr/TZmi/1TF
+ 1f9Ooq3/Ul5Z/9nSsv/t58T/7efE/+3nxP/t58T/7efE/8q8tf/CsbL/Oi4s+CshHmYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAArIR5mOi4s+MKxsv+rnZf/l5B7/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/6+XC/7Kulf+Mj37/raiR/+jjwP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/KvLX/wrGy/zou
+ LPgrIR5mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAALCEeXTUrKfnCsbL/r6Cc/5GKd//t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/ybq1/8Kxsv80Kij5LCEeXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsjH0IsIiD+uqqr/7+vr/9rY1f/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/6+TD/8Sysv+6qar/KyEf/y0gID8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzGhoKLCMh+Y1/
+ f//CsbL/fnJp/7Gpkf/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/9jNvP/CsbL/jH19/y0jIfg5HBwJAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAC0kIp5EODb5wK+v/8Gwr/9vZFv/jYVy/9bQsf/p48H/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3n
+ xP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/+3nxP/t58T/7efE/97Uvv/DsrL/v6+w/0I2
+ NfouJCGbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApHx8ZLiQi72hbWv3BsLH/wrGy/6KWjv93bWT/al9X/2dd
+ VP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2dd
+ VP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9nXVT/Z11U/2ddVP9qX1b/1cu2/9/Vvv/d077/2s+8/82/
+ t//CsbL/wbCx/2ZaWf0vJSLtLCEhFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwjHzouJCL1Wk5N/K+f
+ oP/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kx
+ sv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kxsv/CsbL/wrGy/8Kx
+ sv/CsbL/wrGy/8Kxsv/CsbL/r56f/1lNTPwuJSL0LR8fOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAALB8fKTEmJM8sIiH9UUZF+XVoZ/+DdXT/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3
+ d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4V3
+ d/+Fd3f/hXd3/4V3d/+Fd3f/hXd3/4N1dP91aGf/UUVE+SsiIP4wJiTOLiEhJwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKSIfSi0gHp8vJSTJLyYj3y8mJOQvJiTkLyYk5C8m
+ JOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8m
+ JOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiTkLyYk5C8mJOQvJiPfLyUkyS0gHp8pIh9KAAAAAQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD/////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////gAAAAB////4AAAAAB////AAAAAA
+ D///4AAAAAAH///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///A
+ AAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAA
+ A///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///A
+ AAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAA
+ A///wAAAAAAD///AAAAAAAP//8AAAAAAA///4AAAAAAH///wAAAAAA////gAAAAAH////gAAAAB/////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////w==
+
+
+
\ No newline at end of file
diff --git a/FormLib/FormImageWindow.cs.Designer.cs b/FormLib/FormImageWindow.cs.Designer.cs
index 77cd2cb..2da60cd 100644
--- a/FormLib/FormImageWindow.cs.Designer.cs
+++ b/FormLib/FormImageWindow.cs.Designer.cs
@@ -65,6 +65,8 @@ namespace FormLib
this.Controls.Add(this.panel1);
this.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
this.Name = "FormImageWindow";
this.Text = "图像";
this.Load += new System.EventHandler(this.FormImageWindow_Load);
diff --git a/FormLib/FormImageWindow.cs.cs b/FormLib/FormImageWindow.cs.cs
index 9f1848f..bbc195b 100644
--- a/FormLib/FormImageWindow.cs.cs
+++ b/FormLib/FormImageWindow.cs.cs
@@ -14,9 +14,11 @@ using WeifenLuo.WinFormsUI.Docking;
namespace FormLib
{
+ [Serializable]
public partial class FormImageWindow : DockContent
{
public HWindowTool_Smart myHWindow = new HWindowTool_Smart();
+ public string WindowName { get; set; }
public FormImageWindow()
{
InitializeComponent();
diff --git a/FormLib/FormLib.csproj b/FormLib/FormLib.csproj
index 9dcda7f..d7f952b 100644
--- a/FormLib/FormLib.csproj
+++ b/FormLib/FormLib.csproj
@@ -60,6 +60,12 @@
+
+ Form
+
+
+ FormHalconWindow.cs
+
Form
@@ -87,6 +93,9 @@
+
+ FormHalconWindow.cs
+
FormImageWindow.cs.cs
diff --git a/HDevEngineTool/FormHDevEngineTool.cs b/HDevEngineTool/FormHDevEngineTool.cs
index 7c174e7..91b2c5b 100644
--- a/HDevEngineTool/FormHDevEngineTool.cs
+++ b/HDevEngineTool/FormHDevEngineTool.cs
@@ -121,6 +121,7 @@ namespace HDevEngineTool
if(myHDevEngine.ProgramCall != null)
{
myHDevEngine.ProgramCall.Execute();
+ // HTuple a = myHDevEngine.ProgramCall.GetCtrlVarTuple("RunTime");
}
}
diff --git a/HDevEngineTool/HDevEngineCode.cs b/HDevEngineTool/HDevEngineCode.cs
index 0f8dcda..0d061ae 100644
--- a/HDevEngineTool/HDevEngineCode.cs
+++ b/HDevEngineTool/HDevEngineCode.cs
@@ -54,8 +54,10 @@ namespace HDevEngineTool
MyProgram.LoadProgram(CodeFilePath);
ProgramCall = new HDevProgramCall(MyProgram);
MyEngine.SetHDevOperators(new HDevOpMultiWindowImpl(FormHDevEngineTool.Instance.myHwindow.SmartWindow.HalconWindow));
+
}
ProgramCall.Execute();
+ // HTuple a = MyEngine.GetGlobalCtrlVarTuple("RunTime");
}
}
}
diff --git a/HDevEngineTool/HDevEngineToolRun.cs b/HDevEngineTool/HDevEngineToolRun.cs
index dd9e327..7ef80f5 100644
--- a/HDevEngineTool/HDevEngineToolRun.cs
+++ b/HDevEngineTool/HDevEngineToolRun.cs
@@ -11,7 +11,7 @@ namespace HDevEngineTool
{
public class HDevEngineToolRun : IToolRun
{
- public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList)
+ public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
}
diff --git a/HalconTool/HalconTool.csproj b/HalconTool/HalconTool.csproj
index be28bfd..9daba0d 100644
--- a/HalconTool/HalconTool.csproj
+++ b/HalconTool/HalconTool.csproj
@@ -50,6 +50,7 @@
+
diff --git a/HalconTool/HalconToolRun.cs b/HalconTool/HalconToolRun.cs
index cd3dc4a..9acfafa 100644
--- a/HalconTool/HalconToolRun.cs
+++ b/HalconTool/HalconToolRun.cs
@@ -27,11 +27,11 @@ namespace HalconTool
{
public class HalconToolRun : IToolRun
{
- public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList)
+ public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
Type a = this.GetType();
HalconTool myHalconTool = (HalconTool)L_toolList[toolIndex].tool;
- VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName];
+ VisionJob myJob = (VisionJob)runJob;
myHalconTool.Run(SoftwareRunState.Release);
if (myHalconTool.toolRunStatu != ToolRunStatu.Succeed)
{
@@ -40,9 +40,10 @@ namespace HalconTool
else
{
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myHalconTool.runTime}", Color.Green, selectNode);
- FormImageWindow.Instance.myHWindow.DispImage(myHalconTool.outputImage);
+ ((FormImageWindow)myHalconWindowForm).myHWindow.DispImage(myHalconTool.outputImage);
L_toolList[toolIndex].toolOutput[0] = new ToolIO("OutputImage", myHalconTool.outputImage, DataType.Image);
}
+ L_toolList[toolIndex].toolRunStatu = myHalconTool.toolRunStatu;
}
}
}
diff --git a/ImageWindow/HWindow_Final.resx b/ImageWindow/HWindow_Final.resx
index 589e3e9..faac048 100644
--- a/ImageWindow/HWindow_Final.resx
+++ b/ImageWindow/HWindow_Final.resx
@@ -125,7 +125,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADk
- CAAAAk1TRnQBSQFMAgEBAgEAASABAQEgAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ CAAAAk1TRnQBSQFMAgEBAgEAASgBAQEoAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
diff --git a/PMAlignTool/FormPMAlignTool.cs b/PMAlignTool/FormPMAlignTool.cs
index 27e3768..198c79d 100644
--- a/PMAlignTool/FormPMAlignTool.cs
+++ b/PMAlignTool/FormPMAlignTool.cs
@@ -24,7 +24,7 @@ namespace PMAlignTool
private HDrawingObject serachRegion_drawing_object = new HDrawingObject();
public List templateModelListAdd = new List() { };
public List templateModelListSub = new List() { };
- public List templateModelList = new List() { };
+
public FormPMAlignTool(ref object pmalign)
{
InitializeComponent();
@@ -191,7 +191,7 @@ namespace PMAlignTool
{
if(myPMAlign.inputImage != null)
{
- if(myPMAlign.CreateModelTemplate() == 0)
+ if(myPMAlign.CreateModelTemplate(false, null) == 0)
{
if (myPMAlign.matchMode == MatchMode.BasedShape)
{
diff --git a/PMAlignTool/PMAlign.cs b/PMAlignTool/PMAlign.cs
index 68b743b..e8c81d2 100644
--- a/PMAlignTool/PMAlign.cs
+++ b/PMAlignTool/PMAlign.cs
@@ -276,17 +276,25 @@ namespace PMAlignTool
maxScale = FormPMAlignTool.Instance.nud_ScaleRange.Value;
}
- public int CreateModelTemplate()
+ public int CreateModelTemplate(bool setInputModelRegion, HObject inputModelRegion)
{
HObject template;
oldTrainImage = inputImage;
- if (FormPMAlignTool.Instance.templateModelListAdd.Count == 0)
+ // 判断是否从外部输入模板
+ if(setInputModelRegion)
{
- LoggerClass.WriteLog($"{toolName}未划定模板建立区域", MsgLevel.Exception);
- isCreateModel = false;
- return -1;
+ templateRegion = inputModelRegion;
+ }
+ else
+ {
+ if (FormPMAlignTool.Instance.templateModelListAdd.Count == 0)
+ {
+ LoggerClass.WriteLog($"{toolName}未划定模板建立区域", MsgLevel.Exception);
+ isCreateModel = false;
+ return -1;
+ }
+ CreateModelRegion();
}
- CreateModelRegion();
HObject createModelImg;
HOperatorSet.GenEmptyObj(out createModelImg);
createModelImg = ProcessImage(inputImage);
diff --git a/PMAlignTool/PMAlignTool.csproj b/PMAlignTool/PMAlignTool.csproj
index f76ce52..c491556 100644
--- a/PMAlignTool/PMAlignTool.csproj
+++ b/PMAlignTool/PMAlignTool.csproj
@@ -55,6 +55,7 @@
+
diff --git a/PMAlignTool/PMAlignToolRun.cs b/PMAlignTool/PMAlignToolRun.cs
index 2e07664..1f7908e 100644
--- a/PMAlignTool/PMAlignToolRun.cs
+++ b/PMAlignTool/PMAlignToolRun.cs
@@ -31,11 +31,10 @@ namespace PMAlignTool
{
public class PMAlignToolRun : IToolRun
{
- public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList)
+ public void ToolRun(string jobName, int toolIndex, int inputItemNum, TreeNode selectNode, List L_toolList, IVisionJob runJob, Form myHalconWindowForm)
{
PMAlign myPMAlign = (PMAlign)L_toolList[toolIndex].tool;
-
- VisionJob myJob = VisionJobParams.pVisionProject.Project[jobName];
+ VisionJob myJob = (VisionJob)runJob;
for (int j = 0; j < inputItemNum; j++)
{
if (L_toolList[toolIndex].GetInput(L_toolList[toolIndex].toolInput[j].IOName).value == null)
@@ -64,7 +63,7 @@ namespace PMAlignTool
else
{
myJob.FormLogDisp($"{L_toolList[toolIndex].toolName} 运行成功,{myPMAlign.runTime}", Color.Green, selectNode);
- myPMAlign.DispMainWindow(FormImageWindow.Instance.myHWindow);
+ myPMAlign.DispMainWindow(((FormImageWindow)myHalconWindowForm).myHWindow);
// 将输出值赋值到界面输出中
if (myPMAlign.L_resultList.Count > 0)
{
@@ -75,6 +74,7 @@ namespace PMAlignTool
L_toolList[toolIndex].toolOutput[4] = new ToolIO("GetPose.Score", myPMAlign.L_resultList[0].Socre, DataType.DoubleValue);
}
}
+ L_toolList[toolIndex].toolRunStatu = myPMAlign.toolRunStatu;
}
}
}
diff --git a/ToolLib.Log/Logger/UserLogger.cs b/ToolLib.Log/Logger/UserLogger.cs
index 1ba61ca..b31aecf 100644
--- a/ToolLib.Log/Logger/UserLogger.cs
+++ b/ToolLib.Log/Logger/UserLogger.cs
@@ -176,14 +176,17 @@ namespace Logger
{
lock(myObject)
{
- LogInfo log = LoggerClass.logQueue.Dequeue();
- if (log.ex != null)
+ if(LoggerClass.logQueue.Count > 0)
{
- AddLog(log.logLevel, log.message, log.ex);
- }
- else
- {
- AddLog(log.logLevel, log.message);
+ LogInfo log = LoggerClass.logQueue.Dequeue();
+ if (log.ex != null)
+ {
+ AddLog(log.logLevel, log.message, log.ex);
+ }
+ else
+ {
+ AddLog(log.logLevel, log.message);
+ }
}
}
}
diff --git a/ToolLib.VisionJob/FormJobManage.Designer.cs b/ToolLib.VisionJob/FormJobManage.Designer.cs
index b1706cb..4b603b8 100644
--- a/ToolLib.VisionJob/FormJobManage.Designer.cs
+++ b/ToolLib.VisionJob/FormJobManage.Designer.cs
@@ -32,10 +32,14 @@ namespace ToolLib.VisionJob
this.tabJobUnion = new System.Windows.Forms.TabControl();
this.btnCycleRun = new System.Windows.Forms.Button();
this.btnSignael = new System.Windows.Forms.Button();
- this.picDeleteJob = new System.Windows.Forms.PictureBox();
this.picNewJob = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).BeginInit();
+ this.picDeleteJob = new System.Windows.Forms.PictureBox();
+ this.picSaveJob = new System.Windows.Forms.PictureBox();
+ this.picOpenJob = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.picNewJob)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.picSaveJob)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.picOpenJob)).BeginInit();
this.SuspendLayout();
//
// tabJobUnion
@@ -70,17 +74,6 @@ namespace ToolLib.VisionJob
this.btnSignael.UseVisualStyleBackColor = true;
this.btnSignael.Click += new System.EventHandler(this.btnSignael_Click);
//
- // picDeleteJob
- //
- this.picDeleteJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
- this.picDeleteJob.Image = ((System.Drawing.Image)(resources.GetObject("picDeleteJob.Image")));
- this.picDeleteJob.Location = new System.Drawing.Point(53, 595);
- this.picDeleteJob.Name = "picDeleteJob";
- this.picDeleteJob.Size = new System.Drawing.Size(35, 40);
- this.picDeleteJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.picDeleteJob.TabIndex = 2;
- this.picDeleteJob.TabStop = false;
- //
// picNewJob
//
this.picNewJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
@@ -93,11 +86,48 @@ namespace ToolLib.VisionJob
this.picNewJob.TabStop = false;
this.picNewJob.Click += new System.EventHandler(this.picNewJob_Click);
//
+ // picDeleteJob
+ //
+ this.picDeleteJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.picDeleteJob.Image = ((System.Drawing.Image)(resources.GetObject("picDeleteJob.Image")));
+ this.picDeleteJob.Location = new System.Drawing.Point(53, 595);
+ this.picDeleteJob.Name = "picDeleteJob";
+ this.picDeleteJob.Size = new System.Drawing.Size(35, 40);
+ this.picDeleteJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+ this.picDeleteJob.TabIndex = 2;
+ this.picDeleteJob.TabStop = false;
+ //
+ // picSaveJob
+ //
+ this.picSaveJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.picSaveJob.Image = ((System.Drawing.Image)(resources.GetObject("picSaveJob.Image")));
+ this.picSaveJob.Location = new System.Drawing.Point(94, 595);
+ this.picSaveJob.Name = "picSaveJob";
+ this.picSaveJob.Size = new System.Drawing.Size(35, 40);
+ this.picSaveJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+ this.picSaveJob.TabIndex = 2;
+ this.picSaveJob.TabStop = false;
+ this.picSaveJob.Click += new System.EventHandler(this.picSaveJob_Click);
+ //
+ // picOpenJob
+ //
+ this.picOpenJob.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.picOpenJob.Image = ((System.Drawing.Image)(resources.GetObject("picOpenJob.Image")));
+ this.picOpenJob.Location = new System.Drawing.Point(135, 595);
+ this.picOpenJob.Name = "picOpenJob";
+ this.picOpenJob.Size = new System.Drawing.Size(35, 40);
+ this.picOpenJob.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+ this.picOpenJob.TabIndex = 2;
+ this.picOpenJob.TabStop = false;
+ this.picOpenJob.Click += new System.EventHandler(this.picOpenJob_Click);
+ //
// FormJobManage
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(372, 636);
+ this.Controls.Add(this.picOpenJob);
+ this.Controls.Add(this.picSaveJob);
this.Controls.Add(this.picDeleteJob);
this.Controls.Add(this.picNewJob);
this.Controls.Add(this.btnSignael);
@@ -108,8 +138,10 @@ namespace ToolLib.VisionJob
this.Name = "FormJobManage";
this.Text = "JobManage";
this.Load += new System.EventHandler(this.FormJobManage_Load);
- ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.picNewJob)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.picDeleteJob)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.picSaveJob)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.picOpenJob)).EndInit();
this.ResumeLayout(false);
}
@@ -117,8 +149,10 @@ namespace ToolLib.VisionJob
#endregion
private System.Windows.Forms.Button btnCycleRun;
private System.Windows.Forms.Button btnSignael;
+ public System.Windows.Forms.TabControl tabJobUnion;
private System.Windows.Forms.PictureBox picNewJob;
private System.Windows.Forms.PictureBox picDeleteJob;
- public System.Windows.Forms.TabControl tabJobUnion;
+ private System.Windows.Forms.PictureBox picSaveJob;
+ private System.Windows.Forms.PictureBox picOpenJob;
}
}
\ No newline at end of file
diff --git a/ToolLib.VisionJob/FormJobManage.cs b/ToolLib.VisionJob/FormJobManage.cs
index d7870d9..dd8b4ae 100644
--- a/ToolLib.VisionJob/FormJobManage.cs
+++ b/ToolLib.VisionJob/FormJobManage.cs
@@ -62,5 +62,35 @@ namespace ToolLib.VisionJob
}
}
}
+
+ private void picSaveJob_Click(object sender, EventArgs e)
+ {
+ SaveFileDialog myDia = new SaveFileDialog();
+ string jobName = tabJobUnion.SelectedTab.Text;
+ myDia.Title = "保存job文件";
+ myDia.Filter = "job文件(*.job)|*.job";
+ myDia.FilterIndex = 1;
+ myDia.FileName = jobName;//这里是key
+ if (myDia.ShowDialog() == DialogResult.OK)
+ {
+ VisionJobParams.pVisionProject.SaveJob(jobName, myDia.FileName);
+ }
+ }
+
+ private void picOpenJob_Click(object sender, EventArgs e)
+ {
+ UIInputForm myUIInputForm = new UIInputForm();
+ myUIInputForm.Label.Text = "输入新建Job名称";
+ if (myUIInputForm.ShowDialog() == DialogResult.OK)
+ {
+ OpenFileDialog myDia = new OpenFileDialog();
+ if (myDia.ShowDialog() == DialogResult.OK)
+ {
+ string newJobName = myUIInputForm.Editor.Text;
+ VisionJobParams.pVisionProject.LoadJob(newJobName, myDia.FileName);
+ }
+ }
+
+ }
}
}
diff --git a/ToolLib.VisionJob/FormJobManage.resx b/ToolLib.VisionJob/FormJobManage.resx
index bbbe73c..5236d57 100644
--- a/ToolLib.VisionJob/FormJobManage.resx
+++ b/ToolLib.VisionJob/FormJobManage.resx
@@ -118,6 +118,40 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 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
@@ -160,38 +194,63 @@
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
-
+
- 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
+ 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
+ SvoFejOUQZmsukoAAAAASUVORK5CYII=
diff --git a/ToolLib.VisionJob/OperateProject.cs b/ToolLib.VisionJob/OperateProject.cs
index 3ca1f71..5767d5d 100644
--- a/ToolLib.VisionJob/OperateProject.cs
+++ b/ToolLib.VisionJob/OperateProject.cs
@@ -12,6 +12,7 @@
* ==============================================================================
*/
using CommonMethods;
+using FormLib;
using Logger;
using System;
using System.Collections.Generic;
@@ -25,6 +26,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
+using WeifenLuo.WinFormsUI.Docking;
namespace ToolLib.VisionJob
{
@@ -67,6 +69,35 @@ namespace ToolLib.VisionJob
InitJob(VisionJobParams.pVisionProject.Project[jobName]);
}
+ public void CreateNewJob(string jobName, VisionJob newJob, bool newAddJob = true)
+ {
+ TabPage newTab = new TabPage(jobName);
+ newTab.Controls.Add(new TreeView());
+ FormJobManage.Instance.tabJobUnion.TabPages.Add(newTab);
+ if (newAddJob)
+ {
+ VisionJobParams.pVisionProject.Project.Add(jobName, newJob);
+ FormJobManage.Instance.tabJobUnion.SelectedTab = newTab;
+ // newTab.Select();
+ }
+ newJob.JobName = jobName;
+ InitJob(VisionJobParams.pVisionProject.Project[jobName]);
+ }
+
+ public void AddDispImageindow(DockPanel myPanel, DockState myState, string windowName)
+ {
+ if(VisionJobParams.pVisionProject.Project.ContainsKey(windowName))
+ {
+ FormImageWindow myImageWindow = VisionJobParams.pVisionProject.Project[windowName].myHalconWindow;
+ if(myImageWindow == null)
+ {
+ myImageWindow = new FormImageWindow();
+ }
+ myImageWindow.Text = windowName + "-图像";
+ myImageWindow.Show(myPanel, myState);
+ }
+ }
+
public void SaveJob()
{
// Serialize.BinarySerialize($"{VisionJobParams.sSysConfigPath}Vision.prj" , VisionJobParams.myProject);
diff --git a/ToolLib.VisionJob/VisionJob.cs b/ToolLib.VisionJob/VisionJob.cs
index 8e235cc..92d8467 100644
--- a/ToolLib.VisionJob/VisionJob.cs
+++ b/ToolLib.VisionJob/VisionJob.cs
@@ -11,6 +11,7 @@ using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
+using ViewROI;
namespace ToolLib.VisionJob
{
@@ -257,6 +258,10 @@ namespace ToolLib.VisionJob
{
if (!isDrawing)
{
+ TreeView tree = GetJobTree();
+ graph = tree.CreateGraphics();
+ tree.CreateGraphics().Dispose();
+
isDrawing = true;
Thread th = new Thread(() =>
{
@@ -265,9 +270,7 @@ namespace ToolLib.VisionJob
colValueAndColor.Clear();
startNodeAndColor.Clear();
list.Clear();
- TreeView tree = GetJobTree();
- graph = tree.CreateGraphics();
- tree.CreateGraphics().Dispose();
+
foreach (KeyValuePair item in D_itemAndSource)
{
// 将此划线线程委托到JOB管理界面
@@ -886,14 +889,21 @@ namespace ToolLib.VisionJob
string assemblyName = $"{L_toolList[i].FormToolName.Split('.')[0]}.{L_toolList[i].toolType.ToString()}Run,{L_toolList[i].FormToolName.Split('.')[0]}";
Type classType = Type.GetType(assemblyName);
IToolRun myTool = (IToolRun)Activator.CreateInstance(classType);
- myTool.ToolRun(JobName, i, inputItemNum, treeNode, L_toolList);
+ myTool.ToolRun(JobName, i, inputItemNum, treeNode, L_toolList, this, myHalconWindow);
}
}
public void FormLogDisp(string mes, Color color, TreeNode treeNode, Logger.MsgLevel msgLevel = Logger.MsgLevel.Info)
{
- Logger.LoggerClass.WriteLog(mes, msgLevel);
- treeNode.ForeColor = color;
+ LoggerClass.WriteLog(mes, msgLevel);
+ if(treeNode != null)
+ {
+ treeNode.ForeColor = color;
+ }
+
}
+ [NonSerialized]
+ public FormImageWindow myHalconWindow = new FormImageWindow();
+
}
}
diff --git a/ToolLib.VisionJob/VisionProject.cs b/ToolLib.VisionJob/VisionProject.cs
index 4350eb1..60d3303 100644
--- a/ToolLib.VisionJob/VisionProject.cs
+++ b/ToolLib.VisionJob/VisionProject.cs
@@ -18,6 +18,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Forms;
namespace ToolLib.VisionJob
{
@@ -50,11 +51,6 @@ namespace ToolLib.VisionJob
foreach (var item in Project)
{
OperateProject.Instance.CreateNewJob(item.Key, false);
- //foreach (var tool in item.Value.L_toolList)
- //{
- // OperateTreeView.Instance.Add_Tool((ToolType)Enum.Parse(typeof(ToolType), tool.toolType.ToString()), false);
- //}
- // OperateProject.Instance.InitJob(item.Value);
}
return true;
}
@@ -71,5 +67,45 @@ namespace ToolLib.VisionJob
{
Serialize.BinarySerialize(prjFilePath, Project);
}
+
+ public bool LoadJob(string jobName,string path)
+ {
+ if (!File.Exists(path))
+ {
+ Logger.LoggerClass.WriteLog("job路径不存在!", true);
+ return false;
+ }
+ else if(Project.ContainsKey(jobName))
+ {
+ Logger.LoggerClass.WriteLog("项目中已存在该JOB名称,请更换!", true);
+ return false;
+ }
+ else
+ {
+ try
+ {
+ VisionJob myNewJob = Serialize.BinaryDeserialize(path);
+ OperateProject.Instance.CreateNewJob(jobName, myNewJob, true); // 新添加job
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Logger.LoggerClass.WriteLog("载入项目工程时出现异常!", ex);
+ return false;
+ }
+ }
+ }
+
+ public void SaveJob(string jobName,string filePath)
+ {
+ if(Project.ContainsKey(jobName))
+ {
+ Serialize.BinarySerialize(filePath, Project[jobName]);
+ }
+ else
+ {
+ Logger.LoggerClass.WriteLog("保存时出现异常,未找到Job", true);
+ }
+ }
}
}
diff --git a/ToolLib.VisionToolList/VisionToolList.cs b/ToolLib.VisionToolList/VisionToolList.cs
index 909d399..ca95ca1 100644
--- a/ToolLib.VisionToolList/VisionToolList.cs
+++ b/ToolLib.VisionToolList/VisionToolList.cs
@@ -190,7 +190,6 @@ namespace VisionJobFactory
FormTool = null;
toolInput = new List() { inputImage };
toolOutput = new List() { outPose, outPoseX, outPoseY, outPoseR, outPoseScore };
-
}
///
/// 只获取选择工具的描述信息
diff --git a/VisionEdit/FormMain.cs b/VisionEdit/FormMain.cs
index cf42d49..51530c9 100644
--- a/VisionEdit/FormMain.cs
+++ b/VisionEdit/FormMain.cs
@@ -45,7 +45,7 @@ namespace VisionEdit
InitDockPanel();
_instance = this;
}
-
+ bool configLoadFlag = false;
private void InitDockPanel()
{
try
@@ -66,33 +66,38 @@ namespace VisionEdit
{
return myFormLog;
}
- if (persistString == typeof(FormImageWindow).ToString())
- {
- return myFormImageWindow;
- }
+ //if (persistString == typeof(FormImageWindow).ToString())
+ //{
+ // return new FormImageWindow();
+ //}
//主框架之外的窗体不显示
return null;
});
+ configLoadFlag = true;
}
- catch (Exception)
+ catch (Exception ex)
{
//配置文件不存在或配置文件有问题时 按系统默认规则加载子窗体
myFormToolBox.Show(this.dockPanel1, DockState.DockLeft);
myFormJobManage.Show(this.dockPanel1, DockState.DockRight);
myFormLog.Show(this.dockPanel1, DockState.DockBottom);
- myFormImageWindow.Show(this.dockPanel1, DockState.Document);
}
}
private void FormMain2_Load(object sender, EventArgs e)
{
- // 窗体加载到主窗体
- myFormToolBox.Show(this.dockPanel1, DockState.DockLeft);
- myFormJobManage.Show(this.dockPanel1, DockState.DockRight);
- myFormImageWindow.Show(this.dockPanel1, DockState.Document);
- myFormLog.Show(this.dockPanel1, DockState.DockBottom);
// 初始化JOB
VisionJobParams.pVisionProject.LoadProject();
+ // 窗体加载到主窗体
+ foreach (var item in VisionJobParams.pVisionProject.Project)
+ {
+ if (item.Value.myHalconWindow == null)
+ {
+ item.Value.myHalconWindow = new FormImageWindow();
+ }
+ item.Value.myHalconWindow.Text = item.Value.JobName + "-图像";
+ item.Value.myHalconWindow.Show(this.dockPanel1, DockState.Document);
+ }
}
private void timer1_Tick(object sender, EventArgs e)
@@ -107,10 +112,7 @@ namespace VisionEdit
///
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
- if (File.Exists(m_DockPath))
- {
- dockPanel1.SaveAsXml(this.m_DockPath);
- }
+ dockPanel1.SaveAsXml(this.m_DockPath);
DialogResult dr = MessageBox.Show("是否要进行保存?", "提示", MessageBoxButtons.YesNoCancel);
if (dr == DialogResult.Yes)
{
diff --git a/VisionEdit/Program.cs b/VisionEdit/Program.cs
index d80bb41..05b7b47 100644
--- a/VisionEdit/Program.cs
+++ b/VisionEdit/Program.cs
@@ -11,7 +11,7 @@ namespace VisionEdit
///
/// 应用程序的主入口点。
///
- [STAThread]
+ [STAThreadAttribute]
static void Main()
{
Application.EnableVisualStyles();
diff --git a/VisionEdit/bin/Debug/DockPanel.config b/VisionEdit/bin/Debug/DockPanel.config
index 0c5b398..7de7575 100644
Binary files a/VisionEdit/bin/Debug/DockPanel.config and b/VisionEdit/bin/Debug/DockPanel.config differ