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