commit 1feb3b60eea30d5d59a8c0481e26487b166bdf22
Author: longfellowJian <779035789@qq.com>
Date: Thu Mar 27 14:13:58 2025 +0800
提交:初始化
diff --git a/.vs/Instrument Control Example/FileContentIndex/a77544c9-3295-4de8-bc06-9d984523ce61.vsidx b/.vs/Instrument Control Example/FileContentIndex/a77544c9-3295-4de8-bc06-9d984523ce61.vsidx
new file mode 100644
index 0000000..d33f698
Binary files /dev/null and b/.vs/Instrument Control Example/FileContentIndex/a77544c9-3295-4de8-bc06-9d984523ce61.vsidx differ
diff --git a/.vs/Instrument Control Example/FileContentIndex/read.lock b/.vs/Instrument Control Example/FileContentIndex/read.lock
new file mode 100644
index 0000000..e69de29
diff --git a/App.config b/App.config
new file mode 100644
index 0000000..4bfa005
--- /dev/null
+++ b/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/Empower3.ico b/Empower3.ico
new file mode 100644
index 0000000..aefa662
Binary files /dev/null and b/Empower3.ico differ
diff --git a/Instrument Control Example.sln b/Instrument Control Example.sln
new file mode 100644
index 0000000..fbee7ef
--- /dev/null
+++ b/Instrument Control Example.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29609.76
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Instrument Control", "Instrument Control.csproj", "{BFBFA096-A2BE-460A-BEB4-037A20FBA03C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BFBFA096-A2BE-460A-BEB4-037A20FBA03C}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {1748282C-4D93-4608-A089-5DC2662DF59B}
+ EndGlobalSection
+EndGlobal
diff --git a/Instrument Control.csproj b/Instrument Control.csproj
new file mode 100644
index 0000000..9c8fce4
--- /dev/null
+++ b/Instrument Control.csproj
@@ -0,0 +1,102 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {BFBFA096-A2BE-460A-BEB4-037A20FBA03C}
+ WinExe
+ Properties
+ Waters.Empower.InstrumentControl.Example
+ InstrumentControlExample
+ v4.8
+ 512
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ frmMain.cs
+
+
+
+
+ frmMain.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+ {984EF3B1-C6E4-11D0-8713-0020AFEE2C2A}
+ 1
+ 15
+ 0
+ tlbimp
+ False
+ True
+
+
+
+
+
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..a5a9299
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Windows.Forms;
+
+namespace Waters.Empower.InstrumentControl.Example
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new FrmMain());
+ }
+ }
+}
diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..a3b4937
--- /dev/null
+++ b/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Instrument Control Example")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Waters Corporation")]
+[assembly: AssemblyProduct("Empower Tooolkit Example Code")]
+[assembly: AssemblyCopyright("Copyright ©2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1e453e70-f33b-4725-987a-268ff82ecfdc")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..f9e7154
--- /dev/null
+++ b/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace Waters.Empower.InstrumentControl.Example.Properties {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Waters.Empower.InstrumentControl.Example.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Properties/Resources.resx b/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/Properties/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..7649010
--- /dev/null
+++ b/Properties/Settings.Designer.cs
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace Waters.Empower.InstrumentControl.Example.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.2.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Properties/Settings.settings b/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/frmMain.cs b/frmMain.cs
new file mode 100644
index 0000000..a7674bc
--- /dev/null
+++ b/frmMain.cs
@@ -0,0 +1,475 @@
+using MillenniumToolkit;
+using System;
+using System.Windows.Forms;
+using System.Threading;
+
+namespace Waters.Empower.InstrumentControl.Example
+{
+ public partial class FrmMain
+ {
+ private Project _project = new Project();
+
+ private Instrument _instrument;
+
+ public FrmMain()
+ {
+ InitializeComponent();
+ }
+
+ public void FrmMain_Load(System.Object sender, System.EventArgs e)
+ {
+ // TODO values are hard coded ....
+ string username = "system";
+ string pswd = "manager";
+ string project = "Defaults";
+ string db = "empower";
+
+ // Perform the login.
+ try
+ {
+ LogIntoToolkit(username, pswd, db, project);
+ MessageBox.Show("Login Complete", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
+
+ // Info can be posted to the Empower message center also
+ _project.MessageCenter($"{this.Text} Login Complete");
+
+ _instrument = new Instrument();
+ LoadSystemsForDisplay();
+ LoadNodesForDisplay();
+ LoadSampleSetMethodsForDisplay();
+ }
+ catch (System.Runtime.InteropServices.COMException ex)
+ {
+ MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}");
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message);
+ }
+ }
+ private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ if (_instrument != null)
+ {
+ // when the form closes disconnect from the instrument
+ _instrument.Disconnect();
+ }
+ }
+
+ ///
+ /// Log into the Empower Toolkit
+ ///
+ /// Empower username
+ /// Empower password
+ /// Empower database
+ /// Empower project
+ private void LogIntoToolkit(string username, string pswd, string database, string project)
+ {
+ _project = new Project();
+ _project.Login(database, project, username, pswd);
+ }
+
+ ///
+ /// Loads the Systems ComboBox
+ ///
+ private void LoadSystemsForDisplay()
+ {
+ cbSystem.Items.Clear();
+
+ object obj = _instrument.Systems;
+ if (obj is System.DBNull)
+ {
+ MessageBox.Show("There are no systems available", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ else
+ {
+ string[] systems = (string[])obj;
+ cbSystem.Items.AddRange(systems);
+ }
+ }
+
+ ///
+ /// Load the Nodes ComboBox
+ ///
+ private void LoadNodesForDisplay()
+ {
+ cbNode.Items.Clear();
+
+ // Obtain the available nodes/acq servers
+ object obj = _instrument.AcqServers;
+ if (obj is System.DBNull)
+ {
+ MessageBox.Show("There are no nodes available", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ else
+ {
+ string[] nodes = (string[])obj;
+ cbNode.Items.AddRange(nodes);
+ }
+ }
+
+ ///
+ /// Loads the sample set methods ComboBox
+ ///
+ private void LoadSampleSetMethodsForDisplay()
+ {
+ cbSampleSetMethod.Items.Clear();
+
+ SampleSetMethod ssm = new SampleSetMethod();
+
+ object obj = ssm.SampleSetMethodNames;
+ if (obj is System.DBNull)
+ {
+ MessageBox.Show("There are no sample set methods available", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+ else
+ {
+ string[] nodes = (string[])obj;
+ cbSampleSetMethod.Items.AddRange(nodes);
+ }
+ }
+
+ ///
+ /// Connect to the selected node and system
+ ///
+ ///
+ ///
+ public void BtnConnect_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ string nodeName = (string)cbNode.SelectedItem;
+ string systemName = (string)cbSystem.SelectedItem;
+
+ _instrument.Connect(nodeName, systemName);
+
+ // while the connectionstatus says the connection is not 'Done' ...
+ while (_instrument.ConnectionStatus.Done == false)
+ {
+ // Sleep for 1 second
+ Thread.Sleep(1000);
+ }
+
+ // Declare and obtain a copy of the connectstatus object.
+ ConnectionStatus connectionStatus = _instrument.ConnectionStatus;
+
+ // If the connection status text is either
+ // "Successfully connected to instrument server"
+ // OR an empty string
+ // Then call connection succeeded, otherwise show the text to the user.
+ if (connectionStatus.Text.Equals("Successfully connected to instrument server") || connectionStatus.Text.Length == 0)
+ {
+ ConnectionSucceeded();
+ }
+ else
+ {
+ MessageBox.Show($"Instrument connection failed with error : {connectionStatus.Text}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ catch (System.Runtime.InteropServices.COMException ex)
+ {
+ MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void ConnectionSucceeded()
+ {
+ RefreshInstrumentStatusInformation();
+ }
+
+ private void RefreshInstrumentStatusInformation()
+ {
+ lbStatusInformation.Items.Clear();
+
+ // Note casting should not need to be done, but there is an error in the IDL that means the return type is incorrect
+ InstrumentStatus instrumentStatus = (InstrumentStatus) _instrument.Status;
+
+ // Add each piece of instrument status to the list box, replace the empty string with the correct field value
+ // for all of the fields below
+ string instrumentState = string.Format("State : {0}", instrumentStatus.SystemStateDescription);
+ lbStatusInformation.Items.Add(instrumentState);
+
+ string systemState = string.Format("SystemState : {0}", instrumentStatus.SystemState);
+ lbStatusInformation.Items.Add(systemState);
+
+ string sampleSetLineNumber = string.Format("SampleSetLineNumber : {0}", instrumentStatus.SampleSetLineNumber);
+ lbStatusInformation.Items.Add(sampleSetLineNumber);
+
+ string vial = string.Format("Vial : {0}", instrumentStatus.Vial);
+ lbStatusInformation.Items.Add(vial);
+
+ string injection = string.Format("Injection : {0}", instrumentStatus.Injection);
+ lbStatusInformation.Items.Add(injection);
+
+ string runTime = string.Format("Run Time : {0}", instrumentStatus.RunTime);
+ lbStatusInformation.Items.Add(runTime);
+
+ string totalInjectionTime = string.Format("totalInjectionTime : {0}", instrumentStatus.TotalInjectionTime);
+ lbStatusInformation.Items.Add(totalInjectionTime);
+
+ string sampleSetMethodName = string.Format("SampleSetMethodName : {0}", instrumentStatus.SampleSetMethodName);
+ lbStatusInformation.Items.Add(sampleSetMethodName);
+
+ string sampleSetMethodID = string.Format("sampleSetMethodID : {0}", instrumentStatus.SampleSetMethodID);
+ lbStatusInformation.Items.Add(sampleSetMethodID);
+
+ string InstrumentMethodName = string.Format("InstrumentMethodName : {0}", instrumentStatus.InstrumentMethodName);
+ lbStatusInformation.Items.Add(InstrumentMethodName);
+
+ string sampleSetName = string.Format("Sample Set Name : {0}", instrumentStatus.SampleSetMethodName);
+ lbStatusInformation.Items.Add(sampleSetName);
+
+ string methodSetID = string.Format("Method Set ID : {0}", instrumentStatus.MethodSetID);
+ lbStatusInformation.Items.Add(methodSetID);
+
+ string methodSetName = string.Format("Method Set ID : {0}", instrumentStatus.MethodSetName);
+
+ lbStatusInformation.Items.Add(methodSetName);
+ }
+
+ ///
+ /// Starts a run
+ ///
+ public void BtnStartRun_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ string sampleSetMethodName = (string)cbSampleSetMethod.SelectedItem;
+ string newName = txtNewSSMName.Text;
+
+ // Start the run with the selected instrument method and output sample set method name
+ _instrument.Run(sampleSetMethodName, newName);
+
+ RefreshInstrumentStatusInformation();
+ }
+ catch (System.Runtime.InteropServices.COMException ex)
+ {
+ MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ public void BtnRefreshInfo_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ RefreshInstrumentStatusInformation();
+ }
+ catch (System.Runtime.InteropServices.COMException ex)
+ {
+ MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// Pause the instrument run at the end of the current injection
+ ///
+ public void BtnPauseRun_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _instrument.Pause(float.MaxValue);
+ }
+ catch (System.Runtime.InteropServices.COMException ex)
+ {
+ MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// Modify the next line to be run on the sampleset
+ ///
+ public void BtnModifyNextLine_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ // Obtain the instrument status
+ InstrumentStatus instrumentStatus = (InstrumentStatus)_instrument.Status;
+
+ // If the instrument status contains 'paused' ...
+ if (instrumentStatus.SystemStateDescription.Contains("Paused"))
+ {
+ // Obtain the sample set method name
+ string sampleSetMethodName = instrumentStatus.SampleSetMethodName;
+
+ // Obtain the current vial
+ int vialNumber = instrumentStatus.Vial;
+
+ // Instantiate a sample set method object, set the name, and call 'fetch'
+ SampleSetMethod ssm = new SampleSetMethod
+ {
+ Name = sampleSetMethodName
+ };
+ ssm.Fetch();
+
+ // Obtain the sample set line at the current 'vial number'
+ SampleSetLine ssl = ssm.SampleSetLines.Item(vialNumber);
+
+ // Update the 'Runtime' property on this line to 1 minute
+ ssl.Set("Runtime", "1");
+
+ // Store the changes to the database
+ ssm.Store();
+
+ // Continue the run with the newly changed sample set method
+ _instrument.Replace(ssm.Name);
+ }
+ else
+ {
+ // If the instrument status is not paused - show an error message
+ MessageBox.Show("Wait for the instrument to be paused first", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ catch (System.Runtime.InteropServices.COMException ex)
+ {
+ MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// Add a line to the end of the sample set method, and restarts a paused run with the changes made
+ ///
+ public void BtnAddALine_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ // Declare and obtain the instrument status object
+ InstrumentStatus instrumentStatus = (InstrumentStatus)_instrument.Status;
+
+ // If the instrument status contains 'paused'..
+ if (instrumentStatus.SystemStateDescription.Contains("Paused"))
+ {
+ // Obtain the sample set method name
+ string sampleSetMethodName = instrumentStatus.SampleSetMethodName;
+
+ // Instantiate a sample set method object, set the name and call 'fetch'
+ SampleSetMethod ssm = new SampleSetMethod
+ {
+ Name = sampleSetMethodName
+ };
+ ssm.Fetch();
+
+ // Obtain the lst sample set line (SampleSetLines.Count - 1)
+ SampleSetLine ssl = ssm.SampleSetLines.Item(ssm.SampleSetLines.Count - 1);
+
+ // Call the returnLineWithNextVialPosition with the ssl and the ssl plate layout object
+ ssl = ReturnLineWithNextVialPosition(ssl, ssm.PlateLayouts);
+
+ // Add the newly created sample set to the end of the current sample set lines class
+ ssm.SampleSetLines.Add(ssl, ssm.SampleSetLines.Count - 1, MillenniumToolkit.mtkConstants.mtkAfter);
+
+ // Store the changes to the sample set
+ ssm.Store();
+
+ // Restart the run using the new sample set method
+ _instrument.Replace(sampleSetMethodName);
+ }
+ else
+ {
+ // If the instrument status is not paused - show an error message
+ MessageBox.Show("Wait for the instrument to be paused first", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ catch (System.Runtime.InteropServices.COMException ex)
+ {
+ MessageBox.Show($"Error: {_project.TkErrorDescription(ex.ErrorCode)}", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// Creates a new line, with the vial position being the one AFTER the vial position
+ /// of the line that is passed in.
+ ///
+ /// The model sample set line
+ /// the plate layout to use for the positions
+ ///
+ private SampleSetLine ReturnLineWithNextVialPosition(SampleSetLine ssl, PlateLayouts pl)
+ {
+ // Get the position of the vial for the passed in line (call get on the vial field)
+ string lastKnownPos = (string) (ssl.Get("vial", true));
+
+ // Create a plate position object from the plate layouts
+ PlatePosition platePos = pl.CreatePlatePosition();
+
+ // Move to the last possible vial of the current plate layout
+ platePos.SetToLastVial();
+
+ // Store the value of the last possible vial in the plate layout
+ string maxPossiblePos = platePos.Position;
+
+ // Move the first position in the plate position
+ platePos.SetToFirstVial();
+
+ // If the plate layout is not lastKnownPos or maxPossiblePos
+ while (!platePos.Position.Equals(lastKnownPos) && !platePos.Position.Equals(maxPossiblePos))
+ {
+ // increment the vial position by 1
+ platePos.IncrementVial(1);
+ }
+
+ // If we did not reach the last possible plate position, increment the vial position to get the next position
+ // -i.e Is the current position the same as the maxPossiblePos
+ if (!platePos.Position.Equals(maxPossiblePos))
+ {
+ // increment the position of the plate pos
+ platePos.IncrementVial(1);
+ }
+
+ // Update the vial position on the line to the new vial position
+ ssl.Set("Vial", platePos.Position);
+
+ // Return the now modified line
+ return ssl;
+ }
+
+ ///
+ /// Displays the current instrument configurations for this node
+ ///
+ /// TODO this is a bit Ghetto ...
+ ///
+ ///
+ ///
+ public void BtnShowInstConfig_Click(object sender, EventArgs e)
+ {
+ txtShowInstrumentConfig.Text = "";
+
+ // Loop over each inst config in the instConfigs object
+ foreach (InstConfig instConfig in _instrument.InstConfigs)
+ {
+ // Add a line divider
+ txtShowInstrumentConfig.Text = $"{txtShowInstrumentConfig.Text}\r\nNew Instrument\r\n";
+
+ // For field in the instConfig fields object
+ foreach (string fieldname in instConfig.Fields)
+ {
+ // create the string description which shows the fieldname and its value
+ string desc = $"{fieldname}:{instConfig.Get(fieldname, true)}\r\n";
+ txtShowInstrumentConfig.Text += desc;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/frmMain.designer.cs b/frmMain.designer.cs
new file mode 100644
index 0000000..2088bd2
--- /dev/null
+++ b/frmMain.designer.cs
@@ -0,0 +1,290 @@
+
+namespace Waters.Empower.InstrumentControl.Example
+{
+ public partial class FrmMain : System.Windows.Forms.Form
+ {
+ //Form overrides dispose to clean up the component list.
+ [System.Diagnostics.DebuggerNonUserCode()]protected override void Dispose(bool disposing)
+ {
+ try
+ {
+ if (disposing && components != null)
+ {
+ components.Dispose();
+ }
+ }
+ finally
+ {
+ base.Dispose(disposing);
+ }
+ }
+
+ //Required by the Windows Form Designer
+ private System.ComponentModel.Container components = null;
+
+ //NOTE: The following procedure is required by the Windows Form Designer
+ //It can be modified using the Windows Form Designer.
+ //Do not modify it using the code editor.
+ [System.Diagnostics.DebuggerStepThrough()]private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
+ this.txtShowInstrumentConfig = new System.Windows.Forms.TextBox();
+ this.btnShowInstConfig = new System.Windows.Forms.Button();
+ this.txtNewSSMName = new System.Windows.Forms.TextBox();
+ this.btnModifyNextLine = new System.Windows.Forms.Button();
+ this.btnPauseRun = new System.Windows.Forms.Button();
+ this.btnRefreshInfo = new System.Windows.Forms.Button();
+ this.lbStatusInformation = new System.Windows.Forms.ListBox();
+ this.btnAddALine = new System.Windows.Forms.Button();
+ this.lblSSMNameTitle = new System.Windows.Forms.Label();
+ this.gbRunStatus = new System.Windows.Forms.GroupBox();
+ this.btnStartRun = new System.Windows.Forms.Button();
+ this.lblSampleSetMethod = new System.Windows.Forms.Label();
+ this.cbSampleSetMethod = new System.Windows.Forms.ComboBox();
+ this.lblNodeTitle = new System.Windows.Forms.Label();
+ this.lblSystemTitle = new System.Windows.Forms.Label();
+ this.cbSystem = new System.Windows.Forms.ComboBox();
+ this.cbNode = new System.Windows.Forms.ComboBox();
+ this.btnConnect = new System.Windows.Forms.Button();
+ this.gbRunStatus.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // txtShowInstrumentConfig
+ //
+ this.txtShowInstrumentConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtShowInstrumentConfig.Location = new System.Drawing.Point(40, 538);
+ this.txtShowInstrumentConfig.Multiline = true;
+ this.txtShowInstrumentConfig.Name = "txtShowInstrumentConfig";
+ this.txtShowInstrumentConfig.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.txtShowInstrumentConfig.Size = new System.Drawing.Size(391, 208);
+ this.txtShowInstrumentConfig.TabIndex = 33;
+ //
+ // btnShowInstConfig
+ //
+ this.btnShowInstConfig.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnShowInstConfig.Location = new System.Drawing.Point(462, 543);
+ this.btnShowInstConfig.Name = "btnShowInstConfig";
+ this.btnShowInstConfig.Size = new System.Drawing.Size(127, 31);
+ this.btnShowInstConfig.TabIndex = 32;
+ this.btnShowInstConfig.Text = "Show Instrument Configuration";
+ this.btnShowInstConfig.UseVisualStyleBackColor = true;
+ this.btnShowInstConfig.Click += new System.EventHandler(this.BtnShowInstConfig_Click);
+ //
+ // txtNewSSMName
+ //
+ this.txtNewSSMName.Location = new System.Drawing.Point(166, 172);
+ this.txtNewSSMName.Name = "txtNewSSMName";
+ this.txtNewSSMName.Size = new System.Drawing.Size(235, 21);
+ this.txtNewSSMName.TabIndex = 28;
+ //
+ // btnModifyNextLine
+ //
+ this.btnModifyNextLine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnModifyNextLine.Location = new System.Drawing.Point(462, 343);
+ this.btnModifyNextLine.Name = "btnModifyNextLine";
+ this.btnModifyNextLine.Size = new System.Drawing.Size(127, 31);
+ this.btnModifyNextLine.TabIndex = 27;
+ this.btnModifyNextLine.Text = "Modify Next line";
+ this.btnModifyNextLine.UseVisualStyleBackColor = true;
+ this.btnModifyNextLine.Click += new System.EventHandler(this.BtnModifyNextLine_Click);
+ //
+ // btnPauseRun
+ //
+ this.btnPauseRun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnPauseRun.Location = new System.Drawing.Point(462, 306);
+ this.btnPauseRun.Name = "btnPauseRun";
+ this.btnPauseRun.Size = new System.Drawing.Size(127, 31);
+ this.btnPauseRun.TabIndex = 26;
+ this.btnPauseRun.Text = "Pause Run";
+ this.btnPauseRun.UseVisualStyleBackColor = true;
+ this.btnPauseRun.Click += new System.EventHandler(this.BtnPauseRun_Click);
+ //
+ // btnRefreshInfo
+ //
+ this.btnRefreshInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnRefreshInfo.Location = new System.Drawing.Point(462, 270);
+ this.btnRefreshInfo.Name = "btnRefreshInfo";
+ this.btnRefreshInfo.Size = new System.Drawing.Size(127, 31);
+ this.btnRefreshInfo.TabIndex = 30;
+ this.btnRefreshInfo.Text = "Refresh Status";
+ this.btnRefreshInfo.UseVisualStyleBackColor = true;
+ this.btnRefreshInfo.Click += new System.EventHandler(this.BtnRefreshInfo_Click);
+ //
+ // lbStatusInformation
+ //
+ this.lbStatusInformation.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lbStatusInformation.FormattingEnabled = true;
+ this.lbStatusInformation.ItemHeight = 12;
+ this.lbStatusInformation.Location = new System.Drawing.Point(13, 21);
+ this.lbStatusInformation.Name = "lbStatusInformation";
+ this.lbStatusInformation.Size = new System.Drawing.Size(391, 232);
+ this.lbStatusInformation.TabIndex = 0;
+ //
+ // btnAddALine
+ //
+ this.btnAddALine.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnAddALine.Location = new System.Drawing.Point(462, 380);
+ this.btnAddALine.Name = "btnAddALine";
+ this.btnAddALine.Size = new System.Drawing.Size(127, 31);
+ this.btnAddALine.TabIndex = 31;
+ this.btnAddALine.Text = "Add A Line";
+ this.btnAddALine.UseVisualStyleBackColor = true;
+ this.btnAddALine.Click += new System.EventHandler(this.BtnAddALine_Click);
+ //
+ // lblSSMNameTitle
+ //
+ this.lblSSMNameTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblSSMNameTitle.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.lblSSMNameTitle.Location = new System.Drawing.Point(24, 170);
+ this.lblSSMNameTitle.Name = "lblSSMNameTitle";
+ this.lblSSMNameTitle.Size = new System.Drawing.Size(136, 21);
+ this.lblSSMNameTitle.TabIndex = 29;
+ this.lblSSMNameTitle.Text = "New SSM Name";
+ this.lblSSMNameTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // gbRunStatus
+ //
+ this.gbRunStatus.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.gbRunStatus.Controls.Add(this.lbStatusInformation);
+ this.gbRunStatus.Location = new System.Drawing.Point(27, 252);
+ this.gbRunStatus.Name = "gbRunStatus";
+ this.gbRunStatus.Size = new System.Drawing.Size(415, 270);
+ this.gbRunStatus.TabIndex = 25;
+ this.gbRunStatus.TabStop = false;
+ this.gbRunStatus.Text = "Run Status";
+ //
+ // btnStartRun
+ //
+ this.btnStartRun.Location = new System.Drawing.Point(24, 206);
+ this.btnStartRun.Name = "btnStartRun";
+ this.btnStartRun.Size = new System.Drawing.Size(378, 31);
+ this.btnStartRun.TabIndex = 24;
+ this.btnStartRun.Text = "Start Run";
+ this.btnStartRun.UseVisualStyleBackColor = true;
+ this.btnStartRun.Click += new System.EventHandler(this.BtnStartRun_Click);
+ //
+ // lblSampleSetMethod
+ //
+ this.lblSampleSetMethod.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblSampleSetMethod.Location = new System.Drawing.Point(24, 121);
+ this.lblSampleSetMethod.Name = "lblSampleSetMethod";
+ this.lblSampleSetMethod.Size = new System.Drawing.Size(378, 21);
+ this.lblSampleSetMethod.TabIndex = 23;
+ this.lblSampleSetMethod.Text = "Sample Set Method";
+ this.lblSampleSetMethod.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // cbSampleSetMethod
+ //
+ this.cbSampleSetMethod.FormattingEnabled = true;
+ this.cbSampleSetMethod.Location = new System.Drawing.Point(24, 144);
+ this.cbSampleSetMethod.Name = "cbSampleSetMethod";
+ this.cbSampleSetMethod.Size = new System.Drawing.Size(375, 20);
+ this.cbSampleSetMethod.TabIndex = 22;
+ //
+ // lblNodeTitle
+ //
+ this.lblNodeTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblNodeTitle.Location = new System.Drawing.Point(24, 13);
+ this.lblNodeTitle.Name = "lblNodeTitle";
+ this.lblNodeTitle.Size = new System.Drawing.Size(180, 18);
+ this.lblNodeTitle.TabIndex = 21;
+ this.lblNodeTitle.Text = "Node";
+ this.lblNodeTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // lblSystemTitle
+ //
+ this.lblSystemTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblSystemTitle.Location = new System.Drawing.Point(222, 13);
+ this.lblSystemTitle.Name = "lblSystemTitle";
+ this.lblSystemTitle.Size = new System.Drawing.Size(173, 18);
+ this.lblSystemTitle.TabIndex = 20;
+ this.lblSystemTitle.Text = "System";
+ this.lblSystemTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // cbSystem
+ //
+ this.cbSystem.FormattingEnabled = true;
+ this.cbSystem.Location = new System.Drawing.Point(222, 33);
+ this.cbSystem.Name = "cbSystem";
+ this.cbSystem.Size = new System.Drawing.Size(180, 20);
+ this.cbSystem.TabIndex = 19;
+ //
+ // cbNode
+ //
+ this.cbNode.FormattingEnabled = true;
+ this.cbNode.Location = new System.Drawing.Point(24, 33);
+ this.cbNode.Name = "cbNode";
+ this.cbNode.Size = new System.Drawing.Size(180, 20);
+ this.cbNode.TabIndex = 18;
+ //
+ // btnConnect
+ //
+ this.btnConnect.Location = new System.Drawing.Point(24, 66);
+ this.btnConnect.Name = "btnConnect";
+ this.btnConnect.Size = new System.Drawing.Size(378, 31);
+ this.btnConnect.TabIndex = 17;
+ this.btnConnect.Text = "Connect";
+ this.btnConnect.UseVisualStyleBackColor = true;
+ this.btnConnect.Click += new System.EventHandler(this.BtnConnect_Click);
+ //
+ // FrmMain
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(629, 758);
+ this.Controls.Add(this.txtShowInstrumentConfig);
+ this.Controls.Add(this.btnShowInstConfig);
+ this.Controls.Add(this.txtNewSSMName);
+ this.Controls.Add(this.btnModifyNextLine);
+ this.Controls.Add(this.btnPauseRun);
+ this.Controls.Add(this.btnRefreshInfo);
+ this.Controls.Add(this.btnAddALine);
+ this.Controls.Add(this.lblSSMNameTitle);
+ this.Controls.Add(this.gbRunStatus);
+ this.Controls.Add(this.btnStartRun);
+ this.Controls.Add(this.lblSampleSetMethod);
+ this.Controls.Add(this.cbSampleSetMethod);
+ this.Controls.Add(this.lblNodeTitle);
+ this.Controls.Add(this.lblSystemTitle);
+ this.Controls.Add(this.cbSystem);
+ this.Controls.Add(this.cbNode);
+ this.Controls.Add(this.btnConnect);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MinimumSize = new System.Drawing.Size(600, 797);
+ this.Name = "FrmMain";
+ this.Padding = new System.Windows.Forms.Padding(10, 9, 10, 9);
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Empower Instrument Control Example";
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmMain_FormClosed);
+ this.Load += new System.EventHandler(this.FrmMain_Load);
+ this.gbRunStatus.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+ private System.Windows.Forms.TextBox txtShowInstrumentConfig;
+ private System.Windows.Forms.Button btnShowInstConfig;
+ private System.Windows.Forms.TextBox txtNewSSMName;
+ private System.Windows.Forms.Button btnModifyNextLine;
+ private System.Windows.Forms.Button btnPauseRun;
+ private System.Windows.Forms.Button btnRefreshInfo;
+ private System.Windows.Forms.ListBox lbStatusInformation;
+ private System.Windows.Forms.Button btnAddALine;
+ private System.Windows.Forms.Label lblSSMNameTitle;
+ private System.Windows.Forms.GroupBox gbRunStatus;
+ private System.Windows.Forms.Button btnStartRun;
+ private System.Windows.Forms.Label lblSampleSetMethod;
+ private System.Windows.Forms.ComboBox cbSampleSetMethod;
+ private System.Windows.Forms.Label lblNodeTitle;
+ private System.Windows.Forms.Label lblSystemTitle;
+ private System.Windows.Forms.ComboBox cbSystem;
+ private System.Windows.Forms.ComboBox cbNode;
+ private System.Windows.Forms.Button btnConnect;
+
+ }
+
+}
diff --git a/frmMain.resx b/frmMain.resx
new file mode 100644
index 0000000..5f24ce1
--- /dev/null
+++ b/frmMain.resx
@@ -0,0 +1,347 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ AAABAAMAEBAAAAAACABoBQAANgAAACAgAAAAAAgAqAgAAJ4FAAAwMAAAAAAgAKglAABGDgAAKAAAABAA
+ AAAgAAAAAQAIAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAACswAAA5UQAAS10PAFBsAABhfgAAa3wPAFBC
+ KwBnaTIAdGVNAH9sTQBqZVoAa2VaAHdvUgB8dmoAgX1TAI17YQBkgwAAZYQAAGeFAABrhgEAbIcDAGiJ
+ AABriAAAbIkBAG6KAQBsjgAAZ4ELAHKOAwBvlAAAc5AAAHGVAABxlwAAcpcAAHWWAAB0lwAAdJkAAHWb
+ AAB3mQIAeJsAAHuaAgB4nwAAe5oFAH2XDwB3jyMAfIRnAISfDgCGmxEAjJ8dAICgBgCFoAoAiKQTAImi
+ FwCJoxgAjaMfAIGMKgCOmiUAjpYtAJCcIACNjzoAmp8xAJKgIACYpjAAmaY6AJ6sPQCMhEQAg45TAKGS
+ XACpml0AqqBMAKa0RQCsoFUArLNUALCyWQCXgmAAnYRhAJ+LaQCPiHcAkZtxAKCHZACjj2EAootkAKWL
+ ZAC9nWUAvZ1nAL6dZwC+nmYAvp9mALWaawCymG0Av51oAL+daQC9nmgAup5vAKGQfAC1m3UAvJ9zAL2f
+ cwCaoGsAsqdkALijZQC/pGUAuqNpALS5YgC1u2MAtrhkAL+jcgC+o3UApbZyAKq1egC9vHEAvr10AMOk
+ bgDEpG4AxaRuAMWkbwDBo3AAwqNwAMKkcADDpHMAx6RxAMancwDHp3MAwqd3AMSodgDFqHcAyahxAMmp
+ cQDApXgAx6R5AMileQDGq3sAyat5AMisfADJrX0Awr97AMO/ewDGu3wAusNgAMTAfACalowAnpmVALqp
+ gwCmppwAv6+VALKtnwCysZAAt72SAKmnogC/vrgAxKqCAMuvgwDLsIIAzLOGAM+2iQDPvpEA07qQAMe9
+ qgDLyYoA0MWOANbMnADYypoAwcakAMXIrwDdwaIA0MmpAMzAsADHyrEAyc20AMrOtwDGwroAy8a9AMzQ
+ ugDR1L8A4dKtAOXTtQDq1rwA6tu5ANTYxADX3McA2NbIANrU0wDb2dMA3t3TAN7c1ADs18AA7NfBAOzX
+ wgDs28EA7djDAOzbwgDv3sIA797DAO7ZxADs3cQA793IAPDcwwDw38QA8t/HAPHeywDz4MkA9eTIAPfi
+ zwDl59sA5+jcAOLg4ADk4+MA6+rqAOzr7ADv7vAA9PTyAPj2+gD+/f8A////AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBxa0zIEiaKS+YloJ7dXBTu8jDRR8q
+ jTYEQl5qfHh+Vr2+wGYZGg4MAgcPUFxzcVS9vrptF6G3tbbLqklXc3FUvb64hhSmzJSps5JPYHNxVL2+
+ uIcUos0NCEs6OGV2clm9vrluE6fOCwYJTkNjgXJZvb68aBKoz5OLkF1RRjs8Ob2+wEcQq9DR1NSRBSEk
+ KCS9v68/EazSjExhKxUiJjEuvcSuNRKx0woAAQMYN0RkUr3HnycWstSOLE1BQF+Ad1q9yWceG8rU1NTU
+ tEpcdXFUwrA0HD6ka2ycpY9YaXRwVMaJIzKgPR1ilX96hYN5fVWdMCWKni2Io5uZl4R7dW9bAAB+AgAA
+ ggIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgA
+ AAAgAAAAQAAAAAEACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAxMxUART0wADlGBABGWAAAUV0QAFNo
+ AABcdAAAV2MUAGB5AABifAAAZX8AAGt5FQBGQC8AVEs6AF1UPwBgWjQAZWwjAGVaRQBvYk0AdWhNAHdp
+ UgCEc1UAindXAIV2WgCJd1kAinlbAJB9WgCMfGAAZYAAAGaAAABogwAAaYUAAGyIAABtigAAbosAAG+M
+ AABxjgAAcY8AAHKPAABxigcAcpAAAHSSAAB1lAAAdpQAAHeWAAB4lwAAeZgAAHmZAAB6mQAAepoAAHua
+ AAB7mwAAe5MMAH+cCwB2iBkAfoYoAIKdDACHmRcAiKMYAIyZJwCRnCgAhYQ4AI+aNACUmzUAoZ07AI2j
+ IQCUpysAmKg2AJqlOQCdqzsAg4JBAJuZSQCUgF4AoJZOAJejXgCkrEYAprJJAK+hUwC0oF0Aq7JVAJaD
+ ZACbhWEAnIllAJKCaQCSj20AnpFoAKOMZACjjmkApZBkAKOQbACpkWkArJNpAK+WawCqk20ArZVtAL2c
+ ZgC9nWYAvJxnALydZwCwl2sAsZhrALWeagCymG0AtZptALacbgC9nWkAvZ5pAL6eaAC+n2gAv59qALme
+ bwCum30AtJ1yALqecAC6pGUAv6BqAL+gawC5uWoAq6B0ALugcgC8oHAAvqFxAL2icgC+onIAuaF1AL2i
+ dQC8pHoAvrp0AMCgbADAoWwAwKFtAMGibwDBo28AwKJwAMCjcADBo3EAwKRwAMKkcQDCpXEAwKRzAMCk
+ dADCpHQAwqZ0AMKldwDEp3UAxKh2AMWqegDFqX0AyKx9AMDCdgCOjIcAlpOMAJ2blwCjnZIAvqmEAK22
+ hgCro5YAtqeQALW5mQC2u5wAt72eALi8nACtqqQAtbCkALmzpQC6vqEAtLOuALq2qwC/u6kAxq2DAMqu
+ gADDrowAzLGEAM20igDKvIwA0LiNAMu3lADSupMA1L6ZAMK+tAC9w6cAycOFAM/HkADRxZIA1sCZANnC
+ nQDVy5oAw8atANrGpADbzaQA3s2qAN7QqwDMz7cA4M2tAOLRsQDj0bIA5dO1AObVuADn1roA6Ne7AObb
+ uwDp2L0A6dm+AMjIxQDW1c0A1tbQANnZ0gDb2tQA3NvVANzc1QDq2sAA6trBAOvbwgDs3cQA7d/HAOHa
+ zgDg3tcA4uHZAObl2gDj4t0A5OPeAOPl3gDk5N0A6ObcAOvp3gDk4+EA5OTgAOfm4QDl5eIA5uXiAObm
+ 4wDn5uQA5ujhAOro4QDs6+AA7eziAOjo5QDq6uUA6ejmAOrp5gDr6+cA6+roAO3s6QDv7uwA8O/sAPHx
+ 7QD08+8A9PTuAPX18QD39vUA+Pj3APr6+QD8/PsA/Pz8AP7+/QD+/v4A1tTTyca/MzMzM0K8uXUzMzNL
+ ra2sqpSSkZCKhIJ0amHV0srHxcRFMzIxMH+ysTQrKzupqZOTkpKRjomEgG1rX9XSysfFxH8yMS0rO7Cr
+ PyEgIHB8fHx9jIyOh4OAbWxg1dLKx8XEtjIuKyUgdm9VCAYGRldXWmZoeouHhIFzbGDV0srHxcTDMSwo
+ IAlGUxsQAwMHFRlIVlxueYaEgHNrYNXSysfFxMNCKiEJBQcSEQ4CAgIPExVIWGZ4hYOAc2tg1dLKx8XE
+ w0IpH6Hq6t/a2t/g6urqpBpWY3GFhIFta2DV0srHxcTDTCgenurZ0M/R2Nnf6uqkGlZkeIWDgXNrYNXS
+ ysfFxMNPJR2e3tDNzdDY3unr66hRWmd5hoOAc2tg1dLKx8XEw08lCp7Zzs2ml5yjp6GhSlhnbnuIhIFt
+ bF/V0srHxcTDTyUKntvQz5cNEhdQUjcfNmV7i4eEgG1sX9XSysfFxMNPJQqe3NjZlw4SGVJZXkk0OU6N
+ iYOBc2tf1dLKx8XEw08lCp/j29yXDREVG1JXXnBHPHKJg4FzbF/V0srHxcTDQyUKn+nc4pcBDhIUGEhW
+ Xmh6jYmEgG1rX9XSysfFxMNCJQqg7eTilgABDQ4SFRpWZneLik1AQD9A1dLKx8XEw0ElCqDw5eHk7PL1
+ 9/fOFlJcRzwzMzMzMzPV0srHxcTDLiUKpfLs5ufv8vX4+M8ZPScpLzMzMzMzM9XSysfFxL0uJQql9PHu
+ 7/L09vj42AsdIyovMzMzMzMz1dLKx8XEtS4lCqX28/PLmKKns7ubCSAmLDAzMzMzMzPV0srHxcR1LiUK
+ pfj19ZgNERMQBgkdISgsMDMzMzg5OdXSysfFxEwuJQq0+fj4mA0RBAUGCBwgJisvOUBOc2tf1dLKx8XE
+ QS4lHLT6+fmYDAIDAwUFCB0iO06Hg4Bta2DV0srHxb8zLiYdtPv6+pgAAgICAwMFC0loeYeEgG1sYNXS
+ ysfFfzMvKB67/Pv75MvMzM3O0VRIWGd5h4OBc2xf1dLKx8VFMy8pIMD+/f39/f3+/v7+mUhYZ3mHhIBz
+ a1/V0srHvTMzMCsjzv////////////+cUVtoeYeEgG1rYNXSysdMMzMxLT7X9e3o3d3i5efu8Z1aZneL
+ h4OAbWxf1dLKvTMzMzI1rrJHHx0JNllZWVldXnB3i42Hg4BtbGDV0spFMzMzMk+8riooJD6amn5+fn5+
+ j4+NjomDgG1rYNXSlTMzMzNCvr5FLy5Esa+traypqZOTkpGQiYOBbWtf1bo4MzMzOLrBtzMzRbm4sbGv
+ raysqpSSkZCKhIBtbF/IOjMzMzO2wsFFM0W5ubixsa+trayqlJKRkIqEgnRpYgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAADAA
+ AABgAAAAAQAgAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAO3fx//77NL/7NzE/+rawf/q2b//6di9/+fW
+ u//p1bz/zseP/4iiGf90lwD/epsA/3ubAP95mgD/fJwC/5CkI//Bu3f/3sip/97Hp//MvYb/sLJZ/4Oe
+ Dv93mQD/eJoA/3qbAP+SpCb/rqxT/8q0hP/RtY3/zbOH/8yxhP/MsIL/y6+B/8mtf//GrHz/xqp5/8Wp
+ dv/Fpnb/xKZ0/8Klcf/ApHD/wKNv/8Chbf/AoGz/v6Br/7+gav/Ip27/u5tm/+zexf///+X//+/T//3s
+ 0P/9687//OnM//voy///6dH/4tmf/6W5N/+Epwb/hKcA/4SnAP+EpwD/hKcB/4+tE/+9wF//59Oo/+3U
+ sv/o0Kb/xsJw/5OsGf99owD/gaUA/4OmAP+Sqxf/tLZP/9XAiP/hwpr/3MCR/9u+jf/avIv/2buK/9i7
+ iP/Xuob/1riD/9W3gf/VtYD/1LR+/9Kye//Rsnn/0bB4/9Cudv/PrXT/z61z/8+tcv/duHn/vJtn/+zd
+ w///8NT/7t7D/+vbwP/r2r//6tm9/+nYu//t2cL/3M+k/7C4Wf+Joxb/e5sA/3qaAP97mwD/eJkA/3ia
+ AP+XpjH/vrZ2/9K+mf/cwan/w7V//5CfKv91lAP/dJQA/3WVAP95lgf/k58w/7urcv/Mr4v/xq2C/8Wr
+ f//Eqn3/xKp8/8WrfP/Gq3v/xqp5/8SpeP/EqHf/xah1/8Smc//DpXH/w6Nv/8Kibv/BoGz/waBr/8Kh
+ av/PrHD/vJtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuf/p1r3/39Cr/8HAd/+VqCv/eZkA/3eY
+ AP95mQD/d5YA/3WVAP+AmRH/nqVI/8Gzhv/SuKP/vq2C/5idRf95kBL/booA/2yKAP9piQH/fpAa/6qe
+ Yf++o4H/uqJ6/7qheP+6onf/u6N2/72kd/+/pHf/wKR2/8Gldf/BpXT/wqZ0/8Gkcv/BonD/waJu/8Cg
+ bf+/n2v/v59q/8Cgaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fVuf/o1br/49Kx/87G
+ jf+erTv/eZkA/3aXAP95mAD/dpUA/3OTAP9wjwL/hZYk/6+ncf/DrJT/t6SC/6GZYf99iiX/ZH8A/2J/
+ AP9gfgD/boIO/5OOSv+qlW//rZdy/66Xcf+wmHD/sppx/7adcv+5n3P/vKBz/76ic//ApXT/waV0/8Gj
+ cv/BonD/waNu/8Cgbf+/n2v/v59q/8Chaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fV
+ uf/n1bj/5tO3/9nMoP+lsEf/eJgA/3SVAP94lgD/dJIA/3CPAP9ohwD/dYoT/5mXV/+tnH3/q5d9/6CQ
+ b/98gTb/XXQE/1hyAP9YcQD/YHQI/3Z7Lf+PhFT/nYlo/6CLaf+jjGj/p5Bq/62VbP+ymW7/t51v/7ug
+ cv+/o3L/wKRz/8Gjcf/Bo3D/waNu/8Chbf+/oGv/v6Bq/8Chaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZ
+ vv/p2L3/6Ne7/+bVuf/l1Lb/6dW8/+PRsv+stFX/eJgA/3OUAP92lAD/cpAA/2yKAP9igAD/aH4I/3+D
+ Of+Sh2H/l4Rv/5F/aP92c0H/WmcU/01iAP9LYAD/TmIA/1lmEP90cDn/inlb/5B8Xv+UgF3/m4Zh/6KM
+ Zf+rk2n/splt/7iecP+9oXH/v6Jx/8CjcP/Bo3D/waJv/8Chbf+/oGv/v6Bq/8Cgaf/Nqm//vZ1m/+vd
+ xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6tW9/+bTuP+2umb/gp0Q/3WVAf9zkQD/bYsA/2J/
+ AP9UcQD/UGgA/1llDv9rZjj/dWVR/3BfTf9hVzv/TU4c/zdGAP8vQwD/MUQA/zVHAP9NURP/aFs6/3Nh
+ Rf99akv/inZU/5eCXv+jjGX/rJRp/7Oabf+6nm//vqFw/8CicP/BonD/waJv/8Cgbf+/oGv/v6Bq/8Cg
+ af/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XStf+9vXH/jKIf/3eV
+ AP9tjQD/bYkF/3KJF/9ziCb/coMs/3N9Of9/fVb/hnxr/4F2Z/98c2T/cm1V/2BmNv9YZCr/WWYq/1to
+ Kv9pbj3/fXdY/4h8Zf+Mfmb/jXxg/5F9XP+bhWD/p49m/6+Wav+3nG//vaFw/8CicP/BonD/waJv/8Cg
+ bf+/oGv/v6Bq/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XS
+ tf+9vHL/jaEh/3WUAP9niAD/dI0U/5yoZP/BxqP/0NO3/9HRuv/Qz73/0M3B/83Kvv/Myb//y8i9/8jH
+ tv/Gx7L/x8mz/8nLtP/MzLj/09DA/9TRw//DvrH/pZuH/5KAYv+Uflr/pI1k/66Vaf+2m23/vJ9v/8Ci
+ cP/Bo3D/waNv/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
+ uf/l1Lb/6dS6/+XStf/Cv3r/k6Ut/3aTBP9jgwD/dY0b/621hf/k4tr/+vf0//j08v/w7+j/7Ozk/+vr
+ 4v/s7OP/7u3l//Lv6v/08ez/9vPu//j18P/49u//+/nw//j47v/d3NL/squa/5ODZf+SfVf/pI1k/66V
+ af+2m23/vJ9v/8CicP/BonD/waNv/8Chbf+/oWv/v59q/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZ
+ vv/p2L3/6Ne7/+bVuf/l1Lb/6NS5/+XStf/Jwob/nKo+/3iUCf9hgQD/c4oZ/6ave//a2cz/7Ovi/+fl
+ 3v/e3db/3NvV/93c1f/f39f/4eHZ/+Pi2//l5N3/6Off/+vq4f/u7eT/8/Lo//Lx5//a2M7/s6ua/5eF
+ Z/+WgFn/po9l/7CXav+3nG7/vaBw/8CicP/BonD/waJv/8Chbf+/oWv/v6Bq/8Cgaf/Nqm//vZ1m/+vd
+ xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/n6tD/3mUCv9ggAD/cogZ/6Wt
+ ev/W1cj/5uXe/+Hg2f/Z2NL/19bR/9jX0v/b2tP/3t7X/+Df2P/j4tv/5+be/+rp4P/u7OL/8PDn//Dv
+ 5v/a2M3/tq6b/52La/+chF3/q5Jn/7OZbP+5nnD/vqJx/8CjcP/Bo3D/waJv/8Cgbf+/oGv/v6Bq/8Cg
+ af/Nqm//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/oKtE/3mU
+ Cv9gfwD/cYcZ/6Ssev/T0sf/4+Lb/97d2P/Z2NL/1NPO/8vKxf/Cwbv/wb+5/8bEvf/Ny8T/09HI/9bU
+ yv/W1sj/2NrI/9jbyf/Fya3/rKmE/6OQbP+njWf/sJds/7acbv+7n3D/vqNx/8CkcP/BpHD/waNu/8Cg
+ bf+/oGv/v59q/8Cgaf/Nqm//vZxm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XS
+ tf/LxIr/oKtD/3mUCv9gfwD/cYcZ/6Ssev/S0sf/4uHb/97d2P/c29X/0dDL/7W0r/+XlIz/i4d9/5aR
+ hv+knpD/raaX/7Orm/+0r5j/srGQ/6yyhP+ZqGH/jJlH/5eRTv+qlGT/t5xz/7ufc/+9oXL/v6Ny/8Ck
+ cf/BpHD/waNu/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
+ uf/l1Lb/59S5/+XStf/LxIr/oKtD/3mUCv9ffwD/cYcZ/6Stev/T08f/4+Lc/9/e2v/g39r/0NDL/6Wk
+ nv90b2X/YlhJ/29kUv+CdmD/j4Fn/5mJbv+hkHH/nJFj/4uPQ/92ihz/b4kN/32MG/+dlkn/uJ9w/76i
+ dv/AonT/waRz/8Gkcf/BpHD/waJu/8Chbf+/n2v/v59q/8Cgaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZ
+ vv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/oKtD/3mUCv9ffwD/cYcZ/6Sse//T08j/5OPe/+Lh
+ 3P/k493/09PN/6Ohmv9rZFn/VUk3/2RWQP95alD/iHdY/5SAX/+eiGX/nopf/5SKSv+GiS7/eIoU/3KM
+ BP+Ckxr/oJxG/7ahZv/BpHX/w6V1/8Kkcv/Bo3D/waJu/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZtm/+vd
+ xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/MxIv/oatE/3mUCv9ffwD/cYcZ/6Ss
+ fP/U1Mr/5uXh/+Xk3//n5uD/19bR/6imn/9xal7/Wk89/2hcRv99blb/inpe/5eFZf+gjGn/p5Ft/6yU
+ b/+plWb/mpRK/4mSKf+AlBX/i5gk/6OeRv+4o2X/waVy/8Okc//Co3D/waJu/8Chbf+/oWv/v6Bq/8Cg
+ af/Nqm//vZtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XStf/LxIr/oKtE/3mU
+ Cv9ffwD/cYgZ/6WufP/W1sz/6Obi/+fm4f/p6OP/2djT/6imn/9vaV3/Vkw7/2NXQ/93aFL/hHVa/5B/
+ Yf+ahmb/ooxq/6iQbv+slW//rJdq/6uZYf+gmUv/lpo1/5acMf+poUz/vaRq/8Kkcv/Co3H/waJv/8Ch
+ bf+/oGv/v6Bq/8Chaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/59S5/+XS
+ tf/GwYL/mKc3/3eSB/9gfwD/cYgZ/6WufP/X1sz/6efk/+jn4//q6uX/2dnU/6alnv9qZFn/TkU2/1pP
+ Pf9sX0r/eWtS/4R0WP+OfF7/loNh/5yIZP+jjWn/rJNw/7WYdv+1m27/rJ1a/6aeTf+woVj/vqRt/8Kk
+ cv/DpHL/w6Jx/8Khcf/CoG//wqBu/8Ohbf/QqnP/v5tp/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
+ uf/l1Lb/6NW6/+XStf+/vnf/j6Mn/3SRAv9hgAD/cYga/6Wuff/X183/6unl/+jn5P/r6+f/2NjT/6Cf
+ mf9bVk3/OjIk/0Q6Kv9VSjf/YVQ+/2xdRP93Zkr/gG1P/4h1Vf+Tf13/oIpl/6mRa/+ymG7/uJ1x/72h
+ df/Co3f/xaV4/8ald//EpHP/v6Js/72haP+6n2T/up9i/7ugYv/Iqmj/upth/+vdxP//7tL/7NzB/+nZ
+ vv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XStf+9vHL/i6Eh/3ORAP9hgAD/cYga/6awf//Y2c//6+rn/+np
+ 5v/r6+j/2NjU/5+dmf9ZVEz/NS4j/z01Jv9LQzP/V0s5/2BUPv9rXEX/dGRK/35tUP+Jdlf/lYJe/6GL
+ Zf+sk2z/tppy/72gdv/Co3f/w6V3/8SldP+9o2j/saBW/6qfSv+lnUL/o50//6SeP/+yqUb/pZtB/+vd
+ xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW7/+XStf+8vG//iaAd/3KRAP9hgAD/cYga/6aw
+ gP/Y2tD/6+vo/+no5v/n5+T/3t3a/8LAvf+fnZf/jouE/5OPhv+cl47/op2R/6ehlP+tppn/sKqb/6yj
+ k/+YinH/jntZ/5uFYf+tknH/tZly/7KdZv+uoFn/qaFL/6GhPP+ZnzH/kp0l/42cHP+KnBf/iZwW/4qd
+ Fv+VqBn/j5sf/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6dW8/+XStv+3umj/gpwS/3CQ
+ AP9igAD/coga/6ewgP/Z2tH/7Ovp/+ro5//k4+H/5OTh/+bl5P/q6ub/7e3p//Dv6//z8+7/9fbv//f3
+ 8f/5+fT/9ffy/+Hh3P+vpJT/jHhZ/5R/V/+ij17/opRT/5mYP/+Rmyr/iJwV/3ycAv94mwD/epsA/3qb
+ AP96mwD/epsA/3ucAP+EqAD/epsA/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bVuf/l1Lb/6tW9/+XS
+ tv+wtlz/eZcE/26OAP9jgQD/cogb/6iwgP/b29L/7u3r/+zq6f/l5uP/5ubj/+rp5//v7+3/9PTw//X2
+ 8v/4+PT/+vv2//39+f////z/+/z5/+fn4/+zqJn/i3hV/4d9QP+DiSz/fI0W/3qSDf97lwf/e5oB/3ib
+ AP93mwD/eZsA/3mbAP95mwD/eZsA/3qcAP+DqAD/eZsA/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+bV
+ uf/l1Lb/6dW9/+TStP+stFX/dZUA/22OAP9jgQD/cogb/6iwgP/c3NP/8O/s/+3s6v/n6OX/6Ojl/+vq
+ 6P/v7uz/8vHv//Pz8P/29fL/+Pjz//v69v/+/fj//Pr6/+nm5f+sqIn/d3cw/3B7Gv9uhgj/a4sA/2+R
+ AP90lgD/eJoA/3ubAP97mwD/e5sA/3ubAP97mwD/e5sA/3ycAP+FqAD/e5sA/+vdxP//7tL/7NzB/+nZ
+ vv/p2L3/6Ne7/+bVuf/m1Lf/59W6/97Pqf+osk//dpYA/22OAP9jgQD/cogb/6ixgf/d3dX/8fHu//Du
+ 7f/q6uj/6enn/+bl4//i4uD/4+Lg/+Xl4v/p6OX/7ezo//Hv7P/08vD/9PHx/+Hf2P+dpWz/Y3cI/2F7
+ AP9riAD/cI4A/3STAP93lwD/epoA/3ubAP97mwD/e5sA/3ubAP97mwD/epsA/3ucAP+EqAD/epsA/+vd
+ xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fVuf/o1bn/5dO0/9PJlv+hrkL/dpYA/26OAP9jgQD/cogb/6mx
+ gv/e3tf/8/Lw//Lx8P/w7+3/6Ojm/9LS0P+6ubb/sa+q/7e1sP/Avrj/yMS+/83Jw//RzsT/z8+//7/D
+ ov+Km0j/YXsA/2OAAP9tigD/cpAA/3aVAP95mAD/epoA/3ubAP97mwD/e5sA/3qbAP96mwD/epsA/3uc
+ AP+EqAD/epsA/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fVuf/p1rz/4dGu/8fDgv+ZqjT/dpYA/26O
+ AP9jgQD/cogb/6mxgv/e39j/9PTy//X08//19fP/5ubj/7q6t/+JhX7/c21i/353av+Qhnr/l458/5WT
+ b/+Pll7/i5hS/4WWQv9yiRv/ZoEA/2mGAP9wjQD/dJEA/3aVAP95mAD/epkA/3qbAP95mwD/d5sA/3ab
+ AP94mwD/fJsA/4CcBf+KqAj/f5sF/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuf/p1r3/39Cq/76+
+ c/+Spin/dpYA/2+PAP9jgQD/cogb/6myg//f4Nn/9/X0//f19f/5+ff/5eXk/66sqf9sZl3/UUY3/15R
+ P/9uYkj/bmk7/2ZsIf9cbwj/WXIA/113AP9jfQD/aIMA/2yIAP9wjgD/dJIA/3WVAP92mAD/d5kA/3qb
+ AP99mwT/gpwL/4WcEP+LnRf/kZ0h/5aeKP+iqC3/lJsm/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fW
+ uf/q1r//3c6m/7e7Zv+NpCD/d5YA/3CPAP9jgQD/cogb/6qzhP/h4dv/+ff2//j39//7+/n/5+fm/66s
+ qv9rZVz/T0Q1/1pOOf9dWi7/VV4S/1JkAv9TaQD/Vm8A/1t0AP9hewD/Z4IA/2yIAP9vjQD/c5AA/3SU
+ AP92lwD/eZoA/4GcC/+OnSD/nZ42/6mfSf+xn1X/tZ9a/7efXP/EqmH/tptb/+vdxP//7tL/7NzB/+nZ
+ vv/p2L3/6Ne7/+fWuf/r18H/2s2h/6u0Uv+FnxH/d5YA/3CPAP9jgQD/cokb/6q0hf/h4tz/+vj5//r6
+ +v/9/fz/6eno/7CurP9tZ2H/TEQz/0xJJv9LUxT/R1kB/0tgAP9SZwD/WG4A/1xzAP9feAD/ZH4A/2iD
+ AP9piQD/b44A/3uUC/+KmR//l50x/6KfQf+toVH/t6Ff/7+ga//DoHH/xKBx/8SgcP/Rqnb/wJtr/+vd
+ xP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuv/t2MP/1cqa/5ysOP96mgP/d5YA/3GQAP9jgQD/cooc/6u1
+ hv/i493/+vn6//v7+//+//7/6urp/62rqf9hXVP/NDMV/y00AP8xQAD/NkgA/z1QAP9DVwD/SF0A/0xj
+ AP9SawD/W3UA/2R9AP9uhgj/fI4W/5GWMf+onVD/uaFn/8Gjcv/Do3P/wqJw/8Ggbv/An2z/v59r/8Cg
+ av/NqnD/vZ1n/+vdxP//7tL/7NzB/+nZvv/p2L3/6Ne7/+fWuv/r18H/zsaO/5CmI/9zlgD/d5YA/3OQ
+ AP9kggD/dIsc/6y2h//k5d///Pv8//39/f//////7Ovs/7Cuq/9cXEr/KC4F/yUwAP8uOwD/NEMA/zlJ
+ AP8/UQD/RFcA/0ldAP9OZAD/V24A/2d6Df+Bhyz/m5JL/62aYP+5n23/wKJz/8Skdv/DpHT/wqJw/8Gh
+ bv+/n2v/v59q/8Cgaf/Nq2//vZ1m/+vdxP//7tL/7NzB/+nZvv/p2L3/6de8/+fWuv/i0rH/v791/4mj
+ F/9ylgD/d5cA/3ORAP9kggD/dYwc/624h//l5+D//fz9//7+/v/+/f3/8vHx/8vKyf+Vlon/dHhf/3R6
+ X/98gmH/f4di/4OKY/+Gj2T/jJZo/4+ZaP9/ik7/cXoz/3x7N/+Vh1D/q5Jo/7eacv+9n3X/v6Jy/8Gk
+ cf/BpHD/waJu/8Chbf+/n2v/v59q/8Chaf/Nq2//vZxm/+vdxP//7tL/7NzB/+nZvv/p2L3/6ti//+jW
+ vP/Uy5n/q7VS/4WgD/91mAD/eJgA/3OSAP9lgwD/d44c/7G7iv/o6eP//v3+//7+/v/8/Pv/+Pj3/+7u
+ 7f/g4N7/2dnX/9ra1//d3dr/3t7b/+Df3P/g4d3/5ufk/+bn4/++va3/lIxu/5F/Xf+dhmH/qZFo/7KY
+ bf+5nnD/vqJx/8Gjcf/Bo3D/waJu/8Chbf+/oGv/v6Bq/8Chaf/Nqm//vZtm/+vdxP//7tL/7NzB/+nZ
+ vv/p2L3/69nB/+nWvP/HxIP/mKsz/3+eBv94mQD/eJgA/3STAP9mhQD/epEe/7a/kf/s7Oj/////////
+ ///8/Pz//Pz8//v7+//8/Pz//Pz9//38/f/9/P7//f3///79///+/f/////////////Tz8j/oJOA/5SB
+ Yv+dhV//qZJn/7KZbP+5nnD/vqJx/8Gjcf/Bo3D/waJu/8Chbf+/oGv/v6Bq/8Cgaf/Nqm//vZtm/+vd
+ xP//7tL/7NzB/+nZvv/p2L3/7NnC/+fVuP+3vGj/hKAS/3mbAf96mQD/eZgA/3WTAP9mhwD/fJUe/7/F
+ nP/y8PL/////////////////////////////////////////////////////////////////////////
+ ///Y1M7/pZiF/5aDY/+ehl7/q5No/7OZbP+6nnD/vqJx/8Gkcf/BpHD/waJu/8Chbf+/n2v/v59q/8Cg
+ af/Nqm//vZxm/+vdxP//7tL/7NzB/+nZvv/r2sD/6de8/9fNnf+jsUT/eJoA/3aZAP97mgD/epgA/3aU
+ AP9rigD/hZso/8nMqf/49fv//////////////////////////////////v7///3+///9/v7//f7///3+
+ ///9/v/////////////Z1M7/q52J/52JZ/+jimL/r5Vq/7abbv+7n3D/v6Jx/8Gkcf/BpHD/waJu/8Ch
+ bf+/n2v/v59q/8Cgaf/Nqm//vZ1m/+vdxP//7tL/7NzB/+rZv//u28X/4NOt/7q+bP+OpiD/eJkA/3ia
+ AP97mwD/eJkA/3aWAP94kwj/maZF/9HPsf/07vL/9/X2//Ly8f/u7+z/7e7r/+vs6f/q6+f/6evn/+rq
+ 5//r6uj/7Ovq/+zs6//t7ez/8fHx//Hw8P/UzcP/saCI/6aQa/+qkWf/s5lt/7mecP+9onL/wKRz/8Gj
+ cv/Bo3D/waJu/8Cgbf+/n2v/v59q/8Cgaf/Nqm//vZtm/+vdxP//7tL/7NzC/+rZv//v28j/1s2c/5yt
+ Of97mwj/epoA/3qbAP97mwD/d5kA/3eYAP+PoCj/uLR0/9THq//Wzbf/wsSY/625ef+js3D/orFu/5+u
+ av+erWr/qLF7/7q1mf/Ct6f/wren/8K4pv/DuKb/xryq/8i8qf+9rpX/sZx6/6+Xbv+ymW3/uJ5x/7yh
+ cv/ApHP/waR0/8Gjcv/Bo3D/waJu/8Cgbf+/n2v/v59q/8Cgaf/Nq2//vZtm/+vdxP//7tL/7t3F/+zb
+ w//k1rb/v8B1/4miGP9zlwD/epsA/3ubAP96mQD/eJkA/4KdDv+rr1b/08Cc/9S/of+zrG7/iJUr/22H
+ BP9igQD/Yn8A/2R+AP9vghL/hoo5/5+RY/+pk3T/p5Jw/6eRbv+nkW3/qZJs/6qUbP+ulm7/sppw/7ae
+ cv+6oHP/vaJ0/7+jc//BpHT/wqR0/8Gjcv/Bo3D/waJu/8Cgbf+/n2v/v59q/8Cgaf/Nq2//vZ1m/+vd
+ xP//7tL/8N7I/+zbw//NyY7/nq89/3+cB/92mAD/e5sA/3ubAP93mAD/f5wI/5qqN//EvH7/3caq/9K/
+ mv+hpkj/c48C/2mIAP9lhgD/aYYA/3mMFP+Wl0T/rp5t/7Wgev+1nnn/tJx1/7Occ/+zm3L/s5tx/7Sb
+ cP+3nnL/uqF1/72kd//ApXf/waR2/8Gldf/CpnX/wqZz/8Kkcv/Co3D/waJu/8Cgbf+/n2v/v59q/8Cg
+ af/Nqm//vZ1m/+vdxP//79b/793G/9/TrP+vuVr/g6AP/3qaAP96mgD/e5sA/3qaAP95mgD/j6Ui/7y7
+ cP/dyaf/28ek/8G6ef+SpCr/cZQA/3CSAP92lAP/iZsi/6moWf/EsYX/zLOT/8mwjv/ErYb/xKyE/8Os
+ gv/Dq4D/wqp//8Kpff/CqHz/wqh7/8Ooev/EqHr/xKd4/8Ondv/Dp3b/w6dz/8Klcv/Co3D/waJu/8Ch
+ bf+/oGv/v59q/8Cgaf/Nqm//vZxm/+zdxf//8dr/5de1/7/Bdf+SqCj/eJkA/3iZAP97mwD/eZkA/3iZ
+ AP+HoRX/rrRW/9fInf/q0L3/0sOU/6WuSP+BnRD/dZgA/3mZBP+PoiT/sK5d/8y6jf/WvJv/0LmS/862
+ jv/MtIv/y7OK/8uyiP/KsYX/ya+D/8eugf/HrX//x6x9/8eqfP/Gqnv/xql5/8Sod//EqHb/xKd0/8Kl
+ cv/Bo3D/waJu/8Chbf+/oGv/v59q/8Cgaf/Nqm//vZtm/+7dxf//79H/z8yO/5uuNv99nQb/epsA/3uc
+ AP97nQD/eZoA/3+dBP+lsUX/0seU/+TQsv/m0LX/xr9+/5CmIv91mQL/fZ0D/5GmJv+2tGH/1L+T/9vC
+ n//ZwJv/1b2V/9O8kv/SupD/0bmO/9C3i//Pton/zrOG/8yyhP/MsIL/zK+A/8qtf//JrXz/yax6/8eq
+ eP/GqXf/xql1/8Snc//DpXH/w6Nv/8Kibv/BoWz/waBr/8Khav/PrHD/vJtm/+vdw//08Kz/r8FH/4qr
+ C/+ApQD/hacA/4WoAP+BpgD/jKsP/7C+SP/b1JT/9+LD//jiw//i1Z7/t79V/4yrC/+Epwj/o7Ux/8fE
+ b//l0KH/79Ow/+vRqv/nzqP/58yh/+XLnv/kypz/4sea/+HFlv/gxJT/38KR/92/j//cvo3/3L2L/9m7
+ if/Yu4b/17iD/9W3gf/VtYD/1LV+/9Kze//Rsnn/0bB4/9Cudv/PrXT/z6xz/8+tcv/duHn/vJxm/+bc
+ vv++yWb/haER/3iZAP96mgD/e5sA/3qbAP91lwD/h6EW/8TBff/i0LD/5tK3/+PQsv+7vG//l6kw/32b
+ A/+Kohn/qq9N/9TAlf/ew6X/2cGc/9bAmv/VvZb/1buV/9O7kf/RupD/0beO/8+1i//OtIj/zbOG/8ux
+ hP/LsIH/y6+B/8mtf//Gq3z/xap5/8Wpdv/Fpnb/xKZ0/8Klcf/ApHD/wKNv/8Chbf/AoWz/v59r/7+f
+ av/IqG7/u51m/wAAAAAAAH0CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAB9AgAAAAAAADw5AAAAAAAAzgsAAAAAAAByWQAA
+ AAAAAM0NAAAAAAAAclkAAAAAAADMlAAAAAAAAHFUAAAAAAAAt7UAAAAAAABxVAAAAAAAAA4MAAAAAAAA
+ cVQAAAAAAACNNgAAAAAAAH5WAAAAAAAAmikAAAAAAABwUwAAAAAAAGEAAAAAAAAABAAAAAAAAAB9AgAA
+ AAAAACAAAAAAAAAAdAAAAAAAAABhAAAAAAAAACgAAAAAAAAAcgAAAAAAAAAuAAAAAAAAACkAAAAAAAAA
+ YwAAAAAAAAAqAAAAAAAAAHcAAAAAAAAAZwAAAAAAAABsAA==
+
+
+
\ No newline at end of file
diff --git a/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs
new file mode 100644
index 0000000..15efebf
--- /dev/null
+++ b/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
diff --git a/obj/Debug/Instrument Control.csproj.FileListAbsolute.txt b/obj/Debug/Instrument Control.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..7f09b41
--- /dev/null
+++ b/obj/Debug/Instrument Control.csproj.FileListAbsolute.txt
@@ -0,0 +1,14 @@
+D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.AssemblyReference.cache
+D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.SuggestedBindingRedirects.cache
+D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.ResolveComReference.cache
+D:\Code\Instrument Control Example\obj\Debug\Waters.Empower.InstrumentControl.Example.FrmMain.resources
+D:\Code\Instrument Control Example\obj\Debug\Waters.Empower.InstrumentControl.Example.Properties.Resources.resources
+D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.GenerateResource.cache
+D:\Code\Instrument Control Example\obj\Debug\Instrument Control.csproj.CoreCompileInputs.cache
+D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.AssemblyReference.cache
+D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.SuggestedBindingRedirects.cache
+D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.ResolveComReference.cache
+D:\gitcode\Empower\obj\Debug\Waters.Empower.InstrumentControl.Example.FrmMain.resources
+D:\gitcode\Empower\obj\Debug\Waters.Empower.InstrumentControl.Example.Properties.Resources.resources
+D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.GenerateResource.cache
+D:\gitcode\Empower\obj\Debug\Instrument Control.csproj.CoreCompileInputs.cache
diff --git a/obj/Debug/Waters.Empower.InstrumentControl.Example.FrmMain.resources b/obj/Debug/Waters.Empower.InstrumentControl.Example.FrmMain.resources
new file mode 100644
index 0000000..8c49518
Binary files /dev/null and b/obj/Debug/Waters.Empower.InstrumentControl.Example.FrmMain.resources differ
diff --git a/obj/Debug/Waters.Empower.InstrumentControl.Example.Properties.Resources.resources b/obj/Debug/Waters.Empower.InstrumentControl.Example.Properties.Resources.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/obj/Debug/Waters.Empower.InstrumentControl.Example.Properties.Resources.resources differ