diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.Designer.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.Designer.cs
new file mode 100644
index 00000000..98d097b7
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.Designer.cs
@@ -0,0 +1,499 @@
+namespace ROEditor
+{
+ partial class AboutROEditor
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.logoPictureBox = new System.Windows.Forms.PictureBox();
+ this.labelProductName = new System.Windows.Forms.Label();
+ this.labelVersion = new System.Windows.Forms.Label();
+ this.labelCopyright = new System.Windows.Forms.Label();
+ this.labelCompanyName = new System.Windows.Forms.LinkLabel();
+ this.textBoxDescription = new System.Windows.Forms.TextBox();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.panel3 = new System.Windows.Forms.Panel();
+ this.labelVersionDateTime = new System.Windows.Forms.Label();
+ this.labelServer = new System.Windows.Forms.Label();
+ this.labelDatabase = new System.Windows.Forms.Label();
+ this.panel4 = new System.Windows.Forms.Panel();
+ this.panel5 = new System.Windows.Forms.Panel();
+ this.panel6 = new System.Windows.Forms.Panel();
+ this.panel7 = new System.Windows.Forms.Panel();
+ this.btnEULA = new System.Windows.Forms.Button();
+ this.btnOK = new System.Windows.Forms.Button();
+ ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
+ this.panel1.SuspendLayout();
+ this.panel2.SuspendLayout();
+ this.panel3.SuspendLayout();
+ this.panel4.SuspendLayout();
+ this.panel5.SuspendLayout();
+ this.panel6.SuspendLayout();
+ this.panel7.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // logoPictureBox
+ //
+ this.logoPictureBox.Cursor = System.Windows.Forms.Cursors.Hand;
+ this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.logoPictureBox.Image = global::ROEditor.Properties.Resources.Red_V_txt_NB_bur_1984;
+ this.logoPictureBox.Location = new System.Drawing.Point(0, 0);
+ this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4);
+ this.logoPictureBox.Name = "logoPictureBox";
+ this.logoPictureBox.Size = new System.Drawing.Size(577, 174);
+ this.logoPictureBox.TabIndex = 25;
+ this.logoPictureBox.TabStop = false;
+ this.logoPictureBox.Click += new System.EventHandler(this.logoPictureBox_Click);
+ //
+ // labelProductName
+ //
+ this.labelProductName.Dock = System.Windows.Forms.DockStyle.Top;
+ this.labelProductName.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelProductName.Location = new System.Drawing.Point(0, 0);
+ this.labelProductName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelProductName.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelProductName.Name = "labelProductName";
+ this.labelProductName.Size = new System.Drawing.Size(577, 21);
+ this.labelProductName.TabIndex = 19;
+ this.labelProductName.Text = "Referenced Object Editor";
+ this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelVersion
+ //
+ this.labelVersion.Dock = System.Windows.Forms.DockStyle.Top;
+ this.labelVersion.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelVersion.Location = new System.Drawing.Point(0, 0);
+ this.labelVersion.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelVersion.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelVersion.Name = "labelVersion";
+ this.labelVersion.Size = new System.Drawing.Size(577, 21);
+ this.labelVersion.TabIndex = 0;
+ this.labelVersion.Text = "Version 1 Beta Release";
+ this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelCopyright
+ //
+ this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelCopyright.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelCopyright.Location = new System.Drawing.Point(0, 0);
+ this.labelCopyright.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelCopyright.Name = "labelCopyright";
+ this.labelCopyright.Size = new System.Drawing.Size(577, 21);
+ this.labelCopyright.TabIndex = 21;
+ this.labelCopyright.Text = "Copyright 2008";
+ this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelCompanyName
+ //
+ this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.labelCompanyName.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelCompanyName.Location = new System.Drawing.Point(0, 0);
+ this.labelCompanyName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelCompanyName.Name = "labelCompanyName";
+ this.labelCompanyName.Size = new System.Drawing.Size(577, 21);
+ this.labelCompanyName.TabIndex = 22;
+ this.labelCompanyName.TabStop = true;
+ this.labelCompanyName.Text = "Volian Enterprises Inc.";
+ this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.labelCompanyName.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.labelCompanyName_LinkClicked);
+ //
+ // textBoxDescription
+ //
+ this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.textBoxDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.textBoxDescription.Location = new System.Drawing.Point(0, 0);
+ this.textBoxDescription.Margin = new System.Windows.Forms.Padding(8, 4, 4, 4);
+ this.textBoxDescription.Multiline = true;
+ this.textBoxDescription.Name = "textBoxDescription";
+ this.textBoxDescription.ReadOnly = true;
+ this.textBoxDescription.Size = new System.Drawing.Size(577, 119);
+ this.textBoxDescription.TabIndex = 23;
+ this.textBoxDescription.TabStop = false;
+ this.textBoxDescription.Text = "Thank you for choosing PROMS for your procedure maintenance solution.\r\n\r\nPROMS is" +
+ " protected under the copyright laws.\r\n\r\nPlease refer the the End User Licence Ag" +
+ "reement (EULA) for the terms of use.\r\n";
+ //
+ // panel1
+ //
+ this.panel1.Controls.Add(this.logoPictureBox);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel1.Location = new System.Drawing.Point(12, 11);
+ this.panel1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(577, 174);
+ this.panel1.TabIndex = 26;
+ //
+ // panel2
+ //
+ this.panel2.Controls.Add(this.labelProductName);
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel2.Location = new System.Drawing.Point(12, 185);
+ this.panel2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(577, 31);
+ this.panel2.TabIndex = 27;
+ //
+ // panel3
+ //
+ this.panel3.Controls.Add(this.labelVersionDateTime);
+ this.panel3.Controls.Add(this.labelServer);
+ this.panel3.Controls.Add(this.labelDatabase);
+ this.panel3.Controls.Add(this.labelVersion);
+ this.panel3.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel3.Location = new System.Drawing.Point(12, 216);
+ this.panel3.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.panel3.Name = "panel3";
+ this.panel3.Size = new System.Drawing.Size(577, 82);
+ this.panel3.TabIndex = 28;
+ //
+ // labelVersionDateTime
+ //
+ this.labelVersionDateTime.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.labelVersionDateTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelVersionDateTime.Location = new System.Drawing.Point(0, 19);
+ this.labelVersionDateTime.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelVersionDateTime.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelVersionDateTime.Name = "labelVersionDateTime";
+ this.labelVersionDateTime.Size = new System.Drawing.Size(577, 21);
+ this.labelVersionDateTime.TabIndex = 1;
+ this.labelVersionDateTime.Text = "Version Date/Time";
+ this.labelVersionDateTime.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // labelServer
+ //
+ this.labelServer.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.labelServer.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelServer.Location = new System.Drawing.Point(0, 40);
+ this.labelServer.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelServer.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelServer.Name = "labelServer";
+ this.labelServer.Size = new System.Drawing.Size(577, 21);
+ this.labelServer.TabIndex = 3;
+ this.labelServer.Text = "SQL Server Name";
+ this.labelServer.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.labelServer.Visible = false;
+ //
+ // labelDatabase
+ //
+ this.labelDatabase.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.labelDatabase.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.labelDatabase.Location = new System.Drawing.Point(0, 61);
+ this.labelDatabase.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ this.labelDatabase.MaximumSize = new System.Drawing.Size(0, 21);
+ this.labelDatabase.Name = "labelDatabase";
+ this.labelDatabase.Size = new System.Drawing.Size(577, 21);
+ this.labelDatabase.TabIndex = 2;
+ this.labelDatabase.Text = "Database Name";
+ this.labelDatabase.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.labelDatabase.Visible = false;
+ //
+ // panel4
+ //
+ this.panel4.Controls.Add(this.labelCopyright);
+ this.panel4.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel4.Location = new System.Drawing.Point(12, 298);
+ this.panel4.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.panel4.Name = "panel4";
+ this.panel4.Size = new System.Drawing.Size(577, 28);
+ this.panel4.TabIndex = 29;
+ //
+ // panel5
+ //
+ this.panel5.Controls.Add(this.labelCompanyName);
+ this.panel5.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel5.Location = new System.Drawing.Point(12, 326);
+ this.panel5.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.panel5.Name = "panel5";
+ this.panel5.Size = new System.Drawing.Size(577, 28);
+ this.panel5.TabIndex = 30;
+ //
+ // panel6
+ //
+ this.panel6.Controls.Add(this.textBoxDescription);
+ this.panel6.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel6.Location = new System.Drawing.Point(12, 354);
+ this.panel6.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.panel6.Name = "panel6";
+ this.panel6.Size = new System.Drawing.Size(577, 119);
+ this.panel6.TabIndex = 31;
+ //
+ // panel7
+ //
+ this.panel7.Controls.Add(this.btnEULA);
+ this.panel7.Controls.Add(this.btnOK);
+ this.panel7.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panel7.Location = new System.Drawing.Point(12, 473);
+ this.panel7.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.panel7.Name = "panel7";
+ this.panel7.Size = new System.Drawing.Size(577, 47);
+ this.panel7.TabIndex = 32;
+ //
+ // btnEULA
+ //
+ this.btnEULA.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
+ this.btnEULA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnEULA.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnEULA.Location = new System.Drawing.Point(309, 14);
+ this.btnEULA.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.btnEULA.Name = "btnEULA";
+ this.btnEULA.Size = new System.Drawing.Size(91, 30);
+ this.btnEULA.TabIndex = 27;
+ this.btnEULA.Text = "&View EULA";
+ this.btnEULA.Visible = false;
+ this.btnEULA.Click += new System.EventHandler(this.btnViewEULA_Click);
+ //
+ // btnOK
+ //
+ this.btnOK.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
+ this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnOK.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnOK.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnOK.Location = new System.Drawing.Point(499, 14);
+ this.btnOK.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(75, 30);
+ this.btnOK.TabIndex = 26;
+ this.btnOK.Text = "&OK";
+ //
+ // AboutROEditor
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.SystemColors.ControlLightLight;
+ this.ClientSize = new System.Drawing.Size(601, 529);
+ this.Controls.Add(this.panel7);
+ this.Controls.Add(this.panel6);
+ this.Controls.Add(this.panel5);
+ this.Controls.Add(this.panel4);
+ this.Controls.Add(this.panel3);
+ this.Controls.Add(this.panel2);
+ this.Controls.Add(this.panel1);
+ this.DoubleBuffered = true;
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "AboutROEditor";
+ this.Padding = new System.Windows.Forms.Padding(12, 11, 12, 11);
+ this.ShowIcon = false;
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "About Proms 2010";
+ ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
+ this.panel1.ResumeLayout(false);
+ this.panel2.ResumeLayout(false);
+ this.panel3.ResumeLayout(false);
+ this.panel4.ResumeLayout(false);
+ this.panel5.ResumeLayout(false);
+ this.panel6.ResumeLayout(false);
+ this.panel6.PerformLayout();
+ this.panel7.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ //private void InitializeComponentORG()
+ //{
+ // System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutROEditor));
+ // this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+ // this.logoPictureBox = new System.Windows.Forms.PictureBox();
+ // this.labelProductName = new System.Windows.Forms.Label();
+ // this.labelVersion = new System.Windows.Forms.Label();
+ // this.labelCopyright = new System.Windows.Forms.Label();
+ // this.labelCompanyName = new System.Windows.Forms.Label();
+ // this.textBoxDescription = new System.Windows.Forms.TextBox();
+ // this.okButton = new System.Windows.Forms.Button();
+ // this.tableLayoutPanel.SuspendLayout();
+ // ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
+ // this.SuspendLayout();
+ // //
+ // // tableLayoutPanel
+ // //
+ // this.tableLayoutPanel.ColumnCount = 2;
+ // this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
+ // this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
+ // this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
+ // this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
+ // this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
+ // this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
+ // this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
+ // this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
+ // this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
+ // this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ // this.tableLayoutPanel.Location = new System.Drawing.Point(12, 11);
+ // this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4);
+ // this.tableLayoutPanel.Name = "tableLayoutPanel";
+ // this.tableLayoutPanel.RowCount = 6;
+ // this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ // this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ // this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ // this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ // this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ // this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+ // this.tableLayoutPanel.Size = new System.Drawing.Size(556, 326);
+ // this.tableLayoutPanel.TabIndex = 0;
+ // //
+ // // logoPictureBox
+ // //
+ // this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
+ // this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
+ // this.logoPictureBox.Location = new System.Drawing.Point(4, 4);
+ // this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4);
+ // this.logoPictureBox.Name = "logoPictureBox";
+ // this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
+ // this.logoPictureBox.Size = new System.Drawing.Size(175, 318);
+ // this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ // this.logoPictureBox.TabIndex = 12;
+ // this.logoPictureBox.TabStop = false;
+ // //
+ // // labelProductName
+ // //
+ // this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
+ // this.labelProductName.Location = new System.Drawing.Point(191, 0);
+ // this.labelProductName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ // this.labelProductName.MaximumSize = new System.Drawing.Size(0, 21);
+ // this.labelProductName.Name = "labelProductName";
+ // this.labelProductName.Size = new System.Drawing.Size(361, 21);
+ // this.labelProductName.TabIndex = 19;
+ // this.labelProductName.Text = "Product Name";
+ // this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ // //
+ // // labelVersion
+ // //
+ // this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
+ // this.labelVersion.Location = new System.Drawing.Point(191, 32);
+ // this.labelVersion.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ // this.labelVersion.MaximumSize = new System.Drawing.Size(0, 21);
+ // this.labelVersion.Name = "labelVersion";
+ // this.labelVersion.Size = new System.Drawing.Size(361, 21);
+ // this.labelVersion.TabIndex = 0;
+ // this.labelVersion.Text = "Version";
+ // this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ // //
+ // // labelCopyright
+ // //
+ // this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
+ // this.labelCopyright.Location = new System.Drawing.Point(191, 64);
+ // this.labelCopyright.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ // this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 21);
+ // this.labelCopyright.Name = "labelCopyright";
+ // this.labelCopyright.Size = new System.Drawing.Size(361, 21);
+ // this.labelCopyright.TabIndex = 21;
+ // this.labelCopyright.Text = "Copyright";
+ // this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ // //
+ // // labelCompanyName
+ // //
+ // this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
+ // this.labelCompanyName.Location = new System.Drawing.Point(191, 96);
+ // this.labelCompanyName.Margin = new System.Windows.Forms.Padding(8, 0, 4, 0);
+ // this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 21);
+ // this.labelCompanyName.Name = "labelCompanyName";
+ // this.labelCompanyName.Size = new System.Drawing.Size(361, 21);
+ // this.labelCompanyName.TabIndex = 22;
+ // this.labelCompanyName.Text = "Company Name";
+ // this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ // //
+ // // textBoxDescription
+ // //
+ // this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+ // this.textBoxDescription.Location = new System.Drawing.Point(191, 132);
+ // this.textBoxDescription.Margin = new System.Windows.Forms.Padding(8, 4, 4, 4);
+ // this.textBoxDescription.Multiline = true;
+ // this.textBoxDescription.Name = "textBoxDescription";
+ // this.textBoxDescription.ReadOnly = true;
+ // this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+ // this.textBoxDescription.Size = new System.Drawing.Size(361, 155);
+ // this.textBoxDescription.TabIndex = 23;
+ // this.textBoxDescription.TabStop = false;
+ // this.textBoxDescription.Text = "Description";
+ // //
+ // // okButton
+ // //
+ // this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ // this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ // this.okButton.Location = new System.Drawing.Point(452, 295);
+ // this.okButton.Margin = new System.Windows.Forms.Padding(4);
+ // this.okButton.Name = "okButton";
+ // this.okButton.Size = new System.Drawing.Size(100, 27);
+ // this.okButton.TabIndex = 24;
+ // this.okButton.Text = "&OK";
+ // //
+ // // AboutROEditor
+ // //
+ // this.AcceptButton = this.okButton;
+ // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+ // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ // this.ClientSize = new System.Drawing.Size(580, 348);
+ // this.Controls.Add(this.tableLayoutPanel);
+ // this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ // this.Margin = new System.Windows.Forms.Padding(4);
+ // this.MaximizeBox = false;
+ // this.MinimizeBox = false;
+ // this.Name = "AboutROEditor";
+ // this.Padding = new System.Windows.Forms.Padding(12, 11, 12, 11);
+ // this.ShowIcon = false;
+ // this.ShowInTaskbar = false;
+ // this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ // this.Text = "AboutROEditor";
+ // this.tableLayoutPanel.ResumeLayout(false);
+ // this.tableLayoutPanel.PerformLayout();
+ // ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
+ // this.ResumeLayout(false);
+
+ //}
+
+ #endregion
+
+ //private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+ //private System.Windows.Forms.PictureBox logoPictureBox;
+ //private System.Windows.Forms.Label labelProductName;
+ //private System.Windows.Forms.Label labelVersion;
+ //private System.Windows.Forms.Label labelCopyright;
+ //private System.Windows.Forms.Label labelCompanyName;
+ //private System.Windows.Forms.TextBox textBoxDescription;
+ //private System.Windows.Forms.Button okButton;
+ private System.Windows.Forms.Label labelProductName;
+ private System.Windows.Forms.Label labelVersion;
+ private System.Windows.Forms.Label labelCopyright;
+ private System.Windows.Forms.LinkLabel labelCompanyName;
+ private System.Windows.Forms.TextBox textBoxDescription;
+ private System.Windows.Forms.PictureBox logoPictureBox;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.Panel panel3;
+ private System.Windows.Forms.Panel panel4;
+ private System.Windows.Forms.Panel panel5;
+ private System.Windows.Forms.Panel panel6;
+ private System.Windows.Forms.Panel panel7;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.Button btnEULA;
+ private System.Windows.Forms.Label labelVersionDateTime;
+ private System.Windows.Forms.Label labelServer;
+ private System.Windows.Forms.Label labelDatabase;
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.cs
new file mode 100644
index 00000000..ec1f1b9b
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.cs
@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace ROEditor
+{
+ partial class AboutROEditor : Form
+ {
+ public AboutROEditor()
+ {
+ InitializeComponent();
+
+ // Initialize the AboutBox to display the product information from the assembly information.
+ // Change assembly information settings for your application through either:
+ // - Project->Properties->Application->Assembly Information
+ // - AssemblyInfo.cs
+ //this.Text = String.Format("About {0}", AssemblyTitle);
+ //this.labelProductName.Text = AssemblyProduct;
+ //this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
+ //this.labelCopyright.Text = AssemblyCopyright;
+ //this.labelCompanyName.Text = AssemblyCompany;
+ //this.textBoxDescription.Text = AssemblyDescription;
+
+ // Initialize the AboutBox to display the product information from the assembly information.
+ // Change assembly information settings for your application through either:
+ // - Project->Properties->Application->Assembly Information
+ // - AssemblyInfo.cs
+ DateTime buildDateTime = new System.IO.FileInfo(Assembly.GetExecutingAssembly().Location).LastWriteTime;
+ // If the AssemblyConfiguration is "DEMO" then we are running a Demo version
+ string demoTxt = "";//VlnSettings.ReleaseMode.Equals("DEMO")?"(Demo)": "";
+ //string connectionString = Database.VEPROMS_Connection;
+ //Match mServer = Regex.Match(connectionString,".*Data Source=([^;]*).*");
+ //string server = (mServer.Success)?mServer.Groups[1].Value:"unknown";
+ //if (server.StartsWith(@".\")) server = @"Local \ " + server.Substring(2);
+ //string databaseName = Database.SelectedDatabase;
+ this.Text = String.Format("About {0}", AssemblyTitle + " " + demoTxt);
+ this.labelProductName.Text = AssemblyProduct;
+ this.labelVersion.Text = String.Format("Version {0}", (demoTxt.Equals(""))? AssemblyVersion : demoTxt);
+ this.labelVersionDateTime.Text = String.Format("Build Date: {0}", buildDateTime.ToString());
+ this.labelCopyright.Text = String.Format("Copyright © {0}. All Rights Reserved.", buildDateTime.Year.ToString());
+ this.labelCompanyName.Text = AssemblyCompany;
+// this.textBoxDescription.Text = AssemblyDescription;
+ this.labelCompanyName.Links[0].LinkData = "Volian Enterprises Inc.";
+ this.labelCompanyName.Links.Add(0,23,"www.volian.com");
+ //this.labelServer.Text = string.Format("SQL Server: {0}", server);
+ //this.labelDatabase.Text = string.Format("Database: {0}", databaseName);
+
+ }
+
+ #region Assembly Attribute Accessors
+
+ public string AssemblyTitle
+ {
+ get
+ {
+ // Get all Title attributes on this assembly
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
+ // If there is at least one Title attribute
+ if (attributes.Length > 0)
+ {
+ // Select the first one
+ AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
+ // If it is not an empty string, return it
+ if (titleAttribute.Title != "")
+ return titleAttribute.Title;
+ }
+ // If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name
+ return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
+ }
+ }
+
+ public string AssemblyVersion
+ {
+ get
+ {
+ return Assembly.GetExecutingAssembly().GetName().Version.ToString();
+ }
+ }
+
+ public string AssemblyDescription
+ {
+ get
+ {
+ // Get all Description attributes on this assembly
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
+ // If there aren't any Description attributes, return an empty string
+ if (attributes.Length == 0)
+ return "";
+ // If there is a Description attribute, return its value
+ return ((AssemblyDescriptionAttribute)attributes[0]).Description;
+ }
+ }
+
+ public string AssemblyProduct
+ {
+ get
+ {
+ // Get all Product attributes on this assembly
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+ // If there aren't any Product attributes, return an empty string
+ if (attributes.Length == 0)
+ return "";
+ // If there is a Product attribute, return its value
+ return ((AssemblyProductAttribute)attributes[0]).Product;
+ }
+ }
+
+ //public string AssemblyCopyright
+ //{
+ // get
+ // {
+ // // Get all Copyright attributes on this assembly
+ // object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
+ // // If there aren't any Copyright attributes, return an empty string
+ // if (attributes.Length == 0)
+ // return "";
+ // // If there is a Copyright attribute, return its value
+ // return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
+ // }
+ //}
+
+ public string AssemblyCompany
+ {
+ get
+ {
+ // Get all Company attributes on this assembly
+ object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
+ // If there aren't any Company attributes, return an empty string
+ if (attributes.Length == 0)
+ return "";
+ // If there is a Company attribute, return its value
+ return ((AssemblyCompanyAttribute)attributes[0]).Company;
+ }
+ }
+ #endregion
+ private void labelCompanyName_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+ {
+ // Determine which link was clicked within the LinkLabel.
+ this.labelCompanyName.Links[0].Visited = true;
+
+ // Display the appropriate link based on the value of the
+ // LinkData property of the Link object.
+ string target = e.Link.LinkData as string;
+
+ System.Diagnostics.Process.Start(target); // this should start the default web browser
+ }
+
+ private void logoPictureBox_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start(labelCompanyName.Links[0].LinkData as string); // this should start the default web browser
+ }
+
+ private void btnViewEULA_Click(object sender, EventArgs e)
+ {
+ //string EulaFile = string.Format(@"\{0}", VlnSettings.EULAfile);
+ //string strEULA = System.Environment.CurrentDirectory + EulaFile;
+ //frmViewTextFile ViewFile = new frmViewTextFile(strEULA,RichTextBoxStreamType.PlainText);
+ //ViewFile.Text = "End-User License Agreement";
+ //ViewFile.ShowDialog();
+ }
+
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.resx
new file mode 100644
index 00000000..19dc0dd8
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AboutROEditor.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/App.ico b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/App.ico
new file mode 100644
index 00000000..7a50cb61
Binary files /dev/null and b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/App.ico differ
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AssemblyInfo.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AssemblyInfo.cs
new file mode 100644
index 00000000..f1adcaa6
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/AssemblyInfo.cs
@@ -0,0 +1,69 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("RO Editor")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Volian Enterprises Inc.")]
+[assembly: AssemblyProduct("Referenced Objects Editor")]
+[assembly: AssemblyCopyright("2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build YYMM (two digit year, two digit month)
+// Revision DHH (day - no leading zero, two digit hour - military time
+//
+[assembly: AssemblyVersion("1.0.1303.2513")]
+[assembly: AssemblyFileVersion("1.0.1303.2513")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Cert_prt_rgb_70x32.gif b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Cert_prt_rgb_70x32.gif
new file mode 100644
index 00000000..421f061b
Binary files /dev/null and b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Cert_prt_rgb_70x32.gif differ
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldCombFrm.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldCombFrm.cs
new file mode 100644
index 00000000..64fcc1e7
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldCombFrm.cs
@@ -0,0 +1,588 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: FieldCombFrm.cs $ $Revision: 12 $
+ * $Author: Kathy $ $Date: 5/21/03 12:45p $
+ *
+ * $History: FieldCombFrm.cs $
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:45p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-041: edit field name not always set
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 12/11/02 Time: 11:22a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fixed - was always putting up Variable field, even if not defined
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:25p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname special chars
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:29a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname replace chars
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 12/02/02 Time: 6:13a
+ * Updated in $/EXE/RefObj/ROEditor
+ * combo field fix
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:17p
+ * Updated in $/EXE/RefObj/ROEditor
+ * wasn't finding variable text
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:13p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix digit as first char in fieldname
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/25/02 Time: 2:30p
+ * Updated in $/EXE/RefObj/ROEditor
+ * multitxt->variabletxt
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:56a
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:15p
+ * Updated in $/EXE/RefObj/ROEditor
+ * vlnxml
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 9/05/02 Time: 12:41p
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 8/23/02 Time: 3:33p
+ * Created in $/EXE/RefObj/ROEditor
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Xml;
+using System.Xml.Schema;
+using System.Text;
+using ROFields;
+using RODBInterface;
+
+namespace ROEditor
+{
+ ///
+ /// Summary description for FieldCombFrm.
+ ///
+ public class FieldCombFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Label lblFieldName;
+ private System.Windows.Forms.TextBox tbFieldName;
+ private System.Windows.Forms.GroupBox gbAlternatives;
+ private System.Windows.Forms.CheckBox cbSingleTxt;
+ private System.Windows.Forms.CheckBox cbVariableTxt;
+ private System.Windows.Forms.CheckBox cbTable;
+ private System.Windows.Forms.CheckBox cbXYPlot;
+ private System.Windows.Forms.Label lblW1;
+ private System.Windows.Forms.Label lblW2;
+ private System.Windows.Forms.Label lblW3;
+ private System.Windows.Forms.Label lblW4;
+ private System.Windows.Forms.TextBox tbSingleTxtWid;
+ private System.Windows.Forms.TextBox tbVariableTxtWid;
+ private System.Windows.Forms.TextBox tbTableWid;
+ private System.Windows.Forms.TextBox tbXYPlotWid;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.Button btnCancel;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private ROField myrof;
+ private RODB myrodb;
+ private VlnXmlElement myelem;
+ private string origname;
+ private int origFixedLength=0;
+ private int origVariableTxtLength = 0;
+ private int origTableLength = 0;
+ private int origXYPlotLength = 0;
+ private ArrayList avail_list;
+ private ArrayList inuse_list;
+ private uint editlevel;
+ private bool exists = false;
+ public FieldCombFrm(ROField rof, RODB rodb, VlnXmlElement elem, uint elevel, string oname, ArrayList alist, ArrayList ilist)
+ {
+ int idx;
+ string strlen;
+ string fielddef;
+ //
+ // Required for Windows Form Designer support
+ //
+ myrof = rof;
+ myrodb = rodb;
+ myelem = elem;
+ editlevel = elevel;
+ avail_list = alist;
+ inuse_list = ilist;
+ InitializeComponent();
+ this.tbFieldName.Text = rof.GetFieldname;
+ origname = oname;
+
+ if (rof.GetRecID != null) // it's new if it's null
+ {
+ exists = true;
+ string recid = rof.GetMasterRecID;
+ if (recid != null && recid != "")
+ fielddef = myrodb.RODB_GetSchemaPiece(recid,"ROMaster");
+ else
+ fielddef = myrodb.RODB_GetSchemaPiece(rof.GetRecID,myelem.GetAttribute("Table"));
+ // search for combination items included & their original length.
+ idx = fielddef.IndexOf("Fixed");
+ if (idx >= 0)
+ {
+ idx=fielddef.IndexOf("xsd:maxLength value=\"",idx);
+ strlen = fielddef.Substring(idx+21,2);
+ origFixedLength = System.Convert.ToInt32(strlen);
+ this.tbSingleTxtWid.Text = strlen;
+ this.cbSingleTxt.Checked = true;
+ }
+ else
+ this.cbSingleTxt.Checked = false;
+ idx = fielddef.IndexOf("type=\"Variable");
+ if (idx >= 0)
+ {
+ idx=fielddef.IndexOf("xsd:maxLength value=\"",idx);
+ strlen = fielddef.Substring(idx+21,2);
+ origVariableTxtLength = System.Convert.ToInt32(strlen);
+ this.tbVariableTxtWid.Text = strlen;
+ this.cbVariableTxt.Checked = true;
+ }
+ else
+ this.cbVariableTxt.Checked = false;
+ idx = fielddef.IndexOf("Table");
+ if (idx >= 0)
+ {
+ idx=fielddef.IndexOf("xsd:maxLength value=\"",idx);
+ strlen = fielddef.Substring(idx+21,2);
+ origTableLength = System.Convert.ToInt32(strlen);
+ this.tbTableWid.Text = strlen;
+ this.cbTable.Checked = true;
+ }
+ else
+ this.cbTable.Checked = false;
+ idx = fielddef.IndexOf("XYPlot");
+ if (idx >= 0)
+ {
+ idx=fielddef.IndexOf("xsd:maxLength value=\"",idx);
+ strlen = fielddef.Substring(idx+21,2);
+ origXYPlotLength = System.Convert.ToInt32(strlen);
+ this.tbXYPlotWid.Text = strlen;
+ this.cbXYPlot.Checked = true;
+ }
+ else
+ this.cbXYPlot.Checked = false;
+ }
+
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblFieldName = new System.Windows.Forms.Label();
+ this.tbFieldName = new System.Windows.Forms.TextBox();
+ this.gbAlternatives = new System.Windows.Forms.GroupBox();
+ this.tbXYPlotWid = new System.Windows.Forms.TextBox();
+ this.tbTableWid = new System.Windows.Forms.TextBox();
+ this.tbVariableTxtWid = new System.Windows.Forms.TextBox();
+ this.tbSingleTxtWid = new System.Windows.Forms.TextBox();
+ this.lblW4 = new System.Windows.Forms.Label();
+ this.lblW3 = new System.Windows.Forms.Label();
+ this.lblW2 = new System.Windows.Forms.Label();
+ this.lblW1 = new System.Windows.Forms.Label();
+ this.cbXYPlot = new System.Windows.Forms.CheckBox();
+ this.cbTable = new System.Windows.Forms.CheckBox();
+ this.cbVariableTxt = new System.Windows.Forms.CheckBox();
+ this.cbSingleTxt = new System.Windows.Forms.CheckBox();
+ this.btnOK = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.gbAlternatives.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lblFieldName
+ //
+ this.lblFieldName.Location = new System.Drawing.Point(16, 8);
+ this.lblFieldName.Name = "lblFieldName";
+ this.lblFieldName.Size = new System.Drawing.Size(72, 16);
+ this.lblFieldName.TabIndex = 0;
+ this.lblFieldName.Text = "Field Name:";
+ //
+ // tbFieldName
+ //
+ this.tbFieldName.Location = new System.Drawing.Point(96, 8);
+ this.tbFieldName.Name = "tbFieldName";
+ this.tbFieldName.Size = new System.Drawing.Size(384, 22);
+ this.tbFieldName.TabIndex = 1;
+ this.tbFieldName.Text = "";
+ //
+ // gbAlternatives
+ //
+ this.gbAlternatives.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.tbXYPlotWid,
+ this.tbTableWid,
+ this.tbVariableTxtWid,
+ this.tbSingleTxtWid,
+ this.lblW4,
+ this.lblW3,
+ this.lblW2,
+ this.lblW1,
+ this.cbXYPlot,
+ this.cbTable,
+ this.cbVariableTxt,
+ this.cbSingleTxt});
+ this.gbAlternatives.Location = new System.Drawing.Point(16, 48);
+ this.gbAlternatives.Name = "gbAlternatives";
+ this.gbAlternatives.Size = new System.Drawing.Size(464, 152);
+ this.gbAlternatives.TabIndex = 2;
+ this.gbAlternatives.TabStop = false;
+ this.gbAlternatives.Text = "Alternatives";
+ //
+ // tbXYPlotWid
+ //
+ this.tbXYPlotWid.Location = new System.Drawing.Point(320, 120);
+ this.tbXYPlotWid.Name = "tbXYPlotWid";
+ this.tbXYPlotWid.Size = new System.Drawing.Size(40, 22);
+ this.tbXYPlotWid.TabIndex = 11;
+ this.tbXYPlotWid.Text = "";
+ //
+ // tbTableWid
+ //
+ this.tbTableWid.Location = new System.Drawing.Point(320, 88);
+ this.tbTableWid.Name = "tbTableWid";
+ this.tbTableWid.Size = new System.Drawing.Size(40, 22);
+ this.tbTableWid.TabIndex = 10;
+ this.tbTableWid.Text = "";
+ //
+ // tbVariableTxtWid
+ //
+ this.tbVariableTxtWid.Location = new System.Drawing.Point(320, 56);
+ this.tbVariableTxtWid.Name = "tbVariableTxtWid";
+ this.tbVariableTxtWid.Size = new System.Drawing.Size(40, 22);
+ this.tbVariableTxtWid.TabIndex = 9;
+ this.tbVariableTxtWid.Text = "";
+ //
+ // tbSingleTxtWid
+ //
+ this.tbSingleTxtWid.Location = new System.Drawing.Point(320, 24);
+ this.tbSingleTxtWid.Name = "tbSingleTxtWid";
+ this.tbSingleTxtWid.Size = new System.Drawing.Size(40, 22);
+ this.tbSingleTxtWid.TabIndex = 8;
+ this.tbSingleTxtWid.Text = "";
+ //
+ // lblW4
+ //
+ this.lblW4.Location = new System.Drawing.Point(264, 120);
+ this.lblW4.Name = "lblW4";
+ this.lblW4.Size = new System.Drawing.Size(56, 16);
+ this.lblW4.TabIndex = 7;
+ this.lblW4.Text = "Width:";
+ //
+ // lblW3
+ //
+ this.lblW3.Location = new System.Drawing.Point(264, 96);
+ this.lblW3.Name = "lblW3";
+ this.lblW3.Size = new System.Drawing.Size(56, 16);
+ this.lblW3.TabIndex = 6;
+ this.lblW3.Text = "Width:";
+ //
+ // lblW2
+ //
+ this.lblW2.Location = new System.Drawing.Point(264, 64);
+ this.lblW2.Name = "lblW2";
+ this.lblW2.Size = new System.Drawing.Size(56, 16);
+ this.lblW2.TabIndex = 5;
+ this.lblW2.Text = "Width:";
+ //
+ // lblW1
+ //
+ this.lblW1.Location = new System.Drawing.Point(264, 32);
+ this.lblW1.Name = "lblW1";
+ this.lblW1.Size = new System.Drawing.Size(56, 16);
+ this.lblW1.TabIndex = 4;
+ this.lblW1.Text = "Width:";
+ //
+ // cbXYPlot
+ //
+ this.cbXYPlot.Location = new System.Drawing.Point(16, 120);
+ this.cbXYPlot.Name = "cbXYPlot";
+ this.cbXYPlot.Size = new System.Drawing.Size(144, 24);
+ this.cbXYPlot.TabIndex = 3;
+ this.cbXYPlot.Text = "X/Y Plot";
+ //
+ // cbTable
+ //
+ this.cbTable.Location = new System.Drawing.Point(16, 88);
+ this.cbTable.Name = "cbTable";
+ this.cbTable.Size = new System.Drawing.Size(144, 24);
+ this.cbTable.TabIndex = 2;
+ this.cbTable.Text = "Table";
+ //
+ // cbVariableTxt
+ //
+ this.cbVariableTxt.Location = new System.Drawing.Point(16, 56);
+ this.cbVariableTxt.Name = "cbVariableTxt";
+ this.cbVariableTxt.Size = new System.Drawing.Size(144, 24);
+ this.cbVariableTxt.TabIndex = 1;
+ this.cbVariableTxt.Text = "Variable Line Text";
+ //
+ // cbSingleTxt
+ //
+ this.cbSingleTxt.Location = new System.Drawing.Point(16, 24);
+ this.cbSingleTxt.Name = "cbSingleTxt";
+ this.cbSingleTxt.Size = new System.Drawing.Size(144, 24);
+ this.cbSingleTxt.TabIndex = 0;
+ this.cbSingleTxt.Text = "Single Line Text";
+ //
+ // btnOK
+ //
+ this.btnOK.Location = new System.Drawing.Point(264, 216);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(88, 24);
+ this.btnOK.TabIndex = 3;
+ this.btnOK.Text = "OK";
+ this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(392, 216);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(88, 24);
+ this.btnCancel.TabIndex = 4;
+ this.btnCancel.Text = "Cancel";
+ //
+ // FieldCombFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(504, 253);
+ this.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.btnCancel,
+ this.btnOK,
+ this.gbAlternatives,
+ this.tbFieldName,
+ this.lblFieldName});
+ this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.Name = "FieldCombFrm";
+ this.Text = "Combination Field Definition";
+ this.gbAlternatives.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private bool CheckValidWidth(string wid)
+ {
+ long val;
+ try
+ {
+ // Attempt to convert to long, if it fails, there are problems in the text
+ val = System.Convert.ToInt64(wid);
+ }
+ catch
+ {
+ MessageBox.Show("The field width is not a valid number. Please re-enter");
+ return false;
+ }
+ return true;
+ }
+
+ private void btnOK_Click(object sender, System.EventArgs e)
+ {
+ string savschemapiece;
+ bool success=false;
+
+ // check for field validity
+ if (this.tbFieldName.Text == null)
+ {
+ MessageBox.Show("Cannot have empty field definition name.");
+ return;
+ }
+
+ if (this.cbSingleTxt.Checked == true && this.tbSingleTxtWid.Text == null)
+ {
+ MessageBox.Show("Cannot have empty width for Single Line Text");
+ return;
+ }
+ if (this.cbSingleTxt.Checked == true)
+ {
+ success=CheckValidWidth(this.tbSingleTxtWid.Text);
+ if (success == false) return;
+ }
+
+ if (this.cbVariableTxt.Checked == true && this.tbVariableTxtWid.Text == null)
+ {
+ MessageBox.Show("Cannot have empty width for Variable Length Text");
+ return;
+ }
+ if (this.cbVariableTxt.Checked == true)
+ {
+ success=CheckValidWidth(this.tbSingleTxtWid.Text);
+ if (success == false) return;
+ }
+
+ if (this.cbTable.Checked == true && this.tbTableWid.Text == null)
+ {
+ MessageBox.Show("Cannot have empty width for Table Text");
+ return;
+ }
+ if (this.cbTable.Checked == true)
+ {
+ success=CheckValidWidth(this.tbTableWid.Text);
+ if (success == false) return;
+ }
+
+ if (this.cbXYPlot.Checked == true && this.tbXYPlotWid.Text == null)
+ {
+ MessageBox.Show("Cannot have empty width for XYPlot Text");
+ return;
+ }
+ if (this.cbXYPlot.Checked == true)
+ {
+ success=CheckValidWidth(this.tbXYPlotWid.Text);
+ if (success == false) return;
+ }
+
+ // check that it is not duplicate name.
+ ROField rof;
+ for (int i=0; i< avail_list.Count; i++)
+ {
+ rof = (ROField) avail_list[i];
+ if (rof.GetFieldname == this.tbFieldName.Text && rof.GetRecID != myrof.GetRecID)
+ {
+ MessageBox.Show("The field name is not unique. Please re-enter");
+ return;
+ }
+ }
+ for (int i=0; i< inuse_list.Count; i++)
+ {
+ rof = (ROField) inuse_list[i];
+ if (rof.GetFieldname == this.tbFieldName.Text && rof.GetRecID != myrof.GetRecID)
+ {
+ MessageBox.Show("The field name is not unique. Please re-enter");
+ return;
+ }
+ }
+
+ // generate the new schema string based on text box input.
+ string fname=CvtUserFldToFld(this.tbFieldName.Text);
+ savschemapiece = myrof.MakeComboSchemaString(fname, this.cbSingleTxt.Checked,
+ this.tbSingleTxtWid.Text, this.cbVariableTxt.Checked, this.tbVariableTxtWid.Text,
+ this.cbTable.Checked, this.tbTableWid.Text, this.cbXYPlot.Checked, this.tbXYPlotWid.Text);
+ myrof.SetFieldname(fname);
+ // if this is 'new'. create a new element and do an insert to database
+ if (exists == false)
+ success = myrodb.RODB_NewFieldRecord(myrof, myelem, savschemapiece, editlevel, "a");
+ else // modification of existing...
+ success = myrodb.RODB_UpdateFieldRecord(myrof, myelem, savschemapiece, CvtUserFldToFld(origname), fname, editlevel, true);
+
+ // update the local/internal copy of the schema.
+ if (success != true)
+ {
+ return; // DO YET process an error.
+ }
+ else
+ {
+ // if this is a RRO schema, reload. We're not reloading the group schema
+ // because it is rarely used and is only loaded as needed.
+ if (editlevel == (uint) RecordType.Schema)
+ {
+ XmlSchema myschema;
+ VlnXmlElement parent;
+ parent = myelem;
+ while (parent != null)
+ {
+ if (parent.HasAttribute("Schema") == true) break;
+ if (parent.HasAttribute("FieldsInUse") == true) break;
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ // if a schema has been read in, delete it and reread it.
+ if (parent.HasAttribute("Schema"))
+ {
+ // delete this attribute because we'll reread it in.
+ parent.RemoveAttribute("Schema");
+ myschema = myrodb.RODB_GetSchema(myelem);
+ }
+ }
+
+ }
+
+
+ this.Close();
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldCombFrm.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldCombFrm.resx
new file mode 100644
index 00000000..2a46b324
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldCombFrm.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ FieldCombFrm
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTextFrm.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTextFrm.cs
new file mode 100644
index 00000000..a3f29b8a
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTextFrm.cs
@@ -0,0 +1,425 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: FieldTextFrm.cs $ $Revision: 12 $
+ * $Author: Kathy $ $Date: 7/15/04 11:11a $
+ *
+ * $History: FieldTextFrm.cs $
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 7/15/04 Time: 11:11a
+ * Updated in $/EXE/RefObj/ROEditor
+ * Fix B2004-015
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 12/09/03 Time: 9:29a
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-066 fix - add new fieldname crash
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:46p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-041: edit of field name didn't always save
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:25p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname special chars
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:29a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname replace chars
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 12/02/02 Time: 6:13a
+ * Updated in $/EXE/RefObj/ROEditor
+ * added arg on db call
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 11/19/02 Time: 11:31a
+ * Updated in $/EXE/RefObj/ROEditor
+ * add wait cursor for long op
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:13p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix digit as first char in fieldname
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:56a
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:15p
+ * Updated in $/EXE/RefObj/ROEditor
+ * vlnxml
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 9/05/02 Time: 12:41p
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 8/23/02 Time: 3:33p
+ * Created in $/EXE/RefObj/ROEditor
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Xml;
+using System.Xml.Schema;
+using System.Text;
+using ROFields;
+using RODBInterface;
+
+namespace ROEditor
+{
+ ///
+ /// Summary description for FieldText.
+ ///
+ public class FieldTextFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Label lblFName;
+ private System.Windows.Forms.Label lblWidth;
+ private System.Windows.Forms.TextBox tbFieldName;
+ private System.Windows.Forms.TextBox tbWidth;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Label lblPattern;
+ private System.Windows.Forms.TextBox tbPattern;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+
+ private ROField myrof;
+ private RODB myrodb;
+ private VlnXmlElement myelem;
+ private string schemapiece;
+ private string origname;
+ private bool exists=false;
+ private uint original_type;
+ private uint editlevel;
+ private ArrayList avail_list;
+ private ArrayList inuse_list;
+ public FieldTextFrm(ROField rof, RODB rodb, VlnXmlElement elem, uint otype, uint elevel, string oname, ArrayList alist, ArrayList ilist)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ myrodb = rodb;
+ myelem = elem;
+ myrof = rof;
+ original_type = otype;
+ editlevel = elevel;
+ avail_list = alist;
+ inuse_list = ilist;
+ uint ftype = rof.GetFieldType;
+ // origname is the original name if this is a modification of a fieldname
+ // if it's new, it will be null
+ if(oname!=null)origname=CvtUserFldToFld(oname);
+ InitializeComponent();
+
+ if (ftype == (uint)FieldTypes.FrmtSingleTxt)
+ {
+ this.tbPattern.Visible = true;
+ this.lblPattern.Visible = true;
+ }
+ else
+ {
+ this.tbPattern.Visible = false;
+ this.lblPattern.Visible = false;
+ }
+
+ // put name out. and if it's an existing field get current data to
+ // put out.
+ this.tbFieldName.Text = rof.GetFieldname;
+ if (rof.GetRecID != null)
+ {
+ exists = true;
+ if (rof.GetMasterRecID != null)
+ // get it from the master, else read in the definition from
+ // the local table
+ schemapiece = myrodb.RODB_GetSchemaPiece(rof.GetMasterRecID,"ROMaster");
+ else
+ schemapiece = myrodb.RODB_GetSchemaPiece(rof.GetRecID,myelem.GetAttribute("Table"));
+ int indxs = schemapiece.IndexOf("maxLength value=");
+ int indxe = schemapiece.IndexOf("\"",indxs+17); // +17, get past maxLength value ="
+ this.tbWidth.Text = schemapiece.Substring(indxs+17,indxe-(indxs+17));
+
+ // get pattern too.
+ if (ftype == (uint)FieldTypes.FrmtSingleTxt)
+ {
+ indxs = schemapiece.IndexOf("pattern value=");
+ indxe = schemapiece.IndexOf("\"",indxs+15);
+ this.tbPattern.Text = schemapiece.Substring(indxs+15,indxe-(indxs+15));
+ }
+ }
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private bool CheckValidWidth(string wid)
+ {
+ long val;
+ try {
+ // Attempt to convert to long, if it fails, there are problems in the text
+ val = System.Convert.ToInt64(wid);
+ }
+ catch {
+ MessageBox.Show("The field width is not a valid number. Please re-enter");
+ return false;
+ }
+ return true;
+ }
+
+ private void btnOK_Click(object sender, System.EventArgs e)
+ {
+ string savschemapiece;
+ bool success=false;
+
+ // check for field validity
+ if (this.tbFieldName.Text == null || this.tbWidth.Text == null)
+ {
+ MessageBox.Show("Cannot have empty field defintion name or width");
+ return;
+ }
+ success=CheckValidWidth(this.tbWidth.Text);
+ if (success == false) return;
+ // check that it is not duplicate name.
+ ROField rof;
+ for (int i=0; i< avail_list.Count; i++)
+ {
+ rof = (ROField) avail_list[i];
+ if (rof.GetFieldname == this.tbFieldName.Text && rof.GetRecID != myrof.GetRecID)
+ {
+ MessageBox.Show("The field name is not unique. Please re-enter");
+ return;
+ }
+ }
+ for (int i=0; i< inuse_list.Count; i++)
+ {
+ rof = (ROField) inuse_list[i];
+ if (rof.GetFieldname == this.tbFieldName.Text && rof.GetRecID != myrof.GetRecID)
+ {
+ MessageBox.Show("The field name is not unique. Please re-enter");
+ return;
+ }
+ }
+
+ // generate the new schema string based on text box input.
+ string fname=CvtUserFldToFld(this.tbFieldName.Text);
+ savschemapiece = myrof.MakeSchemaString(fname, this.tbWidth.Text, this.tbPattern.Text);
+ myrof.SetFieldname(fname);
+ // if this is 'new'. create a new element and do an insert to Master database
+ if (exists == false)
+ success = myrodb.RODB_NewFieldRecord(myrof, myelem, savschemapiece, editlevel, null);
+ else // modification of existing....
+ {
+ Cursor.Current = Cursors.WaitCursor;
+ success = myrodb.RODB_UpdateFieldRecord(myrof, myelem, savschemapiece, origname, fname, editlevel, false);
+ Cursor.Current = Cursors.Default;
+ }
+
+ if (success != true)
+ {
+ return; // DO YET process an error.
+ }
+ else
+ {
+ // if this is a RRO schema, reload. We're not reloading the group schema
+ // because it is rarely used and is only loaded as needed.
+ if (editlevel == (uint) RecordType.Schema)
+ {
+ XmlSchema myschema;
+ VlnXmlElement parent;
+ parent = myelem;
+ while (parent != null)
+ {
+ if (parent.HasAttribute("Schema") == true) break;
+ if (parent.HasAttribute("FieldsInUse") == true) break;
+ // If loop to top, fields haven't been defined yet, don't
+ // crash on caste - just set to return null (B2004-015)
+ if (parent.ParentNode is VlnXmlElement)
+ parent = (VlnXmlElement) parent.ParentNode;
+ else
+ parent = null;
+ }
+ // if a schema has been read in, delete it and reread it.
+ if (parent !=null && parent.HasAttribute("Schema"))
+ {
+ // delete this attribute because we'll reread it in.
+ parent.RemoveAttribute("Schema");
+ myschema = myrodb.RODB_GetSchema(myelem);
+ }
+ }
+
+ }
+ this.Close();
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblFName = new System.Windows.Forms.Label();
+ this.lblWidth = new System.Windows.Forms.Label();
+ this.tbFieldName = new System.Windows.Forms.TextBox();
+ this.tbWidth = new System.Windows.Forms.TextBox();
+ this.btnOK = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.lblPattern = new System.Windows.Forms.Label();
+ this.tbPattern = new System.Windows.Forms.TextBox();
+ this.SuspendLayout();
+ //
+ // lblFName
+ //
+ this.lblFName.Location = new System.Drawing.Point(16, 16);
+ this.lblFName.Name = "lblFName";
+ this.lblFName.Size = new System.Drawing.Size(80, 16);
+ this.lblFName.TabIndex = 0;
+ this.lblFName.Text = "Field Name:";
+ //
+ // lblWidth
+ //
+ this.lblWidth.Location = new System.Drawing.Point(16, 40);
+ this.lblWidth.Name = "lblWidth";
+ this.lblWidth.Size = new System.Drawing.Size(72, 16);
+ this.lblWidth.TabIndex = 1;
+ this.lblWidth.Text = "Width:";
+ //
+ // tbFieldName
+ //
+ this.tbFieldName.Location = new System.Drawing.Point(104, 8);
+ this.tbFieldName.Name = "tbFieldName";
+ this.tbFieldName.Size = new System.Drawing.Size(320, 22);
+ this.tbFieldName.TabIndex = 2;
+ this.tbFieldName.Text = "";
+ //
+ // tbWidth
+ //
+ this.tbWidth.Location = new System.Drawing.Point(104, 40);
+ this.tbWidth.Name = "tbWidth";
+ this.tbWidth.Size = new System.Drawing.Size(32, 22);
+ this.tbWidth.TabIndex = 3;
+ this.tbWidth.Text = "";
+ //
+ // btnOK
+ //
+ this.btnOK.Location = new System.Drawing.Point(216, 72);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(88, 24);
+ this.btnOK.TabIndex = 4;
+ this.btnOK.Text = "OK";
+ this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(336, 72);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(88, 24);
+ this.btnCancel.TabIndex = 5;
+ this.btnCancel.Text = "Cancel";
+ //
+ // lblPattern
+ //
+ this.lblPattern.Location = new System.Drawing.Point(160, 40);
+ this.lblPattern.Name = "lblPattern";
+ this.lblPattern.Size = new System.Drawing.Size(48, 16);
+ this.lblPattern.TabIndex = 6;
+ this.lblPattern.Text = "Pattern:";
+ this.lblPattern.Visible = false;
+ //
+ // tbPattern
+ //
+ this.tbPattern.Location = new System.Drawing.Point(224, 40);
+ this.tbPattern.Name = "tbPattern";
+ this.tbPattern.Size = new System.Drawing.Size(176, 22);
+ this.tbPattern.TabIndex = 7;
+ this.tbPattern.Text = "";
+ this.tbPattern.Visible = false;
+ //
+ // FieldTextFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(464, 101);
+ this.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.tbPattern,
+ this.lblPattern,
+ this.btnCancel,
+ this.btnOK,
+ this.tbWidth,
+ this.tbFieldName,
+ this.lblWidth,
+ this.lblFName});
+ this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.Name = "FieldTextFrm";
+ this.Text = "Text Field Definition";
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTextFrm.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTextFrm.resx
new file mode 100644
index 00000000..5acd684b
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTextFrm.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ FieldTextFrm
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTypeDefFrm.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTypeDefFrm.cs
new file mode 100644
index 00000000..c5498ffa
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTypeDefFrm.cs
@@ -0,0 +1,435 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: FieldTypeDefFrm.cs $ $Revision: 11 $
+ * $Author: Kathy $ $Date: 5/21/03 12:49p $
+ *
+ * $History: FieldTypeDefFrm.cs $
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:49p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-041: edit of fieldname didn't always save
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:25p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname special chars
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:29a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname replace chars
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 12/02/02 Time: 6:17a
+ * Updated in $/EXE/RefObj/ROEditor
+ * added arg and close form
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:13p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix digit as first char in fieldname
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 9/25/02 Time: 2:30p
+ * Updated in $/EXE/RefObj/ROEditor
+ * multitxt->variable
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:56a
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:15p
+ * Updated in $/EXE/RefObj/ROEditor
+ * vlnxml
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 9/05/02 Time: 12:41p
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 8/30/02 Time: 9:43a
+ * Updated in $/EXE/RefObj/ROEditor
+ * image def
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 8/23/02 Time: 3:34p
+ * Created in $/EXE/RefObj/ROEditor
+ *********************************************************************************************/
+
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Xml;
+using System.Text;
+using RODBInterface;
+using ROFields;
+
+namespace ROEditor
+{
+ ///
+ /// Summary description for FieldType.
+ ///
+ ///
+
+ public class FieldTypeDefFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Label lblFldName;
+ private System.Windows.Forms.TextBox tbFieldName;
+ private System.Windows.Forms.GroupBox gbFldType;
+ private System.Windows.Forms.RadioButton rbSingleLine;
+ private System.Windows.Forms.RadioButton rbFormSingleLine;
+ private System.Windows.Forms.RadioButton rbVariableTxt;
+ private System.Windows.Forms.RadioButton rbTable;
+ private System.Windows.Forms.RadioButton rbXYPlot;
+ private System.Windows.Forms.RadioButton rbImage;
+ private System.Windows.Forms.RadioButton rbCombination;
+ private System.Windows.Forms.RadioButton rbMultiple;
+ private System.Windows.Forms.Button btnContinue;
+ private System.Windows.Forms.Button btnCancel;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private ROField myrof;
+ private RODB myrodb;
+ private VlnXmlElement myelem;
+ private uint original_type=0;
+ private string origname;
+ private uint editlevel;
+ private ArrayList avlist; // available list from rodef form
+ private ArrayList iulist; // inuse list from rodef form
+ public FieldTypeDefFrm(ROField rof, RODB rodb, VlnXmlElement elem, uint elevel, ArrayList alist, ArrayList ilist)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+ myrof = rof;
+ myrodb = rodb;
+ myelem = elem;
+ editlevel = elevel;
+ avlist = alist;
+ iulist = ilist;
+ origname = null;
+
+ if (rof.GetFieldname != null) // initialize some values.
+ {
+ origname = CvtUserFldToFld(rof.GetFieldname);
+ original_type = rof.GetFieldType;
+ uint ftype = rof.GetFieldType;
+ this.tbFieldName.Text = rof.GetFieldname;
+ // disable image, because it's only enabled for image type.
+ this.rbImage.Enabled = false;
+ if (ftype == (uint)FieldTypes.Combination)
+ this.rbCombination.Checked = true;
+ else if (ftype == (uint)FieldTypes.FrmtSingleTxt)
+ this.rbFormSingleLine.Checked = true;
+ else if (ftype == (uint)FieldTypes.Image)
+ {
+ this.rbImage.Enabled = true;
+ this.rbImage.Checked = true;
+ // for image - you can't change it's type.
+ this.rbCombination.Enabled = false;
+ this.rbFormSingleLine.Enabled = false;
+ this.rbVariableTxt.Enabled = false;
+ this.rbSingleLine.Enabled = false;
+ this.rbTable.Enabled = false;
+ this.rbXYPlot.Enabled = false;
+ }
+ else if (ftype == (uint)FieldTypes.VariableTxt)
+ this.rbVariableTxt.Checked = true;
+ else if (ftype == (uint)FieldTypes.SingleTxt)
+ this.rbSingleLine.Checked = true;
+ else if (ftype == (uint)FieldTypes.Table)
+ this.rbTable.Checked = true;
+ else if (ftype == (uint)FieldTypes.XYPlot)
+ this.rbXYPlot.Checked = true;
+ else
+ return;
+ }
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ private void btnContinue_Click(object sender, System.EventArgs e)
+ {
+ if (this.tbFieldName.Text == "")
+ {
+ MessageBox.Show("Cannot have empty field name.");
+ return;
+ }
+
+ myrof.SetFieldname(this.tbFieldName.Text);
+ uint ftype=0;
+ if (this.rbSingleLine.Checked == true)
+ ftype = (uint)FieldTypes.SingleTxt;
+ else if (this.rbFormSingleLine.Checked == true)
+ ftype = (uint)FieldTypes.FrmtSingleTxt;
+ else if (this.rbVariableTxt.Checked == true)
+ ftype = (uint)FieldTypes.VariableTxt;
+ else if (this.rbTable.Checked == true)
+ ftype = (uint)FieldTypes.Table;
+ else if (this.rbXYPlot.Checked == true)
+ ftype = (uint)FieldTypes.XYPlot;
+ else if (this.rbImage.Checked == true)
+ {
+ bool success;
+ string savschemapiece;
+ string fname=CvtUserFldToFld(this.tbFieldName.Text);
+ myrof.SetFieldType((uint)FieldTypes.Image);
+ myrof.SetFieldname(fname);
+ savschemapiece = myrof.MakeImageSchemaString(this.tbFieldName.Text);
+ if (original_type == (uint)FieldTypes.Nil) // new one.
+ success = myrodb.RODB_NewFieldRecord(myrof, myelem, savschemapiece, editlevel, null);
+ else // modification of existing....
+ success = myrodb.RODB_UpdateFieldRecord(myrof, myelem, savschemapiece, origname, fname, editlevel, false);
+
+ if (success != true)
+ {
+ return; // DO YET process an error.
+ }
+ return;
+
+ }
+ else if (this.rbCombination.Checked == true)
+ {
+ ftype = (uint)FieldTypes.Combination;
+ myrof.SetFieldType(ftype);
+ FieldCombFrm comb = new FieldCombFrm(myrof, myrodb, myelem, editlevel, origname, avlist, iulist);
+ comb.ShowDialog();
+ if (comb.DialogResult == DialogResult.OK)
+ {
+ }
+ return;
+ }
+ else
+ {
+ MessageBox.Show("Must define a field type.");
+ return;
+ }
+ myrof.SetFieldType(ftype);
+ FieldTextFrm ftxt = new FieldTextFrm(myrof, myrodb, myelem, original_type, editlevel, origname, avlist, iulist);
+ ftxt.ShowDialog();
+ this.Close();
+ }
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblFldName = new System.Windows.Forms.Label();
+ this.tbFieldName = new System.Windows.Forms.TextBox();
+ this.gbFldType = new System.Windows.Forms.GroupBox();
+ this.rbMultiple = new System.Windows.Forms.RadioButton();
+ this.rbCombination = new System.Windows.Forms.RadioButton();
+ this.rbImage = new System.Windows.Forms.RadioButton();
+ this.rbXYPlot = new System.Windows.Forms.RadioButton();
+ this.rbTable = new System.Windows.Forms.RadioButton();
+ this.rbVariableTxt = new System.Windows.Forms.RadioButton();
+ this.rbFormSingleLine = new System.Windows.Forms.RadioButton();
+ this.rbSingleLine = new System.Windows.Forms.RadioButton();
+ this.btnContinue = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.gbFldType.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lblFldName
+ //
+ this.lblFldName.Location = new System.Drawing.Point(16, 8);
+ this.lblFldName.Name = "lblFldName";
+ this.lblFldName.Size = new System.Drawing.Size(88, 16);
+ this.lblFldName.TabIndex = 0;
+ this.lblFldName.Text = "Field Name:";
+ //
+ // tbFieldName
+ //
+ this.tbFieldName.Location = new System.Drawing.Point(120, 8);
+ this.tbFieldName.Name = "tbFieldName";
+ this.tbFieldName.Size = new System.Drawing.Size(368, 22);
+ this.tbFieldName.TabIndex = 1;
+ this.tbFieldName.Text = "";
+ //
+ // gbFldType
+ //
+ this.gbFldType.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.rbMultiple,
+ this.rbCombination,
+ this.rbImage,
+ this.rbXYPlot,
+ this.rbTable,
+ this.rbVariableTxt,
+ this.rbFormSingleLine,
+ this.rbSingleLine});
+ this.gbFldType.Location = new System.Drawing.Point(24, 40);
+ this.gbFldType.Name = "gbFldType";
+ this.gbFldType.Size = new System.Drawing.Size(464, 120);
+ this.gbFldType.TabIndex = 2;
+ this.gbFldType.TabStop = false;
+ this.gbFldType.Text = "Field Type";
+ //
+ // rbMultiple
+ //
+ this.rbMultiple.Enabled = false;
+ this.rbMultiple.Location = new System.Drawing.Point(248, 96);
+ this.rbMultiple.Name = "rbMultiple";
+ this.rbMultiple.Size = new System.Drawing.Size(128, 16);
+ this.rbMultiple.TabIndex = 7;
+ this.rbMultiple.Text = "Multiple Field";
+ //
+ // rbCombination
+ //
+ this.rbCombination.Location = new System.Drawing.Point(248, 72);
+ this.rbCombination.Name = "rbCombination";
+ this.rbCombination.Size = new System.Drawing.Size(128, 16);
+ this.rbCombination.TabIndex = 6;
+ this.rbCombination.Text = "Combination Field";
+ //
+ // rbImage
+ //
+ this.rbImage.Location = new System.Drawing.Point(248, 48);
+ this.rbImage.Name = "rbImage";
+ this.rbImage.Size = new System.Drawing.Size(128, 16);
+ this.rbImage.TabIndex = 5;
+ this.rbImage.Text = "Image";
+ //
+ // rbXYPlot
+ //
+ this.rbXYPlot.Location = new System.Drawing.Point(248, 24);
+ this.rbXYPlot.Name = "rbXYPlot";
+ this.rbXYPlot.Size = new System.Drawing.Size(128, 16);
+ this.rbXYPlot.TabIndex = 4;
+ this.rbXYPlot.Text = "X/Y Plot";
+ //
+ // rbTable
+ //
+ this.rbTable.Location = new System.Drawing.Point(24, 96);
+ this.rbTable.Name = "rbTable";
+ this.rbTable.Size = new System.Drawing.Size(128, 16);
+ this.rbTable.TabIndex = 3;
+ this.rbTable.Text = "Table";
+ //
+ // rbVariableTxt
+ //
+ this.rbVariableTxt.Location = new System.Drawing.Point(24, 72);
+ this.rbVariableTxt.Name = "rbVariableTxt";
+ this.rbVariableTxt.Size = new System.Drawing.Size(160, 16);
+ this.rbVariableTxt.TabIndex = 2;
+ this.rbVariableTxt.Text = "Variable Length Text";
+ //
+ // rbFormSingleLine
+ //
+ this.rbFormSingleLine.Location = new System.Drawing.Point(24, 48);
+ this.rbFormSingleLine.Name = "rbFormSingleLine";
+ this.rbFormSingleLine.Size = new System.Drawing.Size(184, 16);
+ this.rbFormSingleLine.TabIndex = 1;
+ this.rbFormSingleLine.Text = "Formatted Single Line Text";
+ //
+ // rbSingleLine
+ //
+ this.rbSingleLine.Location = new System.Drawing.Point(24, 24);
+ this.rbSingleLine.Name = "rbSingleLine";
+ this.rbSingleLine.Size = new System.Drawing.Size(128, 16);
+ this.rbSingleLine.TabIndex = 0;
+ this.rbSingleLine.Text = "Single Line Text";
+ //
+ // btnContinue
+ //
+ this.btnContinue.Location = new System.Drawing.Point(248, 176);
+ this.btnContinue.Name = "btnContinue";
+ this.btnContinue.Size = new System.Drawing.Size(104, 24);
+ this.btnContinue.TabIndex = 3;
+ this.btnContinue.Text = "Continue ...";
+ this.btnContinue.Click += new System.EventHandler(this.btnContinue_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(384, 176);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(104, 24);
+ this.btnCancel.TabIndex = 4;
+ this.btnCancel.Text = "Cancel";
+ //
+ // FieldTypeDefFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(512, 221);
+ this.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.btnCancel,
+ this.btnContinue,
+ this.gbFldType,
+ this.tbFieldName,
+ this.lblFldName});
+ this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.Name = "FieldTypeDefFrm";
+ this.Text = " Field Type Selection";
+ this.gbFldType.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTypeDefFrm.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTypeDefFrm.resx
new file mode 100644
index 00000000..65521144
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FieldTypeDefFrm.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ FieldTypeDefFrm
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FixRev.Bat b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FixRev.Bat
new file mode 100644
index 00000000..81176489
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/FixRev.Bat
@@ -0,0 +1,4 @@
+PUSHD ..\..\..\ReferencedObjects\Exe\RefObj\ROEditor"
+"..\..\..\..\AdjustBuildRevision\bin\Debug\AdjustBuildRevision" "%CD%\AssemblyInfo.cs"
+POPD
+pause
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupDefFrm.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupDefFrm.cs
new file mode 100644
index 00000000..27498d32
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupDefFrm.cs
@@ -0,0 +1,667 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: GroupDefFrm.cs $ $Revision: 17 $
+ * $Author: Jsj $ $Date: 7/02/03 9:25a $
+ *
+ * $History: GroupDefFrm.cs $
+ *
+ * ***************** Version 17 *****************
+ * User: Jsj Date: 7/02/03 Time: 9:25a
+ * Updated in $/EXE/RefObj/ROEditor
+ * made messagebox calls modal by removing the parent window reference
+ *
+ * ***************** Version 16 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:50p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-034: process if only one field. Also, check for all data on okay
+ * button select.
+ *
+ * ***************** Version 15 *****************
+ * User: Kathy Date: 5/07/03 Time: 1:58p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-033 fixed
+ *
+ * ***************** Version 14 *****************
+ * User: Jsj Date: 4/14/03 Time: 3:01p
+ * Updated in $/EXE/RefObj/ROEditor
+ * changes resulting from speeding up RO FST file creation
+ *
+ * ***************** Version 13 *****************
+ * User: Kathy Date: 3/11/03 Time: 11:25a
+ * Updated in $/EXE/RefObj/ROEditor
+ * allow extra text on accpageid template
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:26p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname special char
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:29a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname replace chars
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 12/02/02 Time: 6:18a
+ * Updated in $/EXE/RefObj/ROEditor
+ * added status on long ops & check for fieldname change for textbox
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:18p
+ * Updated in $/EXE/RefObj/ROEditor
+ * mods for new group (toplevel)
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 10/10/02 Time: 10:02a
+ * Updated in $/EXE/RefObj/ROEditor
+ * accessory page id
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 10/02/02 Time: 1:40p
+ * Updated in $/EXE/RefObj/ROEditor
+ * clean up
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:14p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix digit as first char in fieldname
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:57a
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/19/02 Time: 10:03a
+ * Updated in $/EXE/RefObj/ROEditor
+ * only allow mods at root
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:15p
+ * Updated in $/EXE/RefObj/ROEditor
+ * vlnxml
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 8/28/02 Time: 10:56a
+ * Updated in $/EXE/RefObj/ROEditor
+ * development
+ *********************************************************************************************/
+
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Xml;
+using System.Text;
+using RODBInterface;
+using ROFields;
+using VlnStatus;
+
+namespace ROEditor
+{
+ ///
+ /// Summary description for GroupDefinition.
+ ///
+ public class GroupDefFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Label lblGroup;
+ private System.Windows.Forms.TextBox tbGroup;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label lblPrefix;
+ private System.Windows.Forms.Label lblValue;
+ private System.Windows.Forms.TextBox tbPrefix;
+ private System.Windows.Forms.TextBox tbValue;
+ private System.Windows.Forms.Button btnRODef;
+ private System.Windows.Forms.Button btnSubDef;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.Button btnCancel;
+
+ private RODB myrodb;
+ private VlnXmlElement elem;
+ private string origGroup;
+ private string origPrefix;
+ private string origValue;
+ private int dbtype;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+
+ public GroupDefFrm(VlnXmlElement pelem, RODB rodb, string gpname,int idbtype)
+ {
+ myrodb = rodb;
+ elem = pelem;
+ origGroup = gpname;
+ dbtype=idbtype; // if new, 3 = user define, must define fields before save.
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+ FillInData();
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private string CvtFldToUserFld(string fldname)
+ {
+ string tmpstr0;
+ if (fldname.Length < 2) return fldname;
+ // an xml element name cannot begin with a digit. we had prepended a "__"
+ if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
+ tmpstr0 = fldname.Substring(2,fldname.Length-2);
+ else
+ tmpstr0 = fldname;
+ // an xml element name cannot have a space, we converted to a "__"
+ string tmpstr = tmpstr0.Replace("__"," ");
+ int len = tmpstr.Length;
+ int cur = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval, indx;
+ if (len <6)
+ indx = -1;
+ else
+ indx=tmpstr.IndexOf(OKpunch,cur);
+ string asc_spchar;
+ while (indx>=0)
+ {
+ outstr += tmpstr.Substring(cur,indx-cur);
+ asc_spchar = tmpstr.Substring(indx+3,3);
+ decval = System.Convert.ToInt16(asc_spchar,10);
+ outstr += System.Convert.ToChar(decval).ToString();
+ cur = indx+6;
+ if (cur+6 > len)
+ indx = -1;
+ else
+ indx = tmpstr.IndexOf(OKpunch,cur);
+ }
+ if (cur
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblGroup = new System.Windows.Forms.Label();
+ this.tbGroup = new System.Windows.Forms.TextBox();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.tbValue = new System.Windows.Forms.TextBox();
+ this.tbPrefix = new System.Windows.Forms.TextBox();
+ this.lblValue = new System.Windows.Forms.Label();
+ this.lblPrefix = new System.Windows.Forms.Label();
+ this.btnRODef = new System.Windows.Forms.Button();
+ this.btnSubDef = new System.Windows.Forms.Button();
+ this.btnOK = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lblGroup
+ //
+ this.lblGroup.Location = new System.Drawing.Point(24, 8);
+ this.lblGroup.Name = "lblGroup";
+ this.lblGroup.Size = new System.Drawing.Size(56, 16);
+ this.lblGroup.TabIndex = 0;
+ this.lblGroup.Text = "Group:";
+ //
+ // tbGroup
+ //
+ this.tbGroup.Location = new System.Drawing.Point(88, 8);
+ this.tbGroup.Name = "tbGroup";
+ this.tbGroup.Size = new System.Drawing.Size(248, 22);
+ this.tbGroup.TabIndex = 1;
+ this.tbGroup.Text = "textBox1";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.tbValue,
+ this.tbPrefix,
+ this.lblValue,
+ this.lblPrefix});
+ this.groupBox1.Location = new System.Drawing.Point(24, 56);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(312, 96);
+ this.groupBox1.TabIndex = 2;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Accessory Page Access";
+ //
+ // tbValue
+ //
+ this.tbValue.Location = new System.Drawing.Point(72, 56);
+ this.tbValue.Name = "tbValue";
+ this.tbValue.Size = new System.Drawing.Size(216, 22);
+ this.tbValue.TabIndex = 3;
+ this.tbValue.Text = "textBox1";
+ // tbPrefix
+ //
+ this.tbPrefix.Location = new System.Drawing.Point(72, 24);
+ this.tbPrefix.Name = "tbPrefix";
+ this.tbPrefix.Size = new System.Drawing.Size(216, 22);
+ this.tbPrefix.TabIndex = 2;
+ this.tbPrefix.Text = "textBox1";
+ //
+ // lblValue
+ //
+ this.lblValue.Location = new System.Drawing.Point(16, 56);
+ this.lblValue.Name = "lblValue";
+ this.lblValue.Size = new System.Drawing.Size(48, 16);
+ this.lblValue.TabIndex = 1;
+ this.lblValue.Text = "Value:";
+ //
+ // lblPrefix
+ //
+ this.lblPrefix.ForeColor = System.Drawing.SystemColors.ControlText;
+ this.lblPrefix.Location = new System.Drawing.Point(16, 24);
+ this.lblPrefix.Name = "lblPrefix";
+ this.lblPrefix.Size = new System.Drawing.Size(48, 16);
+ this.lblPrefix.TabIndex = 0;
+ this.lblPrefix.Text = "Prefix:";
+ //
+ // btnRODef
+ //
+ this.btnRODef.Location = new System.Drawing.Point(24, 168);
+ this.btnRODef.Name = "btnRODef";
+ this.btnRODef.Size = new System.Drawing.Size(312, 24);
+ this.btnRODef.TabIndex = 3;
+ this.btnRODef.Text = "Referenced Object Definition...";
+ this.btnRODef.Click += new System.EventHandler(this.btnRODef_Click);
+ //
+ // btnSubDef
+ //
+ this.btnSubDef.Location = new System.Drawing.Point(24, 208);
+ this.btnSubDef.Name = "btnSubDef";
+ this.btnSubDef.Size = new System.Drawing.Size(312, 24);
+ this.btnSubDef.TabIndex = 4;
+ this.btnSubDef.Text = "Subgroup Definition ...";
+ this.btnSubDef.Click += new System.EventHandler(this.btnSubDef_Click);
+ //
+ // btnOK
+ //
+ this.btnOK.Location = new System.Drawing.Point(24, 248);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(144, 24);
+ this.btnOK.TabIndex = 5;
+ this.btnOK.Text = "OK";
+ this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(192, 248);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(144, 24);
+ this.btnCancel.TabIndex = 6;
+ this.btnCancel.Text = "Cancel";
+ //
+ // GroupDefFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(368, 293);
+ this.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.btnCancel,
+ this.btnOK,
+ this.btnSubDef,
+ this.btnRODef,
+ this.groupBox1,
+ this.tbGroup,
+ this.lblGroup});
+ this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.Name = "GroupDefFrm";
+ this.Text = "Group Definition";
+ this.groupBox1.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private bool ProcessRROAccPageIDChange(VlnXmlElement mnuele, string newtmpl)
+ {
+ bool success;
+ XmlNode chldnode = (XmlNode) mnuele.FirstChild;
+ VlnXmlElement echild;
+ while (chldnode != null)
+ {
+ if (chldnode is VlnXmlElement)
+ {
+ echild = (VlnXmlElement) chldnode;
+ if (echild.Name != "vlnGroup")
+ {
+ // If this is a group defintion subtree it will only have one
+ // child, which is the text definition for the subgroup. Don't
+ // include these in the tree.
+ int levelCnt = chldnode.ChildNodes.Count;
+ string TheMenuTitle = echild.GetAttribute("MenuTitle");
+ if ((levelCnt > 1) || (levelCnt==1 && !TheMenuTitle.Equals("")))
+ {
+ string accid = echild.GetAccPageIDString(newtmpl);
+ echild.SetAttribute("AccPageID",accid);
+ success = myrodb.RODB_WriteRO(echild);
+ if (success==false) return false;
+ }
+ }
+ }
+ chldnode = chldnode.NextSibling;
+ }
+ return true;
+ }
+
+ private bool UpdateAccPageID(VlnXmlElement grp, string newtmpl, VlnStatusMessage StatMsgWindow)
+ {
+ // For this group and below in the xml tree, update Accessory Page ID using the new
+ // template.
+ bool success;
+ string haskids;
+ string kidsloaded;
+ XmlNode node = (XmlNode) grp.FirstChild;
+ VlnXmlElement child;
+ while (node != null)
+ {
+ if (node is VlnXmlElement)
+ {
+ child = (VlnXmlElement) node;
+
+ // If this is a group menu edit, process group nodes, otherwise
+ // process rros.
+
+ if (child.Name == "vlnGroup")
+ {
+ haskids = child.GetAttribute("HasChild");
+ kidsloaded = child.GetAttribute("ChildLoaded");
+ if (haskids == "True" && kidsloaded == "False" )
+ {
+ elem.SetAttribute("TreeNotData","True");
+ myrodb.RODB_GetChildData(child,true);
+ child.SetAttribute("ChildLoaded","True");
+ }
+ StatMsgWindow.StatusMessage = child.GetAttribute("MenuTitle");
+ success = UpdateAccPageID(child, newtmpl, StatMsgWindow);
+ if (success == false) return false;
+
+ success = ProcessRROAccPageIDChange(grp, newtmpl);
+ if (success==false)return false;
+ }
+ }
+ node = node.NextSibling;
+ }
+ success = ProcessRROAccPageIDChange(grp, newtmpl);
+ if (success==false) return false;
+ return true;
+ }
+
+ private void btnOK_Click(object sender, System.EventArgs e)
+ {
+ // if the fields were disabled, just return. (Only need to check one of them)
+ if(this.tbGroup.Enabled == false)
+ {
+ this.Close();
+ return;
+ }
+ // is this is a database level group, and is a user defined type, the
+ // accessory page value, fields in use & group fields in use must all be set.
+ // (doesn't need a prefix.
+ if (elem.ParentNode.Name == "RO_Root" && dbtype==3) //3 is user defined.
+ {
+ string strattr;
+ strattr = elem.GetAttribute("FieldsInUse");
+ if (strattr == null || strattr=="")
+ {
+ MessageBox.Show("No fields defined for Referenced Objects","Group Definition Error");
+ return;
+ }
+ strattr = this.tbValue.Text;
+ if (strattr == null || strattr=="")
+ {
+ MessageBox.Show("No Value defined for this group","Group Definition Error");
+ return;
+ }
+ strattr = elem.GetAttribute("GroupFieldsInUse");
+ if (strattr == null || strattr=="")
+ {
+ MessageBox.Show("No fields defined for subgroup","Group Definition Error");
+ return;
+ }
+ }
+ bool modaccpageid=false;
+ bool modified=false;
+ if ((elem.HasAttribute("AccPageID")&&this.tbValue.Text!=origValue) || this.tbValue.Modified)
+ {
+ string dummy = ""; // need for RODB_GetFIeldsInUse call, won't be used.
+ ArrayList AvailList, InUseList;
+ //first see if it is a valid 'InUse' Field.
+ AvailList = myrodb.RODB_GetFields(elem, (uint) RecordType.Schema);
+ InUseList = myrodb.RODB_GetFieldsInUse(elem, AvailList,"FieldsInUse", ref dummy, true);
+ int chkbracketo, chkbracketc; // open & close bracket indexes
+ chkbracketo = this.tbValue.Text.IndexOf("<");
+ chkbracketc = this.tbValue.Text.IndexOf(">");
+ if (chkbracketo == -1 || chkbracketc == -1)
+ {
+ MessageBox.Show("Missing bracket () in value definition.");
+ return;
+ }
+ //if (chkbracketo != 0 || chkbracketc != this.tbValue.Text.Length-1)
+ //{
+ // MessageBox.Show("Value definition contains extraneous text.");
+ // return;
+ //}
+ // check for more than one field, don't allow this,
+ int twobrk = this.tbValue.Text.IndexOf("<",chkbracketo+1);
+ if (twobrk != -1)
+ {
+ MessageBox.Show("Cannot have two fields in accessory page id.");
+ return;
+ }
+ string val = this.tbValue.Text.Substring(chkbracketo+1,chkbracketc-chkbracketo-1);
+ // loop thru inuse list and see if it's there.
+ bool found = false;
+ for(int i=0; i0)
+ accidattr.Append(this.tbValue.Text.Substring(0,chkbracketo+1)); // +1 include the "<"
+ else
+ accidattr.Append("<");
+ accidattr.Append(CvtUserFldToFld(this.tbValue.Text.Substring(chkbracketo+1,chkbracketc-chkbracketo-1)));
+ if (chkbracketc>this.tbValue.Text.Length)
+ accidattr.Append(this.tbValue.Text.Substring(chkbracketc+1,this.tbValue.Text.Length-chkbracketc+1));
+ else
+ accidattr.Append(">");
+ elem.SetAttribute("AccPageID",accidattr.ToString());
+// elem.SetAttribute("AccPageID",CvtUserFldToFld(this.tbValue.Text));
+
+ }
+ if (this.tbGroup.Text != origGroup)
+ {
+ XmlNode tmpn = (XmlNode) elem;
+ tmpn.FirstChild.Value = tmpn.FirstChild.Value.Replace(origGroup, this.tbGroup.Text);
+ modified=true;
+ }
+ if ((elem.HasAttribute("AccPageIDPrefix")&&this.tbPrefix.Text != origPrefix) || this.tbPrefix.Modified==true)
+ {
+ elem.SetAttribute("AccPageIDPrefix",this.tbPrefix.Text);
+ modified=true;
+ }
+ bool success=true;
+ if (modified==true) success = myrodb.RODB_WriteRO(elem);
+ if (modified == true && success == true && modaccpageid==true)
+ {
+ Cursor.Current = Cursors.WaitCursor;
+ VlnStatusMessage StatMsgWindow = new VlnStatusMessage("Status of Accessory Page ID Change");
+ success = UpdateAccPageID(elem, this.tbValue.Text,StatMsgWindow);
+ Cursor.Current = Cursors.Default;
+ StatMsgWindow.Dispose();
+ }
+ if (success == false)
+ MessageBox.Show("Could not save data.");
+ this.Close();
+ }
+
+ private void btnRODef_Click(object sender, System.EventArgs e)
+ {
+ RODefFrm rodef = new RODefFrm(elem,myrodb,"FieldsInUse", this.tbGroup.Text, dbtype);
+ rodef.ShowDialog();
+ // get accpageid, in case field name changed.
+ string accvalue = elem.GetAttribute("AccPageID");
+
+ VlnXmlElement parent;
+ parent = (VlnXmlElement) elem.ParentNode;
+ while (parent != null && accvalue=="")
+ {
+ // walk up tree to get parent.
+ if (accvalue == "") accvalue = parent.GetAttribute("AccPageID");
+ if (parent.Name != "RO_Root")
+ parent = (VlnXmlElement) parent.ParentNode;
+ else
+ parent = null;
+ }
+ if (accvalue != "")
+ this.tbValue.Text = CvtFldToUserFld(accvalue);
+ else
+ this.tbValue.Text = "";
+ }
+
+ private void btnSubDef_Click(object sender, System.EventArgs e)
+ {
+ RODefFrm rodef = new RODefFrm(elem,myrodb,"GroupFieldsInUse", this.tbGroup.Text, dbtype);
+ rodef.ShowDialog();
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupDefFrm.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupDefFrm.resx
new file mode 100644
index 00000000..07b710fc
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupDefFrm.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ GroupDefFrm
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupNewFrm.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupNewFrm.cs
new file mode 100644
index 00000000..eb4a300a
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupNewFrm.cs
@@ -0,0 +1,425 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: GroupNewFrm.cs $ $Revision: 7 $
+ * $Author: Kathy $ $Date: 5/07/03 1:58p $
+ *
+ * $History: GroupNewFrm.cs $
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 5/07/03 Time: 1:58p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-033
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 4/04/03 Time: 9:40a
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-030: set HasChild Attribute for new group
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:26p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname special char
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 12/06/02 Time: 11:58a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix new table can't delete without exiting program
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:30a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname replace chars
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 10/17/02 Time: 11:35a
+ * Updated in $/EXE/RefObj/ROEditor
+ * don't save twice if continue selected to close
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:24p
+ * Created in $/EXE/RefObj/ROEditor
+ * new hi level group, form & code
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Xml;
+using System.Text;
+using ROFields;
+using RODBInterface;
+
+namespace ROEditor
+{
+ ///
+ /// Summary description for GroupNewFrm.
+ ///
+ public class GroupNewFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.TextBox tbGroup;
+ private System.Windows.Forms.Label lblGroup;
+ private System.Windows.Forms.Button btnContinue;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.RadioButton rbbtnUserDef;
+ private System.Windows.Forms.RadioButton rbbtnGraphics;
+ private System.Windows.Forms.RadioButton rbbtnSetpoint;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private RODB myrodb;
+ private VlnXmlElement elem;
+ private string lastSavedGroup;
+ private VlnXmlElement nelem; // new group element
+ private string tbname; // new group table name
+ private string toprecid; // new group master rec id
+
+ public GroupNewFrm(RODB rodb, VlnXmlElement topelem)
+ {
+ elem = topelem;
+ myrodb = rodb;
+ nelem = null;
+ toprecid = null;
+ tbname = null;
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnContinue = new System.Windows.Forms.Button();
+ this.tbGroup = new System.Windows.Forms.TextBox();
+ this.lblGroup = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.rbbtnSetpoint = new System.Windows.Forms.RadioButton();
+ this.rbbtnGraphics = new System.Windows.Forms.RadioButton();
+ this.rbbtnUserDef = new System.Windows.Forms.RadioButton();
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(176, 244);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(120, 24);
+ this.btnCancel.TabIndex = 10;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // btnContinue
+ //
+ this.btnContinue.Location = new System.Drawing.Point(40, 244);
+ this.btnContinue.Name = "btnContinue";
+ this.btnContinue.Size = new System.Drawing.Size(106, 24);
+ this.btnContinue.TabIndex = 9;
+ this.btnContinue.Text = "Continue";
+ this.btnContinue.Click += new System.EventHandler(this.btnContinue_Click);
+ //
+ // tbGroup
+ //
+ this.tbGroup.Location = new System.Drawing.Point(72, 8);
+ this.tbGroup.Name = "tbGroup";
+ this.tbGroup.Size = new System.Drawing.Size(248, 22);
+ this.tbGroup.TabIndex = 8;
+ this.tbGroup.Text = "";
+ //
+ // lblGroup
+ //
+ this.lblGroup.Location = new System.Drawing.Point(8, 8);
+ this.lblGroup.Name = "lblGroup";
+ this.lblGroup.Size = new System.Drawing.Size(56, 16);
+ this.lblGroup.TabIndex = 7;
+ this.lblGroup.Text = "Group:";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.rbbtnSetpoint,
+ this.rbbtnGraphics,
+ this.rbbtnUserDef});
+ this.groupBox1.Location = new System.Drawing.Point(24, 56);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(288, 152);
+ this.groupBox1.TabIndex = 11;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Group Type";
+ //
+ // rbbtnSetpoint
+ //
+ this.rbbtnSetpoint.Location = new System.Drawing.Point(48, 64);
+ this.rbbtnSetpoint.Name = "rbbtnSetpoint";
+ this.rbbtnSetpoint.Size = new System.Drawing.Size(184, 24);
+ this.rbbtnSetpoint.TabIndex = 2;
+ this.rbbtnSetpoint.Text = "Setpoint Database";
+ //
+ // rbbtnGraphics
+ //
+ this.rbbtnGraphics.Location = new System.Drawing.Point(48, 96);
+ this.rbbtnGraphics.Name = "rbbtnGraphics";
+ this.rbbtnGraphics.Size = new System.Drawing.Size(184, 24);
+ this.rbbtnGraphics.TabIndex = 1;
+ this.rbbtnGraphics.TabStop = true;
+ this.rbbtnGraphics.Text = "Graphics Database";
+ //
+ // rbbtnUserDef
+ //
+ this.rbbtnUserDef.Location = new System.Drawing.Point(48, 32);
+ this.rbbtnUserDef.Name = "rbbtnUserDef";
+ this.rbbtnUserDef.Size = new System.Drawing.Size(184, 24);
+ this.rbbtnUserDef.TabIndex = 0;
+ this.rbbtnUserDef.Text = "User Defined Database";
+ //
+ // GroupNewFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(376, 273);
+ this.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.groupBox1,
+ this.btnCancel,
+ this.btnContinue,
+ this.tbGroup,
+ this.lblGroup});
+ this.Font = new System.Drawing.Font("Tahoma", 9F);
+ this.Name = "GroupNewFrm";
+ this.Text = "New Group (Database)";
+ this.Load += new System.EventHandler(this.GroupNewFrm_Load);
+ this.groupBox1.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private void GroupNewFrm_Load(object sender, System.EventArgs e)
+ {
+
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private void btnCancel_Click(object sender, System.EventArgs e)
+ {
+ if (toprecid != null)
+ {
+ myrodb.RODB_DeleteGroup((XmlNode)nelem,tbname,toprecid);
+ }
+ if(nelem!=null)
+ {
+ XmlNode par = (XmlNode)nelem.ParentNode;
+ par.RemoveChild((XmlNode)nelem);
+ }
+ }
+
+ private void btnContinue_Click(object sender, System.EventArgs e)
+ {
+ bool success;
+ if (this.tbGroup.Text == null || this.tbGroup.Text == "")
+ {
+ MessageBox.Show("Need to specify group name.");
+ return;
+ }
+ // if this was already saved, i.e. user hit continue button already,
+ // just return;
+ if (this.tbGroup.Text == lastSavedGroup)
+ {
+ this.Close();
+ return;
+ }
+ lastSavedGroup = this.tbGroup.Text;
+ int dbtype=-1;
+ if (this.rbbtnGraphics.Checked == true) dbtype = 1;
+ else if (this.rbbtnSetpoint.Checked == true) dbtype = 2;
+ else if (this.rbbtnUserDef.Checked == true) dbtype = 3;
+ if (dbtype<0)
+ {
+ MessageBox.Show("Need to define type of group.");
+ return;
+ }
+ Cursor.Current = Cursors.WaitCursor;
+ // make a new table with the next table name id
+ tbname = myrodb.RODB_GetNextGroupTable();
+ if (tbname == null)
+ {
+ Cursor.Current = Cursors.Default;
+ return;
+ }
+ toprecid = myrodb.RODB_AddNewTable(tbname, this.tbGroup.Text);
+ if (toprecid == null)
+ {
+ Cursor.Current = Cursors.Default;
+ return;
+ }
+ // for the given type, copy over the required fields.
+ success = myrodb.RODB_CopyFieldDefs("ROMaster",tbname,dbtype);
+ if (success == false)
+ {
+ Cursor.Current = Cursors.Default;
+ return;
+ }
+ // create top level group node with input name.
+ nelem = (VlnXmlElement) elem.OwnerDocument.CreateElement("vlnGroup");
+ nelem.InnerText = CvtUserFldToFld(this.tbGroup.Text);
+ nelem.SetAttribute("Table",tbname);
+ nelem.SetAttribute("ParentID", "00000000");
+ string nrecid = myrodb.RODB_GetNextRecId(tbname);
+ nelem.SetAttribute("RecID", nrecid);
+ elem.AppendChild((XmlNode) nelem);
+ success = myrodb.RODB_InsertGroup(nelem);
+ Cursor.Current = Cursors.Default;
+ if (success == false) return;
+ nelem.SetAttribute("TreeNotData", "True");
+ nelem.SetAttribute("MenuTitle", this.tbGroup.Text);
+ nelem.SetAttribute("MasterRecID",toprecid);
+ nelem.SetAttribute("HasChild", "False");
+
+ // if this is a setpoint db or image db, get fields and find those fields needed
+ // to define ro & group. This is hardcoded, yuk.
+ if(dbtype == 1 || dbtype == 2)
+ {
+ ArrayList FieldList = myrodb.RODB_GetFields(nelem, (uint) RecordType.Schema);
+ string[] fldlist=null, grplist=null;
+ ROField rof;
+ string curfld;
+ StringBuilder Inuse = new StringBuilder();
+ // Get list of inuse fields for the rro.
+ if (dbtype == 1)
+ fldlist = new string[] {"Name", "Image ID", "Image"};
+ else
+ fldlist = new string[] {"Setpoint ID", "Setpoint Value", "Associated System Component", "Applicability", "Revision", "Short Description",
+ "Description", "Key Assumptions", "Basis", "References"};
+ for (int i=0; i< fldlist.Length; i++)
+ {
+ curfld = fldlist[i];
+ for (int j=0; j");
+ nelem.SetAttribute("MenuItem"," ");
+ nelem.SetAttribute("GroupMenuItem","");
+ nelem.SetAttribute("AccPageIDPrefix","SP2");
+ nelem.SetAttribute("AccPageID","");
+ }
+ else if (dbtype == 1) // image
+ {
+ nelem.SetAttribute("RetVal","");
+ nelem.SetAttribute("MenuItem","");
+ nelem.SetAttribute("GroupMenuItem","");
+ nelem.SetAttribute("AccPageIDPrefix","IG2");
+ nelem.SetAttribute("AccPageID","");
+ }
+ success = myrodb.RODB_WriteRO(nelem);
+ if (success == false) return;
+ }
+
+ // now let the user specify the group name, etc to define the group.
+ GroupDefFrm grdef = new GroupDefFrm(nelem,myrodb,nelem.InnerText,dbtype);
+ grdef.ShowDialog();
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupNewFrm.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupNewFrm.resx
new file mode 100644
index 00000000..7ebaaeb7
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/GroupNewFrm.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ GroupNewFrm
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Properties/Resources.Designer.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Properties/Resources.Designer.cs
new file mode 100644
index 00000000..86954426
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Properties/Resources.Designer.cs
@@ -0,0 +1,70 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:2.0.50727.4234
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ROEditor.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.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() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [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("ROEditor.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ internal static System.Drawing.Bitmap Red_V_txt_NB_bur_1984 {
+ get {
+ object obj = ResourceManager.GetObject("Red_V_txt_NB_bur_1984", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Properties/Resources.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Properties/Resources.resx
new file mode 100644
index 00000000..2eb5abf1
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Properties/Resources.resx
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+ ..\Red_V_txt_NB_bur_1984.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RODefFrm.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RODefFrm.cs
new file mode 100644
index 00000000..256f4cb7
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RODefFrm.cs
@@ -0,0 +1,1219 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: RODefFrm.cs $ $Revision: 18 $
+ * $Author: Kathy $ $Date: 9/06/05 11:26a $
+ *
+ * $History: RODefFrm.cs $
+ *
+ * ***************** Version 18 *****************
+ * User: Kathy Date: 9/06/05 Time: 11:26a
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2005-035
+ *
+ * ***************** Version 17 *****************
+ * User: Jsj Date: 7/02/03 Time: 9:25a
+ * Updated in $/EXE/RefObj/ROEditor
+ * made messagebox calls modal by removing the parent window reference
+ *
+ * ***************** Version 16 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:52p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-041: process if only one field for RO & not always saving ro
+ * field name edit
+ *
+ * ***************** Version 15 *****************
+ * User: Kathy Date: 5/07/03 Time: 1:58p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-033 fixed
+ *
+ * ***************** Version 14 *****************
+ * User: Jsj Date: 4/14/03 Time: 3:03p
+ * Updated in $/EXE/RefObj/ROEditor
+ * changes due to RO FST file creation speed up
+ *
+ * ***************** Version 13 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:26p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname special chars & bug fixes
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 12/02/02 Time: 9:25a
+ * Updated in $/EXE/RefObj/ROEditor
+ * after edit fieldname, update menu & retval correctly
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:30a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname replace chars
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 12/02/02 Time: 6:19a
+ * Updated in $/EXE/RefObj/ROEditor
+ * status on long ops & update text box for fieldname change
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 11/19/02 Time: 11:30a
+ * Updated in $/EXE/RefObj/ROEditor
+ * validate retval (handle {})
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:18p
+ * Updated in $/EXE/RefObj/ROEditor
+ * new group (table)
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 10/10/02 Time: 10:02a
+ * Updated in $/EXE/RefObj/ROEditor
+ * try to m ake xml tree & tree control in sync
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 9/25/02 Time: 2:31p
+ * Updated in $/EXE/RefObj/ROEditor
+ * multitxt->variable
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:57a
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/19/02 Time: 10:04a
+ * Updated in $/EXE/RefObj/ROEditor
+ * mods for subgroup apply below node. if mod menutitle template, update
+ * menu titles from node down.
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:15p
+ * Updated in $/EXE/RefObj/ROEditor
+ * vlnxml
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 8/28/02 Time: 10:57a
+ * Updated in $/EXE/RefObj/ROEditor
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Xml;
+using System.Xml.Schema;
+using System.Text;
+using ROFields;
+using RODBInterface;
+using VlnStatus;
+
+
+namespace ROEditor
+{
+
+ ///
+ /// Summary description for RODefinition.
+ ///
+ public class RODefFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Label lblGroup;
+ private System.Windows.Forms.Label lblRetVal;
+ private System.Windows.Forms.Label lblMenuVal;
+ private System.Windows.Forms.TextBox tbRetVal;
+ private System.Windows.Forms.TextBox tbMenuVal;
+ private System.Windows.Forms.Label lblGroupText;
+ private System.Windows.Forms.GroupBox gbFields;
+ private System.Windows.Forms.Label lblInUse;
+ private System.Windows.Forms.Label lblAvail;
+ private System.Windows.Forms.ListBox lboxInUse;
+ private System.Windows.Forms.ListBox lboxAvail;
+ private System.Windows.Forms.Button btnAdd;
+ private System.Windows.Forms.Button btnEdit;
+ private System.Windows.Forms.Button btnRemove;
+ private System.Windows.Forms.Button btnNew;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private RODB myrodb;
+ ArrayList AvailList;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.Button btnCancel;
+ ArrayList InUseList;
+ private VlnXmlElement elem;
+ private uint editlevel; // flag for group definition or ro definition
+ private string strFieldsInUse;
+ private string origFieldsInUse;
+ private string origRetVal;
+ private string origMenuItem;
+ StringBuilder parseerror;
+ private int hi, lo;
+ private int dbtype;
+ // pass in Group Element
+ public RODefFrm(VlnXmlElement pelem, RODB rodb, string fields, string grptxt, int idbtype)
+ {
+ myrodb = rodb;
+ strFieldsInUse = fields;
+ dbtype = idbtype;
+ if (fields == "FieldsInUse") // not a group level edit.
+ editlevel = (uint) RecordType.Schema;
+ else
+ editlevel = (uint) RecordType.GroupSchema;
+ elem = pelem;
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ if(editlevel==(uint)RecordType.GroupSchema)this.Text = "Subgroup Definition";
+ FillInData(grptxt);
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ private void FillInAvailable()
+ {
+ ROField rof;
+
+ // put the items in the AvailList box.
+ for (int i=0; i< AvailList.Count; i++)
+ {
+ rof = (ROField) AvailList[i];
+ if (rof.GetFieldname != null) // DO YET: Why null?
+ this.lboxAvail.Items.Add(rof.GetFieldname);
+ }
+ }
+
+
+ private void SetUpListBoxes()
+ {
+ ROField rof;
+ // Get list of available fields (all fields in this type, i.e. rectype = 'Schema'
+ // or 'GroupSchema') and get list of inuse from the schema definition.
+ AvailList = myrodb.RODB_GetFields(elem, editlevel);
+ InUseList = myrodb.RODB_GetFieldsInUse(elem, AvailList, strFieldsInUse, ref origFieldsInUse, true);
+ FillInAvailable();
+
+ // set up the listbox for inuse items.
+ if (InUseList != null)
+ {
+ // add items to the InUseList box.
+ for (int i=0; i< InUseList.Count; i++)
+ {
+ rof = (ROField) InUseList[i];
+ if (rof.GetFieldname != null) //DO YET: why null?
+ this.lboxInUse.Items.Add(rof.GetFieldname);
+ }
+ }
+ }
+
+
+ private void DoValueTextBoxes()
+ {
+ string menuitm, retval;
+ if (editlevel == (uint) RecordType.GroupSchema)
+ {
+ menuitm = elem.GetAttribute("GroupMenuItem");
+ this.tbRetVal.Visible = false;
+ this.lblRetVal.Visible = false;
+ VlnXmlElement parent;
+ parent = (VlnXmlElement) elem.ParentNode;
+ while (parent != null && (menuitm == ""))
+ {
+ // walk up tree to get parent and check for data there
+ if (menuitm == "") menuitm = parent.GetAttribute("GroupMenuItem");
+ if (parent.Name != "RO_Root")
+ parent = (VlnXmlElement) parent.ParentNode;
+ else
+ parent = null;
+ }
+ if (menuitm !="")
+ this.tbMenuVal.Text = CvtFldToUserFld(menuitm);
+ else
+ this.tbMenuVal.Text = "";
+ }
+ else
+ {
+ menuitm = elem.GetAttribute("MenuItem");
+ retval = elem.GetAttribute("RetVal");
+ this.tbRetVal.Visible = true;
+ this.lblRetVal.Visible = true;
+ VlnXmlElement parent;
+ parent = (VlnXmlElement) elem.ParentNode;
+ while (parent != null && (menuitm == "" || retval==""))
+ {
+ // walk up tree to get parent and check for data there
+ if (menuitm == "") menuitm = parent.GetAttribute("MenuItem");
+ if (retval == "") retval = parent.GetAttribute("RetVal");
+ if (parent.Name != "RO_Root")
+ parent = (VlnXmlElement) parent.ParentNode;
+ else
+ parent = null;
+ }
+ if (menuitm!="")
+ this.tbMenuVal.Text = CvtFldToUserFld(menuitm);
+ else
+ this.tbMenuVal.Text = "";
+ if (retval!="")
+ this.tbRetVal.Text = CvtFldToUserFld(retval);
+ else
+ this.tbRetVal.Text = "";
+ }
+ }
+
+ private void FillInData(string grptxt)
+ {
+ this.lblGroupText.Text = grptxt;
+ DoValueTextBoxes();
+ SetUpListBoxes();
+
+ lboxInUse.GotFocus += new EventHandler(this.lboxInUse_GotFocus);
+ lboxAvail.GotFocus += new EventHandler(this.lboxAvail_GotFocus);
+
+ // save copies of local data, so if there is a change, we know we must save them.
+ origRetVal=this.tbRetVal.Text;
+ origMenuItem=this.tbMenuVal.Text;
+
+ // if this is a database level definition & it's a user defined database,
+ // the okay button is disabled until a field is used.
+ if (elem.ParentNode.Name == "RO_Root" && dbtype==3)
+ {
+ string attr;
+ if (editlevel==(uint)RecordType.Schema)
+ attr = elem.GetAttribute("FieldsInUse");
+ else
+ attr = elem.GetAttribute("GroupFieldsInUse");
+ if (attr==null || attr=="") btnOK.Enabled=false;
+ }
+ }
+
+ protected void lboxInUse_GotFocus (object sender, EventArgs e)
+ {
+ lboxAvail.ClearSelected();
+ this.btnRemove.Enabled = true;
+ this.btnAdd.Enabled = false;
+ this.btnEdit.Enabled = true;
+ }
+ protected void lboxAvail_GotFocus (object sender, EventArgs e)
+ {
+ lboxInUse.ClearSelected();
+ this.btnAdd.Enabled = true;
+ this.btnRemove.Enabled = false;
+ this.btnEdit.Enabled = true;
+ }
+ private void btnRemove_Click(object sender, System.EventArgs e)
+ {
+ //get item in lboxInUse (in use list) and remove it from there
+ // and add it to the lboxAvail list.
+ if (lboxInUse.SelectedIndex >=0 )
+ {
+ // get the selected item and its string. Remove it from the listbox,
+ // add it to the available array list & listbox & then remove it from
+ // the inuse array list.
+ int indx = lboxInUse.SelectedIndex;
+ lboxInUse.Items.RemoveAt(indx);
+
+ // copy if over to availlist
+ ROField rof = (ROField) InUseList[indx];
+ ROField copyrof = new ROField(rof.GetFieldname,rof.GetRecID,rof.GetMasterRecID, rof.GetFieldType);
+ AvailList.Add(copyrof);
+
+ lboxAvail.Items.Add(copyrof.GetFieldname);
+ InUseList.RemoveAt(indx);
+ lboxAvail.Refresh();
+ lboxInUse.Refresh();
+ }
+ }
+ private void btnAdd_Click(object sender, System.EventArgs e)
+ {
+ //get item in lboxInUse (in use list) and remove it from there
+ // and add it to the lboxAvail list.
+ if (lboxAvail.SelectedIndex >=0 )
+ {
+ // get the selected item and its string. Remove it from the listbox,
+ // add it to the inuse array list & listbox & then remove it from
+ // the avail(able) array list.
+ int indx = lboxAvail.SelectedIndex;
+ lboxAvail.Items.RemoveAt(indx);
+
+ // copy if over to availlist
+ ROField rof = (ROField) AvailList[indx];
+ ROField copyrof = new ROField(rof.GetFieldname,rof.GetRecID,rof.GetMasterRecID,rof.GetFieldType);
+ InUseList.Add(copyrof);
+
+ lboxInUse.Items.Add(copyrof.GetFieldname);
+ AvailList.RemoveAt(indx);
+ lboxAvail.Refresh();
+ lboxInUse.Refresh();
+ btnOK.Enabled=true;
+
+ }
+ }
+
+ private void syntax(string prob,int start, int end)
+ {
+ lo=start;
+ hi=end;
+ parseerror.Append("Invalid Syntax - ");
+ parseerror.Append(prob);
+ }
+
+ private void missingDelimiter(char chr,int start,int end)
+ {
+ lo=start;
+ hi=end;
+ string delim = "{}{<><";
+ int delindx;
+ delindx = delim.IndexOf(chr,0);
+ parseerror.Append("Couldn't find matching ");
+ if (delindx >-1)
+ parseerror.Append(delim.Substring(delindx,1));
+ else
+ parseerror.Append("?");
+ }
+ private bool isWhiteSpace(char chr)
+ {
+ return(chr!=0 && " \t\n\r".IndexOf(chr)!=-1);
+ }
+ private int endsIn(char chr, string str, int start, int end)
+ {
+ while(start <= end && isWhiteSpace(str[end]))end--;
+ if(start <= end && str[end]==chr)return 1;
+ return 0;
+ }
+
+ private void processBrace(string str, int start, int end)
+ {
+ int where=str.IndexOfAny("<>{}=".ToCharArray(),start,end-start);
+ if(where!=0)
+ {
+ char chr=str[where];
+ switch(chr)
+ {
+ case '{':
+ // verify that this ends in a }
+ if(endsIn('}',str,where,end)==0)
+ {
+ syntax("should end with }",where,end);
+ }
+ break;
+ case '<':
+ syntax("< not permitted here",where,where);
+ break;
+ case '}':
+ syntax("} not permitted here",start,where);
+ break;
+ case '>':
+ syntax("> not permitted here",start,where);
+ break;
+ }
+ }
+ }
+
+ private int findMatchingBrace(string str, int start, int end)
+ {
+ int where=start+1;
+ int last=where;
+ int termlevel=1;
+ while(hi==0 && where <= end && termlevel!=0)
+ {
+ char chr=str[where];
+ switch (chr)
+ {
+ case '{':
+ where=findMatchingBrace(str,where,end);
+ where++;
+ break;
+ case '}':
+ termlevel=0;
+ break;
+ case '>':
+ missingDelimiter(chr,last,where);
+ break;
+ case '<':
+ int next;
+ next=str.IndexOfAny("{}<>".ToCharArray(),where+1,end-where);
+ if(next==0)
+ {
+ missingDelimiter(chr,last,end);
+ }
+ else if(str[next]!='>')
+ {
+ missingDelimiter(chr,last,next);
+ }
+ else
+ {
+ last=where=next+1;
+ }
+ break;
+ default:
+ where++;
+ break;
+ }
+ }
+ if(hi==0 && termlevel!=0)
+ {
+ missingDelimiter('{',start,end);
+ }
+ return where;
+ }
+
+ private bool ValidReturnFieldSpec(string str, int start, int end)
+ {
+ if (parseerror != null)
+ parseerror.Remove(0,parseerror.Length);
+ else
+ parseerror = new StringBuilder();
+ int where=start;
+ int last=start;
+ hi=lo=0;
+ while(hi==0 && where <= end)
+ {
+ char chr=str[where];
+ switch (chr)
+ {
+ case '{':
+ int next;
+ next=findMatchingBrace(str,where,end);
+ if(hi==0)
+ {
+ processBrace(str,where+1,next-1);
+ where=next+1;
+ last=where;
+ }
+ break;
+ case '}':
+ missingDelimiter(chr,last,where);
+ break;
+ case '>':
+ missingDelimiter(chr,last,where);
+ break;
+ case '<':
+ int strt=where+1;
+ where = str.IndexOfAny("<>{}".ToCharArray(),where+1,end-where);
+ if (where==0)
+ missingDelimiter('<',start,end);
+ else if (str[where]=='>')
+ {
+ string inusename = str.Substring(strt,where-strt);
+ // now check field name.
+ bool found = false;
+ string rofname;
+ for (int i=0; i0)
+ {
+ MessageBox.Show(parseerror.ToString(),"Error in validating return value");
+ return false;
+ }
+ else
+ return true;
+ }
+
+ private bool ValidFieldSpec(string field)
+ {
+ int left = field.IndexOf("<");
+ int right;
+ int stindx = 0;
+ while (left != -1)
+ {
+ // get right bracket and then check for valid field & if commas with
+ // this, check for integer values.
+ right = field.IndexOf(">",stindx);
+ if (right == -1)
+ {
+ MessageBox.Show("Missing > in Menu value.");
+ return false;
+ }
+ string substring = field.Substring(left+1,right-left-1);
+ // do comma parts now.
+ string inusename;
+ int comma1 = substring.IndexOf(",");
+ if (comma1 != -1)
+ {
+ // get any numbers for formatting & check for ints.
+ int comma2 = substring.IndexOf(",",comma1+1);
+ if (comma2 != -1) // two ints.
+ {
+ if (comma2-comma1 > 1) // first format field - not empty
+ {
+ string int1 = substring.Substring(comma1+1,comma2-comma1-1);
+ try
+ {
+ int l = System.Convert.ToInt32(int1);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"invalid format number");
+ return false;
+ }
+ }
+ if (comma2field.Length)
+ left = -1;
+ else
+ {
+ stindx=right+1;
+ left = field.IndexOf("<",left+1);
+ }
+ }
+ return true;
+ }
+ private bool ProcessRROMenuChange(VlnXmlElement mnuele, string newtmpl)
+ {
+ bool success;
+ XmlNode chldnode = (XmlNode) mnuele.FirstChild;
+ VlnXmlElement echild;
+ while (chldnode != null)
+ {
+ if (chldnode is VlnXmlElement)
+ {
+ echild = (VlnXmlElement) chldnode;
+ if (echild.Name != "vlnGroup")
+ {
+ // If this is a group defintion subtree it will only have one
+ // child, which is the text definition for the subgroup. Don't
+ // include these in the tree.
+ int levelCnt = chldnode.ChildNodes.Count;
+ string TheMenuTitle = echild.GetAttribute("MenuTitle");
+ if ((levelCnt >= 1) && !TheMenuTitle.Equals(""))
+ {
+ string mnustring = echild.GetMenuString(newtmpl,false);
+ echild.SetAttribute("MenuTitle",mnustring);
+ success = myrodb.RODB_WriteRO(echild);
+ if (success==false) return false;
+ }
+ }
+ }
+ chldnode = chldnode.NextSibling;
+ }
+ return true;
+ }
+
+ private bool UpdateMenuTitles(VlnXmlElement mnuele, string newtmpl, string stredittype, VlnStatusMessage StatMsgWindow)
+ {
+ // For this group and below in the xml tree, update menu titles using the new
+ // template.
+ bool success;
+ string haskids;
+ string kidsloaded;
+ XmlNode node = (XmlNode) mnuele.FirstChild;
+ VlnXmlElement child;
+
+ while (node != null)
+ {
+ if (node is VlnXmlElement)
+ {
+ child = (VlnXmlElement) node;
+
+ // If this is a group menu edit, process group nodes, otherwise
+ // process rros. For both, when hitting a group node, check that
+ // it doesn't have a menu item string redefining the menu template.
+
+ if (child.Name == "vlnGroup" && child.HasAttribute(stredittype) == false)
+ {
+ haskids = child.GetAttribute("HasChild");
+ kidsloaded = child.GetAttribute("ChildLoaded");
+ if (haskids == "True" && kidsloaded == "False" )
+ {
+ myrodb.RODB_GetChildData(child,true);
+ child.SetAttribute("ChildLoaded","True");
+ }
+ StatMsgWindow.StatusMessage = child.GetAttribute("MenuTitle");
+ success = UpdateMenuTitles(child,newtmpl, stredittype, StatMsgWindow);
+ if (success == false) return false;
+
+ if (editlevel == (uint) RecordType.Schema)
+ {
+ success = ProcessRROMenuChange(mnuele, newtmpl);
+ if (success==false)return false;
+ }
+ else if (editlevel == (uint) RecordType.GroupSchema)
+ {
+ string mnustring = child.GetMenuString(newtmpl,true);
+ child.SetAttribute("MenuTitle",mnustring);
+ success = myrodb.RODB_WriteGroup(child,child);
+ if (success==false) return false;
+ }
+ }
+ }
+ node = node.NextSibling;
+ }
+ // if doing RO menu updates, do all at the current level, otherwise, skip it
+ // because it is a group menu item.
+ if (stredittype == "MenuItem")
+ {
+ success = ProcessRROMenuChange(mnuele, newtmpl);
+ if (success==false) return false;
+ }
+ return true;
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private string CvtFldToUserFld(string fldname)
+ {
+ string tmpstr0;
+ if (fldname.Length < 2) return fldname;
+ // an xml element name cannot begin with a digit. we had prepended a "__"
+ if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
+ tmpstr0 = fldname.Substring(2,fldname.Length-2);
+ else
+ tmpstr0 = fldname;
+ // an xml element name cannot have a space, we converted to a "__"
+ string tmpstr = tmpstr0.Replace("__"," ");
+ int len = tmpstr.Length;
+ int cur = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval, indx;
+ if (tmpstr.Length <6)
+ indx = -1;
+ else
+ indx=tmpstr.IndexOf(OKpunch,cur);
+ string asc_spchar;
+ while (indx>=0)
+ {
+ outstr += tmpstr.Substring(cur,indx-cur);
+ asc_spchar = tmpstr.Substring(indx+3,3);
+ decval = System.Convert.ToInt16(asc_spchar,10);
+ outstr += System.Convert.ToChar(decval).ToString();
+ cur = indx+6;
+ if (cur+6 > len)
+ indx = -1;
+ else
+ indx = tmpstr.IndexOf(OKpunch,cur);
+ }
+ if (cur= 0)
+ rof = (ROField) InUseList[indx];
+ else
+ {
+ isInSelList = false;
+ indx = lboxAvail.SelectedIndex;
+ if (indx >= 0)
+ rof = (ROField) AvailList[indx];
+ else
+ {
+ // message - bad one.
+ return;
+ }
+ }
+
+ uint ftype = rof.GetFieldType;
+ if (ftype == (uint)FieldTypes.FrmtSingleTxt || ftype == (uint)FieldTypes.VariableTxt ||
+ ftype == (uint)FieldTypes.SingleTxt || ftype == (uint)FieldTypes.Table ||
+ ftype == (uint)FieldTypes.XYPlot || ftype == (uint)FieldTypes.Image)
+
+ {
+ FieldTypeDefFrm nwtyp = new FieldTypeDefFrm(rof, myrodb, elem, editlevel, AvailList, InUseList);
+ nwtyp.ShowDialog();
+ }
+ else
+ {
+ FieldCombFrm nwcomb = new FieldCombFrm(rof, myrodb, elem, editlevel, rof.GetFieldname, AvailList, InUseList);
+ nwcomb.ShowDialog();
+ }
+
+ // Update Lists & Text boxes to represent any modified text.
+ if (isInSelList)
+ {
+ lboxInUse.Items.Clear();
+ // add items to the InUseList box.
+ for (int i=0; i< InUseList.Count; i++)
+ {
+ rof = (ROField) InUseList[i];
+ if (rof.GetFieldname != null)
+ this.lboxInUse.Items.Add(rof.GetFieldname);
+ }
+ }
+ else
+ {
+ lboxAvail.Items.Clear();
+ // add items to the AvailList box.
+ for (int i=0; i< AvailList.Count; i++)
+ {
+ rof = (ROField) AvailList[i];
+ if (rof.GetFieldname != null)
+ this.lboxAvail.Items.Add(rof.GetFieldname);
+ }
+ }
+ }
+
+ private void btnNew_Click(object sender, System.EventArgs e)
+ {
+ ROField rof = new ROField(null,null,null,0);
+ FieldTypeDefFrm nwtyp = new FieldTypeDefFrm(rof, myrodb, elem, editlevel, AvailList, InUseList);
+ nwtyp.ShowDialog();
+
+ if (rof.GetFieldname != null)
+ {
+ AvailList.Add(rof);
+ lboxAvail.Items.Add(rof.GetFieldname);
+ }
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblGroup = new System.Windows.Forms.Label();
+ this.lblRetVal = new System.Windows.Forms.Label();
+ this.lblMenuVal = new System.Windows.Forms.Label();
+ this.tbRetVal = new System.Windows.Forms.TextBox();
+ this.tbMenuVal = new System.Windows.Forms.TextBox();
+ this.lblGroupText = new System.Windows.Forms.Label();
+ this.gbFields = new System.Windows.Forms.GroupBox();
+ this.btnNew = new System.Windows.Forms.Button();
+ this.btnRemove = new System.Windows.Forms.Button();
+ this.btnEdit = new System.Windows.Forms.Button();
+ this.btnAdd = new System.Windows.Forms.Button();
+ this.lboxAvail = new System.Windows.Forms.ListBox();
+ this.lboxInUse = new System.Windows.Forms.ListBox();
+ this.lblAvail = new System.Windows.Forms.Label();
+ this.lblInUse = new System.Windows.Forms.Label();
+ this.btnOK = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.gbFields.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lblGroup
+ //
+ this.lblGroup.Location = new System.Drawing.Point(24, 0);
+ this.lblGroup.Name = "lblGroup";
+ this.lblGroup.Size = new System.Drawing.Size(88, 16);
+ this.lblGroup.TabIndex = 0;
+ this.lblGroup.Text = "Group:";
+ this.lblGroup.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // lblRetVal
+ //
+ this.lblRetVal.Location = new System.Drawing.Point(16, 32);
+ this.lblRetVal.Name = "lblRetVal";
+ this.lblRetVal.Size = new System.Drawing.Size(96, 16);
+ this.lblRetVal.TabIndex = 1;
+ this.lblRetVal.Text = "Return Value:";
+ this.lblRetVal.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // lblMenuVal
+ //
+ this.lblMenuVal.Location = new System.Drawing.Point(16, 64);
+ this.lblMenuVal.Name = "lblMenuVal";
+ this.lblMenuVal.Size = new System.Drawing.Size(96, 16);
+ this.lblMenuVal.TabIndex = 2;
+ this.lblMenuVal.Text = "Menu Value:";
+ this.lblMenuVal.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // tbRetVal
+ //
+ this.tbRetVal.Location = new System.Drawing.Point(120, 32);
+ this.tbRetVal.Name = "tbRetVal";
+ this.tbRetVal.Size = new System.Drawing.Size(464, 22);
+ this.tbRetVal.TabIndex = 4;
+ this.tbRetVal.Text = "textBox1";
+ //
+ // tbMenuVal
+ //
+ this.tbMenuVal.Location = new System.Drawing.Point(120, 64);
+ this.tbMenuVal.Name = "tbMenuVal";
+ this.tbMenuVal.Size = new System.Drawing.Size(464, 22);
+ this.tbMenuVal.TabIndex = 5;
+ this.tbMenuVal.Text = "textBox1";
+ //
+ // lblGroupText
+ //
+ this.lblGroupText.Location = new System.Drawing.Point(120, 0);
+ this.lblGroupText.Name = "lblGroupText";
+ this.lblGroupText.Size = new System.Drawing.Size(464, 16);
+ this.lblGroupText.TabIndex = 7;
+ this.lblGroupText.Text = "label1";
+ //
+ // gbFields
+ //
+ this.gbFields.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.btnNew,
+ this.btnRemove,
+ this.btnEdit,
+ this.btnAdd,
+ this.lboxAvail,
+ this.lboxInUse,
+ this.lblAvail,
+ this.lblInUse});
+ this.gbFields.Location = new System.Drawing.Point(8, 112);
+ this.gbFields.Name = "gbFields";
+ this.gbFields.Size = new System.Drawing.Size(704, 224);
+ this.gbFields.TabIndex = 8;
+ this.gbFields.TabStop = false;
+ this.gbFields.Text = "Fields";
+ //
+ // btnNew
+ //
+ this.btnNew.Location = new System.Drawing.Point(608, 48);
+ this.btnNew.Name = "btnNew";
+ this.btnNew.Size = new System.Drawing.Size(80, 24);
+ this.btnNew.TabIndex = 7;
+ this.btnNew.Text = "New...";
+ this.btnNew.Click += new System.EventHandler(this.btnNew_Click);
+ //
+ // btnRemove
+ //
+ this.btnRemove.Enabled = false;
+ this.btnRemove.Location = new System.Drawing.Point(272, 144);
+ this.btnRemove.Name = "btnRemove";
+ this.btnRemove.Size = new System.Drawing.Size(80, 24);
+ this.btnRemove.TabIndex = 6;
+ this.btnRemove.Text = "Remove>>";
+ this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);
+ //
+ // btnEdit
+ //
+ this.btnEdit.Enabled = false;
+ this.btnEdit.Location = new System.Drawing.Point(272, 96);
+ this.btnEdit.Name = "btnEdit";
+ this.btnEdit.Size = new System.Drawing.Size(80, 24);
+ this.btnEdit.TabIndex = 5;
+ this.btnEdit.Text = "Edit...";
+ this.btnEdit.Click += new System.EventHandler(this.btnEdit_Click);
+ //
+ // btnAdd
+ //
+ this.btnAdd.Enabled = false;
+ this.btnAdd.Location = new System.Drawing.Point(272, 48);
+ this.btnAdd.Name = "btnAdd";
+ this.btnAdd.Size = new System.Drawing.Size(80, 24);
+ this.btnAdd.TabIndex = 4;
+ this.btnAdd.Text = "<< Add";
+ this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
+ //
+ // lboxAvail
+ //
+ this.lboxAvail.ItemHeight = 14;
+ this.lboxAvail.Location = new System.Drawing.Point(376, 48);
+ this.lboxAvail.Name = "lboxAvail";
+ this.lboxAvail.Size = new System.Drawing.Size(216, 144);
+ this.lboxAvail.TabIndex = 3;
+ //
+ // lboxInUse
+ //
+ this.lboxInUse.ItemHeight = 14;
+ this.lboxInUse.Location = new System.Drawing.Point(24, 48);
+ this.lboxInUse.Name = "lboxInUse";
+ this.lboxInUse.Size = new System.Drawing.Size(216, 144);
+ this.lboxInUse.TabIndex = 2;
+ //
+ // lblAvail
+ //
+ this.lblAvail.Location = new System.Drawing.Point(384, 24);
+ this.lblAvail.Name = "lblAvail";
+ this.lblAvail.Size = new System.Drawing.Size(80, 16);
+ this.lblAvail.TabIndex = 1;
+ this.lblAvail.Text = "Available:";
+ //
+ // lblInUse
+ //
+ this.lblInUse.Location = new System.Drawing.Point(24, 24);
+ this.lblInUse.Name = "lblInUse";
+ this.lblInUse.Size = new System.Drawing.Size(64, 16);
+ this.lblInUse.TabIndex = 0;
+ this.lblInUse.Text = "In Use:";
+ //
+ // btnOK
+ //
+ this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btnOK.Location = new System.Drawing.Point(512, 376);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(88, 24);
+ this.btnOK.TabIndex = 9;
+ this.btnOK.Text = "OK";
+ this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(616, 376);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(80, 24);
+ this.btnCancel.TabIndex = 10;
+ this.btnCancel.Text = "Cancel";
+ //
+ // RODefFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(792, 437);
+ this.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.btnCancel,
+ this.btnOK,
+ this.gbFields,
+ this.lblGroupText,
+ this.tbMenuVal,
+ this.tbRetVal,
+ this.lblMenuVal,
+ this.lblRetVal,
+ this.lblGroup});
+ this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.Name = "RODefFrm";
+ this.Text = "Referenced Object Definition";
+ this.gbFields.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RODefFrm.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RODefFrm.resx
new file mode 100644
index 00000000..c87ed6c9
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RODefFrm.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ RODefFrm
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs
new file mode 100644
index 00000000..f3706f40
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.cs
@@ -0,0 +1,2577 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: ROEditor.cs $ $Revision: 54 $
+ * $Author: Kathy $ $Date: 7/20/04 2:15p $
+ *
+ * $History: ROEditor.cs $
+ *
+ * ***************** Version 54 *****************
+ * User: Kathy Date: 7/20/04 Time: 2:15p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2004-021 improve duplicate error message
+ *
+ * ***************** Version 53 *****************
+ * User: Kathy Date: 7/15/04 Time: 11:11a
+ * Updated in $/EXE/RefObj/ROEditor
+ * Fix B2004-017
+ *
+ * ***************** Version 52 *****************
+ * User: Jsj Date: 1/21/04 Time: 12:11p
+ * Updated in $/EXE/RefObj/ROEditor
+ * calls new function to get currently selected field type for multi type
+ * field
+ *
+ * ***************** Version 51 *****************
+ * User: Jsj Date: 1/07/04 Time: 2:19p
+ * Updated in $/EXE/RefObj/ROEditor
+ * allow use of SQL Server
+ *
+ * ***************** Version 50 *****************
+ * User: Kathy Date: 10/15/03 Time: 10:30a
+ * Updated in $/EXE/RefObj/ROEditor
+ * found/fixed as part of B2003-060 - will go thru QA process for that
+ * bug's fix
+ *
+ * ***************** Version 49 *****************
+ * User: Jsj Date: 7/02/03 Time: 9:25a
+ * Updated in $/EXE/RefObj/ROEditor
+ * made messagebox calls modal by removing the parent window reference
+ *
+ * ***************** Version 48 *****************
+ * User: Kathy Date: 5/30/03 Time: 12:48p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-044: sync up xml with UI tree view
+ *
+ * ***************** Version 47 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:52p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-034: if only one field for ro, wasn't always processing it.
+ *
+ * ***************** Version 46 *****************
+ * User: Kathy Date: 5/07/03 Time: 1:59p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-033 fixed.
+ *
+ * ***************** Version 45 *****************
+ * User: Jsj Date: 4/14/03 Time: 3:03p
+ * Updated in $/EXE/RefObj/ROEditor
+ * changes due to RO FST file creation speed up
+ *
+ * ***************** Version 44 *****************
+ * User: Kathy Date: 3/26/03 Time: 2:20p
+ * Updated in $/EXE/RefObj/ROEditor
+ * speed up initial load
+ *
+ * ***************** Version 43 *****************
+ * User: Kathy Date: 3/11/03 Time: 11:26a
+ * Updated in $/EXE/RefObj/ROEditor
+ * be sure tree isloaded for group def change
+ *
+ * ***************** Version 42 *****************
+ * User: Kathy Date: 3/04/03 Time: 11:13a
+ * Updated in $/EXE/RefObj/ROEditor
+ * may be more than 1 new database for tree at a time
+ *
+ * ***************** Version 41 *****************
+ * User: Kathy Date: 2/24/03 Time: 11:09a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fixed new with implicit cancel bug (crash)
+ *
+ * ***************** Version 40 *****************
+ * User: Jsj Date: 2/21/03 Time: 5:33p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fixed RO | Save menu item enable/disable state
+ *
+ * ***************** Version 39 *****************
+ * User: Kathy Date: 2/03/03 Time: 10:40a
+ * Updated in $/EXE/RefObj/ROEditor
+ * ui improve
+ *
+ * ***************** Version 38 *****************
+ * User: Kathy Date: 1/22/03 Time: 12:18p
+ * Updated in $/EXE/RefObj/ROEditor
+ * duplicate/save as bug
+ *
+ * ***************** Version 37 *****************
+ * User: Kathy Date: 1/15/03 Time: 1:57p
+ * Updated in $/EXE/RefObj/ROEditor
+ * improve UI
+ *
+ * ***************** Version 36 *****************
+ * User: Jsj Date: 1/13/03 Time: 12:00p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fixed call to data conversion
+ *
+ * ***************** Version 35 *****************
+ * User: Kathy Date: 1/08/03 Time: 10:07a
+ * Updated in $/EXE/RefObj/ROEditor
+ * view image support
+ *
+ * ***************** Version 34 *****************
+ * User: Kathy Date: 1/07/03 Time: 9:25a
+ * Updated in $/EXE/RefObj/ROEditor
+ * roeditor.own & specific ro (from vfw)
+ *
+ * ***************** Version 33 *****************
+ * User: Jsj Date: 1/06/03 Time: 11:31a
+ * Updated in $/EXE/RefObj/ROEditor
+ * logic for No RO directory, Emply RO directroy, and RO directory with
+ * paradox database
+ *
+ * ***************** Version 32 *****************
+ * User: Jsj Date: 1/02/03 Time: 3:57p
+ * Updated in $/EXE/RefObj/ROEditor
+ * added INI file logic
+ *
+ * ***************** Version 31 *****************
+ * User: Kathy Date: 12/17/02 Time: 9:47a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix some duplicate/save as bugs
+ *
+ * ***************** Version 30 *****************
+ * User: Kathy Date: 12/16/02 Time: 12:12p
+ * Updated in $/EXE/RefObj/ROEditor
+ * added cancel button & fixed some duplicate/saveas bugs
+ *
+ * ***************** Version 29 *****************
+ * User: Kathy Date: 12/13/02 Time: 10:06a
+ * Updated in $/EXE/RefObj/ROEditor
+ * if 'cancel' from edit, was 'stuck' on that edit control
+ *
+ * ***************** Version 28 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:26p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname special chars & bug fixes
+ *
+ * ***************** Version 27 *****************
+ * User: Jsj Date: 12/06/02 Time: 3:28p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix for parameter display data (ignoring the data for now)
+ *
+ * ***************** Version 26 *****************
+ * User: Kathy Date: 12/06/02 Time: 11:59a
+ * Updated in $/EXE/RefObj/ROEditor
+ * improve tree view & fix minor menuing things
+ *
+ * ***************** Version 25 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:30a
+ * Updated in $/EXE/RefObj/ROEditor
+ * fieldname replace chars
+ *
+ * ***************** Version 24 *****************
+ * User: Jsj Date: 11/27/02 Time: 12:54p
+ * Updated in $/EXE/RefObj/ROEditor
+ * Modification to create the RO.FST file
+ *
+ * ***************** Version 23 *****************
+ * User: Kathy Date: 11/26/02 Time: 11:10a
+ * Updated in $/EXE/RefObj/ROEditor
+ * add icons, list view & improve sizing
+ *
+ * ***************** Version 22 *****************
+ * User: Kathy Date: 11/20/02 Time: 1:29p
+ * Updated in $/EXE/RefObj/ROEditor
+ * selecting 'x' doesn't close it - fixed.
+ *
+ * ***************** Version 21 *****************
+ * User: Kathy Date: 11/20/02 Time: 11:37a
+ * Updated in $/EXE/RefObj/ROEditor
+ * zoom btn & ask about save for mod data
+ *
+ * ***************** Version 20 *****************
+ * User: Kathy Date: 11/19/02 Time: 11:30a
+ * Updated in $/EXE/RefObj/ROEditor
+ * Fix a variety of UI bugs
+ *
+ * ***************** Version 19 *****************
+ * User: Kathy Date: 10/24/02 Time: 11:17a
+ * Updated in $/EXE/RefObj/ROEditor
+ * save as, duplicate and delete top group
+ *
+ * ***************** Version 18 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:19p
+ * Updated in $/EXE/RefObj/ROEditor
+ * added new hi-level group
+ *
+ * ***************** Version 17 *****************
+ * User: Kathy Date: 10/11/02 Time: 11:37a
+ * Updated in $/EXE/RefObj/ROEditor
+ * Restore Btn, bug fixes
+ *
+ * ***************** Version 16 *****************
+ * User: Kathy Date: 10/10/02 Time: 10:03a
+ * Updated in $/EXE/RefObj/ROEditor
+ * accessory page id & try to make xml tree in sync with tree control
+ *
+ * ***************** Version 15 *****************
+ * User: Jsj Date: 10/03/02 Time: 4:53p
+ * Updated in $/EXE/RefObj/ROEditor
+ * got the Edit menus (cut,paste,etc) working
+ *
+ * ***************** Version 14 *****************
+ * User: Jsj Date: 10/03/02 Time: 1:27p
+ * Updated in $/EXE/RefObj/ROEditor
+ * put back missing variables for tree nodes
+ *
+ * ***************** Version 13 *****************
+ * User: Jsj Date: 10/02/02 Time: 5:46p
+ * Updated in $/EXE/RefObj/ROEditor
+ * added an Edit menu item to the popup and RO menus. Added logic to
+ * enable or disable the Save, Expand/Collaspe, and Properties menu items,
+ * added an About dialog box. Added logic to clear the edit pane.
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 10/02/02 Time: 2:43p
+ * Updated in $/EXE/RefObj/ROEditor
+ * more tying tree to data
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 10/02/02 Time: 1:39p
+ * Updated in $/EXE/RefObj/ROEditor
+ * insert/delete group/ro tie tree to code (round 1)
+ *
+ * ***************** Version 10 *****************
+ * User: Jsj Date: 10/02/02 Time: 12:11p
+ * Updated in $/EXE/RefObj/ROEditor
+ * added Delete to popup, and added logic to right mouse button so that it
+ * selects the tree node and modifies the popup menu based on if that node
+ * is colasped or expanded.
+ *
+ * ***************** Version 9 *****************
+ * User: Jsj Date: 10/01/02 Time: 4:50p
+ * Updated in $/EXE/RefObj/ROEditor
+ * added menus and ability to pass in a database path
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:20p
+ * Updated in $/EXE/RefObj/ROEditor
+ * fix minor problems with listing groups without ros
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:57a
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 9/19/02 Time: 10:04a
+ * Updated in $/EXE/RefObj/ROEditor
+ * minor changes during dev
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:16p
+ * Updated in $/EXE/RefObj/ROEditor
+ * vlnxml
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/10/02 Time: 12:55p
+ * Updated in $/EXE/RefObj/ROEditor
+ * menutitle attribute
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 9/05/02 Time: 12:41p
+ * Updated in $/EXE/RefObj/ROEditor
+ * dev
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 8/28/02 Time: 10:58a
+ * Updated in $/EXE/RefObj/ROEditor
+ * development
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 8/23/02 Time: 3:35p
+ * Created in $/EXE/RefObj/ROEditor
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Windows.Forms;
+using System.Data;
+using System.Xml;
+using System.Xml.Schema;
+using System.Text;
+using System.IO;
+using ctlXMLEditLib;
+using RODBInterface;
+using ROFields;
+using Org.Mentalis.Files;
+//using IniFileIO;
+
+
+
+namespace ROEditor
+{
+ ///
+ /// Summary description for Form1.
+ ///
+ ///
+
+ public class Form1 : System.Windows.Forms.Form
+ {
+ private ctlXMLEditLib.ctlXMLEdit ctlXMLEdit2;
+ private RODB myrodb;
+ private string DbConnectPath;
+ private System.ComponentModel.IContainer components;
+ private System.Windows.Forms.Splitter splitter1;
+ private System.Windows.Forms.MainMenu mainMenu1;
+ private System.Windows.Forms.MenuItem menuItem10;
+ private System.Windows.Forms.MenuItem menuNewGroup;
+ private System.Windows.Forms.MenuItem menuEdit;
+ private System.Windows.Forms.MenuItem menuEditCopy;
+ private System.Windows.Forms.MenuItem menuEditCut;
+ private System.Windows.Forms.MenuItem menuEditPaste;
+ private System.Windows.Forms.MenuItem menuTools;
+ private System.Windows.Forms.MenuItem menuToolsROFST;
+ private System.Windows.Forms.MenuItem menuHelp;
+ private System.Windows.Forms.MenuItem menuHelpAbout;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.MenuItem menuRO;
+ private System.Windows.Forms.MenuItem menuRONew;
+ private System.Windows.Forms.MenuItem menuNewRefObj;
+ private System.Windows.Forms.MenuItem menuROEdit;
+ private System.Windows.Forms.MenuItem menuRODelete;
+ private System.Windows.Forms.MenuItem menuROSave;
+ private System.Windows.Forms.MenuItem menuROProperties;
+ private System.Windows.Forms.MenuItem menuROExit;
+ private System.Windows.Forms.MenuItem menuItem1;
+
+ private XmlDocument myroXmlDoc;
+ private VlnXmlElement newone;
+ private TreeNode TreeNewparent;
+ private System.Windows.Forms.MenuItem menuItem3;
+ private System.Windows.Forms.MenuItem menuItem5;
+ private System.Windows.Forms.MenuItem menuEditUndo;
+ private System.Windows.Forms.MenuItem menuEditDelete;
+ private System.Windows.Forms.MenuItem menuEditSelAll;
+ private TreeNode LastSelectedNode;
+ private TextBox CurrentTextBox; // currently selected TextBox field
+ private VlnXmlElement rootXml;
+ private TreeNode rootNode;
+
+ private System.Windows.Forms.ImageList imageListRoTree;
+ private System.Windows.Forms.TreeView roTreeView;
+ private System.Windows.Forms.ListView roListView;
+ private System.Windows.Forms.ToolBar tbar;
+ private bool duplicate_active;
+
+ private const int ROGROUPIMAGE = 0;
+ private System.Windows.Forms.Panel panel2;
+ private const int ROIMAGE = 1;
+
+ private ToolBarButton tbtnSave;
+ private ToolBarButton tbtnRestore;
+ private ToolBarButton tbtnCancel;
+ private ToolBarButton tbtnSaveAs;
+ private ToolBarButton tbtnDuplicate;
+ private System.Windows.Forms.MenuItem menuItem2;
+ private System.Windows.Forms.ImageList imageListToolBar;
+ private ToolBarButton tbtnZoom;
+
+ public Form1(string PassedInPath, string specificro)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ // The data path the was passed in.
+ DbConnectPath = PassedInPath;
+
+ // Setup the context menu
+ MenuItem[] ContextMenuItemList = new MenuItem[6];
+ ContextMenuItemList[0] = new MenuItem("Expand/Collaspe",new EventHandler(roTreeView_ToggleExpandCollapse));
+ ContextMenuItemList[1] = menuRONew.CloneMenu();
+ ContextMenuItemList[2] = menuROEdit.CloneMenu();
+ ContextMenuItemList[3] = menuRODelete.CloneMenu();
+ ContextMenuItemList[4] = menuROSave.CloneMenu();
+ ContextMenuItemList[5] = menuROProperties.CloneMenu();
+
+ ContextMenu treePopupMenu = new ContextMenu(ContextMenuItemList);
+
+ // Add the root to the tree.
+ myrodb = new RODB(DbConnectPath);
+ myroXmlDoc = myrodb.RODB_GetRoot();
+ rootXml = (VlnXmlElement) myroXmlDoc.FirstChild;
+ rootNode = new TreeNode("Referenced Objects",ROGROUPIMAGE,ROGROUPIMAGE);
+ rootNode.Tag = rootXml;
+ roTreeView.Nodes.Add(rootNode);
+ roTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.roTreeView_AfterSelect);
+ roTreeView.DoubleClick += new System.EventHandler(this.roTreeView_OnDoubleClick);
+ roTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.roTreeView_BeforeExpand);
+ roTreeView.Sorted = true;
+ roTreeView.ContextMenu = treePopupMenu;
+ roTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(roTreeView_OnMouseDown);
+
+ // For each group, get its subgroup.
+ bool success = myrodb.RODB_GetRootGroups((VlnXmlElement)myroXmlDoc.FirstChild);
+ if (success == false) this.Close();
+ VlnXmlElement group = (VlnXmlElement) myroXmlDoc.FirstChild.FirstChild;
+ while (group != null)
+ {
+ // Add the top groups to tree control as a node.
+ TreeNode grnode = new TreeNode(CvtFldToUserFld(group.InnerText),ROGROUPIMAGE,ROGROUPIMAGE);
+ grnode.Tag = group;
+ rootNode.Nodes.Add(grnode);
+ string haskids = group.GetAttribute("HasChild");
+
+ if (haskids == "True") // add a 'dummy' node to tree if there are any
+ {
+ TreeNode subch = new TreeNode("VLN_DUMMY_FOR_TREE");
+ subch.Tag = group;
+ grnode.Nodes.Add(subch);
+ }
+ group = (VlnXmlElement) group.NextSibling;
+ }
+ newone = null;
+ rootNode.Expand();
+ duplicate_active = false;
+ if (specificro != null) DoSpecificRO(specificro);
+ }
+
+ private void DoSpecificRO(string specificro)
+ {
+ // if a specific RO was passed in. Load the xml tree from it to the root & then
+ // edit it through the ctlXmledit.
+ // from the input tbl string, get a table name.
+
+ ArrayList levelRecids = new ArrayList();
+ int itbl = System.Convert.ToInt32(specificro.Substring(0,4),16);
+ string stbl = System.Convert.ToString(itbl,10);
+ string pstbl = stbl.PadLeft(6,'0');
+ string tbname = "RO" + pstbl;
+ string recid = specificro.Substring(4,8);
+
+ // read in this element from the table.
+ VlnXmlElement spro;
+ spro = myrodb.RODB_ReadRO(tbname, recid);
+
+ VlnXmlElement parent;
+ string parentid;
+ parentid = spro.GetAttribute("ParentID");
+ string sproParentid = parentid;
+
+ // walk up tree to get the path through the tree.
+ VlnXmlElement child = spro;
+ while (parentid != null && parentid != "00000000")
+ {
+ parent = myrodb.RODB_ReadRO(tbname, parentid);
+ if (parent != null)
+ {
+ parentid = parent.GetAttribute("ParentID");
+ levelRecids.Add(parent.GetAttribute("RecID"));
+ if (parentid == "00000000") break;
+ parent.AppendChild(child);
+ child = parent;
+ }
+ else
+ parentid = null;
+ }
+
+ // Now hook this into the top part of tree by loading data into
+ // xml & hooking it into the tree control.
+ string attrele;
+ string attrspro;
+ TreeNode trnd = rootNode.FirstNode;
+ VlnXmlElement ele;
+ for (int i=levelRecids.Count-1; i>=0; i--)
+ {
+ ele = (VlnXmlElement) trnd.Tag;
+ attrele = ele.GetAttribute((i==levelRecids.Count-1)?"Table":"RecID");
+ if (i==levelRecids.Count-1)
+ attrspro = spro.GetAttribute("Table");
+ else
+ attrspro = (string) levelRecids[i];
+ while (attrele != attrspro)
+ {
+ // get next one.
+ trnd = trnd.NextNode;
+ ele = (VlnXmlElement) trnd.Tag;
+ attrele = ele.GetAttribute((i==levelRecids.Count-1)?"Table":"RecID");
+ }
+ if (trnd == null)
+ {
+ MessageBox.Show("Error editting RO");
+ return;
+ }
+ LoadKids(trnd);
+ trnd = trnd.FirstNode;
+ }
+ // lastly select the active node, this will load up everything we need.
+ if (trnd == null)
+ {
+ MessageBox.Show("Error editting RO");
+ return;
+ }
+ ele = (VlnXmlElement) trnd.Tag;
+ attrele = ele.GetAttribute("RecID");
+ while (attrele != spro.GetAttribute("RecID"))
+ {
+ trnd = trnd.NextNode;
+ ele = (VlnXmlElement) trnd.Tag;
+ attrele = ele.GetAttribute("RecID");
+ }
+ if (trnd == null)
+ {
+ MessageBox.Show("Error editting RO");
+ return;
+ }
+ roTreeView.SelectedNode = trnd;
+
+ }
+
+ protected void roTreeView_AfterSelect (object sender,
+ System.Windows.Forms.TreeViewEventArgs e)
+ {
+ // if the same node was selected, don't do anything.
+ if (LastSelectedNode != null && LastSelectedNode.Equals(roTreeView.SelectedNode)) return;
+
+ TreeNode CurrentNode = roTreeView.SelectedNode;
+ if (LastSelectedNode == null)
+ LastSelectedNode = CurrentNode;
+ if (CurrentNode != null)
+ {
+ if (!LastSelectedNode.Equals(CurrentNode))
+ {
+ int retval = roTreeView_ClearEditDisplay(false);
+ if (retval == -1) // cancel
+ {
+ roTreeView.SelectedNode = LastSelectedNode;
+
+ return;
+ }
+ LastSelectedNode = CurrentNode;
+ }
+
+ // if selected to make new, but didn't add any data, remove it.
+ if (newone!=null)
+ {
+ XmlNode parent = newone.ParentNode;
+ parent.RemoveChild(newone);
+ newone=null;
+ }
+
+ /* enable/disable menu items */
+
+ // Enable the Save item if changes were made
+ // Just copy the state of the Save Button
+ menuROSave.Enabled = tbtnSave.Enabled;
+ roTreeView.ContextMenu.MenuItems[4].Enabled = tbtnSave.Enabled;
+
+ // Should the properties menu item be available?
+ VlnXmlElement curelem = (VlnXmlElement) CurrentNode.Tag;
+ if (curelem.Name == "vlnGroup")
+ menuROProperties.Enabled = true;
+ else
+ menuROProperties.Enabled = false;
+
+ // Should the delete menu item be available, i.e. at top node, NO!
+ if (curelem.Name == "RO_Root")
+ {
+ menuRODelete.Enabled = false;
+ menuNewRefObj.Enabled = false;
+ }
+ else
+ {
+ menuRODelete.Enabled = true;
+ menuNewRefObj.Enabled = true;
+ }
+
+ // Is there field text to edit?
+ // yes if current node is either a subgroup or ro value node
+ menuROEdit.Enabled = roTreeView_IsSubgroupOrRO();
+ LoadKids(CurrentNode);
+ if (curelem.Name != "RO_Root" && curelem.Name != "vlnGroup")
+ EditRO(curelem);
+ else
+ updateRoListView(CurrentNode);
+ }
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private string CvtFldToUserFld(string fldname)
+ {
+ string tmpstr0;
+ if (fldname.Length < 2) return fldname;
+ // an xml element name cannot begin with a digit. we had prepended a "__"
+ if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
+ tmpstr0 = fldname.Substring(2,fldname.Length-2);
+ else
+ tmpstr0 = fldname;
+ // an xml element name cannot have a space, we converted to a "__"
+ string tmpstr = tmpstr0.Replace("__"," ");
+ int len = tmpstr.Length;
+ int cur = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval, indx;
+ if (tmpstr.Length <6)
+ indx = -1;
+ else
+ indx=tmpstr.IndexOf(OKpunch,cur);
+ string asc_spchar;
+ while (indx>=0)
+ {
+ outstr += tmpstr.Substring(cur,indx-cur);
+ asc_spchar = tmpstr.Substring(indx+3,3);
+ decval = System.Convert.ToInt16(asc_spchar,10);
+ outstr += System.Convert.ToChar(decval).ToString();
+ cur = indx+6;
+ if (cur+6 > len)
+ indx = -1;
+ else
+ indx = tmpstr.IndexOf(OKpunch,cur);
+ }
+ if (cur 0)
+ {
+ if (CurrentNode.IsExpanded)
+ roTreeView.ContextMenu.MenuItems[0].Text = "Collapse";
+ else
+ roTreeView.ContextMenu.MenuItems[0].Text = "Expand";
+ roTreeView.ContextMenu.MenuItems[0].Enabled = true;
+ }
+ else
+ {
+ roTreeView.ContextMenu.MenuItems[0].Text = "Expand/Collapse";
+ roTreeView.ContextMenu.MenuItems[0].Enabled = false;
+ }
+
+
+ // Should the save option be available?
+ // Just reflect the Save button state.
+ roTreeView.ContextMenu.MenuItems[4].Enabled = tbtnSave.Enabled;
+ menuROSave.Enabled = tbtnSave.Enabled;
+
+ // Should the properties menu item be available?
+ VlnXmlElement curelem = (VlnXmlElement) CurrentNode.Tag;
+ if (curelem.Name == "vlnGroup")
+ roTreeView.ContextMenu.MenuItems[5].Enabled = true;
+ else
+ roTreeView.ContextMenu.MenuItems[5].Enabled = false;
+
+ // should delete menu item be available, i.e. top node NO!
+ if (curelem.Name == "RO_Root")
+ {
+ roTreeView.ContextMenu.MenuItems[3].Enabled = false;
+ roTreeView.ContextMenu.MenuItems[1].MenuItems[1].Enabled = false;
+ }
+ else
+ {
+ roTreeView.ContextMenu.MenuItems[3].Enabled = true;
+ roTreeView.ContextMenu.MenuItems[1].MenuItems[1].Enabled = true;
+ }
+
+ // Is there field text to edit?
+ // yes if current node is either a subgroup or ro value node
+ roTreeView.ContextMenu.MenuItems[2].Enabled = roTreeView_IsSubgroupOrRO();
+ }
+ }
+ }
+
+ /*
+ * return true if current tree node is a either a subgroup or a RO
+ */
+ protected bool roTreeView_IsSubgroupOrRO()
+ {
+ bool rtnval = false;
+ TreeNode CurrentNode = roTreeView.SelectedNode;
+ VlnXmlElement curelem = (VlnXmlElement) CurrentNode.Tag;
+ if (curelem.Name != "RO_Root")
+ {
+ if (curelem.Name == "vlnGroup")
+ {
+ TreeNode PNode = CurrentNode.Parent;
+ VlnXmlElement pelem = (VlnXmlElement) PNode.Tag;
+ rtnval = (pelem.Name == "vlnGroup");
+ }
+ else
+ rtnval = true;
+ }
+ return rtnval;
+ }
+ /*
+ * Clear the edit display (panel on the right side)
+ */
+ protected int roTreeView_ClearEditDisplay(bool cancel)
+ {
+ if (ctlXMLEdit2 != null)
+ {
+ if (cancel != true)
+ {
+ // first see if there is changes to data, if so, then prompt to see if
+ // user wants to continue.
+ bool chgdata = ctlXMLEdit2.DataChanged();
+ if (chgdata == true)
+ {
+ DialogResult dr = MessageBox.Show("Do you want to save your changes?","Warning:",MessageBoxButtons.YesNoCancel);
+ if (dr == DialogResult.Yes)
+ {
+ TreeNode tr=null;
+ bool ok = SaveRO(ref tr); // savero needs a tree node
+ if (ok == false) return -1;
+ }
+ else if (dr == DialogResult.Cancel)
+ return -1;
+ }
+ }
+ ctlXMLEdit2.Dispose();
+ this.panel2.Controls.Remove(ctlXMLEdit2);
+ this.panel2.Visible = false;
+ tbtnSave.Enabled = false;
+ menuROSave.Enabled = tbtnSave.Enabled;
+ tbtnRestore.Enabled = false;
+ tbtnSaveAs.Enabled = false;
+ tbtnDuplicate.Enabled = false;
+ tbtnZoom.Enabled = false;
+ tbtnZoom.Text = "Zoom";
+ ctlXMLEdit2 = null;
+ }
+ // The current text box no longer has focus.
+ CurrentTextBox = null;
+ tbtnCancel.Enabled = false;
+ roTreeView_ResetEditMenu();
+ duplicate_active = false;
+ return 0;
+ }
+
+ protected void roListView_ClearListDisplay()
+ {
+ if (roListView != null)
+ {
+ roListView.Dispose();
+ this.panel1.Controls.Remove(roListView);
+ roListView=null;
+ }
+ }
+
+ private void CreateCtlXmlEdit2(VlnXmlElement curelem, XmlSchema myschema, ArrayList reqfields)
+ {
+ ctlXMLEdit2 = new ctlXMLEditLib.ctlXMLEdit(curelem,myschema,reqfields);
+ ctlXMLEdit2.AutoScroll = true;
+ ctlXMLEdit2.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ ctlXMLEdit2.Name = "ctlXMLEdit2";
+ ctlXMLEdit2.Size = new System.Drawing.Size(ctlXMLEdit2.GetMaxWidth(),ctlXMLEdit2.GetMaxLength());
+ this.panel2.Visible = true;
+ this.panel2.Size = new System.Drawing.Size(ctlXMLEdit2.GetMaxWidth()+20,ctlXMLEdit2.GetMaxLength()+10);
+ this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ ctlXMLEdit2.TabIndex = 4;
+ ctlXMLEdit2.Tag = "";
+ /*
+ * Spin through all of the controls and assign an event handler
+ * for changed text so that when the user changes any of the RO Text,
+ * the Save button will become enabled
+ */
+ System.Collections.IEnumerator ctlEnumerator = ctlXMLEdit2.Controls.GetEnumerator();
+ while (ctlEnumerator.MoveNext())
+ {
+ Control TmpInfo;
+ TmpInfo = (Control)ctlEnumerator.Current;
+ if (TmpInfo is GroupBox)
+ {
+ System.Collections.IEnumerator ctlGroup = TmpInfo.Controls.GetEnumerator();;
+ while(ctlGroup.MoveNext())
+ {
+ Control tmpradio = (Control) ctlGroup.Current;
+ tmpradio.Click += new EventHandler(ctlXMLEdit2_ClickControl);
+ }
+ }
+ else
+ {
+ TmpInfo.TextChanged += new EventHandler(ctlXMLEdit2_TextChanged);
+ TmpInfo.Click += new EventHandler(ctlXMLEdit2_ClickControl);
+ }
+ }
+ this.panel2.Controls.Add(ctlXMLEdit2);
+ tbtnCancel.Enabled = true;
+ }
+
+ private void EditRO(VlnXmlElement curelem)
+ {
+ newone=null;
+ // can't edit fields for top or top group nodes (top node not editable,
+ // and top group node data change at properties level).
+ if (curelem.Name == "RO_Root" || curelem.ParentNode.Name == "RO_Root") return;
+
+ int retval = roTreeView_ClearEditDisplay(false);
+ if (retval == -1) return;
+ roListView_ClearListDisplay();
+
+ XmlSchema myschema;
+ // If no schema exists, then the definition of the item may not be complete - give
+ // a message. (B2004-017)
+ if (curelem.Name != "vlnGroup")
+ {
+ myschema = myrodb.RODB_GetSchema(curelem);
+ if (myschema==null)
+ {
+ MessageBox.Show("RO Definition does not exist, check RO Definition under Properties for the Group that contains this RO.");
+ return;
+ }
+ }
+ else
+ {
+ myschema = myrodb.RODB_GetGroupSchema(curelem);
+ if (myschema==null)
+ {
+ MessageBox.Show("Subgroup Definition does not exist, check Subgroup Definition under Properties for the Group that contains this Subgroup.");
+ return;
+ }
+ }
+
+ ArrayList reqfields = curelem.GetRequiredFields();
+ CreateCtlXmlEdit2(curelem,myschema,reqfields);
+ this.panel2.Controls.Add(ctlXMLEdit2);
+ tbtnSave.Enabled=false; // set initial states of buttons on edit
+ tbtnRestore.Enabled=false;
+ tbtnCancel.Enabled=true;
+ tbtnSaveAs.Enabled=false;
+ tbtnDuplicate.Enabled=true;
+ tbtnZoom.Enabled = false;
+ ctlXMLEdit2.Focus();
+ }
+ protected void roTreeView_OnDoubleClick (object sender, System.EventArgs e)
+ {
+ VlnXmlElement curelem = (VlnXmlElement) roTreeView.SelectedNode.Tag;
+ EditRO(curelem);
+ }
+
+ protected void roTreeView_ResetEditMenu ()
+ {
+ this.menuEditCopy.Enabled = false;
+ this.menuEditCut.Enabled = false;
+ this.menuEditPaste.Enabled = false;
+ this.menuEditDelete.Enabled = false;
+ this.menuEditSelAll.Enabled = false;
+ this.menuEditUndo.Enabled = false;
+ }
+
+
+ protected void ctlXMLEdit2_ClickControl(object sender, EventArgs e)
+ {
+ TextBox tmpTxtbx = new TextBox();
+ CurrentTextBox = null;
+
+ roTreeView_ResetEditMenu();
+
+ if (sender.GetType() == tmpTxtbx.GetType())
+ {
+ tmpTxtbx = (TextBox)sender;
+ CurrentTextBox = tmpTxtbx; // the text box currently selected
+
+ if (CurrentTextBox.Multiline)
+ {
+ tbtnZoom.Text = "Zoom";
+ tbtnZoom.Enabled = true;
+ }
+ else if (CurrentTextBox == ctlXMLEdit2.GetGraphicsFiletextbox() && CurrentTextBox.Text != null && CurrentTextBox.Text != "")
+ {
+ tbtnZoom.Enabled = true;
+ tbtnZoom.Text = "View Image";
+ }
+ else
+ {
+ tbtnZoom.Text = "Zoom";
+ tbtnZoom.Enabled = false;
+ }
+
+ if (tmpTxtbx.CanUndo)
+ this.menuEditUndo.Enabled = true;
+
+ if (tmpTxtbx.TextLength != tmpTxtbx.SelectionLength)
+ {
+ this.menuEditSelAll.Enabled = true;
+ }
+
+ if (tmpTxtbx.SelectionLength > 0)
+ {
+ this.menuEditDelete.Enabled = true;
+ this.menuEditCopy.Enabled = true;
+ this.menuEditCut.Enabled = true;
+ }
+ object dataobj = System.Windows.Forms.Clipboard.GetDataObject();
+ if (dataobj != null)
+ this.menuEditPaste.Enabled=true;
+ }
+ else if (sender is RadioButton)
+ {
+ tbtnCancel.Enabled = true;
+ tbtnSave.Enabled = true;
+ tbtnRestore.Enabled = true;
+ tbtnSaveAs.Enabled = true;
+ }
+ menuROSave.Enabled = tbtnSave.Enabled;
+ }
+
+
+ protected void ctlXMLEdit2_TextChanged(object sender, EventArgs e)
+ {
+ if (CurrentTextBox != null)
+ {
+ this.menuEditUndo.Enabled = true;
+ this.menuEditSelAll.Enabled = (CurrentTextBox.TextLength > 0);
+ }
+
+ tbtnSave.Enabled = true;
+ tbtnRestore.Enabled = true;
+ tbtnSaveAs.Enabled = true;
+ tbtnCancel.Enabled = true;
+ menuROSave.Enabled = tbtnSave.Enabled;
+ }
+
+ private void LoadKids(TreeNode enode)
+ {
+ VlnXmlElement elem;
+ elem = (VlnXmlElement)enode.Tag;
+ string haskids;
+ string kidsloaded;
+ haskids = elem.GetAttribute("HasChild");
+ kidsloaded = elem.GetAttribute("ChildLoaded");
+ if (haskids == "True" && kidsloaded == "False" )
+ {
+ // if there's a dummy tree node (used to have tree control expansion for
+ // items not yet loaded, delete child in tree control)
+ XmlNode tmpnode = (XmlNode) elem;
+ XmlNode chldnode;
+ VlnXmlElement echild;
+ if (enode.FirstNode.Text == "VLN_DUMMY_FOR_TREE") enode.FirstNode.Remove();
+ Cursor.Current = Cursors.WaitCursor;
+ myrodb.RODB_GetChildData(elem,true);
+ chldnode = tmpnode.FirstChild;
+ while (chldnode != null)
+ {
+ if (chldnode is VlnXmlElement)
+ {
+ echild = (VlnXmlElement) chldnode;
+ TreeNode chldnd;
+ if (echild.Name == "vlnGroup")
+ {
+ chldnd = new TreeNode(echild.GetAttribute("MenuTitle"),ROGROUPIMAGE,ROGROUPIMAGE);
+ chldnd.Tag = echild;
+ enode.Nodes.Add(chldnd);
+ // add a 'dummy' node to tree if there are any children
+ string haskids1="False";
+ string kidsloaded1="False";
+ if (echild.HasAttribute("HasChild")==true)
+ haskids1 = echild.GetAttribute("HasChild");
+ if (echild.HasAttribute("ChildLoaded")==true)
+ kidsloaded1 = echild.GetAttribute("ChildLoaded");
+ if (haskids1=="True" && kidsloaded1=="False")
+ {
+ TreeNode subch = new TreeNode("VLN_DUMMY_FOR_TREE");
+ chldnd.Nodes.Add(subch);
+ }
+ }
+ else
+ {
+ // If this is a group defintion subtree it will only have one
+ // child, which is the text definition for the subgroup. Don't
+ // include these in the tree.
+ int levelcnt = chldnode.ChildNodes.Count;
+ string TheMenuTitle = echild.GetAttribute("MenuTitle");
+ if (levelcnt>=1 && !TheMenuTitle.Equals(""))
+ {
+ chldnd = new TreeNode(TheMenuTitle,ROIMAGE,ROIMAGE);
+ chldnd.Tag = echild;
+ enode.Nodes.Add(chldnd);
+ }
+ }
+ }
+ chldnode = chldnode.NextSibling;
+ }
+ Cursor.Current = Cursors.Default;
+ }
+ }
+
+ protected void roTreeView_BeforeExpand(object sender,
+ System.Windows.Forms.TreeViewCancelEventArgs e)
+ {
+ LoadKids(e.Node);
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if (components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the co`de editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
+ this.imageListRoTree = new System.Windows.Forms.ImageList(this.components);
+ this.splitter1 = new System.Windows.Forms.Splitter();
+ this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components);
+ this.menuRO = new System.Windows.Forms.MenuItem();
+ this.menuRONew = new System.Windows.Forms.MenuItem();
+ this.menuNewGroup = new System.Windows.Forms.MenuItem();
+ this.menuNewRefObj = new System.Windows.Forms.MenuItem();
+ this.menuItem1 = new System.Windows.Forms.MenuItem();
+ this.menuROEdit = new System.Windows.Forms.MenuItem();
+ this.menuRODelete = new System.Windows.Forms.MenuItem();
+ this.menuROSave = new System.Windows.Forms.MenuItem();
+ this.menuROProperties = new System.Windows.Forms.MenuItem();
+ this.menuItem10 = new System.Windows.Forms.MenuItem();
+ this.menuROExit = new System.Windows.Forms.MenuItem();
+ this.menuEdit = new System.Windows.Forms.MenuItem();
+ this.menuEditUndo = new System.Windows.Forms.MenuItem();
+ this.menuItem3 = new System.Windows.Forms.MenuItem();
+ this.menuEditCut = new System.Windows.Forms.MenuItem();
+ this.menuEditCopy = new System.Windows.Forms.MenuItem();
+ this.menuEditPaste = new System.Windows.Forms.MenuItem();
+ this.menuEditDelete = new System.Windows.Forms.MenuItem();
+ this.menuItem5 = new System.Windows.Forms.MenuItem();
+ this.menuEditSelAll = new System.Windows.Forms.MenuItem();
+ this.menuTools = new System.Windows.Forms.MenuItem();
+ this.menuToolsROFST = new System.Windows.Forms.MenuItem();
+ this.menuHelp = new System.Windows.Forms.MenuItem();
+ this.menuHelpAbout = new System.Windows.Forms.MenuItem();
+ this.menuItem2 = new System.Windows.Forms.MenuItem();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.roTreeView = new System.Windows.Forms.TreeView();
+ this.tbar = new System.Windows.Forms.ToolBar();
+ this.tbtnSave = new System.Windows.Forms.ToolBarButton();
+ this.tbtnCancel = new System.Windows.Forms.ToolBarButton();
+ this.tbtnRestore = new System.Windows.Forms.ToolBarButton();
+ this.tbtnSaveAs = new System.Windows.Forms.ToolBarButton();
+ this.tbtnDuplicate = new System.Windows.Forms.ToolBarButton();
+ this.tbtnZoom = new System.Windows.Forms.ToolBarButton();
+ this.imageListToolBar = new System.Windows.Forms.ImageList(this.components);
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // imageListRoTree
+ //
+ this.imageListRoTree.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListRoTree.ImageStream")));
+ this.imageListRoTree.TransparentColor = System.Drawing.Color.Transparent;
+ this.imageListRoTree.Images.SetKeyName(0, "");
+ this.imageListRoTree.Images.SetKeyName(1, "");
+ //
+ // splitter1
+ //
+ this.splitter1.Location = new System.Drawing.Point(264, 31);
+ this.splitter1.Name = "splitter1";
+ this.splitter1.Size = new System.Drawing.Size(10, 588);
+ this.splitter1.TabIndex = 4;
+ this.splitter1.TabStop = false;
+ //
+ // mainMenu1
+ //
+ this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+ this.menuRO,
+ this.menuEdit,
+ this.menuTools,
+ this.menuHelp,
+ this.menuItem2});
+ //
+ // menuRO
+ //
+ this.menuRO.Index = 0;
+ this.menuRO.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+ this.menuRONew,
+ this.menuItem1,
+ this.menuROEdit,
+ this.menuRODelete,
+ this.menuROSave,
+ this.menuROProperties,
+ this.menuItem10,
+ this.menuROExit});
+ this.menuRO.Text = "RO";
+ //
+ // menuRONew
+ //
+ this.menuRONew.Index = 0;
+ this.menuRONew.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+ this.menuNewGroup,
+ this.menuNewRefObj});
+ this.menuRONew.Text = "New ...";
+ //
+ // menuNewGroup
+ //
+ this.menuNewGroup.Index = 0;
+ this.menuNewGroup.Text = "Group";
+ this.menuNewGroup.Click += new System.EventHandler(this.menuNewGroup_Click);
+ //
+ // menuNewRefObj
+ //
+ this.menuNewRefObj.Index = 1;
+ this.menuNewRefObj.Text = "Referenced Object";
+ this.menuNewRefObj.Click += new System.EventHandler(this.menuNewRefObj_Click);
+ //
+ // menuItem1
+ //
+ this.menuItem1.Index = 1;
+ this.menuItem1.Text = "-";
+ //
+ // menuROEdit
+ //
+ this.menuROEdit.Enabled = false;
+ this.menuROEdit.Index = 2;
+ this.menuROEdit.Text = "Edit";
+ this.menuROEdit.Click += new System.EventHandler(this.menuROEdit_Click);
+ //
+ // menuRODelete
+ //
+ this.menuRODelete.Index = 3;
+ this.menuRODelete.Text = "Delete";
+ this.menuRODelete.Click += new System.EventHandler(this.menuRODelete_Click);
+ //
+ // menuROSave
+ //
+ this.menuROSave.Enabled = false;
+ this.menuROSave.Index = 4;
+ this.menuROSave.Text = "Save";
+ this.menuROSave.Click += new System.EventHandler(this.menuROSave_Click);
+ //
+ // menuROProperties
+ //
+ this.menuROProperties.Index = 5;
+ this.menuROProperties.Text = "Properties";
+ this.menuROProperties.Click += new System.EventHandler(this.menuROProperties_Click);
+ //
+ // menuItem10
+ //
+ this.menuItem10.Index = 6;
+ this.menuItem10.Text = "-";
+ //
+ // menuROExit
+ //
+ this.menuROExit.Index = 7;
+ this.menuROExit.Text = "Exit RO Editor";
+ this.menuROExit.Click += new System.EventHandler(this.menuROExit_Click);
+ //
+ // menuEdit
+ //
+ this.menuEdit.Index = 1;
+ this.menuEdit.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+ this.menuEditUndo,
+ this.menuItem3,
+ this.menuEditCut,
+ this.menuEditCopy,
+ this.menuEditPaste,
+ this.menuEditDelete,
+ this.menuItem5,
+ this.menuEditSelAll});
+ this.menuEdit.Text = "Edit";
+ //
+ // menuEditUndo
+ //
+ this.menuEditUndo.Enabled = false;
+ this.menuEditUndo.Index = 0;
+ this.menuEditUndo.Text = "&Undo";
+ this.menuEditUndo.Click += new System.EventHandler(this.menuEditUndo_Click);
+ //
+ // menuItem3
+ //
+ this.menuItem3.Index = 1;
+ this.menuItem3.Text = "-";
+ //
+ // menuEditCut
+ //
+ this.menuEditCut.Enabled = false;
+ this.menuEditCut.Index = 2;
+ this.menuEditCut.Text = "Cu&t";
+ this.menuEditCut.Click += new System.EventHandler(this.menuEditCut_Click);
+ //
+ // menuEditCopy
+ //
+ this.menuEditCopy.Enabled = false;
+ this.menuEditCopy.Index = 3;
+ this.menuEditCopy.Text = "&Copy";
+ this.menuEditCopy.Click += new System.EventHandler(this.menuEditCopy_Click);
+ //
+ // menuEditPaste
+ //
+ this.menuEditPaste.Enabled = false;
+ this.menuEditPaste.Index = 4;
+ this.menuEditPaste.Text = "&Paste";
+ this.menuEditPaste.Click += new System.EventHandler(this.menuEditPaste_Click);
+ //
+ // menuEditDelete
+ //
+ this.menuEditDelete.Enabled = false;
+ this.menuEditDelete.Index = 5;
+ this.menuEditDelete.Text = "&Delete";
+ this.menuEditDelete.Click += new System.EventHandler(this.menuEditDelete_Click);
+ //
+ // menuItem5
+ //
+ this.menuItem5.Index = 6;
+ this.menuItem5.Text = "-";
+ //
+ // menuEditSelAll
+ //
+ this.menuEditSelAll.Enabled = false;
+ this.menuEditSelAll.Index = 7;
+ this.menuEditSelAll.Text = "Select &All";
+ this.menuEditSelAll.Click += new System.EventHandler(this.menuEditSelAll_Click);
+ //
+ // menuTools
+ //
+ this.menuTools.Index = 2;
+ this.menuTools.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+ this.menuToolsROFST});
+ this.menuTools.Text = "Tools";
+ //
+ // menuToolsROFST
+ //
+ this.menuToolsROFST.Index = 0;
+ this.menuToolsROFST.Text = "Create RO.FST";
+ this.menuToolsROFST.Click += new System.EventHandler(this.menuToolsROFST_Click);
+ //
+ // menuHelp
+ //
+ this.menuHelp.Index = 3;
+ this.menuHelp.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+ this.menuHelpAbout});
+ this.menuHelp.Text = "Help";
+ //
+ // menuHelpAbout
+ //
+ this.menuHelpAbout.Index = 0;
+ this.menuHelpAbout.Text = "About";
+ this.menuHelpAbout.Click += new System.EventHandler(this.menuHelpAbout_Click);
+ //
+ // menuItem2
+ //
+ this.menuItem2.Index = 4;
+ this.menuItem2.Text = "";
+ //
+ // panel1
+ //
+ this.panel1.AutoScroll = true;
+ this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.panel1.Controls.Add(this.panel2);
+ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panel1.Location = new System.Drawing.Point(274, 31);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(542, 588);
+ this.panel1.TabIndex = 5;
+ //
+ // panel2
+ //
+ this.panel2.AutoScroll = true;
+ this.panel2.Location = new System.Drawing.Point(0, 0);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(282, 136);
+ this.panel2.TabIndex = 0;
+ this.panel2.Visible = false;
+ //
+ // roTreeView
+ //
+ this.roTreeView.Dock = System.Windows.Forms.DockStyle.Left;
+ this.roTreeView.Font = new System.Drawing.Font("Arial", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.roTreeView.ImageIndex = 0;
+ this.roTreeView.ImageList = this.imageListRoTree;
+ this.roTreeView.ItemHeight = 18;
+ this.roTreeView.Location = new System.Drawing.Point(0, 31);
+ this.roTreeView.Name = "roTreeView";
+ this.roTreeView.SelectedImageIndex = 0;
+ this.roTreeView.Size = new System.Drawing.Size(264, 588);
+ this.roTreeView.TabIndex = 3;
+ this.roTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.roTreeView_AfterSelect_1);
+ //
+ // tbar
+ //
+ this.tbar.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {
+ this.tbtnSave,
+ this.tbtnCancel,
+ this.tbtnRestore,
+ this.tbtnSaveAs,
+ this.tbtnDuplicate,
+ this.tbtnZoom});
+ this.tbar.DropDownArrows = true;
+ this.tbar.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tbar.ImageList = this.imageListToolBar;
+ this.tbar.Location = new System.Drawing.Point(0, 0);
+ this.tbar.Name = "tbar";
+ this.tbar.ShowToolTips = true;
+ this.tbar.Size = new System.Drawing.Size(816, 31);
+ this.tbar.TabIndex = 0;
+ this.tbar.TextAlign = System.Windows.Forms.ToolBarTextAlign.Right;
+ this.tbar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tbar_OnClick);
+ //
+ // tbtnSave
+ //
+ this.tbtnSave.Enabled = false;
+ this.tbtnSave.ImageIndex = 0;
+ this.tbtnSave.Name = "tbtnSave";
+ this.tbtnSave.Text = "Save";
+ //
+ // tbtnCancel
+ //
+ this.tbtnCancel.Enabled = false;
+ this.tbtnCancel.ImageIndex = 1;
+ this.tbtnCancel.Name = "tbtnCancel";
+ this.tbtnCancel.Text = "Cancel";
+ //
+ // tbtnRestore
+ //
+ this.tbtnRestore.Enabled = false;
+ this.tbtnRestore.ImageIndex = 2;
+ this.tbtnRestore.Name = "tbtnRestore";
+ this.tbtnRestore.Text = "Restore";
+ //
+ // tbtnSaveAs
+ //
+ this.tbtnSaveAs.Enabled = false;
+ this.tbtnSaveAs.ImageIndex = 3;
+ this.tbtnSaveAs.Name = "tbtnSaveAs";
+ this.tbtnSaveAs.Text = "Save As";
+ //
+ // tbtnDuplicate
+ //
+ this.tbtnDuplicate.Enabled = false;
+ this.tbtnDuplicate.ImageIndex = 4;
+ this.tbtnDuplicate.Name = "tbtnDuplicate";
+ this.tbtnDuplicate.Text = "Duplicate";
+ //
+ // tbtnZoom
+ //
+ this.tbtnZoom.Enabled = false;
+ this.tbtnZoom.ImageIndex = 5;
+ this.tbtnZoom.Name = "tbtnZoom";
+ this.tbtnZoom.Text = "Zoom";
+ //
+ // imageListToolBar
+ //
+ this.imageListToolBar.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListToolBar.ImageStream")));
+ this.imageListToolBar.TransparentColor = System.Drawing.Color.Transparent;
+ this.imageListToolBar.Images.SetKeyName(0, "");
+ this.imageListToolBar.Images.SetKeyName(1, "");
+ this.imageListToolBar.Images.SetKeyName(2, "");
+ this.imageListToolBar.Images.SetKeyName(3, "");
+ this.imageListToolBar.Images.SetKeyName(4, "");
+ this.imageListToolBar.Images.SetKeyName(5, "");
+ //
+ // Form1
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(816, 619);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.splitter1);
+ this.Controls.Add(this.roTreeView);
+ this.Controls.Add(this.tbar);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Menu = this.mainMenu1;
+ this.Name = "Form1";
+ this.Text = "RO Edit";
+ this.panel1.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+ #endregion
+
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main(string[] args)
+ {
+ bool StartupROEditor = true;
+ FileStream fsown=null;
+ FileInfo fiown=null;
+ String specificro = null;
+ string ConnectionPath = "";
+ // Let's open the database & set up for the tree structure...
+
+ // if an RO directory path was passed in, then change the
+ // current working directory to it.
+ // this path will also be used to generate a connection string
+ // the the Access database.
+ if (args.Length > 0)
+ {
+ ConnectionPath = args[0];
+// Directory.SetCurrentDirectory(ConnectionPath);
+ }
+ else // find ROPATH
+ {
+ ConnectionPath = FindTheRODirectory();
+ }
+ if (args.Length > 1)
+ specificro = args[1];
+ try
+ {
+ // Convert the RO data if needed
+ if (!CheckForDataConversion(ConnectionPath))
+ ConnectionPath = null; // force exit
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error on check for data conversion");
+ // Application.Exit();
+ }
+ // Process the given RO Path
+ if (ConnectionPath == null)
+ {
+ // no RO directory
+ MessageBox.Show("Could not locate a Referenced Objects (RO) directory.\n\nIt should be inside your VExxx directory or at the same level as your VExxx directory.","RO Editor");
+ StartupROEditor = false;
+ }
+ else if (ConnectionPath.Equals(""))
+ {
+ // already in RO directory
+ ConnectionPath = Directory.GetCurrentDirectory();
+ }
+ else
+ {
+ // Change to the RO Directory
+ try
+ {
+ Directory.SetCurrentDirectory(ConnectionPath);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, e.GetType().ToString());
+ }
+ }
+
+ if (StartupROEditor)
+ {
+ // open an existing file, or create a new one
+ try
+ {
+ fiown = new FileInfo("RoEditor.own");
+ }
+ catch(Exception e)
+ {
+ MessageBox.Show(e.Message,"fileinfo");
+ }
+ // Open the file just specified. Open it so that no-one else can use it
+ try
+ {
+ fsown = fiown.Open( FileMode.Create, FileAccess.ReadWrite, FileShare.None );
+ }
+ catch (IOException)
+ {
+ MessageBox.Show("Another user is executing the RoEditor");
+ return;
+ }
+
+ // If there isn't a RO database file, ask user if we should create an empty one.
+ if (!File.Exists("ROMaster.mdb") && !UsingSQLServer(Directory.GetCurrentDirectory()))
+ {
+ DialogResult AnswerYN;
+ string msgstr = "The RO directory (" + Directory.GetCurrentDirectory() +") is empty.\n\n Create an empty RO database?";
+ AnswerYN = MessageBox.Show(msgstr,"RO Editor",MessageBoxButtons.YesNo);
+ if (AnswerYN == DialogResult.Yes)
+ {
+ string SourceRODatabase = Application.StartupPath + "\\ROMaster.mdb";
+ string DestRODatabase = Directory.GetCurrentDirectory() + "\\ROMaster.mdb";
+ File.Copy(SourceRODatabase,DestRODatabase);
+ }
+ else
+ StartupROEditor = false;
+ }
+ }
+
+ if (StartupROEditor)
+ {
+ Application.Run(new Form1(ConnectionPath,specificro));
+
+ if (fsown != null)
+ {
+ fsown.Close();
+ fiown.Delete();
+ }
+ Application.Exit();
+ }
+ }
+
+ /*
+ * Look for the RO directory via PROC.INI and by
+ * looking for a \RO directory in the current VEplant
+ * directory and at the same level as VEplant
+ */
+ static string FindTheRODirectory()
+ {
+ string RtnStr = "";
+ string CurDir = Directory.GetCurrentDirectory();
+ CurDir = CurDir.ToUpper();
+ bool InProcdureDir = false;
+
+ // are we in the RO directory?
+ if (!CurDir.EndsWith("\\RO")) //not in RO directory
+ {
+ if (File.Exists("PROC.INI")) // Get the ROPATH from the PROC.INI file if possible
+ {
+ InProcdureDir = true;
+ IniReader ini = new IniReader("PROC.INI");
+ RtnStr = ini.ReadString("RO Defaults","ROPATH","");
+ }
+ if (RtnStr.Equals("")) // no ROPATH specified
+ {
+ RtnStr = "..\\RO"; // check default location
+ if (!Directory.Exists(RtnStr))
+ {
+ // Check for Global ROs (at the same directory level as the VEplant directory)
+ if (CurDir.EndsWith("TMPCHG")) // handle temporary change directory
+ {
+ InProcdureDir = false;
+ RtnStr = "..\\..\\..\\..\\RO";
+ }
+ else // Check for Global RO, assume we are in PROCS or .PRC directory
+ RtnStr = "..\\..\\RO";
+ if (!Directory.Exists(RtnStr) && InProcdureDir)
+ {
+ // Could not find RO directory.
+ // Instruct the user to create one.
+ DialogResult AnswerYN;
+ int idx = CurDir.LastIndexOf("\\");
+ RtnStr = CurDir.Substring(0,idx+1) + "RO"; // default location
+ string msgstr = "A RO directory (folder) does not exist.\n\n Create a RO directory in the default location (" + RtnStr + ")?";
+ AnswerYN = MessageBox.Show(msgstr,"RO Editor",MessageBoxButtons.YesNo);
+ if (AnswerYN == DialogResult.Yes)
+ {
+ Directory.CreateDirectory(RtnStr);
+ }
+ else
+ RtnStr = null;
+ }
+ else RtnStr = null;
+ }
+ }
+ }
+ return RtnStr;
+ }
+
+ static bool UsingSQLServer(string ROdir)
+ {
+ bool Rtn = false;
+ string RtnStr;
+ string ROiniPath = ROdir + "\\ROAPP.INI";
+ IniReader ini = new IniReader(ROiniPath);
+ RtnStr = ini.ReadString("Database Server","Path","");
+ if (RtnStr.Length > 1)
+ Rtn = true;
+ return Rtn;
+ }
+
+ static bool CheckForDataConversion(string ROdir)
+ {
+ bool Rtn = true;
+ // Check to see if we need to convert Old RO data
+ if (ROdir != null)
+ {
+ string testParadoxFile = ROdir;
+ string testAccessFile = ROdir;
+ if (!ROdir.Equals(""))
+ {
+ testParadoxFile += "\\";
+ testAccessFile += "\\";
+ }
+
+ testParadoxFile += "ROMASTER.DB"; // Paradox file
+ testAccessFile += "ROMaster.mdb"; // Access file
+// if (File.Exists(testParadoxFile))
+ if (File.Exists(testParadoxFile) && !(File.Exists(testAccessFile) || UsingSQLServer(ROdir)))
+ {
+ // Display a message to the user that the data needs converted
+ DialogResult AnswerYN;
+ AnswerYN = MessageBox.Show("The RO data needs to be converted for the New RO Editor.\n\n Proceed with the data conversion?","RO Editor",MessageBoxButtons.YesNo);
+ if (AnswerYN == DialogResult.Yes)
+ {
+ // Convert old RO Data
+ string argstr = ROdir;
+ if (ROdir.Equals(""))
+ argstr = Directory.GetCurrentDirectory();
+ string ConversionExePath = Application.StartupPath + "\\ParadoxConversion.exe ";
+
+ // Need to move out of RO directory to convert it
+ Directory.SetCurrentDirectory("..\\");
+
+ // create a process & wait until it exits.
+ Process myProcess = new Process();
+ myProcess.StartInfo.FileName = ConversionExePath;
+ myProcess.StartInfo.Arguments=argstr;
+
+ myProcess.Start();
+ myProcess.WaitForExit();
+
+ Directory.SetCurrentDirectory(argstr);
+ }
+ else
+ Rtn = false;
+ }
+ }
+ return Rtn;
+ }
+
+ private void menuROSave_Click(object sender, System.EventArgs e)
+ {
+ tbar_SaveClick();
+ }
+
+ private void menuROExit_Click(object sender, System.EventArgs e)
+ {
+ Close();
+ Application.Exit(); // Exit() does not run the destructors
+ }
+
+ /*
+ * If the xml data becomes inconsistent with the tree view, reload the first
+ * level.
+ */
+ private void CleanUpTree(VlnXmlElement curelem, TreeNode nd)
+ {
+ // Unload any children because data may have changed and it can be
+ // reloaded.
+ nd.Collapse();
+ int cnt = nd.Nodes.Count;
+ bool add_dummykid = false;
+ if (cnt > 0) add_dummykid = true;
+ for (int i=0; i 1) || (levelcnt==1 && !TheMenuTitle.Equals("")))
+ {
+ AllGroups = false;
+ ListViewItem item=null;
+ bool first = true;
+ for (int i=0; i< InUseList.Count; i++)
+ {
+ rof = (ROField) InUseList[i];
+ if (rof.GetFieldname != null)
+ {
+ uint ftype = rof.GetFieldType;
+ if (ftype == 1 || ftype == 2 || ftype == 4 || ftype == 128)
+ {
+ string nm0 = rof.GetFieldname;
+ nm = rof.MakeFieldName(nm0);
+ nd = curele.SelectSingleNode(nm);
+ if (nd==null)nd = curele.SelectSingleNode("*/"+nm);
+ if (nd==null)
+ nd = curele.GetCurrentOfMultiFields(curele,nm);
+// if (nd==null)nd = curele.SelectSingleNode(nm+"a");
+// if (nd==null)nd = curele.SelectSingleNode(nm+"b");
+// if (nd==null)nd = curele.SelectSingleNode(nm+"c");
+// if (nd==null)nd = curele.SelectSingleNode(nm+"d");
+ string data;
+ if(nd==null)
+ data=" ";
+ else
+ data=nd.InnerText;
+ if(first==true)
+ {
+ item = new ListViewItem(data,ROIMAGE);
+ first=false;
+ item.Tag = curele;
+ }
+ else
+ item.SubItems.Add(data);
+ }
+ }
+ }
+ roListView.Items.Add(item);
+ }
+ }
+ }
+ curnd = curnd.NextSibling;
+ }
+ if (AllGroups == true)
+ {
+ roListView.Columns.Clear();
+ roListView.Columns.Add("Group",250,HorizontalAlignment.Left);
+ }
+
+ roListView.Visible=true;
+ }
+
+ private void updateRoListView(TreeNode node)
+ {
+ VlnXmlElement selele;
+ selele = (VlnXmlElement) node.Tag;
+ if (selele.Name != "vlnGroup" && selele.Name != "RO_Root")
+ {
+ // if we already have a list view, and we're still under the same parent,
+ // leave the list view, otherwise clear it.
+ VlnXmlElement curele = null;
+ if (roListView != null && roListView.Items.Count > 0)
+ {
+ curele = (VlnXmlElement) roListView.Items[0].Tag;
+ if (selele.ParentNode != curele.ParentNode)roListView_ClearListDisplay();
+ }
+ return;
+ }
+ else
+ {
+ if (roListView == null)
+ {
+ this.roListView = new System.Windows.Forms.ListView();
+ this.panel1.Controls.Add(roListView);
+ this.roListView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.roListView.LargeImageList = this.imageListRoTree;
+ this.roListView.Name = "roListView";
+ this.roListView.Size = new System.Drawing.Size(688, 700);
+ this.roListView.AllowColumnReorder = true;
+ this.roListView.FullRowSelect = true;
+ this.roListView.SmallImageList = this.imageListRoTree;
+ this.roListView.TabIndex = 5;
+ this.roListView.DoubleClick += new System.EventHandler(this.roListView_OnDoubleClick);
+ this.roListView.View = View.Details;
+ MyListViewComparer LVCompare = new MyListViewComparer();
+ this.roListView.ListViewItemSorter = LVCompare;
+ roListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.roListView_Column_Header_OnClick);
+ }
+
+ DisplayGroupElements(selele);
+ }
+
+ }
+
+ void roListView_Column_Header_OnClick(object sender, ColumnClickEventArgs e)
+ {
+ int indx = e.Column;
+ MyListViewComparer LVCompare = (MyListViewComparer) roListView.ListViewItemSorter;
+ LVCompare.SetColumnToSortBy(indx);
+ roListView.Sort();
+ }
+
+ private void roTreeView_AfterSelect_1(object sender, System.Windows.Forms.TreeViewEventArgs e)
+ {
+
+ }
+ }
+
+ // This class is used to sort by the selected list view column
+ public class MyListViewComparer : IComparer
+ {
+ int column;
+
+ public int Compare (object x, object y)
+ {
+ ListViewItem xitm = (ListViewItem) x;
+ ListViewItem yitm = (ListViewItem) y;
+
+ string xbuff = xitm.SubItems[column].Text;
+ string ybuff = yitm.SubItems[column].Text;
+ int rtnval = 0;
+ int xcnt=0,ycnt=0;
+ int xlen,ylen;
+ byte xbyte, ybyte;
+ xlen = xbuff.Length;
+ ylen = ybuff.Length;
+ if (xbuff[0] == '<')
+ rtnval = 0;
+ if (ybuff[0] == '<')
+ rtnval = 0;
+ while ((rtnval==0) && ((xcnt < xlen) || (ycnt < ylen)))
+ {
+ xbyte = (xcnt == xlen)? (byte)0 : (byte)xbuff[xcnt++];
+ ybyte = (ycnt == ylen)? (byte)0 : (byte)ybuff[ycnt++];
+ rtnval = xbyte - ybyte;
+ }
+
+ return rtnval;
+ }
+
+ public void SetColumnToSortBy(int col)
+ {
+ column = col;
+ }
+
+ }
+
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.csproj b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.csproj
new file mode 100644
index 00000000..6072c23e
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.csproj
@@ -0,0 +1,234 @@
+
+
+ bin\x86\Release\
+ TRACE;Upgrade2005;
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}
+ Debug
+ AnyCPU
+ App.ico
+
+
+ ROEditor
+
+
+ JScript
+ Grid
+ IE50
+ false
+ WinExe
+ ROEditor
+ OnBuildSuccess
+ ROEditor.Form1
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE;Upgrade2005;
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ ..\..\..\..\VEPROMS User Interface\bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Drawing
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+ Form
+
+
+ AboutROEditor.cs
+
+
+ Code
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ True
+ True
+ Resources.resx
+
+
+ Form
+
+
+ Form
+
+
+ Code
+
+
+ Designer
+ AboutROEditor.cs
+
+
+ FieldCombFrm.cs
+ Designer
+
+
+ FieldTextFrm.cs
+ Designer
+
+
+ FieldTypeDefFrm.cs
+ Designer
+
+
+ GroupDefFrm.cs
+ Designer
+
+
+ GroupNewFrm.cs
+ Designer
+
+
+ Designer
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+ RODefFrm.cs
+ Designer
+
+
+
+ ROEditor.cs
+ Designer
+
+
+
+
+
+
+
+
+
+
+ {DECA8343-6351-11D6-8487-00A0CC271352}
+ ctlXMLEditLib
+
+
+ {6D44F537-879E-11D6-84B8-00A0CC271352}
+ DBEncapsulation
+
+
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}
+ Org.Mentalis.Files
+
+
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}
+ RODBInterface
+
+
+ {0C782592-AA05-11D6-84D1-00A0CC271352}
+ ROFields
+
+
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}
+ ROFST
+
+
+ {551CB7B3-00B1-11D7-8590-482B59000000}
+ VlnStatus
+
+
+
+
+ cmd /c "$(ProjectDir)FixRev.bat"
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.csproj.vspscc b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.csproj.vspscc
new file mode 100644
index 00000000..f0d493cd
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:Exe\\RefObj\\ROEditor"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.ico b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.ico
new file mode 100644
index 00000000..50c18a46
Binary files /dev/null and b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.ico differ
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.resx b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.resx
new file mode 100644
index 00000000..f5122820
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROEditor.resx
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 124, 17
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACE
+ CAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+ AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+ AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+ AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+ AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+ AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+ ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+ AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+ AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+ AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+ AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+ AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+ AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+ AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+ AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+ ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+ Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+ AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+ AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+ AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+ ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+ Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+ AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+ AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+ AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+ AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+ AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+ AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/xIAAv8CAAT5KAAPegEA
+ Av8I+SYAA3oCAAF6AwAGegEAAv8D+QMAA/klAAJ6AQAC/wX5AQAEegEAAv8B+QEACPkkAAJ6AQAC/wb5
+ AQADegEAAv8BAAT5AwAC+SQAAnoBAAL/AQADegP5A3oBAAL/A/kGAAL5AewiAAJ6AQAC/wR6AQAC+QN6
+ AQAC/wL5BwAC+QLsIQACegEAAv8EegEAAvkDegEAAv8BBwH5BwAC+QLsIQACegEAAv8EegEAAvkDegEA
+ Av8BAAEHBgAD+QLsIQACegEAA/8DAAL/AfkDegEAA/8BBwYAAvkBAALsIQACegEACP8EegEABP8FAAL/
+ AfkD7CEAAnoBAAH/AgAE/wV6AQAL/wEHAfkB7CIAD3oBAAL/AQAH/wMHAfkiAA96AwAB7AUABQciAAH/
+ BnoBAAj/AgACBwHsAQAHByMAAv8FAAn/MAABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGA
+ FwAD/wMAARABHwcAAQ8HAAEHBwABAwcAAQEGAAEBAeAGAAEDAeAGAAEHAeAGAAEHAeAGAAEHAcAGAAED
+ AYAPAAEBBwABAwYAAYABBwYAAcYBHwQACw==
+
+
+
+ 17, 17
+
+
+ 256, 17
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAe
+ CwAAAk1TRnQBSQFMAgEBBgEAAQwBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+ AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+ AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+ AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+ AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+ AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+ ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+ AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+ AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+ AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+ AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+ AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+ AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+ AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+ AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+ ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+ Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+ AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+ AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+ AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+ ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+ Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+ AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+ AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+ AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+ AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+ AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+ AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAIAcgACAHIAAHBwkE
+ CwcB/wIAAgcgAAcHAQQH/wEECgcB/wMAAgcgAAcHAQQB/wUAAf8BBAkHAf8DAAMHIAABBwYAAQQH/wEE
+ BAcEAAH/AwAEByAAAQcBAAX/AQQB/wUAAf8BBAMHAQAE/wMABQcgAAEHAQAB/wQAAQQH/wEEAgcBAAH/
+ Af4DBwH/AQAGByAAAQcBAAX/AQQB/wIAAf8EBAEHAQAB/wEHAf8B/gMHAf8BAAUHIAABBwEAAf8EAAEE
+ BP8BBAH/AQQCBwEAAf8B/gEHAf8B/gIHAf8BAAUHIAABBwEABf8BBAT/AgQDBwEAAf8BBwH+AQcB/wH+
+ AQcB/wEABQcgAAEHAQAB/wIAAf8BAAYEBAcBAAH/AgcB/gEHAf8BBwH/AQAFByAAAQcBAAT/AQAB/wEA
+ CQcBAAH/AgcB/gEHAf8BAAYHIAABBwEABP8CAAsHAQAE/wEABwcgAAEHBgANBwQACAcgACAHIAABBw//
+ MAcC/w0AAf8FBwf/CgcF/xUHAf8BAAIDBgAC/wEAAQMBAAH/AwcC/wf5Af8JBwH/BPoC/woHCQQB/wEA
+ AgMGAAL/AQABAwEAAf8DBwH/AvkFBwL5Af8IBwH/BfoBAgH/CQcBBAf/AQQB/wEAAgMGAAL/AQABAwEA
+ Af8DBwH/AvkGBwH5Af8IBwH/BPoBAgH6AQIB7AgHAQQB/wUAAf8BBAH/AQACAwkAAQMBAAH/AgcB/wH5
+ Af8C+QYHAfkB/wcHBf8B+gICAf8CBwYAAQQH/wEEAf8BAAwDAQAB/wIHAf8B+QEHAf8C+QUHAfkB/wsH
+ AewC/wECAf8CBwEABf8BBAH/BQAB/wEEAf8BAAIDCAACAwEAAf8CBwH/AfkCBwH/AvkEBwH5Af8FBwH/
+ BgcC7AL/AgcBAAH/BAABBAf/AQQB/wEAAQMBAAj/AQABAwEAAf8CBwH/AfkDBwH/AvkDBwH5Af8EBwL/
+ BQcB7AL/AQIB/wIHAQAF/wEEAf8CAAH/BAQB/wEAAQMBAAH/BgcB/wEAAQMBAAH/AgcB/wH5BAcB/wL5
+ AgcB+QH/AwcB/wH6B/8B+gICAf8CBwEAAf8EAAEEBP8BBAH/AQQBBwH/AQABAwEAAf8GBwH/AQABAwEA
+ Af8CBwH/AfkFBwH/AvkBBwH5Af8CBwH/CfoBAgH6AQIB7AIHAQAF/wEEBP8CBAIHAf8BAAEDAQAB/wYH
+ Af8BAAEDAQAB/wMHAf8B+QUHAf8C+QH/AgcB/wv6AQIB/wMHAQAB/wIAAf8BAAYEAwcB/wEAAQMBAAj/
+ AwAB/wMHAf8C+QUHAf8B+QH/AwcB/wf6BP8EBwEABP8BAAH/AQAHBwH/AQABAwoAAQcBAAH/BAcB/wf5
+ Af8FBwH/AfoH/wYHAQAE/wIACAcB/w4AAf8FBwf/BwcC/wwHBgAJBxD/FAcB/xsHAUIBTQE+BwABPgMA
+ ASgDAAFAAwABIAMAAQEBAAEBBgABARYAA///AAIACw==
+
+
+
+ 36
+
+
+
+
+ AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAEAAAABAA
+ AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
+ AAD///8AAAAAAAAAAAAAAAAAAAAAAA//8AAAmZmZmQAAAAAAAAAP//AJmZmZmZmZkAAAAAAAD//wmZmZ
+ mZmZmZkAAAAAAA//8JmZmZmZmZmZkAAAAAAP//CZmZAAAAmZmZkAAAAAD//wmZAJeXlwCZmZkAAAAA//
+ 8JkHl5eXl5CZmZkAAAAP//CQeXl5eXl5CZmZAAAAD//wB5eXl5AAAACZmQkAAA//8Hl5eXAAAAAAmZmQ
+ kAAP//CXl5AAAAAAAAmZkHkAD//weXkAAAAAAAAJmZCXAA//8JeXAAAAAAAACZmQeXAP//B5eQAAAAAA
+ AAmZkJeQD//wh5AAAAAAAAAJmZB5cA//8HhwAAAAAAAACZmQl5AP//8HgAAAAAAAAJmZkHlwD///CHAA
+ AAAAAACZmQeXkA////CAAAAAAAAPmZkJeXAP////AAAAAAAA//mZB5eQD/////AAAAAAD///kHl5cA//
+ ////8AAAD////wmXlwAP//////////////CHmXkAD//w//////////8IeHmXAA//8A/////////wh4eH
+ kAAP//CAAP////8ACHh4eAAAAAAAeAcAAAAAh4eHh4AAAAB4eAeAeHh4eHh4eHgAAAAAB4eAcAeHh4eH
+ h4eAAAAAAAB4eAAACHh4eHgAAAAAAAAAAAAAAAAAAAAAAAAAAAADwD//AgAH/wAAA/8AAAH/AAAA/wAA
+ AH8AAAA/AAAAHwAAAA8AAAAHAAH4AwAH/AEAD/wBAB/8AAAf/AAAP/wAAD/8AAA/+AAAP/gAAD/wAAA/
+ 4AAAH4AAAAAAAQAAAAEAAAABAAAAAwAAAAcAAAAPgAAAH8AAAD/gIAB/8DgD/w==
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROGROUPYellow.ICO b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROGROUPYellow.ICO
new file mode 100644
index 00000000..3952150b
Binary files /dev/null and b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ROGROUPYellow.ICO differ
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RO_FST.cs b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RO_FST.cs
new file mode 100644
index 00000000..151ddba2
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/RO_FST.cs
@@ -0,0 +1,876 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: RO_FST.cs $ $Revision: 15 $
+ * $Author: Jsj $ $Date: 8/23/06 11:33a $
+ *
+ * $History: RO_FST.cs $
+ *
+ * ***************** Version 15 *****************
+ * User: Jsj Date: 8/23/06 Time: 11:33a
+ * Updated in $/EXE/RefObj/ROEditor
+ * debug statements commented out
+ *
+ * ***************** Version 14 *****************
+ * User: Jsj Date: 5/03/05 Time: 11:48a
+ * Updated in $/EXE/RefObj/ROEditor
+ * 2005 upgrade, move some ROFST logic to ROFST library
+ *
+ * ***************** Version 13 *****************
+ * User: Jsj Date: 5/11/04 Time: 9:29a
+ * Updated in $/EXE/RefObj/ROEditor
+ * Bug fix B2004-011, could not create FST file if user opened nodes on
+ * tree.
+ *
+ * ***************** Version 12 *****************
+ * User: Jsj Date: 4/08/04 Time: 9:48a
+ * Updated in $/EXE/RefObj/ROEditor
+ * Modified code to speed up the creation of the RO.FST file
+ *
+ * ***************** Version 11 *****************
+ * User: Jsj Date: 6/30/03 Time: 1:20p
+ * Updated in $/EXE/RefObj/ROEditor
+ * a NULL Accessory Page ID was giving problems in creating a new RO.FST
+ * file.
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 6/11/03 Time: 2:01p
+ * Updated in $/EXE/RefObj/ROEditor
+ * Fix bug B2003-045
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 5/30/03 Time: 12:48p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-044: sync up xml with UI tree view
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:51p
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-034: process data if only one field for RO & also, convert return
+ * value for xml save
+ *
+ * ***************** Version 7 *****************
+ * User: Jsj Date: 4/14/03 Time: 3:02p
+ * Updated in $/EXE/RefObj/ROEditor
+ * Speed up the creation of the RO.FST file
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 4/04/03 Time: 9:41a
+ * Updated in $/EXE/RefObj/ROEditor
+ * B2003-030 convert new top group name to user readable for ro.fst
+ *
+ * ***************** Version 5 *****************
+ * User: Jsj Date: 2/21/03 Time: 9:51a
+ * Updated in $/EXE/RefObj/ROEditor
+ * added RO FST completed message
+ *
+ * ***************** Version 4 *****************
+ * User: Jsj Date: 1/02/03 Time: 9:31a
+ * Updated in $/EXE/RefObj/ROEditor
+ * Save Graphics file date in RO.FST file
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 12/17/02 Time: 4:54p
+ * Updated in $/EXE/RefObj/ROEditor
+ * save real date for graphic files
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 12/06/02 Time: 3:26p
+ * Updated in $/EXE/RefObj/ROEditor
+ * parameter display data fix (ingoring this data for now)
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 11/27/02 Time: 12:53p
+ * Created in $/EXE/RefObj/ROEditor
+ * Modification to create the RO.FST file
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Data;
+using System.Xml;
+using System.Xml.Schema;
+using System.Text;
+using System.IO;
+using RODBInterface;
+using System.Runtime.InteropServices;
+using VlnStatus;
+using System.Collections.Specialized;
+using ROFST_FILE;
+
+//using VlnProfiler; //don't forget to add VlnProfiler to the reference list
+
+namespace ROEditor
+{
+ ///
+ /// This creates an RO.FST file
+ ///
+
+ class FstTmpSTRC
+ {
+ public ushort thistype;
+ public uint thisoff;
+ public string title;
+
+ public FstTmpSTRC(ushort type, uint offset, string tl)
+ {
+ thistype = type;
+ thisoff = offset;
+ title = tl;
+ }
+
+ void WriteString(BinaryWriter bw, string str)
+ {
+ int n=str.Length;
+ byte [] b = new byte[n+1];
+ for(int i =0; i < n; i++)
+ {
+ b[i] = (byte)str[i];
+ }
+ bw.Write(b,0,n+1); // +1 to include null
+ /**
+ byte nullbyte = 0;
+ int i;
+ for(i =0; i < str.Length; i++)
+ {
+ byte WrByte;
+ WrByte = (byte)str[i];
+ bw.Write(WrByte);
+ }
+ bw.Write(nullbyte);
+***/
+ }
+
+ public void Write(BinaryWriter bw)
+ {
+ bw.Write(thisoff);
+ bw.Write(thistype);
+ WriteString(bw,title);
+ }
+ }
+
+// The Sorted Array was not sorting via the ASCII value of each character in a given string.
+// This sorting function compares two strings by doing a character by character comparison.
+ public class MyComparer : IComparer
+ {
+ public int Compare (object x, object y)
+ {
+ int rtnval = 0;
+ int xcnt=0,ycnt=0;
+ int xlen,ylen;
+ byte xbyte, ybyte;
+ string xbuff = x.ToString();
+ string ybuff = y.ToString();
+ xlen = xbuff.Length;
+ ylen = ybuff.Length;
+ if (xbuff[0] == '<')
+ rtnval = 0;
+ if (ybuff[0] == '<')
+ rtnval = 0;
+ while ((rtnval==0) && ((xcnt < xlen) || (ycnt < ylen)))
+ {
+ xbyte = (xcnt == xlen)? (byte)0 : (byte)xbuff[xcnt++];
+ ybyte = (ycnt == ylen)? (byte)0 : (byte)ybuff[ycnt++];
+ rtnval = xbyte - ybyte;
+ }
+
+ return rtnval;
+ }
+ }
+
+
+ public class RO_FST
+ {
+ private FST_FileHeader FstHeader;
+ private string FstDir; // path to the RO directory
+ private string FstPath; // RO directory Path and RO.FST file name
+ private string FstOld; // ROFST.Old file name (backup of previous fst file)
+ private string FstNew; // ROFST.New hold the RO.FST info during creation
+
+ private BinaryWriter fhFST; // write handle to FST file being created
+
+ private VlnStatusBar StatusWin;
+
+ private RODB ROdatabase;
+
+ private XmlDocument FSTroXmlDoc;
+// private HybridDictionary dicTiming;
+// private HybridDictionary dicDuration;
+
+ ushort widestAcPgId;
+ SortedList IdsAndAccPgIds;
+ SortedList IdsAndOffsets;
+
+ ushort AllTypesUsed;
+
+ private Stack InUseListStack;
+ private Stack RtnValTmplateStack;
+// private DateTime dtLast=DateTime.Now;
+
+ public RO_FST(RODB TheROdb, XmlDocument TheXmlDoc)
+ {
+ ROdatabase = TheROdb; // point to the RO database
+ FSTroXmlDoc = TheXmlDoc;
+ }
+ public bool Create()
+ {
+ bool RtnStat = true;
+// dicDuration=new HybridDictionary();
+// dicTiming=new HybridDictionary();
+// Profiler.Reset();
+ // position to the top of the tree
+ // CurrentNode = roTree.TopNode;
+
+ // Setup the paths to the FST files
+ FstDir = Directory.GetCurrentDirectory();
+ FstPath = FstDir + "\\RO.FST";
+ FstOld = FstDir + "\\ROFST.Old";
+ FstNew = FstDir + "\\ROFST.New";
+
+ // open a temporary file for building the RO.FST
+ try
+ {
+ fhFST = new BinaryWriter(File.Open(FstNew,System.IO.FileMode.Create,System.IO.FileAccess.ReadWrite));
+ }
+ catch (Exception fhExc)
+ {
+ string errmsg = fhExc.Message;
+ MessageBox.Show(errmsg,"Error Creating RO.FST file",System.Windows.Forms.MessageBoxButtons.OK);
+ RtnStat = false;
+ }
+
+ // If we were able to open a new ROFST.NEW file then go ahead and put the
+ // new FST information into it.
+ if (RtnStat)
+ RtnStat = BuildNewRoFST();
+
+ if (RtnStat) // successful in creating new RO FST file?
+ {
+ //If an RO.FST file already exists,
+ // rename the existing file for safe keeping
+ if (File.Exists(FstPath))
+ {
+ // copy the existing RO.FST to ROFST.OLD
+ // - overrite ROFST.OLD if it already exists
+ File.Copy(FstPath,FstOld,true); // save RO.FST as ROFST.OLD
+ File.Delete(FstPath); // remove RO.FST
+ }
+ File.Copy(FstNew,FstPath,true); // save ROFST.NEW as RO.fST
+ File.Delete(FstNew); // remove ROFST.NEW
+ MessageBox.Show("New RO.FST file created successfully.","Create RO.FST file",System.Windows.Forms.MessageBoxButtons.OK);
+ }
+// MessageBox.Show(Profiler.ToString("000.00%"),"Timings");
+// dicDuration=null;
+// dicTiming=null;
+ return RtnStat;
+ }
+
+
+ private bool BuildNewRoFST()
+ {
+ bool RtnVal = true;
+ int i;
+ int numDatabases;
+ // write the empty header - save space for the header info
+ FstHeader = new FST_FileHeader();
+ FstHeader.Write(fhFST);
+
+ // point to the ROMASTER and get the number of databases it has
+ VlnXmlElement ROdbtables = (VlnXmlElement) FSTroXmlDoc.FirstChild;
+ numDatabases = ROdbtables.ChildNodes.Count;
+
+ // Allocate a list of database info structures
+ ROFST_DbInfo[] dbinfo = new ROFST_DbInfo[numDatabases];
+ //For each RO database, process each group
+ XmlNode ROtableNode = ROdbtables;
+ ROtableNode = ROtableNode.FirstChild;
+ StatusWin = new VlnStatusBar("Creating RO.FST file");
+ for (i=0; i < numDatabases && RtnVal; i++)
+ {
+ dbinfo[i] = new ROFST_DbInfo();
+ RtnVal = SaveToFSTFile(ROtableNode,dbinfo[i]);
+ dbinfo[i].dbiType = AllTypesUsed;
+ ROtableNode = ROtableNode.NextSibling;
+ }
+
+ if (RtnVal)
+ {
+ VlnXmlElement tblnode = (VlnXmlElement) ROdbtables.FirstChild;
+ StatusWin.BarMax = numDatabases * 2;
+ StatusWin.BarStepValue = 1;
+ StatusWin.BarValue = 0;
+ // All of the RO database, group, and return value information
+ // was saved to the FST file. Now save the information needed
+ // to read the FST file.
+
+ // Save DB list
+ uint lngbuf = 0;
+ uint dblength = (uint)fhFST.BaseStream.Position;
+
+ fhFST.Write(lngbuf);
+
+ ushort intbuf = Convert.ToUInt16(numDatabases);
+ fhFST.Write(intbuf);
+
+ // The old code did a sizeof() on a structure containing the ROFSTDatabaseInfo (dbi)
+ // You cannot read/write a Struct type in C# like you can with C++. The C# books suggest
+ // creating a Class to replace the Struct, then create methods that perform the binary
+ // read/write. So I created a method that calculates the "struct" size to simulate the
+ // sizeof(struct dbi)
+ uint lngval = (dbinfo[0].GetStructSize()) * (uint)numDatabases;
+
+ for (i=0; i=0)
+ {
+ outstr += tmpstr.Substring(cur,indx-cur);
+ asc_spchar = tmpstr.Substring(indx+3,3);
+ decval = System.Convert.ToInt16(asc_spchar,10);
+ outstr += System.Convert.ToChar(decval).ToString();
+ cur = indx+6;
+ if (cur+6 > len)
+ indx = -1;
+ else
+ indx = tmpstr.IndexOf(OKpunch,cur);
+ }
+ if (cur= 1) && !TheMenuTitle.Equals(""))
+ {
+ curOffset = (uint)fhFST.BaseStream.Position;
+ curType = SaveROToFST(chldnode,InUseList,RtnValTmplate,AccPageIDTplate);
+ }
+ else
+ {
+ SkipThisOne = true;
+ }
+ }
+ if (!SkipThisOne)
+ {
+ string tmpstr = ChildElem.GetAttribute("MenuTitle");
+ tmpfststrc = new FstTmpSTRC(curType,curOffset,tmpstr);
+ FstTmp.Add(tmpfststrc);
+ typ |= curType;
+ numgroups++;
+ }
+ } // end if VlnXmlElement
+
+ // Get next child
+ chldnode = chldnode.NextSibling;
+ }// end while
+ } // if child is not null
+
+ // pop the InUseList stack
+ if (PopInUseStack)
+ InUseListStack.Pop();
+
+ // pop the return valuse template stack
+ if (PopRtnValStack)
+ RtnValTmplateStack.Pop();
+
+
+ // save the current position of the FST file for the return value
+ RtnVal = (uint)fhFST.BaseStream.Position;
+
+ // Save the ID and offset entry for the current ID
+ IdsAndOffsets.Add(curRecID,RtnVal);
+
+ fhFST.Write(curRecID);
+ fhFST.Write(elemParentID);
+ fhFST.Write(numgroups);
+
+ // write the FstTmp
+ for (int i=0; i < FstTmp.Count; i++)
+ {
+ tmpfststrc = (FstTmpSTRC)FstTmp[i];
+ tmpfststrc.Write(fhFST);
+ }
+ FstTmp.Clear();
+
+ return RtnVal;
+ }
+
+
+ public void WriteGraphicsReturnValue(string OrigStr)
+ {
+ string text, tmptext, hgttxt, widtxt, imgdateStr;
+ int idx;
+ int hgt, wid;
+ int imgdateInt;
+ byte newline = 10;
+
+ char[] tmpbuf = OrigStr.ToCharArray();
+
+ // remove the trailing "\r\n"
+ tmptext = OrigStr.Substring(0,OrigStr.Length-2);
+
+ // parse out the image width
+ idx = tmptext.LastIndexOf("\r\n");
+ widtxt = tmptext.Substring(idx+2,tmptext.Length-(idx+2));
+ wid = Convert.ToInt32(widtxt,10);
+ widtxt = wid.ToString("x4");
+ tmptext = tmptext.Substring(0,idx);
+
+ // parse out the image height
+ idx = tmptext.LastIndexOf("\r\n");
+ hgttxt = tmptext.Substring(idx+2,tmptext.Length-(idx+2));
+ hgt = Convert.ToInt32(hgttxt,10);
+ hgttxt = hgt.ToString("x4");
+ tmptext = tmptext.Substring(0,idx);
+
+ // parse out the image file name and image date
+ idx = tmptext.IndexOf(" ");
+ text = tmptext.Substring(idx+1);
+ if (tmptext.StartsWith("\r\n"))
+ imgdateStr = tmptext.Substring(2,idx-2); // first 2 chars are "\r\n"
+ else
+ {
+ if(idx < 1)
+ imgdateStr=null;
+ else
+ imgdateStr = tmptext.Substring(0,idx);
+ }
+ if (imgdateStr == null|| imgdateStr=="")
+ imgdateInt = 0;
+ else
+ imgdateInt = Convert.ToInt32(imgdateStr,10);
+
+ // write graphics file name
+ WriteString(text,false);
+ fhFST.Write(newline);
+
+ // write dummy date (old FST file had only zeros!
+// WriteString("00000000",false);
+ WriteString(imgdateInt.ToString("x8"),false);
+ fhFST.Write(newline);
+
+ // write the image height
+ WriteString(hgttxt,false);
+ fhFST.Write(newline);
+
+ //write the image width
+ WriteString(widtxt,true);
+ }
+
+
+ private ushort SaveROToFST(XmlNode RONode,ArrayList InUseList,string RtnValTmplate, string AccPageIDTplate)
+ {
+ ushort RtnVal;
+ uint startFST = (uint)fhFST.BaseStream.Position;
+ uint RORecID;
+ uint ParID;
+ byte nullbyte=0;
+
+ VlnXmlElement elem;
+ elem = (VlnXmlElement) RONode;
+
+// string dummy = ""; // need for RODB_GetFIeldsInUse call, won't be used.
+// ArrayList AvailList, InUseList;
+// //Get the "In Use" field list
+// AvailList = ROdatabase.RODB_GetFields(elem, (uint) RecordType.Schema);
+// InUseList = ROdatabase.RODB_GetFieldsInUse(elem, AvailList,"FieldsInUse", ref dummy);
+
+ //Write the RO's record ID
+ string RecIdStr = elem.GetAttribute("RecID");
+ RORecID = System.Convert.ToUInt16(RecIdStr,16);
+
+ fhFST.Write(RORecID);
+
+// **** Debug
+// if (RecIdStr.Equals("000000a6"))
+// nullbyte=0;
+// ***
+ // Get the Accessory Page ID
+// string AccPageIDTplate = elem.GetAccPageIDTemplate();
+ string AccPageID = elem.GetAccPageIDString(AccPageIDTplate);
+
+// **** Debug
+// if (AccPageID.Equals("S:1"))
+// nullbyte=0;
+// *****
+
+ //Write the parent ID
+ string ParIDstr = elem.GetAttribute("ParentID");
+ ParID = System.Convert.ToUInt16(ParIDstr,16);
+ fhFST.Write(ParID);
+
+ // not sure why, was in old FST code but no comment!
+ // I assume that it's some sort of separater
+ short none = -1;
+ fhFST.Write(none);
+
+ //Get the RO Return value and return type
+// string RtnValTmplate = elem.GetReturnValueTemplate();
+ RtnVal = 0;
+ string tablename = elem.GetAttribute("Table");
+// if (RtnValTmplate.Equals(""))
+// {
+// int i;
+// i =0;
+// }
+ string cvttmp= CvtFldToUserFld(RtnValTmplate);
+ string RORtnVal = elem.GetReturnValue(ROdatabase,tablename,cvttmp,InUseList,ref RtnVal);
+
+ // Write the field type to the FST
+ fhFST.Write(RtnVal);
+
+ if (RtnVal == 8) // is this an Image (graphics) record?
+ WriteGraphicsReturnValue(RORtnVal);
+ else
+ WriteString(RORtnVal);
+
+ // Write the Accessory Page ID
+ // Fix for Bug B2003-039. Added check for a NULL AccPageID
+ // If is null, then assign a blank string
+
+ if (AccPageID != null)
+ AccPageID = AccPageID.Trim();
+ else
+ AccPageID = " ";
+ WriteString(AccPageID);
+
+ // Save the ID and offset entry for the current ID
+ IdsAndOffsets.Add(RORecID,startFST);
+
+ // Save the RecID and Accessory Page id
+ IdsAndAccPgIds[AccPageID] = RORecID;
+
+
+ // Save the widest AccPageID width
+ int acclen = AccPageID.Length;
+ if (acclen > widestAcPgId)
+ widestAcPgId = (ushort)acclen;
+// if(dtLast.AddSeconds(.3) < DateTime.Now)
+// {
+ StatusWin.StatMsg = AccPageID;
+ StatusWin.PerformStep();
+// dtLast=DateTime.Now;
+// }
+ return RtnVal;
+ }
+
+ public void WriteString(string str)
+ {
+ WriteString(str,true);
+ }
+
+ public void WriteString(string str,bool AddNull)
+ {
+ int n=str.Length;
+ if (AddNull)
+ n++;
+ byte [] b = new byte[n];
+ for(int i =0; i < str.Length; i++)
+ {
+ b[i] = (byte)str[i];
+ }
+ fhFST.Write(b,0,n);
+ }
+
+ }
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Red_V_txt_NB_bur_1984.png b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Red_V_txt_NB_bur_1984.png
new file mode 100644
index 00000000..e8f05bdd
Binary files /dev/null and b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/Red_V_txt_NB_bur_1984.png differ
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.sln b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.sln
new file mode 100644
index 00000000..d1c80bb3
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.sln
@@ -0,0 +1,265 @@
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ROEditor", "ROEditor.csproj", "{3A4A3543-2D44-11D6-8452-00A0CC271352}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+ ProjectSection(ProjectDependencies) = postProject
+ {6D44F537-879E-11D6-84B8-00A0CC271352} = {6D44F537-879E-11D6-84B8-00A0CC271352}
+ {DECA8343-6351-11D6-8487-00A0CC271352} = {DECA8343-6351-11D6-8487-00A0CC271352}
+ {0C782592-AA05-11D6-84D1-00A0CC271352} = {0C782592-AA05-11D6-84D1-00A0CC271352}
+ {551CB7B3-00B1-11D7-8590-482B59000000} = {551CB7B3-00B1-11D7-8590-482B59000000}
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352} = {0C7825FD-AA05-11D6-84D1-00A0CC271352}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VlnStatus", "..\..\..\LibSource\VlnStatus\VlnStatus.csproj", "{551CB7B3-00B1-11D7-8590-482B59000000}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ROFields", "..\..\..\LibSource\ROField\ROFields.csproj", "{0C782592-AA05-11D6-84D1-00A0CC271352}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBEncapsulation", "..\..\..\LibSource\DBEncapsulation\DBEncapsulation.csproj", "{6D44F537-879E-11D6-84B8-00A0CC271352}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RODBInterface", "..\..\..\LibSource\RODBInterface\RODBInterface.csproj", "{0C7825FD-AA05-11D6-84D1-00A0CC271352}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+ ProjectSection(ProjectDependencies) = postProject
+ {6D44F537-879E-11D6-84B8-00A0CC271352} = {6D44F537-879E-11D6-84B8-00A0CC271352}
+ {0C782592-AA05-11D6-84D1-00A0CC271352} = {0C782592-AA05-11D6-84D1-00A0CC271352}
+ {551CB7B3-00B1-11D7-8590-482B59000000} = {551CB7B3-00B1-11D7-8590-482B59000000}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ctlXMLEditLib", "..\..\..\LibSource\ctlXMLEditLib\ctlXMLEditLib.csproj", "{DECA8343-6351-11D6-8487-00A0CC271352}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+ ProjectSection(ProjectDependencies) = postProject
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352} = {0C7825FD-AA05-11D6-84D1-00A0CC271352}
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VlnProfiler", "..\..\..\LibSource\VlnProfiler\VlnProfiler.csproj", "{38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ROFST", "..\..\..\LibSource\ROFST\ROFST.csproj", "{134D8938-9CDC-4712-9444-D5DCC6638AB6}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Org.Mentalis.Files", "..\..\..\LibSource\Org.Mentalis.Files\Org.Mentalis.Files.csproj", "{A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\..\..\LibSource\Utils\Utils.csproj", "{680054D3-49C4-40E7-92A5-67B97DCE6308}"
+ ProjectSection(WebsiteProperties) = preProject
+ Debug.AspNetCompiler.Debug = "True"
+ Release.AspNetCompiler.Debug = "False"
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SourceCodeControl) = preSolution
+ SccNumberOfProjects = 11
+ SccProjectName0 = \u0022$/PROMS/ReferencedObjects\u0022,\u0020XCFAAAAA
+ SccLocalPath0 = ..\\..\\..
+ SccProvider0 = MSSCCI:Microsoft\u0020Visual\u0020SourceSafe
+ SccProjectFilePathRelativizedFromConnection0 = Exe\\RefObj\\ROEditor\\
+ SccProjectUniqueName1 = ROEditor.csproj
+ SccLocalPath1 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection1 = Exe\\RefObj\\ROEditor\\
+ SccProjectUniqueName2 = ..\\..\\..\\LibSource\\ctlXMLEditLib\\ctlXMLEditLib.csproj
+ SccLocalPath2 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection2 = LibSource\\ctlXMLEditLib\\
+ SccProjectUniqueName3 = ..\\..\\..\\LibSource\\DBEncapsulation\\DBEncapsulation.csproj
+ SccLocalPath3 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection3 = LibSource\\DBEncapsulation\\
+ SccProjectUniqueName4 = ..\\..\\..\\LibSource\\Org.Mentalis.Files\\Org.Mentalis.Files.csproj
+ SccLocalPath4 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection4 = LibSource\\Org.Mentalis.Files\\
+ SccProjectUniqueName5 = ..\\..\\..\\LibSource\\RODBInterface\\RODBInterface.csproj
+ SccLocalPath5 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection5 = LibSource\\RODBInterface\\
+ SccProjectUniqueName6 = ..\\..\\..\\LibSource\\ROField\\ROFields.csproj
+ SccLocalPath6 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection6 = LibSource\\ROField\\
+ SccProjectUniqueName7 = ..\\..\\..\\LibSource\\ROFST\\ROFST.csproj
+ SccLocalPath7 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection7 = LibSource\\ROFST\\
+ SccProjectUniqueName8 = ..\\..\\..\\LibSource\\Utils\\Utils.csproj
+ SccLocalPath8 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection8 = LibSource\\Utils\\
+ SccProjectUniqueName9 = ..\\..\\..\\LibSource\\VlnProfiler\\VlnProfiler.csproj
+ SccLocalPath9 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection9 = LibSource\\VlnProfiler\\
+ SccProjectUniqueName10 = ..\\..\\..\\LibSource\\VlnStatus\\VlnStatus.csproj
+ SccLocalPath10 = ..\\..\\..
+ SccProjectFilePathRelativizedFromConnection10 = LibSource\\VlnStatus\\
+ EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|Win32 = Debug|Win32
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|Mixed Platforms = Release|Mixed Platforms
+ Release|Win32 = Release|Win32
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Debug|x86.ActiveCfg = Debug|x86
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Debug|x86.Build.0 = Debug|x86
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Release|Win32.ActiveCfg = Release|Any CPU
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Release|x86.ActiveCfg = Release|x86
+ {3A4A3543-2D44-11D6-8452-00A0CC271352}.Release|x86.Build.0 = Release|x86
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Debug|x86.ActiveCfg = Debug|x86
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Debug|x86.Build.0 = Debug|x86
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Release|Win32.ActiveCfg = Release|Any CPU
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Release|x86.ActiveCfg = Release|x86
+ {551CB7B3-00B1-11D7-8590-482B59000000}.Release|x86.Build.0 = Release|x86
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Debug|x86.ActiveCfg = Debug|x86
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Debug|x86.Build.0 = Debug|x86
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Release|Win32.ActiveCfg = Release|Any CPU
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Release|x86.ActiveCfg = Release|x86
+ {0C782592-AA05-11D6-84D1-00A0CC271352}.Release|x86.Build.0 = Release|x86
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Debug|x86.ActiveCfg = Debug|x86
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Debug|x86.Build.0 = Debug|x86
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Release|Win32.ActiveCfg = Release|Any CPU
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Release|x86.ActiveCfg = Release|x86
+ {6D44F537-879E-11D6-84B8-00A0CC271352}.Release|x86.Build.0 = Release|x86
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Debug|x86.ActiveCfg = Debug|x86
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Debug|x86.Build.0 = Debug|x86
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Release|Win32.ActiveCfg = Release|Any CPU
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Release|x86.ActiveCfg = Release|x86
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}.Release|x86.Build.0 = Release|x86
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Debug|x86.ActiveCfg = Debug|x86
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Debug|x86.Build.0 = Debug|x86
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Release|Win32.ActiveCfg = Release|Any CPU
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Release|x86.ActiveCfg = Release|x86
+ {DECA8343-6351-11D6-8487-00A0CC271352}.Release|x86.Build.0 = Release|x86
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Debug|x86.ActiveCfg = Debug|x86
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Debug|x86.Build.0 = Debug|x86
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Release|Win32.ActiveCfg = Release|Any CPU
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Release|x86.ActiveCfg = Release|x86
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}.Release|x86.Build.0 = Release|x86
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Debug|x86.ActiveCfg = Debug|x86
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Debug|x86.Build.0 = Debug|x86
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Release|Win32.ActiveCfg = Release|Any CPU
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Release|x86.ActiveCfg = Release|x86
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}.Release|x86.Build.0 = Release|x86
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Debug|x86.ActiveCfg = Debug|x86
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Debug|x86.Build.0 = Debug|x86
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Release|Win32.ActiveCfg = Release|Any CPU
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Release|x86.ActiveCfg = Release|x86
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}.Release|x86.Build.0 = Release|x86
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Debug|x86.ActiveCfg = Debug|x86
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Debug|x86.Build.0 = Debug|x86
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Release|Any CPU.Build.0 = Release|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Release|Win32.ActiveCfg = Release|Any CPU
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Release|x86.ActiveCfg = Release|x86
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.vsscc b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.vsscc
new file mode 100644
index 00000000..e0795477
Binary files /dev/null and b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.vsscc differ
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.vssscc b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.vssscc
new file mode 100644
index 00000000..6502c714
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/ReferencedObjects.vssscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:Exe\\RefObj\\ROEditor"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT"
+}
diff --git a/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/app.config b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/app.config
new file mode 100644
index 00000000..bcd05449
--- /dev/null
+++ b/PROMS/ReferencedObjects/Exe/RefObj/ROEditor/app.config
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/PROMS/ReferencedObjects/LibSource/DBEncapsulation/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncap.cs b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncap.cs
new file mode 100644
index 00000000..0750be45
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncap.cs
@@ -0,0 +1,205 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: DBEncap.cs $ $Revision: 5 $
+ * $Author: Kathy $ $Date: 12/10/02 2:24p $
+ *
+ * $History: DBEncap.cs $
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:24p
+ * Updated in $/LibSource/DBEncapsulation
+ * handle dbnull for sql server
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 10/09/02 Time: 12:36p
+ * Updated in $/LibSource/DBEncapsulation
+ * handle null in data
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 9/05/02 Time: 1:03p
+ * Updated in $/LibSource/DBEncapsulation
+ * added ExecuteNonQuery calls
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 9/05/02 Time: 11:31a
+ * Updated in $/LibSource/DBEncapsulation
+ * added Close functions
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 8/23/02 Time: 3:07p
+ * Created in $/LibSource/DBEncapsulation
+ *********************************************************************************************/
+
+using System;
+using System.Data;
+using System.Data.OleDb;
+using Microsoft.Data.Odbc;
+
+namespace DBEncapsulation
+{
+ ///
+ /// Summary description for DBEncapsulate: Encapsulate database interface methods &
+ /// classes. Will encapsulate OLE DB & ODBC connections, commands, readers & other
+ /// features as required.
+ ///
+ public class DBEncapsulate
+ {
+ public virtual void Connection(string strconnect)
+ {
+ }
+ public virtual void OpenConnection()
+ {
+ }
+ public virtual void CloseConnection()
+ {
+ }
+ public virtual void Command(string strCommand)
+ {
+ }
+ public virtual void CommandDispose()
+ {
+ }
+ public virtual bool Reader()
+ {
+ return false;
+ }
+ public virtual void ReaderClose()
+ {
+ }
+ public virtual bool Read()
+ {
+ return false;
+ }
+ public virtual string GetString(int num)
+ {
+ string tmp = "tmp";
+ return (tmp);
+ }
+ public virtual int GetInt32(int num)
+ {
+ return (0);
+ }
+ public virtual void NonQuery()
+ {
+ }
+ }
+ public class OLEDB_DBEncap: DBEncapsulate
+ {
+ OleDbConnection myDatabaseConn;
+ OleDbCommand myCommand;
+ OleDbDataReader myReader;
+ public override void Connection(string strconnect)
+ {
+ myDatabaseConn = new OleDbConnection(strconnect);
+ }
+ public override void OpenConnection()
+ {
+ myDatabaseConn.Open();
+ }
+ public override void CloseConnection()
+ {
+ myDatabaseConn.Close();
+ }
+ public override void Command(string strCommand)
+ {
+ myCommand = new OleDbCommand(strCommand,myDatabaseConn);
+ }
+ public override void CommandDispose()
+ {
+ myCommand.Dispose();
+ }
+ public override bool Reader()
+ {
+ myReader = myCommand.ExecuteReader();
+ if (myReader == null)
+ return false;
+ else
+ return true;
+ }
+ public override void ReaderClose()
+ {
+ myReader.Close();
+ }
+ public override bool Read()
+ {
+ return(myReader.Read());
+ }
+ public override string GetString(int num)
+ {
+ if (myReader.IsDBNull(num) == false)
+ return(myReader.GetString(num));
+ else
+ return null;
+ //if (myReader.GetString(num) == null) return null;
+ //return(myReader.GetString(num));
+ }
+ public override int GetInt32(int num)
+ {
+ return(myReader.GetInt32(num));
+ }
+ public override void NonQuery()
+ {
+ myCommand.ExecuteNonQuery();
+ }
+ }
+
+ public class ODBC_DBEncap: DBEncapsulate
+ {
+ OdbcConnection myDatabaseConn;
+ OdbcCommand myCommand;
+ OdbcDataReader myReader;
+ public override void Connection(string strconnect)
+ {
+ myDatabaseConn = new OdbcConnection(strconnect);
+ }
+ public override void OpenConnection()
+ {
+ myDatabaseConn.Open();
+ }
+ public override void CloseConnection()
+ {
+ myDatabaseConn.Close();
+ }
+ public override void Command(string strCommand)
+ {
+ myCommand = new OdbcCommand(strCommand,myDatabaseConn);
+ }
+ public override void CommandDispose()
+ {
+ myCommand.Dispose();
+ }
+ public override bool Reader()
+ {
+ myReader = myCommand.ExecuteReader();
+ if (myReader == null)
+ return false;
+ else
+ return true;
+ }
+ public override void ReaderClose()
+ {
+ myReader.Close();
+ }
+ public override bool Read()
+ {
+ return(myReader.Read());
+ }
+ public override string GetString(int num)
+ {
+ if (myReader.IsDBNull(num) == false)
+ return(myReader.GetString(num));
+ else
+ return null;
+ }
+ public override int GetInt32(int num)
+ {
+ return(myReader.GetInt32(num));
+ }
+ public override void NonQuery()
+ {
+ myCommand.ExecuteNonQuery();
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncapsulation.csproj b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncapsulation.csproj
new file mode 100644
index 00000000..9d1a6fe8
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncapsulation.csproj
@@ -0,0 +1,129 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {6D44F537-879E-11D6-84B8-00A0CC271352}
+ Debug
+ AnyCPU
+
+
+
+
+ DBEncapsulation
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ DBEncapsulation
+ OnBuildSuccess
+
+
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+
+ Microsoft.Data.Odbc
+ C:\Program Files\Microsoft.Net\Odbc.Net\Microsoft.Data.Odbc.dll
+
+
+ System
+
+
+ System.Data
+
+
+ System.XML
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncapsulation.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncapsulation.csproj.vspscc
new file mode 100644
index 00000000..7fb37e71
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/DBEncapsulation/DBEncapsulation.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\DBEncapsulation"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/IniReader.cs b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/IniReader.cs
new file mode 100644
index 00000000..12b5c705
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/IniReader.cs
@@ -0,0 +1,428 @@
+/*
+ IniReader class for C#
+ Version: 1.0 Date: 2002/04/24
+*/
+/*
+ Copyright © 2002, The KPD-Team
+ All rights reserved.
+ http://www.mentalis.org/
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Neither the name of the KPD-Team, nor the names of its contributors
+ may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+using System;
+using System.Text;
+using System.Collections;
+using System.Runtime.InteropServices;
+
+// The Org.Mentalis.Files contains a number of classes that read from or write to special files.
+namespace Org.Mentalis.Files
+{
+ ///
+ /// The INIReader class can read keys from and write keys to an INI file.
+ ///
+ ///
+ /// This class uses several Win32 API functions to read from and write to INI files. It will not work on Linux or FreeBSD.
+ ///
+ public class IniReader
+ {
+ // API declarations
+ ///
+ /// The GetPrivateProfileInt function retrieves an integer associated with a key in the specified section of an initialization file.
+ ///
+ /// Pointer to a null-terminated string specifying the name of the section in the initialization file.
+ /// Pointer to the null-terminated string specifying the name of the key whose value is to be retrieved. This value is in the form of a string; the GetPrivateProfileInt function converts the string into an integer and returns the integer.
+ /// Specifies the default value to return if the key name cannot be found in the initialization file.
+ /// Pointer to a null-terminated string that specifies the name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
+ /// The return value is the integer equivalent of the string following the specified key name in the specified initialization file. If the key is not found, the return value is the specified default value. If the value of the key is less than zero, the return value is zero.
+ [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileIntA", CharSet = CharSet.Ansi)]
+ private static extern int GetPrivateProfileInt(string lpApplicationName, string lpKeyName, int nDefault, string lpFileName);
+ ///
+ /// The WritePrivateProfileString function copies a string into the specified section of an initialization file.
+ ///
+ /// Pointer to a null-terminated string containing the name of the section to which the string will be copied. If the section does not exist, it is created. The name of the section is case-independent; the string can be any combination of uppercase and lowercase letters.
+ /// Pointer to the null-terminated string containing the name of the key to be associated with a string. If the key does not exist in the specified section, it is created. If this parameter is NULL, the entire section, including all entries within the section, is deleted.
+ /// Pointer to a null-terminated string to be written to the file. If this parameter is NULL, the key pointed to by the lpKeyName parameter is deleted.
+ /// Pointer to a null-terminated string that specifies the name of the initialization file.
+ /// If the function successfully copies the string to the initialization file, the return value is nonzero; if the function fails, or if it flushes the cached version of the most recently accessed initialization file, the return value is zero.
+ [DllImport("KERNEL32.DLL", EntryPoint = "WritePrivateProfileStringA", CharSet = CharSet.Ansi)]
+ private static extern int WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName);
+ ///
+ /// The GetPrivateProfileString function retrieves a string from the specified section in an initialization file.
+ ///
+ /// Pointer to a null-terminated string that specifies the name of the section containing the key name. If this parameter is NULL, the GetPrivateProfileString function copies all section names in the file to the supplied buffer.
+ /// Pointer to the null-terminated string specifying the name of the key whose associated string is to be retrieved. If this parameter is NULL, all key names in the section specified by the lpAppName parameter are copied to the buffer specified by the lpReturnedString parameter.
+ /// Pointer to a null-terminated default string. If the lpKeyName key cannot be found in the initialization file, GetPrivateProfileString copies the default string to the lpReturnedString buffer. This parameter cannot be NULL.
Avoid specifying a default string with trailing blank characters. The function inserts a null character in the lpReturnedString buffer to strip any trailing blanks.
+ /// Pointer to the buffer that receives the retrieved string.
+ /// Specifies the size, in TCHARs, of the buffer pointed to by the lpReturnedString parameter.
+ /// Pointer to a null-terminated string that specifies the name of the initialization file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
+ /// The return value is the number of characters copied to the buffer, not including the terminating null character.
+ [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringA", CharSet = CharSet.Ansi)]
+ private static extern int GetPrivateProfileString(string lpApplicationName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
+ ///
+ /// The GetPrivateProfileSectionNames function retrieves the names of all sections in an initialization file.
+ ///
+ /// Pointer to a buffer that receives the section names associated with the named file. The buffer is filled with one or more null-terminated strings; the last string is followed by a second null character.
+ /// Specifies the size, in TCHARs, of the buffer pointed to by the lpszReturnBuffer parameter.
+ /// Pointer to a null-terminated string that specifies the name of the initialization file. If this parameter is NULL, the function searches the Win.ini file. If this parameter does not contain a full path to the file, the system searches for the file in the Windows directory.
+ /// The return value specifies the number of characters copied to the specified buffer, not including the terminating null character. If the buffer is not large enough to contain all the section names associated with the specified initialization file, the return value is equal to the length specified by nSize minus two.
+ [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileSectionNamesA", CharSet = CharSet.Ansi)]
+ private static extern int GetPrivateProfileSectionNames(byte[] lpszReturnBuffer, int nSize, string lpFileName);
+ ///
+ /// The WritePrivateProfileSection function replaces the keys and values for the specified section in an initialization file.
+ ///
+ /// Pointer to a null-terminated string specifying the name of the section in which data is written. This section name is typically the name of the calling application.
+ /// Pointer to a buffer containing the new key names and associated values that are to be written to the named section.
+ /// Pointer to a null-terminated string containing the name of the initialization file. If this parameter does not contain a full path for the file, the function searches the Windows directory for the file. If the file does not exist and lpFileName does not contain a full path, the function creates the file in the Windows directory. The function does not create a file if lpFileName contains the full path and file name of a file that does not exist.
+ /// If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
+ [DllImport("KERNEL32.DLL", EntryPoint = "WritePrivateProfileSectionA", CharSet = CharSet.Ansi)]
+ private static extern int WritePrivateProfileSection(string lpAppName, string lpString, string lpFileName);
+ /// Constructs a new IniReader instance.
+ /// Specifies the full path to the INI file (the file doesn't have to exist).
+ public IniReader(string file)
+ {
+ Filename = file;
+ }
+ /// Gets or sets the full path to the INI file.
+ /// A String representing the full path to the INI file.
+ public string Filename
+ {
+ get
+ {
+ return m_Filename;
+ }
+ set
+ {
+ m_Filename = value;
+ }
+ }
+ /// Gets or sets the section you're working in. (aka 'the active section')
+ /// A String representing the section you're working in.
+ public string Section
+ {
+ get
+ {
+ return m_Section;
+ }
+ set
+ {
+ m_Section = value;
+ }
+ }
+ /// Reads an Integer from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// The value to return if the specified key isn't found.
+ /// Returns the value of the specified section/key pair, or returns the default value if the specified section/key pair isn't found in the INI file.
+ public int ReadInteger(string section, string key, int defVal)
+ {
+ return GetPrivateProfileInt(section, key, defVal, Filename);
+ }
+ /// Reads an Integer from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// Returns the value of the specified section/key pair, or returns 0 if the specified section/key pair isn't found in the INI file.
+ public int ReadInteger(string section, string key)
+ {
+ return ReadInteger(section, key, 0);
+ }
+ /// Reads an Integer from the specified key of the active section.
+ /// The key from which to return the value.
+ /// The section to search in.
+ /// Returns the value of the specified Key, or returns the default value if the specified Key isn't found in the active section of the INI file.
+ public int ReadInteger(string key, int defVal)
+ {
+ return ReadInteger(Section, key, defVal);
+ }
+ /// Reads an Integer from the specified key of the active section.
+ /// The key from which to return the value.
+ /// Returns the value of the specified key, or returns 0 if the specified key isn't found in the active section of the INI file.
+ public int ReadInteger(string key)
+ {
+ return ReadInteger(key, 0);
+ }
+ /// Reads a String from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// The value to return if the specified key isn't found.
+ /// Returns the value of the specified section/key pair, or returns the default value if the specified section/key pair isn't found in the INI file.
+ public string ReadString(string section, string key, string defVal)
+ {
+ StringBuilder sb = new StringBuilder(MAX_ENTRY);
+ int Ret = GetPrivateProfileString(section, key, defVal, sb, MAX_ENTRY, Filename);
+ return sb.ToString();
+ }
+ /// Reads a String from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// Returns the value of the specified section/key pair, or returns an empty String if the specified section/key pair isn't found in the INI file.
+ public string ReadString(string section, string key)
+ {
+ return ReadString(section, key, "");
+ }
+ /// Reads a String from the specified key of the active section.
+ /// The key from which to return the value.
+ /// Returns the value of the specified key, or returns an empty String if the specified key isn't found in the active section of the INI file.
+ public string ReadString(string key)
+ {
+ return ReadString(Section, key);
+ }
+ /// Reads a Long from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// The value to return if the specified key isn't found.
+ /// Returns the value of the specified section/key pair, or returns the default value if the specified section/key pair isn't found in the INI file.
+ public long ReadLong(string section, string key, long defVal)
+ {
+ return long.Parse(ReadString(section, key, defVal.ToString()));
+ }
+ /// Reads a Long from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// Returns the value of the specified section/key pair, or returns 0 if the specified section/key pair isn't found in the INI file.
+ public long ReadLong(string section, string key)
+ {
+ return ReadLong(section, key, 0);
+ }
+ /// Reads a Long from the specified key of the active section.
+ /// The key from which to return the value.
+ /// The section to search in.
+ /// Returns the value of the specified key, or returns the default value if the specified key isn't found in the active section of the INI file.
+ public long ReadLong(string key, long defVal)
+ {
+ return ReadLong(Section, key, defVal);
+ }
+ /// Reads a Long from the specified key of the active section.
+ /// The key from which to return the value.
+ /// Returns the value of the specified Key, or returns 0 if the specified Key isn't found in the active section of the INI file.
+ public long ReadLong(string key)
+ {
+ return ReadLong(key, 0);
+ }
+ /// Reads a Byte array from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// Returns the value of the specified section/key pair, or returns null (Nothing in VB.NET) if the specified section/key pair isn't found in the INI file.
+ public byte[] ReadByteArray(string section, string key)
+ {
+ try
+ {
+ return Convert.FromBase64String(ReadString(section, key));
+ }
+ catch { }
+ return null;
+ }
+ /// Reads a Byte array from the specified key of the active section.
+ /// The key from which to return the value.
+ /// Returns the value of the specified key, or returns null (Nothing in VB.NET) if the specified key pair isn't found in the active section of the INI file.
+ public byte[] ReadByteArray(string key)
+ {
+ return ReadByteArray(Section, key);
+ }
+ /// Reads a Boolean from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// The value to return if the specified key isn't found.
+ /// Returns the value of the specified section/key pair, or returns the default value if the specified section/key pair isn't found in the INI file.
+ public bool ReadBoolean(string section, string key, bool defVal)
+ {
+ return Boolean.Parse(ReadString(section, key, defVal.ToString()));
+ }
+ /// Reads a Boolean from the specified key of the specified section.
+ /// The section to search in.
+ /// The key from which to return the value.
+ /// Returns the value of the specified section/key pair, or returns false if the specified section/key pair isn't found in the INI file.
+ public bool ReadBoolean(string section, string key)
+ {
+ return ReadBoolean(section, key, false);
+ }
+ /// Reads a Boolean from the specified key of the specified section.
+ /// The key from which to return the value.
+ /// The value to return if the specified key isn't found.
+ /// Returns the value of the specified key pair, or returns the default value if the specified key isn't found in the active section of the INI file.
+ public bool ReadBoolean(string key, bool defVal)
+ {
+ return ReadBoolean(Section, key, defVal);
+ }
+ /// Reads a Boolean from the specified key of the specified section.
+ /// The key from which to return the value.
+ /// Returns the value of the specified key, or returns false if the specified key isn't found in the active section of the INI file.
+ public bool ReadBoolean(string key)
+ {
+ return ReadBoolean(Section, key);
+ }
+ /// Writes an Integer to the specified key in the specified section.
+ /// The section to write in.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string section, string key, int value)
+ {
+ return Write(section, key, value.ToString());
+ }
+ /// Writes an Integer to the specified key in the active section.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string key, int value)
+ {
+ return Write(Section, key, value);
+ }
+ /// Writes a String to the specified key in the specified section.
+ /// Specifies the section to write in.
+ /// Specifies the key to write to.
+ /// Specifies the value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string section, string key, string value)
+ {
+ return (WritePrivateProfileString(section, key, value, Filename) != 0);
+ }
+ /// Writes a String to the specified key in the active section.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string key, string value)
+ {
+ return Write(Section, key, value);
+ }
+ /// Writes a Long to the specified key in the specified section.
+ /// The section to write in.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string section, string key, long value)
+ {
+ return Write(section, key, value.ToString());
+ }
+ /// Writes a Long to the specified key in the active section.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string key, long value)
+ {
+ return Write(Section, key, value);
+ }
+ /// Writes a Byte array to the specified key in the specified section.
+ /// The section to write in.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string section, string key, byte[] value)
+ {
+ if (value == null)
+ return Write(section, key, (string)null);
+ else
+ return Write(section, key, value, 0, value.Length);
+ }
+ /// Writes a Byte array to the specified key in the active section.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string key, byte[] value)
+ {
+ return Write(Section, key, value);
+ }
+ /// Writes a Byte array to the specified key in the specified section.
+ /// The section to write in.
+ /// The key to write to.
+ /// The value to write.
+ /// An offset in value.
+ /// The number of elements of value to convert.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string section, string key, byte[] value, int offset, int length)
+ {
+ if (value == null)
+ return Write(section, key, (string)null);
+ else
+ return Write(section, key, Convert.ToBase64String(value, offset, length));
+ }
+ /// Writes a Boolean to the specified key in the specified section.
+ /// The section to write in.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string section, string key, bool value)
+ {
+ return Write(section, key, value.ToString());
+ }
+ /// Writes a Boolean to the specified key in the active section.
+ /// The key to write to.
+ /// The value to write.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool Write(string key, bool value)
+ {
+ return Write(Section, key, value);
+ }
+ /// Deletes a key from the specified section.
+ /// The section to delete from.
+ /// The key to delete.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool DeleteKey(string section, string key)
+ {
+ return (WritePrivateProfileString(section, key, null, Filename) != 0);
+ }
+ /// Deletes a key from the active section.
+ /// The key to delete.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool DeleteKey(string key)
+ {
+ return (WritePrivateProfileString(Section, key, null, Filename) != 0);
+ }
+ /// Deletes a section from an INI file.
+ /// The section to delete.
+ /// Returns true if the function succeeds, false otherwise.
+ public bool DeleteSection(string section)
+ {
+ return WritePrivateProfileSection(section, null, Filename) != 0;
+ }
+ /// Retrieves a list of all available sections in the INI file.
+ /// Returns an ArrayList with all available sections.
+ public ArrayList GetSectionNames()
+ {
+ try
+ {
+ byte[] buffer = new byte[MAX_ENTRY];
+ GetPrivateProfileSectionNames(buffer, MAX_ENTRY, Filename);
+ string[] parts = Encoding.ASCII.GetString(buffer).Trim('\0').Split('\0');
+ return new ArrayList(parts);
+ }
+ catch { }
+ return null;
+ }
+ //Private variables and constants
+ ///
+ /// Holds the full path to the INI file.
+ ///
+ private string m_Filename;
+ ///
+ /// Holds the active section name
+ ///
+ private string m_Section;
+ ///
+ /// The maximum number of bytes in a section buffer.
+ ///
+ private const int MAX_ENTRY = 32768;
+ }
+}
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Org.Mentalis.Files.csproj b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Org.Mentalis.Files.csproj
new file mode 100644
index 00000000..17b541aa
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Org.Mentalis.Files.csproj
@@ -0,0 +1,67 @@
+
+
+ Debug
+ AnyCPU
+ 8.0.50727
+ 2.0
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}
+ Library
+ Properties
+ Org.Mentalis.Files
+ Org.Mentalis.Files
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ prompt
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Org.Mentalis.Files.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Org.Mentalis.Files.csproj.vspscc
new file mode 100644
index 00000000..9e62459d
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Org.Mentalis.Files.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\Org.Mentalis.Files"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Properties/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..9b3fae73
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Org.Mentalis.Files/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
+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("Org.Mentalis.Files")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Org.Mentalis.Files")]
+[assembly: AssemblyCopyright("Copyright © 2012")]
+[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("fd26053d-c25d-46ca-961c-7016c31e8b4b")]
+
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/RODBInterface/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs
new file mode 100644
index 00000000..88a34c93
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.cs
@@ -0,0 +1,3047 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: RODBInterface.cs $ $Revision: 48 $
+ * $Author: Kathy $ $Date: 9/06/05 11:25a $
+ *
+ * $History: RODBInterface.cs $
+ *
+ * ***************** Version 48 *****************
+ * User: Kathy Date: 9/06/05 Time: 11:25a
+ * Updated in $/LibSource/RODBInterface
+ * B2005-035
+ *
+ * ***************** Version 47 *****************
+ * User: Jsj Date: 5/03/05 Time: 11:45a
+ * Updated in $/LibSource/RODBInterface
+ *
+ * ***************** Version 46 *****************
+ * User: Kathy Date: 7/15/04 Time: 11:10a
+ * Updated in $/LibSource/RODBInterface
+ * Fix B2004-016
+ *
+ * ***************** Version 45 *****************
+ * User: Jsj Date: 5/19/04 Time: 11:11a
+ * Updated in $/LibSource/RODBInterface
+ * fixed typo in warning message
+ *
+ * ***************** Version 44 *****************
+ * User: Jsj Date: 5/13/04 Time: 2:19p
+ * Updated in $/LibSource/RODBInterface
+ * RO FST will skip records that do not have a valid parent.
+ *
+ * ***************** Version 43 *****************
+ * User: Jsj Date: 5/11/04 Time: 9:28a
+ * Updated in $/LibSource/RODBInterface
+ * We were getting multiple tree entries after creating the FST file.
+ *
+ * ***************** Version 42 *****************
+ * User: Jsj Date: 4/08/04 Time: 9:42a
+ * Updated in $/LibSource/RODBInterface
+ * Optimized and added new read functions to speed up RO.FST file
+ * creation.
+ *
+ * ***************** Version 41 *****************
+ * User: Jsj Date: 3/19/04 Time: 9:40a
+ * Updated in $/LibSource/RODBInterface
+ * bug fix, was using parent node's group definition instead of the
+ * current node's group definition
+ * B2004-008
+ *
+ * ***************** Version 40 *****************
+ * User: Jsj Date: 1/12/04 Time: 12:08p
+ * Updated in $/LibSource/RODBInterface
+ * changed SQL Server catalog name from"RO" to "VEPROMS RO"
+ *
+ * ***************** Version 39 *****************
+ * User: Jsj Date: 1/07/04 Time: 2:17p
+ * Updated in $/LibSource/RODBInterface
+ * allow use of SQL Server
+ *
+ * ***************** Version 38 *****************
+ * User: Kathy Date: 5/30/03 Time: 12:47p
+ * Updated in $/LibSource/RODBInterface
+ * B2003-040: flag inserted groups have no children for xml
+ *
+ * ***************** Version 37 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:44p
+ * Updated in $/LibSource/RODBInterface
+ * B2003-041: field name changes fixes.
+ *
+ * ***************** Version 36 *****************
+ * User: Kathy Date: 5/07/03 Time: 1:57p
+ * Updated in $/LibSource/RODBInterface
+ * B2003-033 fix
+ *
+ * ***************** Version 35 *****************
+ * User: Jsj Date: 4/14/03 Time: 2:59p
+ * Updated in $/LibSource/RODBInterface
+ * changes to help speed up RO FST file creation
+ *
+ * ***************** Version 34 *****************
+ * User: Kathy Date: 4/04/03 Time: 9:39a
+ * Updated in $/LibSource/RODBInterface
+ * B2003-030: flag parent's HasChild attribute for new ros
+ *
+ * ***************** Version 33 *****************
+ * User: Kathy Date: 3/13/03 Time: 1:17p
+ * Updated in $/LibSource/RODBInterface
+ * master different than local fieldname, use local
+ *
+ * ***************** Version 32 *****************
+ * User: Kathy Date: 1/27/03 Time: 2:12p
+ * Updated in $/LibSource/RODBInterface
+ * test oledb
+ *
+ * ***************** Version 31 *****************
+ * User: Kathy Date: 12/17/02 Time: 2:32p
+ * Updated in $/LibSource/RODBInterface
+ * new top group with apostrophe failed
+ *
+ * ***************** Version 30 *****************
+ * User: Kathy Date: 12/17/02 Time: 11:05a
+ * Updated in $/LibSource/RODBInterface
+ * fixed bug on apostrophe in field def (schema string)
+ *
+ * ***************** Version 29 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:24p
+ * Updated in $/LibSource/RODBInterface
+ * fieldname special chars & various bug fixes
+ *
+ * ***************** Version 28 *****************
+ * User: Kathy Date: 12/06/02 Time: 11:57a
+ * Updated in $/LibSource/RODBInterface
+ * mods for SQL Server
+ *
+ * ***************** Version 27 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:28a
+ * Updated in $/LibSource/RODBInterface
+ * fieldname replace chars
+ *
+ * ***************** Version 26 *****************
+ * User: Kathy Date: 12/02/02 Time: 6:11a
+ * Updated in $/LibSource/RODBInterface
+ * Fix some bugs and add status bar on long ops
+ *
+ * ***************** Version 25 *****************
+ * User: Jsj Date: 11/27/02 Time: 12:46p
+ * Updated in $/LibSource/RODBInterface
+ * modifications for RO.FST file creation
+ *
+ * ***************** Version 24 *****************
+ * User: Kathy Date: 11/26/02 Time: 12:56p
+ * Updated in $/LibSource/RODBInterface
+ * fixed single quote crash in accpageid
+ *
+ * ***************** Version 23 *****************
+ * User: Kathy Date: 11/11/02 Time: 7:15a
+ * Updated in $/LibSource/RODBInterface
+ * Added RODB_ReadRO to read an RO given a recid/table name
+ *
+ * ***************** Version 22 *****************
+ * User: Kathy Date: 10/24/02 Time: 11:16a
+ * Updated in $/LibSource/RODBInterface
+ * delete hi-level group (table)
+ *
+ * ***************** Version 21 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:16p
+ * Updated in $/LibSource/RODBInterface
+ * minor bug fixes & new group (database, i.e. table level)
+ *
+ * ***************** Version 20 *****************
+ * User: Kathy Date: 10/10/02 Time: 1:04p
+ * Updated in $/LibSource/RODBInterface
+ * xmltree=tree control
+ *
+ * ***************** Version 19 *****************
+ * User: Kathy Date: 10/10/02 Time: 10:56a
+ * Updated in $/LibSource/RODBInterface
+ * console.writeline->Messagebox
+ *
+ * ***************** Version 18 *****************
+ * User: Kathy Date: 10/10/02 Time: 10:00a
+ * Updated in $/LibSource/RODBInterface
+ * delete bug fix & accessory page id support
+ *
+ * ***************** Version 17 *****************
+ * User: Kathy Date: 10/07/02 Time: 11:25a
+ * Updated in $/LibSource/RODBInterface
+ * image file saving of xml using xmltextwriter was missing sometext
+ *
+ * ***************** Version 16 *****************
+ * User: Kathy Date: 10/02/02 Time: 1:41p
+ * Updated in $/LibSource/RODBInterface
+ * tie tree to insert/delete changes (round 1)
+ *
+ * ***************** Version 15 *****************
+ * User: Jsj Date: 10/01/02 Time: 4:45p
+ * Updated in $/LibSource/RODBInterface
+ * hooks for passed in database path
+ *
+ * ***************** Version 14 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:22p
+ * Updated in $/LibSource/RODBInterface
+ * remove using vlnxml
+ *
+ * ***************** Version 13 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:18p
+ * Updated in $/LibSource/RODBInterface
+ * fix digit as first char in fieldname & recurse through tree adjusting
+ * for modified field names
+ *
+ * ***************** Version 12 *****************
+ * User: Jsj Date: 9/26/02 Time: 11:13a
+ * Updated in $/LibSource/RODBInterface
+ * added VLNXML reference
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:55a
+ * Updated in $/LibSource/RODBInterface
+ * generate xml strings for writing to database by using xmltextwriter
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 9/19/02 Time: 10:02a
+ * Updated in $/LibSource/RODBInterface
+ * minor changes for schema and other bug fixes
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:14p
+ * Updated in $/LibSource/RODBInterface
+ * vlnxml
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 9/10/02 Time: 12:54p
+ * Updated in $/LibSource/RODBInterface
+ * menu titles
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 9/06/02 Time: 11:43a
+ * Updated in $/LibSource/RODBInterface
+ * datetimestamp
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 8/30/02 Time: 11:56a
+ * Updated in $/LibSource/RODBInterface
+ * new/update ro field records.
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 8/30/02 Time: 9:43a
+ * Updated in $/LibSource/RODBInterface
+ * compile
+ *
+ * ***************** Version 4 *****************
+ * User: Jsj Date: 8/28/02 Time: 3:40p
+ * Updated in $/LibSource/RODBInterface
+ * added a create table function
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 8/28/02 Time: 3:03p
+ * Updated in $/LibSource/RODBInterface
+ * read connection strings from a text file
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 8/28/02 Time: 10:52a
+ * Updated in $/LibSource/RODBInterface
+ * development
+ *********************************************************************************************/
+
+
+using System;
+using System.Collections;
+using System.IO;
+using System.Data;
+using System.Xml;
+using System.Xml.XPath;
+using System.Xml.Schema;
+using System.Text;
+using System.Windows.Forms;
+using DBEncapsulation;
+using ROFields;
+using VlnStatus;
+//using IniFileIO;
+using System.Collections.Specialized;
+using Org.Mentalis.Files;
+//using VlnProfiler; //don't forget to add VlnProfiler to the reference list
+
+namespace RODBInterface
+{
+ ///
+ /// Summary description for Class1
+ ///
+ public enum RecordType: uint
+ {
+ Master=0, SubDatabase=1, Schema=2, Group=3, GroupSchema=4, RRO=5, SchemaStart=6, SchemaEnd=7
+ }
+
+ ///
+ /// The following class handles generation of sql strings to get/put requested parts of
+ /// XML RO Tree. And performs the database access using the VLN_DB class.
+ ///
+ public class RODB
+ {
+ DBEncapsulation.DBEncapsulate DBE;
+ DBEncapsulation.OLEDB_DBEncap DBE_OLEDB;
+// DBEncapsulation.ODBC_DBEncap DBE_ODBC;
+
+ private VlnXmlDocument ROXml;
+ private string schemastart;
+ private string schemaend;
+ private string lastTable="";
+ private HybridDictionary dicFldTypes;
+
+// private string strAccOLEDBconn = "";
+// private string strSQLOLEDBconn = "";
+// private string strAccODBCconn = "";
+// private string strodbcConn = "";
+
+ private string strDatabaseConnectionCommand;
+
+// int dbConnectionType = 0; // we are only doing OLE-DB
+ int dbProviderType = 0;
+ string dbServerPath="";
+ string dbServerUserName="";
+ string dbServerPassword="";
+
+// private enum CONNTYPE {OLEDB, ODBC};
+ private enum DB_PROVIDER {ACCESS,SQL_SERVER,ORACLE};
+
+// public RODB(int conntype, string connectstring)
+ public RODB(string RODirectoyPath)
+ {
+ // Setup the connection string
+ //if (RODirectoyPath.Equals(""))
+ // GetConnectionStringFromFile();
+ //else
+ BuildConnectionString(RODirectoyPath);
+
+ // Initialize the connection depending on OLE-DB or ODBC:
+// conntype = 2; // ODBC: 1; // OLE-DB: 2 need to define this programmatically
+ //END OF TEMPORARY
+
+ // Either use an OLE-DB or ODBC connection, depending on what was passed in.
+//**** We are only doing OLE-DB
+// if ( dbConnectionType == (int)CONNTYPE.ODBC) // ODBC
+// {
+// DBE_ODBC = new ODBC_DBEncap();
+// DBE = DBE_ODBC;
+// }
+// else // OLE-DB
+// {
+ DBE_OLEDB = new OLEDB_DBEncap();
+ DBE = DBE_OLEDB;
+// }
+
+ try
+ {
+// DBE.Connection(strAccOLEDBconn);
+ //DBE.Connection(strodbcConn);
+ //SQL:
+// DBE.Connection(strSQLOLEDBconn);
+ DBE.Connection(strDatabaseConnectionCommand);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Setup of OLEDB/ODBC");
+ }
+ }
+
+
+// public void GetConnectionStringFromFile()
+// {
+// /* This file should contain the connection strings in the followin order:
+// * AccOLEDBconn, SQLOLEDBconn, AccODBCconn, odbcConn.
+// */
+// // append "ConnectList.txt" to the path of the location of the exe being run
+// // for example: VE-PROMS.NET\BIN or BIN\DEBUG
+// // This set in Visual Studio .NET in the properties dialog of the project, select
+// // Configuration Properties. You will see an option call Output Path.
+// string FileName = Application.StartupPath + "\\ConnectList.txt";
+//
+// if (!File.Exists(FileName))
+// {
+// // File does not exist
+// MessageBox.Show("Could not find ConnectList.txt file");
+// return;
+// }
+//
+// /*
+// * Open the text file for reading
+// */
+// StreamReader sr = File.OpenText(FileName);
+//
+// /*
+// * Connection string to MS-access use with oledb directly
+// */
+// strAccOLEDBconn = sr.ReadLine();
+//
+// /*
+// * connection string to SQL-server use with oledb
+// */
+// strSQLOLEDBconn = sr.ReadLine();
+//
+// /*
+// * connection string to for oledb to odbc dsn
+// */
+// strAccODBCconn = sr.ReadLine();
+//
+// /*
+// * ODBC connection:
+// * ACCESS:
+// */
+// strodbcConn = sr.ReadLine();
+//
+// sr.Close(); // close ConnectList.txt
+//
+// }
+
+ private void GetDbServerInfo(string ROdir)
+ {
+// string strConnectionType;
+ string strServerProvider;
+ string ROiniPath = ROdir + "\\ROAPP.INI";
+
+ //**** For now we are only doing OLE-DB
+ //****
+ // Get the database connection type
+// strConnectionType = TheIniFile.GetINIKeyValueStr("Database Server","Connection Type","OLEDB",10,ROiniPath);
+// strConnectionType = strConnectionType.ToUpper();
+// if (strConnectionType.Equals("OLEDB"))
+// dbConnectionType = (int)CONNTYPE.OLEDB;
+// else if (strConnectionType.Equals("ODBC"))
+// {
+// dbConnectionType = (int)CONNTYPE.ODBC;
+// dbODBC_DNS = TheIniFile.GetINIKeyValueStr("Database Server","DNS","",10,ROiniPath);
+// }
+
+ // Get the database Provider name - default to Access
+ IniReader in1 = new IniReader(ROiniPath);
+ strServerProvider = in1.ReadString("Database Server","Driver","ACCESS");
+ strServerProvider = strServerProvider.ToUpper();
+ if (strServerProvider.Equals("SQL SERVER"))
+ dbProviderType = (int)DB_PROVIDER.SQL_SERVER;
+ else if (strServerProvider.Equals("ORACLE"))
+ dbProviderType = (int)DB_PROVIDER.ORACLE;
+ else // default to ACCESS
+ dbProviderType = (int)DB_PROVIDER.ACCESS;
+
+ // Get the database server path
+ dbServerPath = in1.ReadString("Database Server", "Path", ROdir);
+ dbServerUserName = in1.ReadString("Database Server", "UserID", "");
+ dbServerPassword = in1.ReadString("Database Server", "Password", "");
+ if (dbProviderType.Equals((int)DB_PROVIDER.ACCESS))
+ {
+ if (dbServerUserName.Equals(""))
+ dbServerUserName = "Admin"; // default user name for Access
+ }
+ else if (dbServerUserName.Equals("") || (dbServerUserName.Length>0 && dbServerPassword.Equals("")))
+ {
+ userpass pwdlg = new userpass(dbServerUserName);
+ // If using SQL Server or Oracle
+ // prompt for a user name and password.
+ pwdlg.Text = strServerProvider + pwdlg.Text;
+ if (pwdlg.ShowDialog() == DialogResult.OK)
+ {
+ dbServerUserName = pwdlg.uname;
+ dbServerPassword = pwdlg.pword;
+ }
+ else
+ {
+ dbServerUserName = "";
+ dbServerPassword = "";
+ }
+ }
+ }
+
+ public void BuildConnectionString(string DataConnectionPath)
+ {
+ GetDbServerInfo(DataConnectionPath);
+
+// if (dbConnectionType.Equals(CONNTYPE.OLEDB))
+// {
+ if (dbProviderType.Equals((int)DB_PROVIDER.SQL_SERVER))
+ {
+ /*
+ * Connect to SQL-server using OLEDB
+ */
+ // !!!!! do we need the Workstation ID? if so, we need to pass this in too!
+ // - don't seem to need Workstation ID - jsj 1/6/04
+
+ // strSQLOLEDBconn = "Provider=SQLOLEDB;Persist Security Info=False;User ID=sa;Initial Catalog=RO;Data Source=DELL-W2K-SERVER\\SQL2000;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=KATHY;Use Encryption for Data=False;Tag with column collation when possible=False";
+
+ // strDatabaseConnectionCommand = "Provider=SQLOLEDB;Persist Security Info=False;User ID="+dbServerUserName+";Password="+dbServerPassword+";Initial Catalog=RO;Data Source=" + dbServerPath + ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False";
+ strDatabaseConnectionCommand = "Provider=SQLOLEDB;Persist Security Info=False;User ID="+dbServerUserName+";Password="+dbServerPassword+";Initial Catalog=VEPROMS RO;Data Source="+dbServerPath+";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False";
+ }
+ else if (dbProviderType.Equals((int)DB_PROVIDER.ORACLE))
+ {
+ // Don't know if this connect string will work or not on Oracle
+ // we need to test this with an Oracle Database Server
+ // Note that this is the same connection string used for SQL Server
+ // BUT the provider is different!
+ strDatabaseConnectionCommand = "Provider=MSDAORA;Persist Security Info=False;User ID="+dbServerUserName+";Password="+dbServerPassword+";Initial Catalog=VEPROMS RO;Data Source="+dbServerPath+";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False";
+ }
+ else
+ {
+ /*
+ * Connect to MSAccess using OLEDB directly
+ */
+
+ // strAccOLEDBconn = "Provider=Microsoft.Jet.OLEDB.4.0;Password=\"\";User ID=Admin;Data Source=I:\\RO Design\\RO\\ROMaster.mdb;Mode=Share Deny None;Extended Properties=\"\";Jet OLEDB:System database=\"\";Jet OLEDB:Registry Path=\"\";Jet OLEDB:Database Password=\"\";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=\"\";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False";
+
+ // strAccOLEDBconn = "Provider=Microsoft.Jet.OLEDB.4.0;Password=\"\";User ID=Admin;Data Source=" + DataConnectionPath +"\\ROMaster.mdb;Mode=Share Deny None;Extended Properties=\"\";Jet OLEDB:System database=\"\";Jet OLEDB:Registry Path=\"\";Jet OLEDB:Database Password=\"\";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=\"\";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False";
+ strDatabaseConnectionCommand = "Provider=Microsoft.Jet.OLEDB.4.0;Password=\"\";User ID=Admin;Data Source=" + DataConnectionPath +"\\ROMaster.mdb;Mode=Share Deny None;Extended Properties=\"\";Jet OLEDB:System database=\"\";Jet OLEDB:Registry Path=\"\";Jet OLEDB:Database Password=\"\";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password=\"\";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False";
+ }
+// }
+// else // ODBC connection
+// {
+// if (dbODBC_DNS.Length > 0)
+// {
+//
+// /*
+// * Connect to MSAccess using OLEDB and ODBC DSN
+// */
+//
+// // strAccODBCconn = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Access for RO;Extended Properties=\"DSN=Access for RO;DBQ=I:\\RO Design\\RO\\ROMaster.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;\"";
+//
+// // strAccODBCconn = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Access for RO;Extended Properties=\"DSN=Access for RO;DBQ=" + DataConnectionPath + "\\ROMaster.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;\"";
+// strDatabaseConnectionCommand = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Access for RO;Extended Properties=\"DSN=Access for RO;DBQ=" + DataConnectionPath + "\\ROMaster.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;\"";
+// }
+//
+// /*
+// * Connection to MSAccess using an ODBC connection
+// */
+// // strodbcConn = "Driver={Microsoft Access Driver (*.mdb)};DBQ=i:\\Ro Design\\RO\\ROMaster.mdb";
+// strodbcConn = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" + DataConnectionPath + "\\ROMaster.mdb";
+//
+// // Connection to SQL Server using an ODBC connection
+// //strodbcConn = "Driver={SQL Server};Server=DELL-W2K-SERVER\\SQL2000;UID=sa;Database=ROMaster";
+//
+// //SQL - DSN - worked: string strodbcConn = "DSN=SQL RO;UID=sa";
+// //Initial odbc tests on strodbcconn
+// }
+
+ }
+
+ // get the next table name & update it to the next possible.
+ public string RODB_GetNextGroupTable()
+ {
+ // read record type of master for this table. This is where the highest recid is stored.
+ // Update the recid by 1, write it out and return the new recid.
+ string strGetNxt = "SELECT Info FROM ROMaster where RecID = '00000001' and RecType=" + (uint)RecordType.Master;
+ string rettable=null;
+ try
+ {
+ DBE.Command(strGetNxt);
+ DBE.Reader();
+ if (DBE.Read())
+ {
+ rettable = DBE.GetString(0);
+ string nxttable = rettable.Substring(2,6);
+ int ltbl = System.Convert.ToInt32(nxttable,10);
+ ltbl++;
+ nxttable = ltbl.ToString("d6"); // this format "d6" should pad left with zeros
+ string newstr = "RO" + nxttable;
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ string strUpdate = "UPDATE ROMaster SET Info = '" + newstr + "'";
+ strUpdate = strUpdate + ", ModDateTime = '" + dt + "' WHERE RecID = '00000001' and RecType=" + (uint)RecordType.Master;
+ DBE.Command(strUpdate);
+ DBE.Reader();
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return rettable;
+ }
+
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Getting new record id");
+ }
+
+ return null;
+ }
+
+ // get the next recid for this table & update it.
+ public string RODB_GetNextRecId(string table)
+ {
+ // read record type of master for this table. This is where the highest recid is stored.
+ // Update the recid by 1, write it out and return the new recid.
+ string strGetNxt = "SELECT Info FROM " + table + " where RecID = '00000000' and RecType=" + (uint)RecordType.Master;
+
+ try
+ {
+ DBE.Command(strGetNxt);
+ DBE.Reader();
+ if (DBE.Read())
+ {
+ string RecID = DBE.GetString(0);
+
+ int lrecid = System.Convert.ToInt32(RecID,16);
+ lrecid++;
+ RecID = lrecid.ToString("x");
+
+ // need an 8 char string so pad left with zero
+ string padstr = RecID.PadLeft(8,'0');
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ string strUpdate = "UPDATE " + table + " SET Info = '" + padstr + "'";
+ strUpdate = strUpdate + ", ModDateTime = '" + dt + "' WHERE RecID = '00000000' and RecType=" + (uint)RecordType.Master;
+ DBE.Command(strUpdate);
+ DBE.Reader();
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return padstr;
+ }
+
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Getting new record id");
+ }
+ return null;
+ }
+
+ public VlnXmlDocument RODB_GetRoot()
+ {
+ // Create an xmldoc and initialize it with a root node
+ ROXml = new VlnXmlDocument();
+ XmlNode elem=ROXml.CreateNode(XmlNodeType.Element, "RO_Root", "");
+ ROXml.AppendChild(elem);
+ return ROXml;
+ }
+
+ // pass in root node. This will get Groups from Root node. This is a special case because
+ // the list of top level groups is off of the ROMaster database.
+ public bool RODB_GetRootGroups(VlnXmlElement root)
+ {
+ string table;
+ string group;
+ string title;
+
+ // Get menu fields to display
+ try
+ {
+ DBE.OpenConnection();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Could not open database connection");
+// MessageBox.Show(e.StackTrace,"Debug");
+ return false;
+ }
+
+ string strGetGroups = "SELECT RecID,Info FROM ROMaster where RecType = " + (uint) RecordType.SubDatabase;
+ strGetGroups += " ORDER BY RecID ASC";
+ DBE.Command(strGetGroups);
+ DBE.Reader();
+
+ SortedList mySL = new SortedList();
+ while(DBE.Read())
+ {
+ // Parse info string, it has group name & table name. Store in a sorted
+ // list, sorting by Group Name.
+ string mrecid = DBE.GetString(0);
+ group = DBE.GetString(1);
+ mySL.Add(mrecid,group);
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+
+ // Now, for each group, i.e. table, make xml elements for the top level groups by
+ // reading in the Xml Element for the group from each table.
+ for ( int i = 0; i < mySL.Count; i++ )
+ {
+ group = mySL.GetByIndex(i).ToString();
+ int grnamindx = group.IndexOf("\t");
+ if (grnamindx == -1)
+ {// no tab, default to RO000001
+ table = "RO000001";
+ title = group;
+ }
+ else
+ {
+ StringBuilder tablesb = new StringBuilder(70);
+ tablesb.Append(group);
+ tablesb.Remove(0,grnamindx+1);
+ table = tablesb.ToString();
+ title = group.Substring(0,grnamindx);
+ }
+ strGetGroups = "SELECT RecID,Info FROM " + table + " where RecType = " + (uint) RecordType.Group;
+ strGetGroups = strGetGroups + " and ParentID = '00000000'";
+ strGetGroups += " ORDER BY RecID ASC";
+ try
+ {
+ DBE.Command(strGetGroups);
+ DBE.Reader();
+
+ if(DBE.Read())
+ {
+ string RecID = DBE.GetString(0);
+ string Info = DBE.GetString(1);
+ XmlTextReader rdr = new XmlTextReader(Info, XmlNodeType.Element, null);
+ XmlNode nd = ROXml.ReadNode(rdr);
+ VlnXmlElement elem = (VlnXmlElement)nd;
+ root.AppendChild(elem);
+ elem.SetAttribute("RecID", RecID);
+ elem.SetAttribute("ParentID","00000000");
+ elem.SetAttribute("Table", table);
+ elem.SetAttribute("MasterRecID", mySL.GetKey(i).ToString());
+ //elem.SetAttribute("MenuTitle", elem.InnerText);
+ }
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error getting group data");
+ // try to continue on with the next group - may be one missing table.
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ }
+ // get child count for each group.
+ XmlNode node = root.FirstChild;
+ while (node != null)
+ {
+ if (node is VlnXmlElement)
+ {
+ VlnXmlElement child = (VlnXmlElement) node;
+ //get child count for each table listed in innertext.
+ string strGetSubCount = "SELECT COUNT (RecID) as cnt FROM " + child.GetAttribute("Table") + " WHERE ";
+ strGetSubCount = strGetSubCount + "ParentID='" + child.GetAttribute("RecID") + "'";
+ try
+ {
+ DBE.Command(strGetSubCount);
+ DBE.Reader();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error reading RO Data");
+ return false;
+ }
+ if (DBE.Read())
+ {
+ int cnt = DBE.GetInt32(0);
+ if (cnt>0)
+ child.SetAttribute("HasChild","True");
+ else
+ child.SetAttribute("HasChild","False");
+ child.SetAttribute("ChildLoaded","False");
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ }
+
+ node = node.NextSibling;
+ }
+
+ // for the beginning and end schema element, go to the master & read it from there. Store these to be used
+ // by all of the databases.
+
+ string strGetSchemaPiece;
+ schemastart = null;
+ strGetSchemaPiece = "SELECT Info From ROMaster where (ParentID='00000000' and RecType = " + (uint) RecordType.SchemaStart + ")";
+ DBE.Command(strGetSchemaPiece);
+ DBE.Reader();
+ if (DBE.Read())
+ schemastart = DBE.GetString(0);
+ else
+ {
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return false;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ schemaend = null;
+ strGetSchemaPiece = "SELECT Info From ROMaster where (ParentID='00000000' and RecType = " + (uint) RecordType.SchemaEnd + ")";
+ DBE.Command(strGetSchemaPiece);
+ DBE.Reader();
+ if (DBE.Read())
+ schemaend = DBE.GetString(0);
+ else
+ {
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return false;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return true;
+
+ }
+
+ public bool RODB_DeleteGroup(XmlNode group, string tbname, string toprecid)
+ {
+ VlnXmlElement egroup = null;
+ string strDel;
+ strDel = "DELETE FROM ROMaster WHERE ";
+
+ // delete table entry in ROMaster
+ if (group !=null)
+ {
+ egroup = (VlnXmlElement) group;
+ strDel = strDel + "RecID='" + egroup.GetAttribute("MasterRecID") + "'";
+ }
+ else
+ strDel = strDel + "RecID='" + toprecid + "'";
+
+ try
+ {
+ DBE.Command(strDel);
+ DBE.Reader();
+ DBE.Read();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error When deleting SubGroup ROs.");
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return false;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+
+ // now remove the table.
+ if (egroup != null)
+ strDel = "DROP TABLE " + egroup.GetAttribute("Table");
+ else
+ strDel = "DROP TABLE " + tbname;
+ try
+ {
+ DBE.Command(strDel);
+ DBE.Reader();
+ DBE.Read();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error When deleting SubGroup ROs.");
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return false;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return true;
+ }
+
+ // Delete from database either the group or RO from input node.
+ public bool RODB_DeleteRO(XmlNode group)
+ {
+ // delete from database and then delete from tree. delete group and all
+ // subgroups & ros beneath it. delete subgroups by calling this.
+ // note that if just an ro is passed in, it will only delete it.
+ XmlNode node = group.FirstChild;
+ VlnXmlElement child;
+ VlnXmlElement egroup = (VlnXmlElement) group;
+ string strDelSub;
+ if (group.Name == "vlnGroup")
+ {
+ while (node != null)
+ {
+ if (node is VlnXmlElement)
+ {
+ child = (VlnXmlElement) node;
+ // if this is a group, call this again.
+ if (child.Name == "vlnGroup")
+ {
+ bool success = RODB_DeleteRO(node);
+ if (success == false)
+ {
+ MessageBox.Show("error in RODB_DeleteGroup");
+ return false;
+ }
+ }
+
+ }
+ node = node.NextSibling;
+ }
+
+ // delete all db records that have the ParentID = to this group RecID.
+ // (All subgroups should be processed from above recursion.
+ strDelSub = "DELETE FROM " + egroup.GetAttribute("Table") + " WHERE ";
+ strDelSub = strDelSub + "ParentID='" + egroup.GetAttribute("RecID") + "'";
+ try
+ {
+ DBE.Command(strDelSub);
+ DBE.Reader();
+ DBE.Read();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error When deleting SubGroup ROs.");
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return false;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ }
+
+ // now delete this ro or group, i.e. the one passed in.
+ strDelSub = "DELETE FROM " + egroup.GetAttribute("Table") + " WHERE ";
+ strDelSub = strDelSub + "RecID='" + egroup.GetAttribute("RecID") + "'";
+ try
+ {
+ DBE.Command(strDelSub);
+ DBE.Reader();
+ DBE.Read();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error When deleting this RO.");
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return false;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+
+ return true;
+ }
+
+ private string GenerateXmlString(XmlNode node, bool isgroup)
+ {
+ string retstr;
+ XmlTextWriter xmlTextWriter;
+ StringWriter strWriter = new StringWriter();
+ xmlTextWriter = new XmlTextWriter(strWriter);
+ VlnXmlElement enode;
+ XmlNode kid;
+ kid = node.FirstChild;
+ enode = (VlnXmlElement) node;
+
+ if (isgroup == true)
+ {
+ xmlTextWriter.WriteStartElement("vlnGroup");
+ if (enode.HasAttribute("RetVal"))
+ {
+ xmlTextWriter.WriteStartAttribute("RetVal", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("RetVal"));
+ xmlTextWriter.WriteEndAttribute();
+ }
+ if (enode.HasAttribute("MenuItem"))
+ {
+ xmlTextWriter.WriteStartAttribute("MenuItem", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("MenuItem"));
+ xmlTextWriter.WriteEndAttribute();
+ }
+ if (enode.HasAttribute("FieldsInUse"))
+ {
+ xmlTextWriter.WriteStartAttribute("FieldsInUse", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("FieldsInUse"));
+ xmlTextWriter.WriteEndAttribute();
+ }
+ if (enode.HasAttribute("GroupMenuItem"))
+ {
+ xmlTextWriter.WriteStartAttribute("GroupMenuItem", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("GroupMenuItem"));
+ xmlTextWriter.WriteEndAttribute();
+ }
+ if (enode.HasAttribute("GroupFieldsInUse"))
+ {
+ xmlTextWriter.WriteStartAttribute("GroupFieldsInUse", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("GroupFieldsInUse"));
+ xmlTextWriter.WriteEndAttribute();
+ }
+ if (enode.HasAttribute("AccPageID"))
+ {
+ xmlTextWriter.WriteStartAttribute("AccPageID", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("AccPageID"));
+ xmlTextWriter.WriteEndAttribute();
+ }
+ if (enode.HasAttribute("AccPageIDPrefix"))
+ {
+ xmlTextWriter.WriteStartAttribute("AccPageIDPrefix", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("AccPageIDPrefix"));
+ xmlTextWriter.WriteEndAttribute();
+ }
+ xmlTextWriter.WriteStartAttribute("MenuTitle", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("MenuTitle"));
+ xmlTextWriter.WriteEndAttribute();
+
+ while (kid != null)
+ {
+ if ((kid is XmlText) || (kid.ChildNodes.Count == 1 && kid.Name != "vlnGroup"))
+ kid.WriteTo(xmlTextWriter);
+ kid = kid.NextSibling;
+ }
+ }
+ else
+ {
+ xmlTextWriter.WriteStartElement(node.Name);
+
+ xmlTextWriter.WriteStartAttribute("MenuTitle", null);
+ xmlTextWriter.WriteString(enode.GetAttribute("MenuTitle"));
+ xmlTextWriter.WriteEndAttribute();
+
+ while (kid != null)
+ {
+ kid.WriteTo(xmlTextWriter);
+ kid = kid.NextSibling;
+ }
+ }
+
+ xmlTextWriter.WriteEndElement(); // vlnGroup or top of RO.
+ xmlTextWriter.Flush();
+ xmlTextWriter.Close();
+
+ retstr = strWriter.ToString();
+
+ // replace the single quote because ODBC fails if it's in a string because
+ // the single quote represents the beg/end of string when sending string to
+ // ODBC.
+ retstr = retstr.Replace("\'","'");
+ return(retstr);
+ }
+
+ public bool RODB_WriteGroup(XmlNode group, VlnXmlElement master)
+ {
+ bool retval = true;
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ string xmlstr = GenerateXmlString(group, true);
+ string strUpdate = "UPDATE " + master.GetAttribute("Table") + " SET Info = '" + xmlstr + "'";
+ strUpdate = strUpdate + ", ModDateTime = '" + dt + "' WHERE RecID='" + master.GetAttribute("RecID") + "'";
+ try
+ {
+ DBE.Command(strUpdate);
+ DBE.Reader();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error on write group");
+ retval = false;
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return retval;
+ }
+
+ public bool RODB_InsertGroup(VlnXmlElement group)
+ {
+ bool retval = true;
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ string xmlstr = GenerateXmlString(group, true);
+ string strInsert = "INSERT INTO " + group.GetAttribute("Table") + "(RecID, RecType, ParentID, ModDateTime, Info) ";
+ strInsert = strInsert + " VALUES ('" + group.GetAttribute("RecID") + "'," + (uint) RecordType.Group + ",'";
+ strInsert = strInsert + group.GetAttribute("ParentID") + "','" + dt + "','" + xmlstr + "');";
+ try
+ {
+ DBE.Command(strInsert);
+ DBE.Reader();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error on insert group");
+ retval = false;
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return retval;
+ }
+
+ // add a new database table, add a record to master to point to it. return
+ // that record number.
+ public string RODB_AddNewTable(string TblName, string newgrpname)
+ {
+ bool retval = false;
+ // create the table. this is done by doing a select into the new table
+ // from the RoMaster because using the create table command didn't have
+ // a datatype that was compatible between sql & ms-access (for the memo
+ // field 'Info').
+ string strMkTable = "SELECT * INTO " + TblName;
+ strMkTable = strMkTable + " FROM ROMaster WHERE RecID = '00000000';";
+
+ try
+ {
+ DBE.Command(strMkTable);
+ DBE.Reader();
+ retval = true;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error creating table.");
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ // return if error on table create.
+ if (retval == false) return null;
+
+ // remove the first record. It was inserted just to have something to copy to
+ // create the table. (see previous comment)
+
+ string strDel = "DELETE FROM " + TblName + " WHERE RecID = '00000000'";
+ try
+ {
+ DBE.Command(strDel);
+ DBE.Reader();
+ DBE.Read();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error When deleting SubGroup ROs.");
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return null;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+
+ // now insert the first record
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+
+ string strInsert = "INSERT INTO " + TblName + "( RecID, RecType, ParentID, ModDateTime, Info ) ";
+ strInsert = strInsert + " VALUES ('00000000', 0,'00000000','" + dt + "','00000001');";
+ retval = false;
+ try
+ {
+ DBE.Command(strInsert);
+ DBE.Reader();
+ retval=true;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error creating table.");
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+
+ // return if error on insert of master record of new table, otherwise add
+ // this table reference to the master.
+ if (retval == false) return null;
+ string recid = RODB_GetNextRecId("ROMaster");
+ string info = CvtUserFldToFld(newgrpname) + "\t" + TblName;
+ strInsert = "INSERT INTO ROMaster ( RecID, RecType, ParentID, ModDateTime, Info ) ";
+ strInsert = strInsert + " VALUES ('"+recid+"', 1,'00000001','" + dt + "','"+info+"');";
+ retval = false;
+ try
+ {
+ DBE.Command(strInsert);
+ DBE.Reader();
+ retval=true;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error writing new table to master.");
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ if (retval == false)
+ return null;
+ else
+ return recid;
+ }
+
+ // Copy over field definitions from the ROMaster to the input table.
+ public bool RODB_CopyFieldDefs(string fromtb, string totb, int type)
+ {
+ ArrayList retlist = new ArrayList();
+ string strGetFields;
+ string Info;
+ string RecID;
+ string name;
+ uint ftype;
+ ROField rof;
+ bool success;
+
+ // select all of the field definition records in this table.
+ strGetFields = "SELECT RecID, Info from ROMaster where RecType = 2";
+ DBE.Command(strGetFields);
+ DBE.Reader();
+
+ while (DBE.Read())
+ {
+ RecID = DBE.GetString(0);
+ Info = DBE.GetString(1);
+ // it's defined in the local table if the first character is "<" which starts
+ // the schema definition string.
+
+ name = ParseEleName(Info);
+ if (name != null)
+ {
+ // what type of schema element?
+ rof = new ROField(name, RecID, null, 0);
+ ftype = rof.ParseFieldType(Info);
+ rof.SetFieldType(ftype);
+ retlist.Add((object) rof);
+ }
+ }
+
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+
+ // using this list, add new records for field defintion references to the new
+ // table.
+ for (int i=0; i< retlist.Count; i++)
+ {
+ rof = (ROField) retlist[i];
+ if (rof.GetFieldname != null)
+ {
+ string mrecid = rof.GetRecID;
+ string lrecid = RODB_GetNextRecId(totb);
+ StringBuilder strbld = new StringBuilder();
+ strbld.Append(mrecid);
+ strbld.Append(" ");
+ string strtype = rof.GetFieldType.ToString();
+ strbld.Append(strtype.PadLeft(3,'0'));
+ strbld.Append(" ");
+ if (strtype == "128") // append an 'a' for combo type
+ strbld.Append(rof.MakeFieldName(rof.GetFieldname)+"a");
+ else
+ strbld.Append(rof.MakeFieldName(rof.GetFieldname));
+ // add new field.
+ success = RODB_NewSchemaPiece(lrecid, "00000002", totb, strbld.ToString(), 2);
+ if (success == false) return false;
+ }
+ }
+ return true;
+ }
+
+
+ // This is simular to GetChildData() but this function reads in
+ // all the subgroups for the given node
+ // Note that this function is designed to be call for the
+ // root node (i.e. it gets all of group and RO data for a given
+ // database table)
+ public bool RODB_GetGroupAndSubgroups(VlnXmlElement node)
+ {
+ VlnStatusBar StatBar = new VlnStatusBar("Reading from the Database");
+ string tablename = node.GetAttribute("Table");
+
+ string strGetChildData = "SELECT * FROM " + tablename;
+ strGetChildData = strGetChildData + " where (RecType = 3 or RecType = 5) AND ParentID <> '00000002' ORDER BY ParentID,RecID ASC";
+ HybridDictionary dicGroups = new HybridDictionary();
+ dicGroups.Add(node.GetAttribute("RecID").ToString(), node);
+ StatBar.BarMax = RODB_GetNumberOfGroupRecords(tablename); //get number of groups
+ StatBar.BarStepValue = 5;
+ StatBar.StatMsg = node.InnerText;
+
+ DBE.Command(strGetChildData);
+ DBE.Reader();
+ // skip the first record - it's the node that we passed in
+ if (!DBE.Read())
+ {
+ DBE.ReaderClose();
+ StatBar.PerformStep(1);
+ return false;
+ }
+ while (DBE.Read())
+ {
+ string RecID = DBE.GetString(0);
+ int RecType = DBE.GetInt32(1);
+ string ParID = DBE.GetString(2);
+ string AccPageID = DBE.GetString(3);
+ string Info = DBE.GetString(5);
+ if (!ParID.Equals(node.GetAttribute("RecID")))
+ {
+ if (!dicGroups.Contains(ParID))
+ {
+ string strMBText = "The following record is being skipped. The parent for this RO is missing:\n\n RecID: " + RecID + "\n\n Table: " + tablename +"\n";
+ MessageBox.Show(strMBText, "Warning - Orphan RO Record");
+ continue; // skip - no parent for this node
+ }
+ node = (VlnXmlElement)dicGroups[ParID];
+ node.SetAttribute("HasChild", "True");
+ node.SetAttribute("ChildLoaded","True");
+ }
+ else
+ {
+ node.SetAttribute("ChildLoaded","True");
+ }
+ if (RecType == (uint) RecordType.Group)
+ {
+ VlnXmlElement elem;
+ StatBar.PerformStep();
+ try
+ {
+ XmlTextReader rdr = new XmlTextReader(Info, XmlNodeType.Element, null);
+ XmlNode nd = ROXml.ReadNode(rdr);
+ elem = (VlnXmlElement)nd;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error reading Xml Group From data");
+ DBE.ReaderClose();
+ return false;
+ }
+
+ elem.SetAttribute("RecID", RecID);
+ elem.SetAttribute("ParentID",node.GetAttribute("RecID"));
+ elem.SetAttribute("Table", node.GetAttribute("Table"));
+
+ if (!dicGroups.Contains(RecID))
+ {
+ node.AppendChild(elem);
+ dicGroups.Add(RecID,elem);
+ }
+
+ // The Parameter Display Data is stored along with the group. This data
+ // was migrated over so that the data was not lost, but there is no
+ // User Interface to get to it. So remove the xml elements from the
+ // group part of tree. All valid group data only has one sublevel of
+ // data defining the group name.
+ XmlNode grp = (XmlNode) elem;
+ XmlNode kid = grp.FirstChild;
+ XmlNode tmpkid;
+ while (kid != null)
+ {
+ tmpkid = kid.NextSibling;
+ if (kid is VlnXmlElement)
+ if (kid.ChildNodes.Count>1) grp.RemoveChild(kid);
+ kid = tmpkid;
+ }
+ }
+ // Store data in the VlnXmlElement as an RO
+ else if (RecType == (uint) RecordType.RRO)
+ {
+ //Create the reader.
+ XmlNode ro;
+ try
+ {
+ XmlTextReader roreader = new XmlTextReader(Info, XmlNodeType.Element, null);
+ ro = ROXml.ReadNode(roreader);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error reading Xml RRO From data");
+ DBE.ReaderClose();
+ return false;
+ }
+
+ VlnXmlElement elem = (VlnXmlElement) ro;
+ node.AppendChild(ro);
+ elem.SetAttribute("RecID", RecID);
+ elem.SetAttribute("ParentID",node.GetAttribute("RecID"));
+ elem.SetAttribute("Table", node.GetAttribute("Table"));
+ elem.SetAttribute("AccPageID", AccPageID);
+ }
+ }
+ DBE.ReaderClose();
+ dicGroups = null;
+ StatBar.Dispose();
+ return true;
+ }
+
+ public bool RODB_GetChildData(VlnXmlElement node,bool CheckChildCount)
+ {
+ // get menu fields to display here.
+ string tablename = node.GetAttribute("Table");
+ string strGetChildData = "SELECT RecID,RecType,AccPageID, Info FROM " + tablename + " where ";
+ strGetChildData = strGetChildData + "(RecType = " + (uint)RecordType.Group + " or RecType = ";
+ strGetChildData = strGetChildData + (uint)RecordType.RRO + ") and ";
+ strGetChildData = strGetChildData + "ParentID='" + node.GetAttribute("RecID") + "'";
+ strGetChildData += " ORDER BY RecID ASC";
+ //bool readit=false;
+ DBE.Command(strGetChildData);
+ DBE.Reader();
+ while (DBE.Read())
+ {
+ //get count for attribute element
+ string RecID = DBE.GetString(0);
+ int RecType = DBE.GetInt32(1);
+ string AccPageID = DBE.GetString(2);
+ string Info = DBE.GetString(3);
+ node.SetAttribute("HasChild", "True");
+ // Store data in the VlnXmlElement as a subgroup
+ if (RecType == (uint) RecordType.Group)
+ {
+ VlnXmlElement elem;
+ try
+ {
+ XmlTextReader rdr = new XmlTextReader(Info, XmlNodeType.Element, null);
+ XmlNode nd = ROXml.ReadNode(rdr);
+ elem = (VlnXmlElement)nd;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error reading Xml Group From data");
+ DBE.ReaderClose();
+ return false;
+ }
+ node.AppendChild(elem);
+ elem.SetAttribute("RecID", RecID);
+ elem.SetAttribute("ParentID",node.GetAttribute("RecID"));
+ elem.SetAttribute("Table", node.GetAttribute("Table"));
+
+ // The Parameter Display Data is stored along with the group. This data
+ // was migrated over so that the data was not lost, but there is no
+ // User Interface to get to it. So remove the xml elements from the
+ // group part of tree. All valid group data only has one sublevel of
+ // data defining the group name.
+ XmlNode grp = (XmlNode) elem;
+ XmlNode kid = grp.FirstChild;
+ XmlNode tmpkid;
+ while (kid != null)
+ {
+ tmpkid = kid.NextSibling;
+ if (kid is VlnXmlElement)
+ if (kid.ChildNodes.Count>1) grp.RemoveChild(kid);
+ kid = tmpkid;
+ }
+ }
+ // Store data in the VlnXmlElement as an RO
+ else if (RecType == (uint) RecordType.RRO)
+ {
+ //Create the reader.
+ XmlNode ro;
+ try
+ {
+ XmlTextReader roreader = new XmlTextReader(Info, XmlNodeType.Element, null);
+ ro = ROXml.ReadNode(roreader);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Error reading Xml RRO From data");
+ DBE.ReaderClose();
+ return false;
+ }
+
+ VlnXmlElement elem = (VlnXmlElement) ro;
+ node.AppendChild(ro);
+ elem.SetAttribute("RecID", RecID);
+ elem.SetAttribute("ParentID",node.GetAttribute("RecID"));
+ elem.SetAttribute("Table", node.GetAttribute("Table"));
+ elem.SetAttribute("AccPageID", AccPageID);
+ }
+ }
+ DBE.ReaderClose();
+
+ // get child count for each subgroup.
+ if(CheckChildCount)
+ {
+ //A different approach - Look for grandchildren and set the haschildren attribute
+ //Build a query to get a list of children with children
+ string strGetSubCount = "SELECT R1.ParentID,COUNT(*) AS CNT FROM " + tablename + " R1 "
+ + "INNER JOIN " + tablename + " R2 ON R1.ParentID = R2.RecID "
+ + "WHERE (R1.RecType = " + (uint)RecordType.Group + " or R1.RecType=" + (uint)RecordType.RRO + ") "
+ + "and R2.ParentID ='" + node.GetAttribute("RecID") + "' group by R1.ParentID;";
+ try
+ {
+ DBE.Command(strGetSubCount);
+ DBE.Reader();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error reading data");
+ }
+ //Build a Dictionary of Children with Children from the query results
+ HybridDictionary dicChild = new HybridDictionary();
+ while(DBE.Read())
+ dicChild[DBE.GetString(0)]=DBE.GetInt32(1);//This adds the entry and sets the value
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ XmlNode child = node.FirstChild;
+ while (child != null) //Look at each child node
+ {
+ if (child is VlnXmlElement)
+ {
+ VlnXmlElement echild = (VlnXmlElement) child;
+ if (echild.Name == "vlnGroup")
+ {
+ //If the dictionary contains an entry, the child has children
+ echild.SetAttribute("HasChild",(dicChild.Contains(echild.GetAttribute("RecID")))?"True":"False");
+ echild.SetAttribute("ChildLoaded", "False");
+ }
+ }
+ child = child.NextSibling;
+ }
+ dicChild=null;
+ }
+ node.SetAttribute("ChildLoaded","True");
+ return true;
+ }
+
+// public bool OLD_RODB_GetChildData(VlnXmlElement node,bool CheckChildCount)
+// {
+// Profiler.Start("GCD_1");
+// // get menu fields to display here.
+// string tablename = node.GetAttribute("Table");
+// string strGetChildData = "SELECT RecID,RecType,AccPageID, Info FROM " + tablename + " where ";
+// strGetChildData = strGetChildData + "(RecType = " + (uint)RecordType.Group + " or RecType = ";
+// strGetChildData = strGetChildData + (uint)RecordType.RRO + ") and ";
+// strGetChildData = strGetChildData + "ParentID='" + node.GetAttribute("RecID") + "'";
+// strGetChildData += " ORDER BY RecID ASC";
+// Profiler.End("GCD_1");
+// //bool readit=false;
+// Profiler.Start("GCD_2");
+// DBE.Command(strGetChildData);
+// Profiler.End("GCD_2");
+// Profiler.Start("GCD_3");
+// DBE.Reader();
+// Profiler.End("GCD_3");
+// Profiler.Start("GCD_4");
+// while (DBE.Read())
+// {
+// //get count for attribute element
+// string RecID = DBE.GetString(0);
+// int RecType = DBE.GetInt32(1);
+// string AccPageID = DBE.GetString(2);
+// string Info = DBE.GetString(3);
+// node.SetAttribute("HasChild", "True");
+// // Store data in the VlnXmlElement as a subgroup
+// if (RecType == (uint) RecordType.Group)
+// {
+// VlnXmlElement elem;
+// try
+// {
+// XmlTextReader rdr = new XmlTextReader(Info, XmlNodeType.Element, null);
+// XmlNode nd = ROXml.ReadNode(rdr);
+// elem = (VlnXmlElement)nd;
+// }
+// catch (Exception e)
+// {
+// MessageBox.Show(e.Message, "Error reading Xml Group From data");
+// DBE.ReaderClose();
+// return false;
+// }
+// node.AppendChild(elem);
+// elem.SetAttribute("RecID", RecID);
+// elem.SetAttribute("ParentID",node.GetAttribute("RecID"));
+// elem.SetAttribute("Table", node.GetAttribute("Table"));
+//
+// // The Parameter Display Data is stored along with the group. This data
+// // was migrated over so that the data was not lost, but there is no
+// // User Interface to get to it. So remove the xml elements from the
+// // group part of tree. All valid group data only has one sublevel of
+// // data defining the group name.
+// XmlNode grp = (XmlNode) elem;
+// XmlNode kid = grp.FirstChild;
+// XmlNode tmpkid;
+// while (kid != null)
+// {
+// tmpkid = kid.NextSibling;
+// if (kid is VlnXmlElement)
+// if (kid.ChildNodes.Count>1) grp.RemoveChild(kid);
+// kid = tmpkid;
+// }
+// }
+//
+// // Store data in the VlnXmlElement as an RO
+// else if (RecType == (uint) RecordType.RRO)
+// {
+// //Create the reader.
+// XmlNode ro;
+// try
+// {
+// XmlTextReader roreader = new XmlTextReader(Info, XmlNodeType.Element, null);
+// ro = ROXml.ReadNode(roreader);
+// }
+// catch (Exception e)
+// {
+// MessageBox.Show(e.Message, "Error reading Xml RRO From data");
+// DBE.ReaderClose();
+// return false;
+// }
+//
+//
+// VlnXmlElement elem = (VlnXmlElement) ro;
+// node.AppendChild(ro);
+// elem.SetAttribute("RecID", RecID);
+// elem.SetAttribute("ParentID",node.GetAttribute("RecID"));
+// elem.SetAttribute("Table", node.GetAttribute("Table"));
+// elem.SetAttribute("AccPageID", AccPageID);
+// }
+// }
+// Profiler.End("GCD_4");
+// Profiler.Start("GCD_5");
+// DBE.ReaderClose();
+//
+// if (CheckChildCount)
+// {
+// // get child count for each subgroup.
+// XmlNode child = node.FirstChild;
+// // while (child != null && CheckChildCount)
+// while (child != null)
+// {
+// if (child is VlnXmlElement)
+// {
+// VlnXmlElement echild = (VlnXmlElement) child;
+// if (echild.Name == "vlnGroup")
+// {
+// //get child count for each table listed in innertext.
+// string strGetSubCount = "SELECT COUNT(RecID) AS CNT FROM " + echild.GetAttribute("Table") + " WHERE ";
+// strGetSubCount = strGetSubCount + "(RecType = " + (uint)RecordType.Group + " or RecType=" + (uint)RecordType.RRO + ")";
+// strGetSubCount = strGetSubCount + " and ParentID='" + echild.GetAttribute("RecID") + "'";
+// try
+// {
+// DBE.Command(strGetSubCount);
+// DBE.Reader();
+// }
+// catch (Exception e)
+// {
+// MessageBox.Show(e.Message,"Error reading data");
+// }
+// if (DBE.Read())
+// {
+// int cnt = DBE.GetInt32(0);
+// if (cnt>0)
+// echild.SetAttribute("HasChild","True");
+// else
+// echild.SetAttribute("HasChild","False");
+// echild.SetAttribute("ChildLoaded", "False");
+// }
+// DBE.CommandDispose();
+// DBE.ReaderClose();
+// }
+// }
+// child = child.NextSibling;
+// }
+// }
+// node.SetAttribute("ChildLoaded","True");
+// Profiler.End("GCD_5");
+// return true;
+// }
+
+ public bool IsDuplicateAccPageID(VlnXmlElement ro,string newacc)
+ {
+ string strcheck, inacc=null;
+ bool isdup=false;
+ int indx = newacc.IndexOf("'");
+ if (indx >= 0)
+ inacc=newacc.Insert(indx,"'");
+ else
+ inacc=newacc;
+ strcheck = "SELECT Count(RecID) AS CNT FROM " + ro.GetAttribute("Table") + " WHERE AccPageID = '" + inacc + "'";
+
+ if (ro.HasAttribute("RecID")) // new ro's don't have recid defined yet before this test.
+ strcheck = strcheck + " AND (NOT RecID = '" + ro.GetAttribute("RecID") + "')";
+ try
+ {
+ DBE.Command(strcheck);
+ DBE.Reader();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error on check");
+ return true;
+ }
+ if (DBE.Read())
+ {
+ int cnt = DBE.GetInt32(0);
+ if (cnt>0)
+ isdup = true;
+ else
+ isdup = false;
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ return isdup;
+ }
+
+ public VlnXmlElement RODB_ReadRO(string tbl, string recid)
+ {
+ VlnXmlElement retele = null;
+ string readstr = "SELECT ParentID, AccPageID, Info FROM " + tbl + " WHERE RecID = '" + recid + "'";
+ try
+ {
+ DBE.Command(readstr);
+ DBE.Reader();
+
+ if (DBE.Read())
+ {
+ string ParentID = DBE.GetString(0);
+ string AccPageID = DBE.GetString(1);
+ string Info = DBE.GetString(2);
+ // Store data in the VlnXmlElement
+ XmlTextReader rdr = new XmlTextReader(Info, XmlNodeType.Element, null);
+ XmlNode nd = ROXml.ReadNode(rdr);
+ retele = (VlnXmlElement)nd;
+ retele.SetAttribute("RecID", recid);
+ retele.SetAttribute("ParentID",ParentID);
+ retele.SetAttribute("Table", tbl);
+ if (retele.Name != "vlnGroup") retele.SetAttribute("AccPageID", AccPageID);
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+
+ // if this is a group, see if children.
+ if (retele.Name == "vlnGroup")
+ {
+ string strGetSubCount = "SELECT COUNT (RecID) as cnt FROM " + tbl + " WHERE ";
+ strGetSubCount = strGetSubCount + "ParentID='" + recid + "'";
+ DBE.Command(strGetSubCount);
+ DBE.Reader();
+
+ if (DBE.Read())
+ {
+ int cnt = DBE.GetInt32(0);
+ if (cnt>0)
+ retele.SetAttribute("HasChild","True");
+ else
+ retele.SetAttribute("HasChild","False");
+ retele.SetAttribute("ChildLoaded","False");
+ }
+ DBE.CommandDispose();
+ DBE.ReaderClose();
+ }
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Error on Read of RO");
+ return null;
+ }
+ return retele;
+ }
+
+ public bool RODB_WriteRO(VlnXmlElement ro)
+ {
+ bool success;
+ if (ro.Name == "vlnGroup")
+ {
+ success = RODB_WriteGroup(ro, ro);
+ return success;
+ }
+ else
+ {
+ string wraccid=null;
+ string accid = ro.GetAttribute("AccPageID");
+ int quote = accid.IndexOf("'");
+ if (quote>=0)
+ wraccid = accid.Insert(quote,"'");
+ else
+ wraccid = accid;
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ string xmlstr = GenerateXmlString(ro, false);
+ string strUpdate = "UPDATE " + ro.GetAttribute("Table") + " SET Info = '" + xmlstr + "'";
+ strUpdate = strUpdate + ", ModDateTime = '" + dt + "', AccPageID = '" + wraccid + "' WHERE RecID='" + ro.GetAttribute("RecID") + "'";
+ try
+ {
+ DBE.Command(strUpdate);
+ DBE.Reader();
+ success = true;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Database Write Error");
+ success = false;
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ }
+ return success;
+ }
+
+ public bool RODB_InsertRO(VlnXmlElement ro)
+ {
+ bool success=false;
+ string strInsert=null;
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ VlnXmlElement parent = (VlnXmlElement)ro.ParentNode;
+ string lrecid = RODB_GetNextRecId(parent.GetAttribute("Table"));
+ ro.SetAttribute("Table",parent.GetAttribute("Table"));
+ ro.SetAttribute("RecID",lrecid);
+ ro.SetAttribute("ParentID",parent.GetAttribute("RecID"));
+ string haskids = parent.GetAttribute("HasChild");
+ if (haskids == "False" || haskids=="")
+ {
+ parent.SetAttribute("HasChild","True");
+ parent.SetAttribute("ChildLoaded", "True");
+ }
+ string xmlstr = GenerateXmlString(ro, false);
+ string wraccid=null;
+ if (ro.HasAttribute("AccPageID"))
+ {
+ string accid = ro.GetAttribute("AccPageID");
+ int quote = accid.IndexOf("'");
+ if (quote>=0)
+ wraccid = accid.Insert(quote,"'");
+ else
+ wraccid = accid;
+ }
+ if (ro.Name == "vlnGroup")
+ {
+ // add attribute to flag that this does not have xml children, i.e. any
+ // other subgroups or ros under it.
+ ro.SetAttribute("HasChild", "False");
+ if (ro.HasAttribute("AccPageID"))
+ {
+ strInsert = "INSERT INTO " + parent.GetAttribute("Table") + "( RecID, RecType, ParentID, ModDateTime, AccPageID, Info ) ";
+ strInsert = strInsert + " VALUES ('" + ro.GetAttribute("RecID") + "'," + (uint) RecordType.Group + ",'" + ro.GetAttribute("ParentID");
+ strInsert = strInsert + "','" + wraccid + "','" + dt + "','" + xmlstr + "');";
+ }
+ else
+ {
+ strInsert = "INSERT INTO " + parent.GetAttribute("Table") + "( RecID, RecType, ParentID, ModDateTime, Info ) ";
+ strInsert = strInsert + " VALUES ('" + ro.GetAttribute("RecID") + "'," + (uint) RecordType.Group + ",'" + ro.GetAttribute("ParentID");
+ strInsert = strInsert + "','" + dt + "','" + xmlstr + "');";
+ }
+
+ }
+ else
+ {
+ strInsert = "INSERT INTO " + parent.GetAttribute("Table") + "( RecID, RecType, ParentID, AccPageId, ModDateTime, Info ) ";
+ strInsert = strInsert + " VALUES ('" + ro.GetAttribute("RecID") + "'," + (uint) RecordType.RRO + ",'" + ro.GetAttribute("ParentID");
+ strInsert = strInsert + "','" + wraccid + "','" + dt + "','" + xmlstr + "');";
+ }
+
+ try
+ {
+ DBE.Command(strInsert);
+ DBE.Reader();
+ success=true;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Database Write Error");
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return success;
+ }
+
+ private string ParseEleName(string info)
+ {
+ string elemname;
+
+ // need to find element type too.
+ int issingle = info.IndexOf("Single");
+
+ int idx1 = info.IndexOf("element name=");
+ if (idx1 >0)
+ {
+ elemname=info.Substring(idx1+14,info.Length-idx1-14);
+ idx1 = elemname.IndexOf("\"");
+ elemname = CvtFldToUserFld(elemname.Substring(0,idx1));
+ // if we have a choice element, remove the last character (it was added to the
+ // field names in order to allow for unique fields names for the choice items.
+ if (info.IndexOf("xsd:choice") > 0)
+ {
+ string trun = elemname.Remove((elemname.Length)-1,1);
+ return trun;
+ }
+ return elemname;
+ }
+ return null;
+ }
+
+
+ // Given an element to start at, get the fields in use. Pass in the element you're
+ // on, the available list for this group & a string representing 'FieldsInUse' or
+ // 'GroupFieldsInUse'.
+ public ArrayList RODB_GetFieldsInUse(VlnXmlElement elem, ArrayList avail, string strFieldsInUse, ref string origFieldsInUse, bool RemoveFromAvailList)
+ {
+ VlnXmlElement startelem = elem;
+
+ // if doing groups, the fields in use is defined for the parent (except for the top node)
+ //if (useparent == true && elem.ParentNode.Name != "RO_Root")
+ // startelem = (VlnXmlElement) elem.ParentNode;
+
+ // if this element doesn't have any fields in use, walk up the tree until
+ // we find them.
+ string FieldsInUse="";
+ if (startelem.HasAttribute(strFieldsInUse) == false)
+ {
+ VlnXmlElement parent;
+ parent = (VlnXmlElement) startelem.ParentNode;
+ while (parent != null && FieldsInUse == "")
+ {
+ FieldsInUse = parent.GetAttribute(strFieldsInUse);
+ if (parent.Name != "RO_Root")
+ parent = (VlnXmlElement) parent.ParentNode;
+ else
+ parent = null;
+ }
+ }
+ else
+ FieldsInUse = startelem.GetAttribute(strFieldsInUse);
+
+ origFieldsInUse = FieldsInUse; // make a copy to compare to later.
+ ArrayList inuse = new ArrayList();
+ // if there are no fields in use (may be inserting a top group)
+ // return an empty list.
+ if (FieldsInUse=="") return inuse;
+
+ // Go through the FieldsInUse list and move elements from the avail list
+ // to the inuse list
+ int strpos = 0;
+ string recid;
+ recid = FieldsInUse.Substring(strpos,8);
+ while (recid != null)
+ {
+ // find it in avail list. Remove it from there & add to inuse list
+ for(int i=0; i FieldsInUse.Length)
+ recid = null;
+ else
+ {
+ recid = FieldsInUse.Substring(strpos,8);
+ }
+ }
+ return inuse;
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private string CvtFldToUserFld(string fldname)
+ {
+ string tmpstr0;
+ if (fldname.Length < 2) return fldname;
+ // an xml element name cannot begin with a digit. we had prepended a "__"
+ if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
+ tmpstr0 = fldname.Substring(2,fldname.Length-2);
+ else
+ tmpstr0 = fldname;
+ // an xml element name cannot have a space, we converted to a "__"
+ string tmpstr = tmpstr0.Replace("__"," ");
+ int len = tmpstr.Length;
+ int cur = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval, indx;
+ if (tmpstr.Length <6)
+ indx = -1;
+ else
+ indx=tmpstr.IndexOf(OKpunch,cur);
+ string asc_spchar;
+ while (indx>=0)
+ {
+ outstr += tmpstr.Substring(cur,indx-cur);
+ asc_spchar = tmpstr.Substring(indx+3,3);
+ decval = System.Convert.ToInt16(asc_spchar,10);
+ outstr += System.Convert.ToChar(decval).ToString();
+ cur = indx+6;
+ if (cur+6 > len)
+ indx = -1;
+ else
+ indx = tmpstr.IndexOf(OKpunch,cur);
+ }
+ if (cur= 0) // is this field being used?
+ {
+// rof = new ROField(name, RecID, null, 0);
+ ftype |= GetFSTreturnType(System.Convert.ToUInt16(rof.ParseFieldType(Info)),tmpname,elem);
+// ftype |= System.Convert.ToUInt16(rof.ParseFieldType(Info));
+ }
+ }
+ }
+ else
+ {
+ // references master, but what we need is here: the field name and
+ // the the field type. Just parse this from the info field.
+ string parsename;
+ string strftype;
+ strftype = Info.Substring(9,3);
+ parsename = Info.Substring(13,Info.Length-13);
+ if (strftype.Equals("128")) // is it a combo type?
+ parsename = parsename.Substring(0,parsename.Length-1);
+
+ if (FldsUsed.BinarySearch(parsename) >= 0) // is this field being used?
+ {
+ ftype |= GetFSTreturnType(System.Convert.ToUInt16(Info.Substring(9,3)),parsename,elem);
+// ftype |= System.Convert.ToUInt16(Info.Substring(9,3));
+ }
+ }
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+
+ return ftype;
+ }
+***/
+
+ public ushort RODB_GetFieldType(VlnXmlElement elem, string TableName, string Fld)
+ {
+ string strGetFields;
+ string Info;
+ string RecID;
+ string name;
+ string tmpname;
+ ushort ftype = 0;
+ ROField rof;
+ if(TableName != lastTable)
+ {
+ lastTable=TableName;
+ dicFldTypes=new HybridDictionary();
+ // select all of the field definition records in this table.
+ // strGetFields = "SELECT RecID, Info from " + elem.GetAttribute("Table");
+ strGetFields = "SELECT RecID, Info from " + TableName;
+ strGetFields = strGetFields + " where RecType = 2"; // + rtype.ToString();
+ DBE.Command(strGetFields);
+ DBE.Reader();
+
+ // NOTE !!!!
+ // This function does not handle Combo type fields (128).
+ while (DBE.Read())// && ftype == 0)
+ {
+ RecID = DBE.GetString(0);
+ Info = DBE.GetString(1);
+ // it's defined in the local table if the first character is "<" which starts
+ // the schema definition string.
+ if ("<" == Info.Substring(0,1))
+ {
+ name = ParseEleName(Info);
+ if (name != null)
+ {
+ tmpname = CvtUserFldToFld(name);
+ //if (tmpname.Equals(Fld))
+ //{
+ rof = new ROField(name, RecID, null, 0);
+ // uint tmpfldtype = rof.ParseFieldType(Info);
+ ftype = GetFSTreturnType(System.Convert.ToUInt16(rof.ParseFieldType(Info)),tmpname,elem);
+ dicFldTypes[tmpname]=ftype;
+ //}
+ }
+ }
+ else
+ {
+ // references master, but what we need is here: the field name and
+ // the the field type. Just parse this from the info field.
+ string parsename;
+ // string strftype;
+ // strftype = Info.Substring(9,3);
+ parsename = Info.Substring(13,Info.Length-13);
+ //if (parsename.Equals(Fld))
+ //{
+ ftype = GetFSTreturnType(System.Convert.ToUInt16(Info.Substring(9,3)),parsename,elem);
+ dicFldTypes[parsename]=ftype;
+ //}
+
+ }
+
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ }
+ ftype = ((ushort) dicFldTypes[Fld]);
+ return ftype;
+ }
+
+
+
+ // For the given element's table, get all of the RO fields defined in this table.
+ public ArrayList RODB_GetFields(VlnXmlElement elem, uint rtype)
+ {
+ ArrayList retlist = new ArrayList();
+ string strGetFields;
+ string Info;
+ string RecID;
+ string name;
+ uint ftype;
+ ROField rof;
+
+ // select all of the field definition records in this table.
+ strGetFields = "SELECT RecID, Info from " + elem.GetAttribute("Table");
+ strGetFields = strGetFields + " where RecType = 2"; // + rtype.ToString();
+ DBE.Command(strGetFields);
+ DBE.Reader();
+
+ while (DBE.Read())
+ {
+ RecID = DBE.GetString(0);
+ Info = DBE.GetString(1);
+ // it's defined in the local table if the first character is "<" which starts
+ // the schema definition string.
+ if ("<" == Info.Substring(0,1))
+ {
+ name = ParseEleName(Info);
+ if (name != null)
+ {
+ // what type of schema element?
+ rof = new ROField(name, RecID, null, 0);
+ ftype = rof.ParseFieldType(Info);
+ rof.SetFieldType(ftype);
+ retlist.Add((object) rof);
+ }
+ }
+
+ else
+ {
+ // the recid points to a field definition (schema) in the master - use it to get
+ // the schema element from the master and copy it.
+ string parsename;
+ string masterrecid;
+ string strftype;
+ masterrecid = Info.Substring(0,8);
+ strftype = Info.Substring(9,3);
+ ftype = System.Convert.ToUInt32(Info.Substring(9,3));
+ parsename = CvtFldToUserFld(Info.Substring(13,Info.Length-13));
+
+ // if we have a choice element, remove the last character (it was added to the
+ // field names in order to allow for unique fields names for the choice items.
+ if (ftype == (uint) FieldTypes.Combination)
+ {
+ string tparsename = parsename.Remove((parsename.Length)-1,1); // remove the choice string and the space
+ parsename = tparsename;
+ }
+ rof = new ROField(parsename, RecID, masterrecid, ftype);
+ retlist.Add((object) rof);
+ }
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return retlist;
+ }
+
+ public string RODB_GetSchemaPiece(string Recid, string table)
+ {
+ string strGetSchemaPiece;
+ string Info;
+ strGetSchemaPiece = "SELECT Info From " + table + " where (RecID = '" + Recid + "')";
+ DBE.Command(strGetSchemaPiece);
+ DBE.Reader();
+ if (DBE.Read())
+ Info = DBE.GetString(0);
+ else
+ Info = null;
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return Info.Replace("'","\'");
+ }
+
+ public bool RODB_NewSchemaPiece(string recid, string parentid, string table, string schpiece, uint rtype)
+ {
+ string strSchemaPiece;
+ bool success = true;
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ strSchemaPiece = "INSERT INTO " + table + " (RecID, RecType, ParentID, ModDateTime, Info) VALUES ('";
+ // B2004-016: at one point all fields are returned using a record type of 2 (Schema) -
+ // but the insertion code did not account for this when inserting a type of 4 (GroupSchema) - i.e.
+ // RecordType of 4 is no longer used, all fields (whether schema or group) are defined
+ // as RecordTYpe of 2.
+ //strSchemaPiece = strSchemaPiece + recid + "', " + rtype.ToString() + ", '" + parentid + "', '" + dt + "', '" + schpiece.Replace("\'","'") + "');";
+ strSchemaPiece = strSchemaPiece + recid + "', 2, '" + parentid + "', '" + dt + "', '" + schpiece.Replace("\'","'") + "');";
+
+ DBE.Command(strSchemaPiece);
+ try
+ {
+ DBE.Command(strSchemaPiece);
+ DBE.Reader();
+ }
+ catch (Exception e)
+ {
+ success = false;
+ MessageBox.Show(e.Message, "Database Write Error");
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return success;
+ }
+
+ public bool RODB_WriteSchemaPiece(string Recid, string table, string schpiece)
+ {
+ string strWriteSchemaPiece;
+ bool success = true;
+ string dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ strWriteSchemaPiece = "UPDATE " + table + " SET " + table + ".Info = '" + schpiece.Replace("\'","'") + "'";
+ strWriteSchemaPiece = strWriteSchemaPiece + ", ModDateTime = '" + dt + "' WHERE RecID = '" + Recid + "';";
+ try
+ {
+ DBE.Command(strWriteSchemaPiece);
+ DBE.Reader();
+ }
+ catch (Exception e)
+ {
+ success = false;
+ MessageBox.Show(e.Message, "Database Update Error");
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return success;
+ }
+
+ // Create a new field record in master and reference in the current table.
+ // pass in current rodb object, the xml element creating and editlevel
+ // is a recordType of either Group (group field definitions) or rro for
+ // the ro definition. the string apd represents an append string which is
+ // appended to the fieldname for combo types, otherwise it's null
+ public bool RODB_NewFieldRecord(ROField myrof, VlnXmlElement myelem, string strschema, uint editlevel, string apd)
+ {
+ bool success;
+ // get a new record id for this and save it in the master table.
+ string mrecid = RODB_GetNextRecId("ROMaster");
+
+ // get recid in ROMaster for group, so that we can set the parent field.
+ // walk up the tree until we find a 'MasterRecID' attribute.
+ VlnXmlElement parent;
+ parent = myelem;
+ while (parent != null)
+ {
+ if (parent.HasAttribute("MasterRecID")) break;
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ success = RODB_NewSchemaPiece(mrecid,parent.GetAttribute("MasterRecID"),"ROMaster", strschema, editlevel);
+ if (success != true) return false;
+ // also reference it from the local table.
+ string lrecid = RODB_GetNextRecId(myelem.GetAttribute("Table"));
+ myrof.SetRecID(lrecid);
+ myrof.SetMasterRecID(mrecid);
+ StringBuilder strbld = new StringBuilder();
+ strbld.Append(mrecid);
+ strbld.Append(" ");
+ string strtype = myrof.GetFieldType.ToString();
+ strbld.Append(strtype.PadLeft(3,'0'));
+ strbld.Append(" ");
+ strbld.Append(myrof.MakeFieldName(myrof.GetFieldname));
+ if (apd != null) strbld.Append(apd);
+ // Need ParentID field, get by looking up xml tree to find parentID attribute = "00000000", then
+ // use this recid.
+ parent = myelem;
+ while (parent.GetAttribute("ParentID") != "00000000")
+ {
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ success = RODB_NewSchemaPiece(lrecid,parent.GetAttribute("RecID"), myelem.GetAttribute("Table"), strbld.ToString(), editlevel);
+ return success;
+ }
+
+ private string DoCmbFieldReplace(string repstring, string oname, string nname, string letter)
+ {
+ string cmboname, cmbnname;
+ cmboname = oname.Insert(oname.Length-1,letter);
+ cmbnname = nname.Insert(nname.Length-1,letter);
+ return (repstring.Replace(cmboname,cmbnname));
+ }
+
+ private bool RODB_ProcessRROFieldChange(VlnXmlElement child, string oldname, string newname, uint editlevel,
+ VlnStatusMessage StatMsgWindow, bool combofield)
+ {
+
+ bool success;
+ string str;
+ string info;
+ string tinfo1, tinfo2, tinfo3, tinfo4;
+ string dt;
+ string onameOpen, nnameOpen, onameClose, nnameClose, onameComma, nnameComma;
+ string onameOpenX, nnameOpenX;
+ onameOpen = "<" + oldname + ">";
+ nnameOpen = "<" + newname + ">";
+ onameOpenX = "<" + oldname + ">";
+ nnameOpenX = "<" + newname + ">";
+ onameComma = "<" + oldname + ","; // if format in attribute
+ nnameComma = "<" + newname + ",";
+ onameClose = "" + oldname + ">";
+ nnameClose = "" + newname + ">";
+ dt = string.Format("{0:yyyyMMddHHmmss}", System.DateTime.Now);
+ try
+ {
+ // first do the string replace for the group node. This will change any
+ // attributes which may have changed.
+ str = "SELECT Info From " + child.GetAttribute("Table") + " where (RecID = '" + child.GetAttribute("RecID") + "')";
+ DBE.Command(str);
+ DBE.Reader();
+ if (DBE.Read())
+ info = DBE.GetString(0);
+ else
+ info = null;
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+
+ tinfo1 = info.Replace(onameOpen, nnameOpen);
+ tinfo2 = tinfo1.Replace(onameClose, nnameClose);
+ tinfo3 = tinfo2.Replace(onameComma, nnameComma);
+ tinfo4 = tinfo3.Replace(onameOpenX, nnameOpenX);
+ if (tinfo4 != info)
+ {
+ StatMsgWindow.StatusMessage = child.GetAttribute("MenuTitle");
+ str = "UPDATE " + child.GetAttribute("Table") + " SET Info = '" + tinfo4 + "'";
+ str = str + ", ModDateTime = '" + dt + "' WHERE RecID = '" + child.GetAttribute("RecID") + "';";
+ DBE.Command(str);
+ DBE.Reader();
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ if (child.Name == "vlnGroup"&&child.ParentNode.Name != "RO_Root")
+ {
+ XmlNodeList nodeList;
+ nodeList = child.SelectNodes(oldname);
+ foreach (XmlNode nod in nodeList)
+ {
+ XmlNode newnode = ROXml.CreateNode(XmlNodeType.Element, newname, "");
+ newnode.InnerXml = nod.InnerXml;
+ child.ReplaceChild(newnode,nod);
+ }
+ }
+ // if at top, replace strings in attributes for xml node. Only needs done
+ // for top node because remainder are done in xml string replace for entire
+ // node and written to database, but XML tree is deleted from memory and
+ // reread in as needed.
+ if (child.ParentNode.Name == "RO_Root")
+ {
+ string tmp, tmp1;
+ tmp = child.GetAttribute("RetVal");
+ if (tmp != null)
+ {
+ tmp1 = tmp.Replace(onameOpen, nnameOpen);
+ child.SetAttribute("RetVal", tmp1);
+ }
+ tmp = child.GetAttribute("MenuItem");
+ if (tmp != null)
+ {
+ string conameOpen = "<" + oldname + ",";
+ string cnnameOpen = "<" + newname + ",";
+ tmp1 = tmp.Replace(onameOpen, nnameOpen);
+ string tmp2 = tmp1.Replace(conameOpen, cnnameOpen);
+ child.SetAttribute("MenuItem", tmp2);
+ }
+ tmp = child.GetAttribute("AccPageID");
+ if (tmp != null)
+ {
+ tmp1 = tmp.Replace(onameOpen, nnameOpen);
+ child.SetAttribute("AccPageID", tmp1);
+ }
+ tmp = child.GetAttribute("GroupMenuItem");
+ if (tmp != null)
+ {
+ tmp1 = tmp.Replace(onameOpen, nnameOpen);
+ child.SetAttribute("GroupMenuItem", tmp1);
+ }
+
+ }
+ }
+ // if this was an RO field definition change, need to go through the XML for
+ // the ROs too.
+ if (editlevel == (uint) RecordType.Schema)
+ {
+ XmlNode chldnode = (XmlNode) child.FirstChild;
+ VlnXmlElement echild;
+ while (chldnode != null)
+ {
+ if (chldnode is VlnXmlElement)
+ {
+ echild = (VlnXmlElement) chldnode;
+ if (echild.Name != "vlnGroup")
+ {
+ // If this is a group defintion subtree it will only have one
+ // child, which is the text definition for the subgroup. Don't
+ // include these in the tree.
+ int levelCnt = chldnode.ChildNodes.Count;
+ string TheMenuTitle = echild.GetAttribute("MenuTitle");
+ if ((levelCnt >= 1) && !TheMenuTitle.Equals(""))
+ {
+ // read record, do string replace in info & write record. Also, replace
+ // the xml node with a node with the new name.
+ str = "SELECT Info From " + echild.GetAttribute("Table") + " where (RecID = '" + echild.GetAttribute("RecID") + "')";
+ DBE.Command(str);
+ DBE.Reader();
+ if (DBE.Read())
+ info = DBE.GetString(0);
+ else
+ info = null;
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ if (combofield==false)
+ {
+ tinfo1 = info.Replace(onameOpen,nnameOpen);
+ tinfo2 = tinfo1.Replace(onameClose, nnameClose);
+ XmlNodeList nodeList;
+ nodeList = echild.SelectNodes(oldname);
+ foreach (XmlNode nod in nodeList)
+ {
+ XmlNode newnode = ROXml.CreateNode(XmlNodeType.Element, newname, "");
+ newnode.InnerXml = nod.InnerXml;
+ echild.ReplaceChild(newnode,nod);
+ }
+ }
+ else // need a,b,c,d yikes
+ {
+ string nma, nmb, nmc, nmd;
+ nma = DoCmbFieldReplace(info, onameOpen, nnameOpen, "a");
+ nmb = DoCmbFieldReplace(nma, onameOpen, nnameOpen, "b");
+ nmc = DoCmbFieldReplace(nmb, onameOpen, nnameOpen, "c");
+ nmd = DoCmbFieldReplace(nmc, onameOpen, nnameOpen, "d");
+ nma = DoCmbFieldReplace(nmd, onameClose, nnameClose, "a");
+ nmb = DoCmbFieldReplace(nma, onameClose, nnameClose, "b");
+ nmc = DoCmbFieldReplace(nmb, onameClose, nnameClose, "c");
+ tinfo2 = DoCmbFieldReplace(nmc, onameClose, nnameClose, "d");
+ // replace the combo nodes with the new name, do a-d in case there are more than
+ // one value field stored for this combo type
+ for (char tmplet = 'a';tmplet < 'e'; tmplet++)
+ {
+ XmlNodeList nodeList;
+ nodeList = echild.SelectNodes(oldname+tmplet.ToString());
+ foreach (XmlNode nod in nodeList)
+ {
+ XmlNode newnode = ROXml.CreateNode(XmlNodeType.Element, newname+tmplet, "");
+ newnode.InnerXml = nod.InnerXml;
+ echild.ReplaceChild(newnode,nod);
+ }
+ }
+ }
+
+ StatMsgWindow.StatusMessage = echild.GetAttribute("MenuTitle");
+ str = "UPDATE " + echild.GetAttribute("Table") + " SET Info = '" + tinfo2 + "'";
+ str = str + ", ModDateTime = '" + dt + "' WHERE RecID = '" + echild.GetAttribute("RecID") + "';";
+ DBE.Command(str);
+ DBE.Reader();
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+
+ }
+ }
+ }
+ chldnode = chldnode.NextSibling;
+ }
+ }
+ return true;
+ }
+ catch (Exception e)
+ {
+ success = false;
+ MessageBox.Show(e.Message,"Database Update Error");
+ }
+ return success;
+ }
+
+ // RODB_UpdateNamesInROs: goes through subtree (top node is 'fld') and if this
+ // updated field is used (either in [Group]FieldsInUse or was used in parent, then
+ // 1) if group node, check for attributes using "" and if found, update
+ // to "
+ // 2) if group edit, modify this node's xml data with the new fieldname,
+ // otherwise, edit 'ROs' under this to replace with
+ // Input: VlnXmlElement fld: start processing at this node.
+ // string myrecid: local recid to be used for check to see if used (in FieldsInUse
+ // or GroupFieldsInUse.
+ // string oldname, newname - old and new field names
+ // string myrecid - local record storing field name
+ // uint editlevel - if editting groups, do check for for item 1 above in
+ // Group attributes, otherwise do in
+ // bool parentused - set to false from caller, this is recursive and will
+ // be set appropriately for recursive calls.
+ public bool RODB_UpdateFieldNames(VlnXmlElement fld, string myrecid, string oldname,
+ string newname, uint editlevel, bool parentused, VlnStatusMessage StatMsgWindow, bool combofield)
+ {
+ bool success;
+ bool useAtLevel = false;
+ XmlNode node;
+ VlnXmlElement child;
+ string fldinuse;
+
+ if (editlevel == (uint)RecordType.Schema)
+ fldinuse = "FieldsInUse";
+ else
+ fldinuse = "GroupFieldsInUse";
+
+ // Do the current level before walking through any children groups.
+ if (fld.Name == "vlnGroup")
+ {
+ if (fld.HasAttribute(fldinuse))
+ {
+ // if recid not in here, don't process for this node.
+ string fiu = fld.GetAttribute(fldinuse);
+ if (fiu.IndexOf(myrecid) >= 0) useAtLevel = true;
+ }
+ if (useAtLevel==true || parentused==true) useAtLevel = true;
+
+ if (useAtLevel == true)
+ {
+ string haskids, kidsloaded;
+ haskids = fld.GetAttribute("HasChild");
+ kidsloaded = fld.GetAttribute("ChildLoaded");
+ if (haskids == "True" && kidsloaded == "False" )
+ {
+ success = RODB_GetChildData(fld,true);
+ if (success == false) return false;
+ fld.SetAttribute("ChildLoaded","True");
+ }
+ parentused = true; // for kids of this group.
+
+ success = RODB_ProcessRROFieldChange(fld, oldname, newname, editlevel, StatMsgWindow, combofield);
+ if (success==false) return false;
+ }
+ }
+ node = (XmlNode) fld.FirstChild;
+ while (node != null)
+ {
+ if (node is VlnXmlElement)
+ {
+ useAtLevel=false;
+ child = (VlnXmlElement) node;
+
+ // If this is a group menu edit, process group nodes, by recursive
+ // call and then modify data on group record.
+ // For both, when hitting a group node, check that it either doesn't
+ // have 'FieldsInUse' or 'GroupFieldsInUse' or that if it does,
+ // this record id is in the list -> only process these, otherwise
+ // the field is not used.
+ if (child.Name == "vlnGroup")
+ {
+ // see if inuse for this one, either defined here or from parent.
+ if (child.HasAttribute(fldinuse))
+ {
+ // if recid not in here, don't process for this node. Still
+ // need to check children because they may redefine fields in use.
+ string fiu = child.GetAttribute(fldinuse);
+ if (fiu.IndexOf(myrecid) >= 0) useAtLevel = true;
+ }
+ if (useAtLevel == false && parentused == true) useAtLevel = true;
+
+ // update this record if it doesn't have it's own , then do kids
+ // of it.
+ success = RODB_UpdateFieldNames(child, myrecid, oldname, newname,editlevel,useAtLevel, StatMsgWindow, combofield);
+
+ if (success == false) return false;
+ }
+ }
+ node = node.NextSibling;
+ }
+ // now update ROs at this level, only if RO mods (not group).
+ //if (parentused && editlevel==(uint)RecordType.Schema)
+ //{
+ // success = RODB_ProcessRROFieldChange(fld, oldname, newname, editlevel);
+ // if (success==false) return false;
+ //}
+ return true;
+ }
+
+ // check if the name entered is one used for setting up
+ // the new graphics or setpoint databases.
+ private bool RODB_CheckForStandardName(string oname)
+ {
+ string oldname = CvtFldToUserFld(oname);
+ if (oldname.CompareTo("Name") == 0) return true;
+ if (oldname.CompareTo("Image ID") == 0) return true;
+ if (oldname.CompareTo("Image") == 0) return true;
+ if (oldname.CompareTo("Setpoint ID") == 0) return true;
+ if (oldname.CompareTo("Setpoint Value") == 0) return true;
+ if (oldname.CompareTo("Associated System/Component") == 0) return true;
+ if (oldname.CompareTo("Applicability") == 0) return true;
+ if (oldname.CompareTo("Revision") == 0) return true;
+ if (oldname.CompareTo("Short Description") == 0) return true;
+ if (oldname.CompareTo("Description") == 0) return true;
+ if (oldname.CompareTo("Key Assumptions") == 0) return true;
+ if (oldname.CompareTo("Basis") == 0) return true;
+ if (oldname.CompareTo("References") == 0) return true;
+ if (oldname.CompareTo("Group") == 0) return true;
+ if (oldname.CompareTo("Parameter") == 0) return true;
+ return false;
+ }
+
+ public bool RODB_UpdateFieldRecord(ROField myrof, VlnXmlElement myelem, string strschema,
+ string oldname, string newname, uint editlevel, bool combofield)
+ {
+ bool success=false;
+ // If this is a generic definition that was modified, i.e. from ROMaster, ask
+ // the user whether to update the generic field definition or make it local.
+ if (myrof.GetMasterRecID != null)
+ {
+ // if field is defined in the ROMaster, and we change the field name -
+ // first check if it is using one of the names used to define new
+ // setpoint or graphics databases. If so, make it a local change only!
+
+ bool changegeneric = true;
+ if (oldname != newname)
+ {
+ // if this is one of the standard names - don't let them save it.
+ bool isused=RODB_CheckForStandardName(oldname);
+ if (isused == true)
+ {
+ MessageBox.Show("The field name is used to define new Setpoints or Graphics Database.\n The update will be for this local (database) group only.","Field name modification.");
+ changegeneric = false;
+ }
+ }
+
+ // if standard name, from above check, don't ask user if it is generic
+ // or not.
+ if (changegeneric != false)
+ {
+ System.Windows.Forms.DialogResult result = MessageBox.Show ("Update Generic definition?", "Referenced Object Definition",
+ MessageBoxButtons.YesNo, MessageBoxIcon.Question);
+ if (result == DialogResult.No) changegeneric = false;
+ }
+ if (changegeneric == true)
+ {
+ success = RODB_WriteSchemaPiece(myrof.GetMasterRecID,"ROMaster", strschema);
+ if (success != true) return false;
+ // if change in fieldname, need to go through all of the databases to
+ // adjust for it.
+ if (oldname != newname)
+ {
+ VlnStatusMessage StatMsgWindow = new VlnStatusMessage("Status of RO Field Change");
+ // get root xml element
+ // loop through each subgroup under root.
+ VlnXmlElement topgroup;
+ topgroup = (VlnXmlElement) ROXml.FirstChild.FirstChild;
+ string sqlstr, recid, tbl;
+ while (topgroup != null)
+ {
+ tbl = topgroup.GetAttribute("Table");
+ // get the recid of this field definition from the current table.
+ sqlstr = "SELECT RecID FROM " + tbl;
+ sqlstr = sqlstr + " WHERE (((" + tbl + ".RecType) = 2) AND ((" + tbl + ".Info) like ('";
+ sqlstr = sqlstr + myrof.GetMasterRecID + "%')));";
+ DBE.Command(sqlstr);
+ DBE.Reader();
+ if (DBE.Read())
+ recid = DBE.GetString(0);
+ else
+ recid = null;
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ if (recid != null)
+ {
+ // update the local field definition record
+ StringBuilder strbld = new StringBuilder();
+ strbld.Append(myrof.GetMasterRecID);
+ strbld.Append(" ");
+ string strtype = myrof.GetFieldType.ToString();
+ strbld.Append(strtype.PadLeft(3,'0'));
+ strbld.Append(" ");
+ strbld.Append(myrof.MakeFieldName(myrof.GetFieldname));
+ success = RODB_WriteSchemaPiece(recid,topgroup.GetAttribute("Table"), strbld.ToString());
+ topgroup.SetAttribute("TreeNotData", "True");
+
+ // Update subelements too.
+ if (success == true)
+ success = RODB_UpdateFieldNames(topgroup, recid, oldname, newname, editlevel, false, StatMsgWindow, combofield);
+ topgroup = (VlnXmlElement) topgroup.NextSibling;
+ }
+ }
+ StatMsgWindow.Dispose();
+ }
+ }
+ else // change local
+ {
+ // modify the current to have the definition local.
+ success=RODB_WriteSchemaPiece(myrof.GetRecID,myelem.GetAttribute("Table"), strschema);
+ // get top group node in tree. and from there process fields if
+ // there was a change in fieldname text
+ if (success == true && oldname != newname)
+ {
+ VlnStatusMessage StatMsgWindow = new VlnStatusMessage("Status of RO Field Change");
+ // get top node - the one immediately below the RO_Root.
+ VlnXmlElement parent, startEle;
+ parent = myelem;
+ startEle = myelem;
+ while(parent.Name != "RO_Root")
+ {
+ startEle = parent;
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ startEle.SetAttribute("TreeNotData", "True");
+ success = RODB_UpdateFieldNames(startEle, myrof.GetRecID, oldname, newname, editlevel, false, StatMsgWindow, combofield);
+ StatMsgWindow.Dispose();
+ }
+ }
+ }
+ else
+ {
+ success = RODB_WriteSchemaPiece(myrof.GetRecID,myelem.GetAttribute("Table"),strschema);
+ // changed the fieldname, change xml text.
+ if (success == true && oldname != newname)
+ {
+ VlnStatusMessage StatMsgWindow = new VlnStatusMessage("Status of RO Field Change");
+ // get top node - the one immediately below the RO_Root.
+ VlnXmlElement parent, startEle;
+ parent = myelem;
+ startEle = myelem;
+ while(parent.Name != "RO_Root")
+ {
+ startEle = parent;
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ startEle.SetAttribute("TreeNotData", "True");
+ success = RODB_UpdateFieldNames(startEle, myrof.GetRecID, oldname, newname, editlevel, false, StatMsgWindow, combofield);
+ StatMsgWindow.Dispose();
+ }
+ }
+ return success;
+ }
+
+ public XmlSchema RODB_GetGroupSchema(VlnXmlElement elem)
+ {
+ XmlSchema myschema;
+
+ VlnXmlElement parent;
+ string entireschema;
+ // if at top of tree, use this group schema information (fields in use). but if not,
+ // the parent node defines the schema for the subgroups.
+ if (elem.ParentNode.Name == "RO_Root")
+ parent = elem;
+ else
+ parent = elem;
+// bug fix B2004-008
+// need to use the current node's group definition all the time
+// parent = (VlnXmlElement) elem.ParentNode;
+ while (parent != null)
+ {
+ if (parent.HasAttribute("GroupFieldsInUse") == true) break;
+
+ // if we've looped to the top, just set the parent to null. (B2004-015)
+ if (parent.ParentNode is VlnXmlElement)
+ parent = (VlnXmlElement) parent.ParentNode;
+ else
+ parent = null;
+ }
+
+ if (parent == null) return null;
+ // The group schema never gets saved as an attribute. it's always read in, because
+ // it's not used as often as the ro schema. So for the Group Schema, we're looking
+ // for 'GroupFieldsInUse'.
+ // otherwise, read in schema definitions for those 'FieldsInUse'.
+ string strGetSchemaPiece;
+ entireschema = null;
+ string GroupFieldsInUse = parent.GetAttribute("GroupFieldsInUse");
+ int strpos = 0;
+ string Info;
+
+ // For each item in use, get its xmlschema text. If unique to this group, the definition
+ // exists local to this table. Otherwise, go back to the master.
+ string recid;
+ recid = GroupFieldsInUse.Substring(0,8);
+ while (recid != null)
+ {
+ strGetSchemaPiece = "SELECT Info From " + elem.GetAttribute("Table") + " where (RecID = '" + recid + "')";
+ DBE.Command(strGetSchemaPiece);
+ DBE.Reader();
+ if (DBE.Read())
+ {
+ Info = DBE.GetString(0);
+ // if the info string has "<", i.e. an opening XML schema bracket, use
+ // this text as the field definition, otherwise, go to the master to get
+ // it.
+ if ("<" == Info.Substring(0,1))
+ {
+ // use this field definition, else get from the master.
+ entireschema = entireschema + Info;
+ }
+ else
+ {
+ string recidpart = Info.Substring(0,8);
+ strGetSchemaPiece = "SELECT Info From RoMaster where (RecID = '" + recidpart + "')";
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ DBE.Command(strGetSchemaPiece);
+ DBE.Reader();
+ if (DBE.Read())
+ {
+ Info = DBE.GetString(0);
+ entireschema = entireschema + Info;
+ }
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ strpos = strpos + 9;
+ if (strpos > GroupFieldsInUse.Length)
+ recid = null;
+ else
+ recid = GroupFieldsInUse.Substring(strpos,8);
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ }
+ entireschema = schemastart + entireschema + schemaend;
+ XmlTextReader schemareader = new XmlTextReader(entireschema,XmlNodeType.Element,null);
+ try
+ {
+ myschema = XmlSchema.Read(schemareader,null);
+ return myschema;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message, "Schema Error");
+ return null;
+ }
+ }
+
+ public XmlSchema RODB_GetSchema(VlnXmlElement elem)
+ {
+ XmlSchema myschema;
+
+ VlnXmlElement parent;
+ string entireschema;
+ XmlNode nparent;
+ nparent = elem; //.ParentNode;
+ if (nparent is VlnXmlDocument)
+ {
+ // at top already. use this one.
+ parent = elem;
+ }
+ else
+ {
+ parent = (VlnXmlElement) nparent;
+ while (parent != null)
+ {
+ if (parent.HasAttribute("Schema") == true) break;
+ if (parent.HasAttribute("FieldsInUse") == true) break;
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ }
+
+ // if the schema has already been read in, just use it from the schema attribute,
+ // otherwise, read in schema definitions for those 'FieldsInUse'.
+ if (parent.HasAttribute("Schema"))
+ {
+ entireschema = parent.GetAttribute("Schema");
+ }
+ else
+ {
+ string strGetSchemaPiece;
+ entireschema = null;
+ string FieldsInUse = parent.GetAttribute("FieldsInUse");
+ int strpos = 0;
+ string Info;
+
+ // For each item in use, get its xmlschema text. If unique to this group, the definition
+ // exists local to this table. Otherwise, go back to the master.
+ string recid;
+ recid = FieldsInUse.Substring(0,8);
+ while (recid != null)
+ {
+ strGetSchemaPiece = "SELECT Info From " + elem.GetAttribute("Table") + " where (RecID = '" + recid + "')";
+ DBE.Command(strGetSchemaPiece);
+ DBE.Reader();
+ if (DBE.Read())
+ {
+ Info = DBE.GetString(0);
+ // if the info string has "<", i.e. an opening XML schema bracket, use
+ // this text as the field definition, otherwise, go to the master to get
+ // it.
+ if ("<" == Info.Substring(0,1))
+ {
+ // use this field definition, else get from the master.
+ entireschema = entireschema + Info;
+ }
+ else
+ {
+ string recidpart = Info.Substring(0,8);
+ string localfieldname = Info.Substring(13,Info.Length-13);
+ strGetSchemaPiece = "SELECT Info From RoMaster where (RecID = '" + recidpart + "')";
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ DBE.Command(strGetSchemaPiece);
+ DBE.Reader();
+ if (DBE.Read())
+ {
+ // check if field name is same, if not, use local name.
+ string goodname;
+ Info = DBE.GetString(0);
+ int indx1 = Info.IndexOf("\"");
+ int indx2 = Info.IndexOf("\"",indx1+1);
+ string masterfieldname = Info.Substring(indx1+1,indx2-indx1-1);
+ if (localfieldname != masterfieldname)
+ goodname = Info.Replace(masterfieldname,localfieldname);
+ else
+ goodname = Info;
+
+ entireschema = entireschema + goodname;
+ }
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ strpos = strpos + 9;
+ if (strpos > FieldsInUse.Length)
+ recid = null;
+ else
+ recid = FieldsInUse.Substring(strpos,8);
+ }
+ }
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ entireschema = schemastart + entireschema + schemaend;
+ }
+
+ XmlTextReader schemareader = new XmlTextReader(entireschema,XmlNodeType.Element,null);
+ try
+ {
+ myschema = XmlSchema.Read(schemareader,null);
+ parent.SetAttribute("Schema",entireschema);
+ return myschema;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Schema Read Error");
+ return null;
+ }
+ }
+
+ public int RODB_GetNumberOfROValueRecords(string tablename)
+ {
+ // get menu fields to display here.
+ string strGetRoCount = "SELECT COUNT(RecType) AS NumRecs FROM " + tablename;
+ strGetRoCount += " WHERE RecType = " + (uint)RecordType.RRO;
+ DBE.Command(strGetRoCount);
+ DBE.Reader();
+ DBE.Read();
+ int ROCnt = DBE.GetInt32(0);
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return ROCnt;
+ }
+
+ public int RODB_GetNumberOfGroupRecords(string tablename)
+ {
+ // get menu fields to display here.
+ string strGetGrpCount = "SELECT COUNT(RecType) AS NumRecs FROM " + tablename;
+ strGetGrpCount += " WHERE RecType = " + (uint)RecordType.Group;
+ DBE.Command(strGetGrpCount);
+ DBE.Reader();
+ DBE.Read();
+ int GrpCnt = DBE.GetInt32(0);
+ DBE.ReaderClose();
+ DBE.CommandDispose();
+ return GrpCnt;
+ }
+
+ }
+}
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.csproj b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.csproj
new file mode 100644
index 00000000..ec05db7f
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.csproj
@@ -0,0 +1,159 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}
+ Debug
+ AnyCPU
+
+
+
+
+ RODBInterface
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ RODBInterface
+ OnBuildSuccess
+
+
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Drawing
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Form
+
+
+ Code
+
+
+ userpass.cs
+ Designer
+
+
+
+
+ {6D44F537-879E-11D6-84B8-00A0CC271352}
+ DBEncapsulation
+
+
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}
+ Org.Mentalis.Files
+
+
+ {0C782592-AA05-11D6-84D1-00A0CC271352}
+ ROFields
+
+
+ {551CB7B3-00B1-11D7-8590-482B59000000}
+ VlnStatus
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.csproj.vspscc
new file mode 100644
index 00000000..c9a85b83
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/RODBInterface.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\RODBInterface"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/VlnXml.cs b/PROMS/ReferencedObjects/LibSource/RODBInterface/VlnXml.cs
new file mode 100644
index 00000000..3bf0084f
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/VlnXml.cs
@@ -0,0 +1,1213 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: VlnXml.cs $ $Revision: 23 $
+ * $Author: Jsj $ $Date: 6/20/05 1:29p $
+ *
+ * $History: VlnXml.cs $
+ *
+ * ***************** Version 23 *****************
+ * User: Jsj Date: 6/20/05 Time: 1:29p
+ * Updated in $/LibSource/RODBInterface
+ * added status message while reading ROs for Complete RO Report.
+ *
+ * ***************** Version 22 *****************
+ * User: Jsj Date: 6/08/05 Time: 4:32p
+ * Updated in $/LibSource/RODBInterface
+ * Complete RO Report Bug fix B2001-001
+ *
+ * ***************** Version 21 *****************
+ * User: Jsj Date: 9/27/04 Time: 11:02a
+ * Updated in $/LibSource/RODBInterface
+ * upped release number
+ *
+ * ***************** Version 20 *****************
+ * User: Kathy Date: 7/15/04 Time: 11:11a
+ * Updated in $/LibSource/RODBInterface
+ * Fix B2004-017
+ *
+ * ***************** Version 19 *****************
+ * User: Kathy Date: 5/06/04 Time: 9:52a
+ * Updated in $/LibSource/RODBInterface
+ * B2004-012 fix: skip process of param display data for RO Cmp Rpt
+ *
+ * ***************** Version 18 *****************
+ * User: Jsj Date: 4/08/04 Time: 9:43a
+ * Updated in $/LibSource/RODBInterface
+ * Added and commented out calls to VlnProfiler
+ *
+ * ***************** Version 17 *****************
+ * User: Jsj Date: 1/21/04 Time: 12:10p
+ * Updated in $/LibSource/RODBInterface
+ * added function to return current selected field type of multi type
+ * field
+ *
+ * ***************** Version 16 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:41p
+ * Updated in $/LibSource/RODBInterface
+ * B2003-035: process ro's with just one field
+ *
+ * ***************** Version 15 *****************
+ * User: Jsj Date: 4/14/03 Time: 2:59p
+ * Updated in $/LibSource/RODBInterface
+ * changes resulting from speeding up RO FST creation
+ *
+ * ***************** Version 14 *****************
+ * User: Kathy Date: 3/11/03 Time: 11:24a
+ * Updated in $/LibSource/RODBInterface
+ * allow extra text on accpageid template
+ *
+ * ***************** Version 13 *****************
+ * User: Kathy Date: 12/17/02 Time: 12:53p
+ * Updated in $/LibSource/RODBInterface
+ * get image data by node for rofst creation
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:25p
+ * Updated in $/LibSource/RODBInterface
+ * fieldname special chars & various bugs
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:29a
+ * Updated in $/LibSource/RODBInterface
+ * fieldname replace chars
+ *
+ * ***************** Version 10 *****************
+ * User: Jsj Date: 11/27/02 Time: 12:47p
+ * Updated in $/LibSource/RODBInterface
+ * modifications for RO.FST file creation
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 11/19/02 Time: 11:32a
+ * Updated in $/LibSource/RODBInterface
+ * fields within {} are not required
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 11/11/02 Time: 7:14a
+ * Updated in $/LibSource/RODBInterface
+ * Added complete report methods.
+ *********************************************************************************************/
+using System;
+using System.Xml;
+using System.Text;
+using System.Collections;
+using System.IO;
+using System.Windows.Forms;
+using ROFields;
+using VlnStatus;
+//using VlnProfiler; //don't forget to add VlnProfiler to the reference list
+
+namespace RODBInterface
+{
+ ///
+ /// Summary description for Class1.
+ ///
+
+ public class VlnXmlDocument:XmlDocument
+ {
+ FileStream Rptfs; // for complete report of this document
+ BinaryWriter RptBW;
+
+ public VlnXmlDocument():base()
+ {
+ }
+
+ public override XmlElement CreateElement( string prefix, string localname, string nsURI)
+ {
+ VlnXmlElement elem = new VlnXmlElement(prefix, localname, nsURI, this);
+ return elem;
+ }
+
+ public bool OpenTemp()
+ {
+ try
+ {
+ Rptfs = new FileStream("print.tmp", FileMode.Create);
+ // Create the writer for data.
+ RptBW = new BinaryWriter(Rptfs);
+ }
+ catch (Exception )
+ {
+ return false;
+ }
+ return true;
+ }
+
+ public void CloseTemp()
+ {
+ RptBW.Close();
+ Rptfs.Close();
+ }
+
+ public void writeInt(short val)
+ {
+ RptBW.Write(val);
+ }
+
+ public void writeText(string str)
+ {
+ short n = (short) str.Length;
+ writeInt(n);
+ // write out char by char. (Using rite
+ // of entire stirng caused special characters to be
+ // written as two bytes - which temp file reading code
+ int i;
+ for(i =0; i < str.Length; i++)
+ {
+ byte WrByte;
+ WrByte = (byte)str[i];
+ RptBW.Write(WrByte);
+ }
+ }
+
+ public void writeTextValue(string str)
+ {
+ writeInt(100);
+ writeText(str);
+ }
+
+ public void writePlot(string str)
+ {
+ writeInt(101);
+ writeText(str);
+ }
+
+ public void writeImage(string str)
+ {
+ writeInt(102);
+ writeText(str);
+ }
+
+ public void pushHeader(string str)
+ {
+ writeInt(2);
+ writeText(str);
+ }
+
+ public void popHeader()
+ {
+ writeInt(3);
+ }
+
+ public void doHeader(ArrayList headers)
+ {
+ int spaces = -1;
+ short cnt = (short) headers.Count;
+ writeInt(255);
+ writeInt(1);
+ writeInt(cnt);
+ for (int i=0; i < cnt ;i++)
+ {
+ writeInt(0);
+ if (spaces>0)
+ {
+ string spc = new String(' ',2*(spaces-1));
+ writeText(spc+headers[i].ToString());
+ }
+ else
+ writeText(headers[i].ToString());
+ spaces++;
+ }
+ }
+
+ public void writeRROBegin()
+ {
+ writeInt(4);
+ }
+
+ public void writeRROEnd()
+ {
+ writeInt(5);
+ }
+
+ public void writeMultiBegin()
+ {
+ writeInt(103);
+ }
+
+ public void writeMultiEnd()
+ {
+ writeInt(104);
+ }
+ }
+
+ public class VlnXmlElement:XmlElement
+ {
+ public VlnXmlElement( string prefix, string localname, string nsURI, XmlDocument doc ):base( prefix,localname,nsURI, doc )
+ {
+ }
+
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private string CvtFldToUserFld(string fldname)
+ {
+ string tmpstr0;
+ if (fldname.Length < 2) return fldname;
+ // an xml element name cannot begin with a digit. we had prepended a "__"
+ if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
+ tmpstr0 = fldname.Substring(2,fldname.Length-2);
+ else
+ tmpstr0 = fldname;
+ // an xml element name cannot have a space, we converted to a "__"
+ string tmpstr = tmpstr0.Replace("__"," ");
+ int len = tmpstr.Length;
+ int cur = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval, indx;
+ if (tmpstr.Length <6)
+ indx = -1;
+ else
+ indx=tmpstr.IndexOf(OKpunch,cur);
+ string asc_spchar;
+ while (indx>=0)
+ {
+ outstr += tmpstr.Substring(cur,indx-cur);
+ asc_spchar = tmpstr.Substring(indx+3,3);
+ decval = System.Convert.ToInt16(asc_spchar,10);
+ outstr += System.Convert.ToChar(decval).ToString();
+ cur = indx+6;
+ if (cur+6 > len)
+ indx = -1;
+ else
+ indx = tmpstr.IndexOf(OKpunch,cur);
+ }
+ if (cur");
+ if (left >= 0 && right > 0)
+ fld = newtmpl.Substring(left+1,right-left-1);
+ else
+ return null;
+ string usefld = CvtUserFldToFld(fld);
+
+ XmlNode elmnode = (XmlNode) elm;
+ XmlNode nd = elmnode.SelectSingleNode(usefld);
+ // if not found it may be a combination, try this.
+ if (nd == null)
+ {
+ string tmp = usefld + "a";
+ nd = elmnode.SelectSingleNode(tmp);
+ }
+ if (nd == null)
+ {
+ string tmp = usefld + "b";
+ nd = elmnode.SelectSingleNode(tmp);
+ }
+ if (nd == null)
+ {
+ string tmp = usefld + "c";
+ nd = elmnode.SelectSingleNode(tmp);
+ }
+ if (nd == null)
+ {
+ string tmp = usefld + "d";
+ nd = elmnode.SelectSingleNode(tmp);
+ }
+ if(nd != null)
+ {
+ StringBuilder strbld = new StringBuilder();
+ if (left > 0) strbld.Append(newtmpl.Substring(0,left));
+ strbld.Append(nd.InnerText.ToString());
+ if (right+1 0) strbld.Append(menuitm.Substring(0,left));
+
+ while (left != -1)
+ {
+ // get right bracket and then check for valid field & if commas with
+ // this, check for integer values.
+ right = menuitm.IndexOf(">",stindx);
+ string tmpd = menuitm.Substring(left+1,right-left-1);
+ // do comma parts now.
+ string inusename;
+ int comma1 = tmpd.IndexOf(",");
+ int frmt1=0, frmt2=0;
+ if (comma1 != -1)
+ {
+ // get any numbers for formatting & check for ints.
+ int comma2 = tmpd.IndexOf(",",comma1+1);
+ if (comma2 != -1) // two ints.
+ {
+ if (comma2-comma1 > 1) // first format field - not empty
+ {
+ string int1 = tmpd.Substring(comma1+1,comma2-comma1-1);
+ frmt1 = System.Convert.ToInt32(int1);
+ }
+ if (comma20)
+ strbld.Append(text.PadRight(frmt2,' '));
+ else
+ strbld.Append(text);
+ }
+ else if (frmt1 != frmt2)
+ {
+ int cnt = 0;
+// while (cnt < tmp.Length && tmp[cnt] <= '9' && tmp[cnt] >= '0') cnt++; // new RO logic
+// int padcnt = (cnt>frmt1)?0:frmt1-cnt;
+ int padcnt = OldROFSTMenuLogic(text,frmt1,frmt2); // testing!!!!!
+ StringBuilder strtmp = new StringBuilder();
+ cnt = 0;
+ while(cnt frmt2) // longer than the field length?
+ strtmp.Append(text.Substring(0,frmt2-cnt));
+ else
+ strtmp.Append(text);
+ string tmpstr = strtmp.ToString();
+ strbld.Append(tmpstr.PadRight(frmt2,' '));
+ }
+ else
+ strbld.Append(text.PadLeft(frmt2,' '));
+ }
+ }
+ stindx = right+1;
+ left = menuitm.IndexOf("<",left+1);
+ if (left != -1 && left > right+1) // append any plain text.
+ strbld.Append(menuitm.Substring(right+1,left-right-1));
+ }
+ if (right+1='0') || str[idx] =='-' || str[idx]=='+'))
+ {
+ siznum++;
+ idx++;
+ }
+ if (siznum == 0)
+ {
+ newoff= siznum+(wid-slen)/2;
+ }
+ else if (((doff-siznum)+slen)> wid)
+ {
+ newoff = wid-siznum-slen;
+ }
+ tmpwid = wid;
+ while (tmpwid > 0 && siznum < newoff)
+ {
+ sps++;
+ siznum++;
+ tmpwid--;
+ }
+ return sps;
+ }
+
+
+ // for this (VlnXmlElement), get it's menu value template. This template is
+ // used to generate the menu titles. Pass in a string 'GroupMenuItem' or
+ // 'MenuItem' so that the group level or RRO level menu template is found.
+ // This walkds up the tree to find the attribute ('GroupMenuItem' or 'MenuItem')
+ // and returns it.
+ public string GetMenuValueTemplate(string menuitm)
+ {
+ VlnXmlElement parent;
+ string strmenuitm;
+ VlnXmlElement tmp;
+ if (menuitm == "GroupMenuItem")
+ {
+ // if at top of tree, use this top GroupMenuItem. but if not,
+ // the parent node defines the GroupMenuItem for the subgroups.
+ if (this.ParentNode.Name == "RO_Root")
+ {
+ tmp = (VlnXmlElement) this.ParentNode;
+ strmenuitm=tmp.GetAttribute(menuitm);
+ return(strmenuitm);
+ }
+ else
+ parent = (VlnXmlElement) this.ParentNode;
+ while (parent != null)
+ {
+ if (parent.HasAttribute(menuitm) == true) break;
+ if (parent.Name != "RO_Root")
+ parent = (VlnXmlElement) parent.ParentNode;
+ else
+ parent = null;
+ }
+ if (parent == null) return null;
+ strmenuitm = parent.GetAttribute(menuitm);
+ return strmenuitm;
+ }
+
+ // Now just do 'MenuItem', which is for ROs
+ parent = (VlnXmlElement) this;
+ strmenuitm = parent.GetAttribute(menuitm);
+ while (parent != null && strmenuitm == "")
+ {
+ // walk up tree to get parent.
+ strmenuitm = parent.GetAttribute(menuitm);
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ return strmenuitm;
+ }
+
+ // for this (VlnXmlElement), get the Return Value template.
+ public string GetReturnValueTemplate()
+ {
+ VlnXmlElement parent;
+ VlnXmlElement tmp=null;
+
+ // get to top node of the ROs & groups to get the return for this tree.
+ parent = (VlnXmlElement) this;
+ tmp = parent;
+ while((tmp.HasAttribute("RetVal") == false) && parent.Name != "RO_Root")
+ {
+ tmp = parent;
+ parent = (VlnXmlElement) parent.ParentNode;
+ }
+ if (tmp.HasAttribute("RetVal") == false) return null;
+ else return tmp.GetAttribute("RetVal");
+ }
+
+ /*
+ * return true if the field is a pre defined PROC.INI field name
+ */
+ private bool IsProcIniDef(string fld)
+ {
+ bool rtnval = false;
+ string tmpstr = fld.ToUpper();
+
+ rtnval = (tmpstr.Equals("U") ||
+ tmpstr.Equals("U-") ||
+ tmpstr.Equals("P") ||
+ tmpstr.Equals("P-") ||
+ tmpstr.Equals("S") ||
+ tmpstr.Equals("S-"));
+
+ return rtnval;
+ }
+
+ /*
+ * This function checks the given field name with the list of fields
+ * that are "in use" for the current group.
+ * If the field name is of one of the pre-defined PROC.INI RO fields
+ * treat that field name as plain text (i.e. NOT in use)
+ */
+ private bool IsAInUseField(ArrayList InUseList, string fld)
+ {
+ bool rtnval = false;
+ int i;
+
+ if (IsProcIniDef(fld)) // is this a pre-defined PROC.INI field?
+ return rtnval; //return false!
+
+ string tmpstr = fld.Substring(0,1);
+ if (tmpstr.Equals("_"))
+ tmpstr = fld.Substring(1,fld.Length-1);
+ else
+ tmpstr = fld;
+ tmpstr = CvtFldToUserFld(fld);
+ for(i=0; rtnval == false && i 0) strbld.Append(RtnValTemplate.Substring(0,left));
+
+ while (left != -1)
+ {
+ // get right bracket and then check for valid field & if commas with
+ // this, check for integer values.
+ right = RtnValTemplate.IndexOf(">",stindx);
+ string inusename;
+ string substr = RtnValTemplate.Substring(left+1,right-left-1);
+ inusename = CvtUserFldToFld(substr);
+
+ // get contents of field & append it onto the string builder.
+ XmlNode elmnode = (XmlNode) elm;
+ XmlNode nd = elmnode.SelectSingleNode(inusename);
+ // Check to see if the found field is a "Field In Use"
+
+ if (IsAInUseField(InUseList,inusename))
+ {
+ string text="";
+ if (nd == null)
+ {
+ text = GetComboFieldValueAndType(elmnode,inusename,ref FldType,false);
+ if (text.Equals(""))
+ text = " ";
+ }
+ else
+ {
+// Profiler.Start("Grv7");
+ FldType = theDb.RODB_GetFieldType((VlnXmlElement)nd,TableName,inusename);
+// Profiler.End("Grv7");
+// Profiler.Start("Grv8");
+ // for an image, get the filename, height, width, otherwise just use
+ // data in the node.
+ if (FldType == 8) // for the '8' see RODBInterface - GetFSTreturntype
+ {
+ // get filename, length, width in that order, separated by newlines
+ XmlNode tmp = nd.SelectSingleNode("Image_Filename");
+ if (tmp != null && tmp.InnerText != null)
+ text = tmp.InnerText + "\r\n";
+ else
+ text = " \r\n";
+ tmp = nd.SelectSingleNode("Image_Height");
+ if (tmp != null && tmp.InnerText != null)
+ text = text + tmp.InnerText + "\r\n";
+ else
+ text = text + " \r\n";
+ tmp = nd.SelectSingleNode("Image_Width");
+ if (tmp != null && tmp.InnerText != null)
+ text = text + tmp.InnerText + "\r\n";
+ else
+ text = text + " \r\n";
+ }
+ else
+ {
+ text = nd.InnerText;
+ }
+// Profiler.End("Grv8");
+ }
+
+ ValueType |= FldType;
+ strbld.Append(text);
+ }
+ else
+ {
+ strbld.Append(RtnValTemplate.Substring(left,right-left+1));
+ }
+
+ stindx = right+1;
+ left = RtnValTemplate.IndexOf("<",left+1);
+ if (left != -1 && left > right+1) // append any plain text.
+ strbld.Append(RtnValTemplate.Substring(right+1,left-right-1));
+ }
+
+ right++; // move past the right bracket ('>')
+ if (right < RtnValTemplate.Length)
+ strbld.Append(RtnValTemplate.Substring(right,RtnValTemplate.Length-right));
+
+// Bug fix: B2004-044
+// If the ValueType is zero, then it will not appear on the list of ROs in the
+// procedure editor.
+ if (ValueType == 0)
+ ValueType = 1;
+
+ RtnValStr = strbld.ToString();
+ return RtnValStr;
+ }
+
+ public string GetComboFieldValueAndType(XmlNode CurNode, string Fld, ref ushort FldTyp, bool ForMenu)
+ {
+ string RtnVal = "";
+ XmlNode ChildNode = CurNode.FirstChild;
+ FldTyp = 0;
+
+ while (ChildNode != null && FldTyp == 0)
+ {
+ if (ChildNode is VlnXmlElement)
+ {
+ string ChildName = ChildNode.Name.ToString();
+ if (ChildName.StartsWith(Fld))
+ {
+ char CmboChar = Convert.ToChar(ChildName.Substring(ChildName.Length-1,1));
+ switch (CmboChar)
+ {
+ case 'a': // Fixed Text
+ case 'b': // Multi Line Text
+ FldTyp = 1;
+ RtnVal = ChildNode.InnerText;
+ break;
+ case 'c': // Table
+ FldTyp = 2;
+ if (ForMenu)
+ RtnVal = "(Table)";
+ else
+ RtnVal = ChildNode.InnerText;
+ break;
+ case 'd': // X/Y Plot
+ FldTyp = 4;
+ if (ForMenu)
+ RtnVal = "(Graph)";
+ else
+ RtnVal = ChildNode.InnerText;
+ break;
+ }
+ }
+ }
+ ChildNode = ChildNode.NextSibling;
+ }
+ return RtnVal;
+ }
+
+ // For this (VlnXmlElement), get the list of used fields. Need to find the
+ // fields from the accessory page id template, the return value template
+ // and the menu title template or group title template (depends on if a
+ // group edit or a RRO edit.
+ public ArrayList GetRequiredFields()
+ {
+ ArrayList fldlist = new ArrayList();
+ string accpagetmpl = GetAccPageIDTemplate();
+ string retvaltmpl = null;
+ string menutmpl = null;
+ if (this.Name == "vlnGroup")
+ {
+ menutmpl = GetMenuValueTemplate("GroupMenuItem");
+ }
+ else
+ {
+ menutmpl = GetMenuValueTemplate("MenuItem");
+ retvaltmpl = GetReturnValueTemplate();
+ }
+ // for each string, add its field names to the list.
+ // accessory page id's only have a field and only used for ROs.
+ if (this.Name != "vlnGroup" && accpagetmpl != null)
+ {
+ string fld = accpagetmpl.Substring(1,accpagetmpl.Length-2);
+ fldlist.Add(fld+"\tAccessory Page Value");
+ }
+ // menutmpl's may have multiple fields. loop through them.
+ int left, right, stindx, comma, rdelim;
+ if (menutmpl != null)
+ {
+ left = menutmpl.IndexOf("<");
+ right = 0;
+ stindx = 0;
+ comma = 0;
+ while (left != -1)
+ {
+ // get right bracket and then check for valid field & if commas with
+ // this, check for integer values.
+ right = menutmpl.IndexOf(">",stindx);
+ comma = menutmpl.IndexOf(",",stindx);
+ rdelim = (comma>-1 && comma>left && comma',stindx);
+ // first see if it is within it's own {}
+ if (stindxbrace -1)
+ {
+ rightbrace = retvaltmpl.IndexOf('}',stindxbrace);
+ if ((left>leftbrace&&leftleftbrace&&right -1)
+ xmldoc.writeImage(ind.InnerText.Substring(indx+1,ind.InnerText.Length-indx-1));
+ else
+ xmldoc.writeImage(ind.InnerText);
+ // now do height & width??
+ ind = this.SelectSingleNode("*/Image_Height");
+ if (ind != null)
+ {
+ short iht = (short) System.Convert.ToInt16(ind.InnerText);
+ xmldoc.writeInt(iht);
+ }
+ else
+ xmldoc.writeInt(0);
+ ind = this.SelectSingleNode("*/Image_Width");
+ if (ind != null)
+ {
+ short iht = (short) System.Convert.ToInt16(ind.InnerText);
+ xmldoc.writeInt(iht);
+ }
+ else
+ xmldoc.writeInt(0);
+ }
+ }
+ else
+ {
+ if (doingplot)
+ xmldoc.writePlot(end.InnerText);
+ else
+ xmldoc.writeTextValue(end.InnerText);
+
+ }
+ }
+ xmldoc.popHeader();
+ }
+
+ }
+ xmldoc.writeRROEnd();
+ }
+ return true;
+ }
+
+ // ShowGroup processes the input group node for the complete report by
+ // using ShowGroupDetail to output data for the group and ShowRRO to
+ // output data for the RO
+ private bool ShowGroup(RODB myrodb, ArrayList headers, VlnStatusMessage showStat)
+ {
+ XmlNode chldnode;
+
+ if (this.ParentNode.Name != "RO_Root")
+ {
+ /* Bug fix: B2001-001
+ * Compete RO Report for All ROs was printing an extra
+ * page showing just a prameter field. This information
+ * was not always related to the RO Group being printed at
+ * this time. Turns out that we don't need to call the
+ * ShowGroupDetail() at this point, only need to save
+ * header informat. -jsj 6/8/2005
+ *
+ ShowGroupDetail(myrodb);
+ */
+ headers.Add(this.GetAttribute("MenuTitle"));
+ }
+ else
+ {
+ int bracket = this.InnerXml.IndexOf("<",0);
+ if (bracket>-1)
+ headers.Add(this.InnerXml.Substring(0,bracket));
+ else
+ headers.Add(this.InnerXml);
+ }
+ string haskids, kidsloaded;
+ haskids = this.GetAttribute("HasChild");
+ kidsloaded = this.GetAttribute("ChildLoaded");
+ if (haskids == "True" && kidsloaded == "False" )
+ {
+ myrodb.RODB_GetChildData(this,true);
+ this.SetAttribute("ChildLoaded", "True");
+ }
+
+ // go through all of the children for this node and put them out.
+ chldnode = (XmlNode) this.FirstChild;
+
+ while (chldnode != null)
+ {
+ if (chldnode is VlnXmlElement)
+ {
+ VlnXmlElement elem = (VlnXmlElement) chldnode;
+// showStat.StatusMessage = elem.InnerText;
+
+ // if it's a group, recurse through it.
+ if (chldnode.Name == "vlnGroup")
+ {
+ elem.ShowGroup(myrodb, headers, showStat);
+ }
+ // do RO's too.
+ else
+ {
+ int levelcnt = chldnode.ChildNodes.Count;
+ bool isParDisData = chldnode.Name == "Parameter__Display__Data";
+ string TheMenuTitle = elem.GetAttribute("MenuTitle");
+ showStat.StatusMessage = TheMenuTitle;
+ if (!isParDisData && ((levelcnt > 1) || (levelcnt==1 && !TheMenuTitle.Equals(""))))
+ elem.ShowRRO(myrodb, headers);
+ }
+ }
+ chldnode = chldnode.NextSibling;
+ }
+ // remove this group from the headers.
+ headers.RemoveAt(headers.Count-1);
+ return true;
+ }
+
+ // put this element, and if a group all it's subelements out to the 'print.tmp'
+ // file for complete reports.
+ public bool Show(RODB myrodb, ArrayList headers)
+ {
+ bool success;
+ VlnStatusMessage showStat = new VlnStatusMessage("Reading ROs");
+ VlnXmlDocument xmldoc = (VlnXmlDocument) this.OwnerDocument;
+ success = xmldoc.OpenTemp();
+ if (success==false) return false;
+
+ // if this is the top node, i.e. with name "RO_Root", it is a complete report
+ // for all Ros, work from the root.
+ if (this.Name == "RO_Root")
+ {
+ // show each 'table' group under the top.
+ VlnXmlElement group = (VlnXmlElement) this.FirstChild;
+ VlnXmlElement tmpgroup;
+ while (group != null)
+ {
+ // Now get subgroups for each group.
+ myrodb.RODB_GetChildData(group,true);
+ group.ShowGroup(myrodb, headers, showStat);
+ tmpgroup = group;
+ group.RemoveAll();
+ group = (VlnXmlElement) tmpgroup.NextSibling;
+ }
+
+ }
+ // this is a particular RO or group of ROs.
+ else
+ {
+ if (this.Name == "vlnGroup")
+ ShowGroup(myrodb, headers, showStat);
+ else
+ ShowRRO(myrodb, headers);
+ }
+ showStat.Dispose();
+ xmldoc.CloseTemp();
+ return true;
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/userpass.cs b/PROMS/ReferencedObjects/LibSource/RODBInterface/userpass.cs
new file mode 100644
index 00000000..4974cd2f
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/userpass.cs
@@ -0,0 +1,188 @@
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+
+namespace RODBInterface
+{
+ ///
+ /// Summary description for userpass.
+ ///
+ public class userpass : System.Windows.Forms.Form
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private System.Windows.Forms.Label uidLbl;
+ private System.Windows.Forms.Label pwLbl;
+ private System.Windows.Forms.Button OKBtn;
+ internal System.Windows.Forms.Button CancelBtn;
+ private System.Windows.Forms.TextBox uidTxtBx;
+ private System.Windows.Forms.TextBox pwTxtBx;
+
+ //public UidPw UIDPW
+ //{
+ // get
+ // {
+ // UidPw up = new UidPw();
+ // up.Password = this.pwTxtBx.Text;
+ // up.UserId = this.uidTxtBx.Text;
+ // return up;
+ // }
+ //}
+
+ public string uname=null;
+ public string pword=null;
+ public userpass()
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+ }
+
+ public userpass(string PassedInName)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+ uidTxtBx.Text = PassedInName;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.uidTxtBx = new System.Windows.Forms.TextBox();
+ this.uidLbl = new System.Windows.Forms.Label();
+ this.pwLbl = new System.Windows.Forms.Label();
+ this.pwTxtBx = new System.Windows.Forms.TextBox();
+ this.OKBtn = new System.Windows.Forms.Button();
+ this.CancelBtn = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // uidTxtBx
+ //
+ this.uidTxtBx.Location = new System.Drawing.Point(8, 40);
+ this.uidTxtBx.Name = "uidTxtBx";
+ this.uidTxtBx.Size = new System.Drawing.Size(134, 22);
+ this.uidTxtBx.TabIndex = 0;
+ this.uidTxtBx.Text = "";
+ this.uidTxtBx.KeyUp += new System.Windows.Forms.KeyEventHandler(this.uidTxtBx_KeyUp);
+ //
+ // uidLbl
+ //
+ this.uidLbl.Location = new System.Drawing.Point(16, 16);
+ this.uidLbl.Name = "uidLbl";
+ this.uidLbl.Size = new System.Drawing.Size(115, 18);
+ this.uidLbl.TabIndex = 1;
+ this.uidLbl.Text = "User ID";
+ //
+ // pwLbl
+ //
+ this.pwLbl.Location = new System.Drawing.Point(184, 16);
+ this.pwLbl.Name = "pwLbl";
+ this.pwLbl.Size = new System.Drawing.Size(86, 18);
+ this.pwLbl.TabIndex = 2;
+ this.pwLbl.Text = "Password";
+ //
+ // pwTxtBx
+ //
+ this.pwTxtBx.AcceptsTab = true;
+ this.pwTxtBx.Location = new System.Drawing.Point(176, 40);
+ this.pwTxtBx.Name = "pwTxtBx";
+ this.pwTxtBx.PasswordChar = '*';
+ this.pwTxtBx.Size = new System.Drawing.Size(125, 22);
+ this.pwTxtBx.TabIndex = 3;
+ this.pwTxtBx.Text = "";
+ this.pwTxtBx.KeyUp += new System.Windows.Forms.KeyEventHandler(this.pwTxtBx_KeyUp);
+ //
+ // OKBtn
+ //
+ this.OKBtn.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.OKBtn.Location = new System.Drawing.Point(336, 16);
+ this.OKBtn.Name = "OKBtn";
+ this.OKBtn.Size = new System.Drawing.Size(96, 28);
+ this.OKBtn.TabIndex = 4;
+ this.OKBtn.Text = "OK";
+ this.OKBtn.Click += new System.EventHandler(this.OKBtn_Click);
+ //
+ // CancelBtn
+ //
+ this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.CancelBtn.Location = new System.Drawing.Point(336, 56);
+ this.CancelBtn.Name = "CancelBtn";
+ this.CancelBtn.Size = new System.Drawing.Size(96, 28);
+ this.CancelBtn.TabIndex = 5;
+ this.CancelBtn.Text = "Cancel";
+ //
+ // userpass
+ //
+ this.AccessibleRole = System.Windows.Forms.AccessibleRole.None;
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(448, 96);
+ this.ControlBox = false;
+ this.Controls.Add(this.CancelBtn);
+ this.Controls.Add(this.OKBtn);
+ this.Controls.Add(this.pwTxtBx);
+ this.Controls.Add(this.uidTxtBx);
+ this.Controls.Add(this.pwLbl);
+ this.Controls.Add(this.uidLbl);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "userpass";
+ this.Text = " Login";
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private void OKBtn_Click(object sender, System.EventArgs e)
+ {
+ uname = this.uidTxtBx.Text;
+ pword = this.pwTxtBx.Text;
+ }
+
+ private void pwTxtBx_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
+ {
+ // if key pressed was a return - treat as ok button.
+ if (e.KeyCode == Keys.Return) this.OKBtn.PerformClick();
+ }
+
+ private void uidTxtBx_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
+ {
+ // if key pressed was a return - treat as ok button.
+ if (e.KeyCode == Keys.Return) this.OKBtn.PerformClick();
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/RODBInterface/userpass.resx b/PROMS/ReferencedObjects/LibSource/RODBInterface/userpass.resx
new file mode 100644
index 00000000..efce1a59
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/RODBInterface/userpass.resx
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Assembly
+
+
+ False
+
+
+ (Default)
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ True
+
+
+ 80
+
+
+ True
+
+
+ userpass
+
+
+ Private
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/ROFST/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/ROFST/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROFST/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.cs b/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.cs
new file mode 100644
index 00000000..09af50ab
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.cs
@@ -0,0 +1,3073 @@
+/*********************************************************************************************
+ * Copyright 2005 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: ROFST.cs $ $Revision: 13 $
+ * $Author: Kathy $ $Date: 8/31/05 11:32a $
+ *
+ * $History: ROFST.cs $
+ *
+ * ***************** Version 13 *****************
+ * User: Kathy Date: 8/31/05 Time: 11:32a
+ * Updated in $/LibSource/ROFST
+ * B2005-032: new groups crashed when writing to ro.fst during approve
+ * sel.
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 8/16/05 Time: 2:52p
+ * Updated in $/LibSource/ROFST
+ * B2005-030: crash when writing ro.fst for new ro
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 6/21/05 Time: 1:36p
+ * Updated in $/LibSource/ROFST
+ * FindModROs for approve selected, crash on xyplot with missing end ">"
+ *
+ * ***************** Version 10 *****************
+ * User: Jsj Date: 6/02/05 Time: 11:31a
+ * Updated in $/LibSource/ROFST
+ * fix for approving with conditional ROs
+ *
+ * ***************** Version 9 *****************
+ * User: Jsj Date: 5/20/05 Time: 9:21a
+ * Updated in $/LibSource/ROFST
+ * fixed getro for cases when using unit specific info to process the RO
+ * return value.
+ *
+ * ***************** Version 8 *****************
+ * User: Jsj Date: 5/17/05 Time: 11:48a
+ * Updated in $/LibSource/ROFST
+ * fixed approve graphic bug, added default graphic extension as part of
+ * ROFST class initialization, code cleanup
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 5/11/05 Time: 9:26a
+ * Updated in $/LibSource/ROFST
+ * add close method
+ *
+ * ***************** Version 6 *****************
+ * User: Jsj Date: 4/07/05 Time: 11:15a
+ * Updated in $/LibSource/ROFST
+ * fixes
+ *
+ * ***************** Version 5 *****************
+ * User: Jsj Date: 3/31/05 Time: 9:16a
+ * Updated in $/LibSource/ROFST
+ *
+ * ***************** Version 4 *****************
+ * User: Jsj Date: 3/28/05 Time: 12:18p
+ * Updated in $/LibSource/ROFST
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 3/22/05 Time: 9:52a
+ * Updated in $/LibSource/ROFST
+ * March 22 2005 update for merge
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 3/14/05 Time: 1:36p
+ * Updated in $/LibSource/ROFST
+ * update
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 3/10/05 Time: 3:53p
+ * Created in $/LibSource/ROFST
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 3/10/05 Time: 3:49p
+ * Created in $/LibSource/ROFST/ROFST
+ *
+ *********************************************************************************************/
+using System;
+using System.IO;
+using System.Windows.Forms;
+using System.Text;
+using System.Collections;
+using VlnStatus;
+using Utils;
+
+/*
+ * This namespace is used in both VE-PROMS and the RO Editor programs.
+ */
+namespace ROFST_FILE
+{
+ /*
+ * Globally used functions amoung a few of the classes in this namespace
+ */
+ public class ROProcessTools
+ {
+ // For now, have hooks to set and get the current
+ // procedure number along with the Maxium Procedure
+ // Number length. The 16-bit code used globals
+ // jsj - 6/2/2005
+
+ private static string PNumber = " "; // default to blank
+ private static int mxPrcLen = 30; // default to 30 chars
+
+ static ROProcessTools()
+ {
+ }
+
+ public static string ProcedureNumber
+ {
+ set { PNumber = value.ToString();}
+ get { return PNumber; }
+ }
+
+ public static int MaxProcNumLen
+ {
+ set { mxPrcLen = (int)value;}
+ get { return mxPrcLen;}
+ }
+
+ public static string UnitSpecific(string str, int len, int trm, int maxPrcNumLen)
+ {
+ // This routine retrieves the procedure number format from the
+ // current directory and uses it to adjust the procedure number
+ // in the specified string
+ string retvalu="";
+ string asis="#";
+ string pnum;
+ if( str == null || str.Length == 0 ) return null;
+ /*
+ * Bug fix: B2005-017 3/2/2005
+ * Need to use the largest procedure number length that's in the
+ * SET.DFF file. "LargestNumber" is the largest length after the
+ * procedure number is replaced via the SET.INI file "replace" list.
+ *
+ if(len==0)len=LargestNumber;
+ */
+ if(len==0)len=maxPrcNumLen; //LargestRawSetNumber
+ string mstr;
+ PrivateProfile proc_ini = new PrivateProfile("proc.ini");
+ mstr = proc_ini.Attr("unit", "procedure number");
+ if (mstr == null) mstr = asis;
+ pnum=mstr;
+ if(pnum.Equals(asis))
+ {
+ retvalu=str;
+ }
+ else if (!pnum.Equals("") && pnum[0] == '!')
+ {
+ if (File.Exists("set.ini"))
+ {
+ string p = str;
+ string q, tonum;
+ StringBuilder rbldr = new StringBuilder();
+ int newl, dw, cnt=0, lstr;
+
+ p = p.TrimStart(" ".ToCharArray());
+ lstr = p.Length;
+ if (len > lstr) len = lstr;
+ mstr = p.Substring(0,len);
+ mstr = mstr.TrimEnd(" \t\r\n".ToCharArray());
+ /* debug
+ string debugstr = "|" + mstr + "|";
+ */
+
+ PrivateProfile set_ini = new PrivateProfile("set.ini");
+
+ tonum = set_ini.Attr("replace", mstr);
+ if (tonum == null || tonum.Equals("")) tonum = mstr;
+ newl = tonum.Length;
+ dw = newl - (lstr);
+
+ q = str; p = tonum;
+ int strptr=0;
+ for (strptr=0; str[strptr] == ' '; strptr++)
+ rbldr.Append(" ");//initial spaces
+ int pptr=0;
+ while (cnt < len)
+ {
+ if (tonum!=null && pptr < tonum.Length)
+ rbldr.Append(tonum[pptr++]);
+ else if (trm == 1) break;
+ else if (cnt < lstr) rbldr.Append(" ");
+ else break;
+ cnt++;
+ }
+ if (trm==0)
+ {
+ strptr+=len;
+ while (str!=null && strptr < str.Length)
+ rbldr.Append(str[strptr++]);
+ }
+ retvalu = rbldr.ToString();
+ }
+ else
+ {
+ retvalu=str;
+ }
+ }
+ else
+ {
+ StringBuilder rbldr = new StringBuilder();
+ // create pointers to use to transfer info
+ int pnumPtr = 0, strPtr=0, endStrPtr = str.Length-1;
+ string pad = "";
+ // determine if the procedure number should be padded instead
+ if(str[0]==' ')pad=" ";
+ // copy from the procedure number definition to the pound symbol
+ if (!pnum.Equals(""))
+ {
+ while(pnumPtr < pnum.Length && pnum[pnumPtr] != '#')
+ {
+ rbldr.Append(((!pad.Equals(""))? pad : pnum[pnumPtr].ToString()));
+ pnumPtr++;
+ }
+ // skip the pound sign
+ if(pnumPtr < pnum.Length && pnum[pnumPtr]!=0)pnumPtr++;
+ }
+ // assuming that the procedure number occurs at the beginning of
+ // str, check to see where it ends
+ if(str.Length > len)endStrPtr=len-1;
+ // find the end of the procedure number
+ while(endStrPtr > strPtr && str[endStrPtr]==' ')endStrPtr--;
+ // copy the procedure number
+ while(strPtr <= endStrPtr)rbldr.Append(str[strPtr++]);
+ // copy the rest of the format
+ while(pnumPtr < pnum.Length)
+ {
+ rbldr.Append(((!pad.Equals(""))? pad : pnum[pnumPtr].ToString()));
+ pnumPtr++;
+ }
+ // copy the rest of the given string
+ while(strPtr < str.Length)rbldr.Append(str[strPtr++]);
+ retvalu = rbldr.ToString();
+ }
+ return retvalu;
+ }
+
+ public static int matchingBrace(string str)
+ {
+ int strptr = 0;
+ int level=1;
+ while(level > 0)
+ {
+ strptr++;
+ switch(str[strptr])
+ {
+ case '{':
+ level++;
+ break;
+ case '}':
+ level--;
+ break;
+ }
+ }
+ return strptr;
+ }
+
+ public static int nextDelimiter(string delim,string str,int l)
+ {
+ int nxtdelim = -1;
+ int strptr = 0;
+ while(l-- > 0 && (nxtdelim == -1))
+ {
+ if (delim.IndexOf(str[strptr])>-1)
+ nxtdelim = strptr;
+ strptr++;
+ }
+ return nxtdelim;
+ }
+
+ public static string getProfile(string grp, string nam)
+ {
+ return getProfile(grp,nam,0);
+ }
+
+ public static string getProfile(string grp, string nam, int flag)
+ {
+ string buff=null;
+ if( grp==null ) return null;
+ PrivateProfile proc_ini = new PrivateProfile("proc.ini");
+ buff = proc_ini.Attr(grp,nam);
+ if (buff == null)
+ buff = "";
+ if(buff.Equals(""))
+ {
+ if (flag == 0)
+ buff = "<" + grp + "-" + nam + ">";
+ else
+ return null;
+ }
+ return buff;
+ }
+
+ public static string evaluate(string str,int len)
+ {
+ string retval=null;
+ string swhir = "PSU"; /* order inwhich to check */
+ string pn;
+ if(str[1]=='-')
+ {
+ int swptr = swhir.IndexOf((str.ToUpper())[0]);
+ byte swchar = 0;
+ if( swptr > -1 ) swchar = (byte)swhir[swptr];
+
+ byte sav=(byte)str[len];
+ str = str.Substring(0,len);
+ while ((swptr > -1) && (swhir[swptr] != 0) && retval == null)
+ {
+ if (swchar == 0) swchar = (byte)str[0];
+ switch((char)swchar)
+ {
+ case 'U':
+ retval=getProfile("Unit",str.Substring(2),swhir[swptr]);
+ break;
+ case 'S':
+ retval=getProfile("Procedure Set",str.Substring(2),swhir[swptr]);
+ break;
+ case 'P':
+ pn = UnitSpecific(PNumber, 0, 1, mxPrcLen);
+ retval=getProfile(pn,str.Substring(2),swhir[swptr]);
+ break;
+ }
+ if (retval == null)
+ swchar= (byte)swhir[++swptr];
+ }
+ StringBuilder sb1 = new StringBuilder(str);
+ sb1.Insert(len,sav);
+ str = sb1.ToString();
+ }
+ else if(len==1 && (str.ToUpper())[0]=='U')
+ {
+ retval=getProfile("Unit","Number");
+ }
+ else if(len==2 && str.ToUpper().StartsWith("ID"))
+ {
+ retval=getProfile("Unit","ID");
+ }
+ if(retval == null)
+ {
+ retval=str.Substring(0,len+2>str.Length?str.Length:len+2);
+ }
+ return retval;
+ }
+
+ }
+
+
+ ///
+ /// Summary description for ROFSTHeader.
+ ///
+
+ public class FST_FileHeader
+ {
+ public int hSize; // size of header structure (record)
+ public short hYear;// year this header was designed (1993)
+ public byte hMonth;// month this header was designed (10)
+ public byte hDay;// day this header was designed (25)
+ public short hcYear;// FST file creation year
+ public byte hcMonth;// FST file creation month
+ public byte hcDay;// FST file creation day
+ public byte hcHour;// FST file creation hour
+ public byte hcMin;// FST file creation minute
+ public byte hcSec;// FST file creation seconds
+ public byte hcHund;// FST file creation hundredth seconds
+ public uint dboffset;// end of RO data, start of database list
+
+
+ // Constructors
+ // default constructor creates with zero'd out values
+ public FST_FileHeader()
+ {
+ hSize = 0;
+ hYear = 0;
+ hMonth = 0;
+ hDay = 0;
+ hcYear = 0;
+ hcMonth = 0;
+ hcDay = 0;
+ hcHour = 0;
+ hcMin = 0;
+ hcSec = 0;
+ hcHund = 0;
+ dboffset = 0;
+ }
+
+
+ // Constructor that initializes with pass in values
+ FST_FileHeader(int Size, short Year, byte Month, byte Day, short cYear, byte cMonth,
+ byte cDay, byte cHour, byte cMin, byte cSec, byte cHund, uint offset)
+ {
+ hSize = Size;
+ hYear = Year;
+ hMonth = Month;
+ hDay = Day;
+ hcYear = cYear;
+ hcMonth = cMonth;
+ hcDay = cDay;
+ hcHour = cHour;
+ hcMin = cMin;
+ hcSec = cSec;
+ hcHund = cHund;
+ dboffset = offset;
+ }
+
+
+ public void Read (BinaryReader br)
+ {
+ hSize = br.ReadInt32();
+ hYear = br.ReadInt16();
+ hMonth = br.ReadByte();
+ hDay = br.ReadByte();
+ hcYear = br.ReadInt16();
+ hcMonth = br.ReadByte();
+ hcDay = br.ReadByte();
+ hcHour = br.ReadByte();
+ hcMin = br.ReadByte();
+ hcSec = br.ReadByte();
+// byte tbyte = br.ReadByte();
+// hcHund = (sbyte)tbyte;
+ hcHund = br.ReadByte();
+ dboffset = br.ReadUInt32();
+
+ // return new FST_FileHeader(fSize,fYear,fMonth,fDay,
+ // fcYear,fcMonth,fcDay,fcHour,fcMin,fcSec,fcHund,fdboffset);
+ }
+
+
+ public void Write (BinaryWriter bw)
+ {
+ bw.Write(hSize);
+ bw.Write(hYear);
+ bw.Write(hMonth);
+ bw.Write(hDay);
+ bw.Write(hcYear);
+ bw.Write(hcMonth);
+ bw.Write(hcDay);
+ bw.Write(hcHour);
+ bw.Write(hcMin);
+ bw.Write(hcSec);
+ bw.Write(hcHund);
+ bw.Write(dboffset);
+ }
+
+
+ public int GetStructSize()
+ {
+ int rtval = 0;
+
+ // You can only use sizeof() in unsafe compiles
+ // so we'll do it by hand...
+ // each number is the number of bytes
+
+ rtval += 4; //sizeof(hSize);
+ rtval += 2; //sizeof(hYear);
+ rtval += 1; //sizeof(hMonth);
+ rtval += 1; //sizeof(hDay);
+ rtval += 2; //sizeof(hcYear);
+ rtval += 1; //sizeof(hcMonth);
+ rtval += 1; //sizeof(hcDay);
+ rtval += 1; //sizeof(hcHour);
+ rtval += 1; //sizeof(hcMin);
+ rtval += 1; //sizeof(hcSec);
+ rtval += 1; //sizeof(hcHund);
+ rtval += 4; //sizeof(dboffset);
+
+ return rtval;
+ }
+
+
+ public void SetHeader(uint offset)
+ {
+ hSize = GetStructSize();
+ hYear = 1993;
+ hMonth = 10;
+ hDay = 25;
+ DateTime dt = DateTime.Now;
+ hcYear = (short)dt.Year;
+ hcMonth = (byte)dt.Month;
+ hcDay = (byte)dt.Day;
+ hcHour = (byte)dt.Hour;
+ hcMin = (byte)dt.Minute;
+ hcSec = (byte)dt.Second;
+ hcHund = (byte)dt.Millisecond;
+ dboffset = offset;
+ }
+ }
+
+
+ public class ROFST_DbInfo
+ {
+ public ushort dbiID; // Number part of table name (RO000002 => 02)
+ public ushort dbiType; // database type (Setpoint,Graphics,User defined)
+ public ushort dbiAW; // length of widest AccPageID
+ public uint dbiGL; // FST file position of this group
+ public uint dbiIL; // FST file position of list of ROIDs
+ public uint dbiAL; // FST file position of list of AccPageIDs
+ public uint dbiEND; // FST file position of the end of this group
+ // !!! make sure to convert strings to char arrays when writing
+ public string dbiTitle; // database title
+ public string dbiAP; // AccPageID Prefix (ex. SP- )
+
+
+ // Constructors
+ // default constructor creates with zero'd out values
+ public ROFST_DbInfo()
+ {
+ dbiID = 0;
+ dbiType = 0;
+ dbiAW = 0;
+ dbiGL = 0;
+ dbiIL = 0;
+ dbiAL = 0;
+ dbiEND = 0;
+ dbiTitle = "";
+ dbiAP = "";
+ }
+
+
+ // Constructor that initializes with pass in values
+ ROFST_DbInfo(ushort ID, ushort Type, ushort AW, uint GL, uint IL, uint AL, uint END,
+ string Title, string dbiAP)
+ {
+ dbiID = ID;
+ dbiType = Type;
+ dbiAW = AW;
+ dbiGL = GL;
+ dbiIL = IL;
+ dbiAL = AL;
+ dbiEND = END;
+ dbiTitle = Title;
+ dbiAP = dbiAP;
+ }
+
+
+ public void WriteUntAndShort(BinaryWriter bw)
+ {
+ bw.Write(dbiID);
+ bw.Write(dbiType);
+ bw.Write(dbiAW);
+ bw.Write(dbiGL);
+ bw.Write(dbiIL);
+ bw.Write(dbiAL);
+ bw.Write(dbiEND);
+ }
+
+
+ void WriteString(BinaryWriter bw, string str)
+ {
+ byte nullbyte = 0;
+ byte []wrBytes = new byte[str.Length + 1];
+ int i;
+ for(i =0; i < str.Length; i++)
+ {
+// byte WrByte;
+// WrByte = (byte)str[i];
+// bw.Write(WrByte);
+ wrBytes[i] = (byte)str[i];
+ }
+ wrBytes[i] = nullbyte;
+ bw.Write(wrBytes);
+// bw.Write(nullbyte);
+ }
+
+
+ public void WriteStrings(BinaryWriter bw)
+ {
+ WriteString(bw,dbiTitle);
+ WriteString(bw,dbiAP);
+ }
+
+
+ public uint GetStructSize()
+ {
+ uint rtval = 0;
+
+ // You can only use sizeof() in unsafe compiles
+ // so we'll do it by hand...
+ // each number is the number of bytes
+
+ rtval += 2; //sizeof(dbiID);
+ rtval += 2; //sizeof(dbiType);
+ rtval += 2; //sizeof(dbiAW);
+ rtval += 4; //sizeof(dbiGL);
+ rtval += 4; //sizeof(dbiIL);
+ rtval += 4; //sizeof(dbiAL);
+ rtval += 4; //sizeof(dbiEND);
+ rtval += 4; //sizeof(uint); // to simulate the (char *) in the old code (16 datatypes)
+ rtval += 4; //sizeof(uint); // to simulate the (char *) in the old code (16 datatypes)
+
+ return rtval;
+ }
+
+
+ public void Load(BinaryReader br)
+ {
+ ReadValues(br);
+ }
+
+ // public void ReadStrings(BinaryReader br)
+ // {
+ // dbiTitle = ROFST_File.LoadString(br);
+ // dbiAP = ROFST_File.LoadString(br);
+ // }
+
+
+ public void ReadValues(BinaryReader br)
+ {
+ dbiID = br.ReadUInt16();
+ dbiType = br.ReadUInt16();
+ dbiAW = br.ReadUInt16();
+ dbiGL = br.ReadUInt32();
+ dbiIL = br.ReadUInt32();
+ dbiAL = br.ReadUInt32();
+ dbiEND = br.ReadUInt32();
+ uint tmp = br.ReadUInt32();
+ uint tmp1 = br.ReadUInt32();
+ }
+ }
+
+
+
+ // structure to hold information to add a new group
+ public struct AddGroup
+ {
+ public uint grp_id;
+ public uint grp_parid;
+ public string grp_name;
+ public short grp_type;
+ public short grp_stat;
+ public uint grp_offset;
+ public int grp_pargrpidx;
+
+
+ // These functions are needed to update values when
+ // referenced from the ArrayLists (allNewGrps)
+// public void OR_grp_type(short val)
+// {
+// ushort gtype = (ushort)grp_type;
+// gtype |= (ushort)val;
+// grp_type = (short)gtype;
+// }
+//
+//
+// public void SET_grp_parid(uint val)
+// {
+// grp_parid = val;
+// }
+//
+//
+// public void SET_grp_pargrpidx(int val)
+// {
+// grp_pargrpidx = val;
+// }
+//
+//
+// public void SET_grp_stat(short val)
+// {
+// grp_stat = val;
+// }
+//
+//
+// public void SET_grp_offset(uint val)
+// {
+// grp_offset = val;
+// }
+ }
+
+
+ // structure to hold information to add a new RO
+ public struct AddRO
+ {
+ public uint ro_id;
+ public uint ro_parid;
+ public string ro_num;
+ public string ro_desc;
+ public string ro_val;
+ public short ro_type;
+ public short ro_stat;
+ public int ro_offset;
+ public int ro_pargrpidx; // index into allNewGrps
+
+
+ // These functions are needed to update values when
+ // referenced from the ArrayLists (allNewRos)
+// public void SET_ro_pargrpidx(int val)
+// {
+// ro_pargrpidx = val;
+// }
+//
+//
+// public void SET_ro_parid(uint val)
+// {
+// ro_parid = val;
+// }
+//
+//
+// public void SET_ro_stat(short val)
+// {
+// ro_stat = val;
+// }
+//
+//
+// public void SET_ro_offset(int val)
+// {
+// ro_offset = val;
+// }
+ }
+
+
+ // structure to hold RO difference information
+ public struct DiffRO
+ {
+ public uint id;
+ public short type;
+ public string desc;
+ public string val;
+ public uint oldoff; // index into old RO.FST file (approved)
+ }
+
+
+ // RO update info arrays.
+ // one of these structures is created from each RO database
+ // (Setpoints, Graphics, User Defined, etc.)
+ public struct dbinew
+ {
+ public ArrayList aryAddedRO;
+ public ArrayList aryAddedGroup;
+ public ArrayList aryAddedDiff;
+ }
+
+
+ // structure to store file positions in the RO.FST file
+ public struct locinc
+ {
+ public uint maxloc;
+ public int inc;
+ }
+
+
+ /*
+ ** Structure of the graphics' values.
+ ** LocalGrfStats ( in ROFST_File class) is used to hold the current
+ ** values "locally" in memory
+ */
+ public struct GrfStats
+ {
+ public string PixFileName;
+ public int PixFileTime;
+ public short PixFileHeight;
+ public short PixFileWidth;
+
+ public void Clear()
+ {
+ PixFileName="";
+ PixFileTime = 0;
+ PixFileHeight = 0;
+ PixFileWidth = 0;
+ }
+
+ public void Load(string instr)
+ {
+ short DeciPerRow = 120;
+ short DeciPerCol = 60;
+ StringBuilder sb = new StringBuilder();
+ int i=0;
+ bool nl = false;
+ /*
+ sscanf(retval,"%s\n%08lx\n%04x\n%04x",LocalGrfStats.PixFileName,
+ &LocalGrfStats.PixFileTime,&LocalGrfStats.PixFileHeight,
+ &LocalGrfStats.PixFileWidth);
+ LocalGrfStats.PixFileHeight *= DeciPerRow;
+ LocalGrfStats.PixFileWidth *= DeciPerCol;
+ */
+ while (!nl && (instr[i]!= 0))
+ {
+ if (instr[i]=='\n')
+ nl=true;
+ else
+ sb.Append(instr[i]);
+ i++;
+ }
+ if (nl)
+ {
+ PixFileName = sb.ToString();
+ }
+
+ nl = false;
+ sb.Remove(0,sb.Length);
+ while (!nl && (instr[i]!=0))
+ {
+ if (instr[i]=='\n')
+ nl=true;
+ else
+ sb.Append(instr[i]);
+ i++;
+ }
+ PixFileTime = Convert.ToInt32(sb.ToString(),16);
+
+ nl = false;
+ sb.Remove(0,sb.Length);
+ while (!nl && (instr[i]!=0))
+ {
+ if (instr[i]=='\n')
+ nl=true;
+ else
+ sb.Append(instr[i]);
+ i++;
+ }
+ PixFileHeight = Convert.ToInt16(sb.ToString(),16);
+ PixFileHeight *= DeciPerRow;
+
+ sb.Remove(0,sb.Length);
+ while ((i < instr.Length) && (instr[i]!=0))
+ {
+ sb.Append(instr[i]);
+ i++;
+ }
+ PixFileWidth = Convert.ToInt16(sb.ToString(),16);
+ PixFileWidth *= DeciPerCol;
+ }
+ }
+
+
+ public class ROFST_File
+ {
+ public enum ROTypes
+ {
+ None=0, Text=1, Table=2, Plot=4, Figure=8
+ };
+
+ private string [] UnitVariables =
+ {
+ "All of the following",//
+ "Number", // 1L; - 1, 2 etc.
+ "Other Number", // 2L; - 2, 1 etc.
+ "Text", // 3L; - One, Two etc. or Unit One, Unit Two
+ "Other Text", // 4L; - Two, One etc. or Unit Two, Unit One
+ "ID", // 5L; - 1Bw, 2Bw etc.
+ "Other ID", // 6L; - 2Bw, 1Bw etc.
+ "Name", // 7L; - Braidwood Unit 1
+ "Other Name" // 8L; - Braidwood Unit 2
+ };
+ private uint NumUnitVariables =9;
+
+
+ private ArrayList [] allNewRos; // new ROs
+ private ArrayList [] allDifferences; // changed ROs
+ private ArrayList [] allNewGrps; // new Groups
+ private ArrayList allLocations; // positions in RO.FST
+
+
+ private int curTblIdx=0; // index into allxxxxx arraylists
+ private uint NewID = 0xFFFF0000;
+ private uint whereisgl = 0;
+ private ushort maxaw=0;
+ private ushort maxtype=0;
+ private int lastLocationIdx = 0;
+
+ public BinaryReader brROFst; // file handle into RO.FST
+ public ArrayList DatabasesInfo; // Holds the current RO.FST data
+ public ArrayList dbiNewInfo; // will hold new RO.FST data
+
+ public short numDatabases; // number of databases in RO.FST
+ public FST_FileHeader Header;
+ // public UserRunTime usrRunTime;
+ public string DirPath;
+
+ public string DefaultGraphicFileExt = "";
+
+ // RO Graphics information
+ GrfStats LocalGrfStats;
+
+ // constructor loads ro.fst databases
+ // public ROFST(string path, UserRunTime urt)
+ public ROFST_File(string path)
+ {
+ try
+ {
+ brROFst = new BinaryReader(File.Open(path,System.IO.FileMode.Open,System.IO.FileAccess.ReadWrite,FileShare.ReadWrite));
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show("Open "+path+"\n\n" + e.Message,"RO.FST Error");
+ return;
+ }
+ DirPath = path; // path of RO.FST file
+
+ // usrRunTime = urt;
+
+ // Read the RO.FST header information
+ Header = new FST_FileHeader();
+ Header.Read(brROFst);
+ brROFst.BaseStream.Seek(Header.dboffset,SeekOrigin.Begin);
+ uint howbig = brROFst.ReadUInt32();
+ short howmany = brROFst.ReadInt16();
+
+ numDatabases = howmany;
+ // dbcount = numDatabases;
+ DatabasesInfo = new ArrayList();
+ dbiNewInfo = new ArrayList();
+
+ // Load the database into the arrays
+ for (int i=0;i topid)return 0; // Beyond range
+ while (topr > botr+1)
+ {
+ guessr=botr+((topr-botr)*(id-botid))/(topid-botid);
+
+ if (guessr==botr) guessr=botr+1;
+ else if (guessr==topr) guessr=topr-1;
+
+ guess=start+guessr*siz;
+ brROFst.BaseStream.Seek(guess,SeekOrigin.Begin);
+ //getID(guess,&retval)
+ guessid=brROFst.ReadUInt32();
+
+ if(guessid==id)
+ {
+ break; // found, break out of while loop
+ }
+ else if(guessid < id)
+ {
+ botr=guessr;
+ botid=guessid;
+ }
+ else
+ {
+ topr=guessr;
+ topid=guessid;
+ }
+ }
+ if(guessid==id)retval=guess; // Any other record
+ return retval;
+ }
+
+ private uint _getID(uint off,ref uint nxtoff)
+ {
+ uint retval = 0;
+ if (off > 0)
+ {
+ brROFst.BaseStream.Seek(off,SeekOrigin.Begin);
+ retval = brROFst.ReadUInt32();
+ nxtoff = brROFst.ReadUInt32();
+ }
+ return retval;
+ }
+
+ // Find the location of an RO value in the RO.FST file
+ private uint toolsFindRO(uint id, uint start, uint end)
+ {
+ uint retval=0;
+ uint topid=0,botid=0,recs=0,siz=0;
+ siz=8; // c code:sizeof(topid)*2;
+ recs=(end-start)/siz; //c code: (end-start)>>3
+ uint guessr,guess=0,guessid=0;
+ uint botr=0,topr=recs;
+ uint topoff =0, botoff=0;
+ //getID(end-siz,&topoff);
+ topid=_getID(end-siz,ref topoff);
+ if(id==topid)return topoff; // Last record
+
+ //getID(start,&botoff);
+ botid=_getID(start,ref botoff);
+ if(id==botid)return botoff; // First record
+
+ if(id < botid || id > topid)return 0; // Beyond range
+ while (topr > botr+1)
+ {
+ guessr=botr+((topr-botr)/2);
+
+ if (guessr==botr) guessr++;
+ else if (guessr==topr) guessr--;
+
+ //getID(guess,&retval)
+ guessid=_getID(start+guessr*siz,ref retval);
+
+ if(guessid==id)
+ {
+ break; // found, break out of while loop
+ }
+ else if(guessid < id)
+ {
+ botr=guessr;
+ botid=guessid;
+ }
+ else
+ {
+ topr=guessr;
+ topid=guessid;
+ }
+ }
+ if (guessid == id) return retval;
+ return 0;
+ }
+
+
+ // return the type of the given RO
+ private ROTypes FindROType(uint rec, uint start, uint end)
+ {
+ short retval=0;
+ byte[] tbyte= new byte[100];
+ uint fnd;
+ if((fnd=FindRO(rec,start,end))>0)
+ {
+ uint offset=brROFst.ReadUInt32();
+ brROFst.BaseStream.Seek((long)offset,SeekOrigin.Begin);
+ uint guessid=brROFst.ReadUInt32();
+ uint parid=brROFst.ReadUInt32();
+ short count=brROFst.ReadInt16();
+ retval=brROFst.ReadInt16(); // RO Type
+ }
+ return (ROTypes)retval;
+ }
+
+
+ // Get the RO Type from the ROID
+ public ROTypes GetROType(string ROID)
+ {
+ // break up ROID into table and record
+ ushort tbl = System.Convert.ToUInt16(ROID.Substring(0,4),16);
+ uint rec = System.Convert.ToUInt32(ROID.Substring(4,8),16);
+ ushort opt=0;
+ if (ROID.Length>12) opt = System.Convert.ToUInt16(ROID.Substring(8,ROID.Length-12),16);
+ if (tbl==0xFFFF)
+ return ROTypes.None; // 0xFFFF is ro from proc.ini file
+ int num=0;
+ for (int i=0; i < numDatabases && ((ROFST_DbInfo)DatabasesInfo[i]).dbiID!=tbl;i++) num++;
+ if (num < numDatabases)
+ {
+ return FindROType(rec,((ROFST_DbInfo)DatabasesInfo[num]).dbiIL,((ROFST_DbInfo)DatabasesInfo[num]).dbiAL);
+ }
+ return ROTypes.None;
+ }
+
+
+ private string FindROText(uint id, uint start,uint end)
+ {
+ string retval=null;
+ uint fnd;
+ if((fnd=FindRO(id,start,end))>0)
+ {
+ uint offset=brROFst.ReadUInt32();
+ brROFst.BaseStream.Seek((long)offset,SeekOrigin.Begin);
+ uint guessid=brROFst.ReadUInt32();
+ uint parid=brROFst.ReadUInt32();
+ short count=brROFst.ReadInt16();
+ ushort typ=brROFst.ReadUInt16();
+ if (count<0)retval=GetAsciiString(brROFst);
+ }
+ return retval;
+ }
+
+
+ // return the RO defined in the PROC.INI file
+ // (master / slave logic)
+ private string roUnitValue(uint rec)
+ {
+ string buff="";
+ PrivateProfile proc_ini = new PrivateProfile("proc.ini");
+ for(int i=0; i < NumUnitVariables; i++)
+ {
+ if((i+1) == rec)
+ {
+ buff = proc_ini.Attr("Unit",UnitVariables[i+1]);
+ if (buff == null || buff.Equals(""))
+ buff = "{"+ UnitVariables[i+1] + "}";
+ break; // break out of for loop
+ }
+ }
+ return buff;
+ }
+
+
+ //
+ // this function will take the ro text value and see if
+ // a macro has been used. If so it will perform the macro
+ // operation on the substring in the text value
+ //
+ // right now the only macro is @HSP(), where every space between
+ // the "(" and ")" will be replaced with a hardspace
+ //
+ public string processMacros(string rostring)
+ {
+ StringBuilder bldstr = new StringBuilder();
+ int cptr = -1;
+ int stptr = 0;
+ if( rostring == null ) return rostring;
+ while( (cptr = rostring.IndexOf("@HSP(",stptr)) != -1 )
+ {
+ bldstr.Append(rostring.Substring(0,cptr-stptr));
+ int cptr2 = rostring.IndexOf(")",cptr);
+ if (cptr2 != -1)
+ {
+ int numspaces = cptr2 - cptr - 5;
+ for (int i=0; i< numspaces; i++)
+ bldstr.Append("\xFF");
+ stptr = cptr2 + 1;
+ }
+ else
+ {
+ bldstr.Append(rostring.Substring(cptr,5));
+ stptr += 5;
+ }
+ }
+ if (stptr < rostring.Length)
+ bldstr.Append(rostring.Substring(stptr));
+ return bldstr.ToString();
+ }
+
+
+
+ private string processROString(string rostr, short menuitem)
+ {
+ string newstr="";
+ strList2 strlst2 = new strList2(rostr);
+ strList strlst = new strList(strlst2.toText());
+ newstr = strlst.toText((int)menuitem);
+
+ newstr = newstr.Replace("\\n","\n");
+ newstr = processMacros(newstr);
+ return newstr;
+ }
+
+
+ public string GetRO(string ROID)
+ {
+ return _GetRO(ROID,1);
+ }
+
+ public string GetEntireRO(string ROID)
+ {
+ return _GetRO(ROID,0);
+ }
+
+ public string GetRO(string ROID, string ProcNum)
+ {
+ ROProcessTools.ProcedureNumber = ProcNum;
+ return GetRO(ROID);
+ }
+
+ public string GetEntireRO(string ROID, string ProcNum)
+ {
+ ROProcessTools.ProcedureNumber = ProcNum;
+ return GetEntireRO(ROID);
+ }
+
+ // Get the RO value from the ROID
+ private string _GetRO(string ROID_in, short procopt)
+ {
+ string ROID = ROID_in;
+ if (ROID.Length == 12)
+ ROID = ROID + "0000";
+ ushort tbl = System.Convert.ToUInt16(ROID.Substring(0,4),16);
+ uint rec = System.Convert.ToUInt32(ROID.Substring(4,8),16);
+ ushort opt=0;
+ // clear graphics info
+ LocalGrfStats.Clear();
+ opt = System.Convert.ToUInt16(ROID.Substring(12,ROID.Length-12),16);
+
+ if (tbl==0xFFFF)
+ return roUnitValue(rec); // RO in PROC.INI file
+
+ int num=0;
+ for(int i=0; i < numDatabases && ((ROFST_DbInfo)DatabasesInfo[i]).dbiID!=tbl;i++) num++;
+
+ string retval = null;
+ if(num < numDatabases)
+ {
+ retval=FindROText(rec,((ROFST_DbInfo)DatabasesInfo[num]).dbiIL,((ROFST_DbInfo)DatabasesInfo[num]).dbiAL);
+ }
+ if ((retval!=null&&retval!="") && (GetROType(ROID)==ROTypes.Figure))
+ {
+ // load graphic stats
+ StringBuilder sbtmp = new StringBuilder();
+ LocalGrfStats.Load(retval);
+ sbtmp.Append(LocalGrfStats.PixFileName);
+ sbtmp.Append("\n");
+ sbtmp.Append(LocalGrfStats.PixFileTime.ToString("x8"));
+ sbtmp.Append("\n");
+ sbtmp.Append(LocalGrfStats.PixFileHeight.ToString("x4"));
+ sbtmp.Append("\n");
+ sbtmp.Append(LocalGrfStats.PixFileWidth.ToString("x4"));
+ retval = sbtmp.ToString();
+
+ }
+ if(retval!=null && retval.Length>0 && !(GetROType(ROID)==ROTypes.Figure))
+ {
+ retval = retval.Replace("\r","");
+ if (procopt!=0)
+ {
+ string newstr = processROString(retval,(short)opt);
+ if (newstr!=null && !newstr.Equals(""))
+ retval = newstr;
+ }
+ }
+ return retval;
+ }
+
+
+ // Get the RO's parent ID
+ private uint GetParent(uint rec, uint start,uint end,ref uint offset)
+ {
+ uint parid=0;
+ uint fnd;
+ if((fnd=FindRO(rec,start,end))>0)
+ {
+ offset=brROFst.ReadUInt32();
+ brROFst.BaseStream.Seek((long)offset,SeekOrigin.Begin);
+ uint guessid=brROFst.ReadUInt32();
+ parid=brROFst.ReadUInt32();
+ }
+ return parid;
+ }
+
+
+ // Get the RO's parent ID from the ROID
+ public uint GetROParent(string ROID)
+ {
+ ushort tbl = Convert.ToUInt16(ROID.Substring(0,4),16);
+ uint rec = Convert.ToUInt32(ROID.Substring(4,8),16);
+ uint retval=0;
+ int indx=0;
+ for(int i=0; i < numDatabases && ((ROFST_DbInfo)DatabasesInfo[i]).dbiID!=tbl; i++) indx++; // position to the RO database
+
+ if(indx < numDatabases)
+ {
+ uint offset=0;
+ retval=GetParent(rec,((ROFST_DbInfo)DatabasesInfo[indx]).dbiIL,((ROFST_DbInfo)DatabasesInfo[indx]).dbiAL,ref offset);
+ }
+ return retval;
+ }
+
+
+ // Get the group title
+ private string GetDescription(ushort tbl, uint rec)
+ {
+ string retval=null;
+ if(tbl==0xFFFF)
+ {
+ if(rec == 0)
+ {
+ retval="Unit Information";
+ }
+
+ else if (rec <= NumUnitVariables)
+ {
+ int irec = (int)rec;
+ retval=UnitVariables[irec];
+ }
+ }
+ else
+ {
+ int indx=0;
+ for(int i=0; i < numDatabases && ((ROFST_DbInfo)DatabasesInfo[i]).dbiID!=tbl; i++) indx++;
+
+ if(indx < numDatabases)
+ {
+ uint id;
+ brROFst.BaseStream.Seek(((ROFST_DbInfo)DatabasesInfo[indx]).dbiGL,SeekOrigin.Begin);
+ id = brROFst.ReadUInt32();
+
+ if((rec==0) || rec==id)
+ {
+ retval=((ROFST_DbInfo)DatabasesInfo[indx]).dbiTitle;
+ }
+ else
+ {
+ uint offset=0;
+ uint parid = this.GetParent(rec,((ROFST_DbInfo)DatabasesInfo[indx]).dbiIL,((ROFST_DbInfo)DatabasesInfo[indx]).dbiAL,ref offset);
+ if(parid!=0)
+ {
+ uint t1 = FindRO(parid,((ROFST_DbInfo)DatabasesInfo[indx]).dbiIL,((ROFST_DbInfo)DatabasesInfo[indx]).dbiAL);
+ t1 = brROFst.ReadUInt32();
+ uint guessid;
+ brROFst.BaseStream.Seek(t1,SeekOrigin.Begin);
+ guessid = brROFst.ReadUInt32();
+ parid = brROFst.ReadUInt32();
+ short count;
+ count = brROFst.ReadInt16();
+ for(int i=0; i < count && retval == null; i++)
+ {
+ uint off;
+ off=brROFst.ReadUInt32();
+ ushort typ;
+ typ=brROFst.ReadUInt16();
+ if(off==offset)
+ {
+ retval = GetAsciiString(brROFst);
+ }
+ else
+ {
+ SkipString(brROFst);
+ }
+ }
+ }
+ }
+ }
+ }
+ return retval;
+ }
+
+
+ // Get the group title by ROID
+ public string GetRODescription(string ROID)
+ {
+ ushort tbl = Convert.ToUInt16(ROID.Substring(0,4),16);
+ uint rec = Convert.ToUInt32(ROID.Substring(4,8),16);
+ return (GetDescription(tbl,rec));
+ }
+
+
+ // get the Accessory Page ID
+ string FindROAccID(uint id, uint start, uint end)
+ {
+ // Returns allocated space
+ string retval=null;
+ if(FindRO(id,start,end)!=0)
+ {
+ uint offset = brROFst.ReadUInt32();
+ brROFst.BaseStream.Seek(offset,SeekOrigin.Begin);
+ uint guessid = brROFst.ReadUInt32();
+ uint parid = brROFst.ReadUInt32();
+ short count = brROFst.ReadInt16();
+ ushort ltyp = brROFst.ReadUInt16();
+ SkipString(brROFst);
+ retval = GetAsciiString(brROFst);
+ }
+ return retval;
+ }
+
+
+ private string roUnitAccID(uint rec)
+ {
+ string rotbuf="";
+ for(int i=0; i < NumUnitVariables; i++)
+ {
+ if((i+1L)==rec)
+ {
+ rotbuf = "U-"+UnitVariables[i+1];
+ break; // break out of for loop
+ }
+ }
+ return rotbuf;
+ }
+
+
+ // Get accessory page ID via the table and record
+ // also include unit specs from ini file
+ private string GetAccID(ushort tbl, uint rec)
+ {
+ string retval=null;
+
+ if (tbl==0xFFFF)
+ {
+ return roUnitAccID(rec); // PROC.INI ro
+ }
+ int indx=0;
+ for(int i=0; i < numDatabases && ((ROFST_DbInfo)DatabasesInfo[i]).dbiID!=tbl; i++)indx++;
+
+ if(indx < numDatabases)
+ {
+ retval=FindROAccID(rec,((ROFST_DbInfo)DatabasesInfo[indx]).dbiIL,((ROFST_DbInfo)DatabasesInfo[indx]).dbiAL);
+ if (retval == null)
+ retval=""; // RO not found, has ? in procedures
+ else
+ retval = ((ROFST_DbInfo)DatabasesInfo[indx]).dbiAP + "-" + retval;
+ }
+ return retval;
+ }
+
+
+ // Get the accessory page ID from the ROID
+ // includes unit specs from ini file
+ public string RoidToAccId(string ROID)
+ {
+ ushort tbl = Convert.ToUInt16(ROID.Substring(0,4),16);
+ uint rec = Convert.ToUInt32(ROID.Substring(4,8),16);
+ if(tbl != 0)
+ return GetAccID(tbl,rec);
+ return null;
+ }
+
+
+ // Get the accessory page ID
+ private string GetAppID(ushort tbl)
+ {
+ string retval = null;
+ if (tbl==0xFFFF)
+ {
+ return "U"; // PROC.INI ro
+ }
+ int indx=0;
+ for(int i=0; i < numDatabases && ((ROFST_DbInfo)DatabasesInfo[i]).dbiID!=tbl; i++) indx++;
+
+ if(indx < numDatabases)
+ return ((ROFST_DbInfo)DatabasesInfo[indx]).dbiAP;
+ return retval;
+ }
+
+
+ // Get the accessory page ID from the ROID
+ public string GetROAppID(string ROID)
+ {
+ ushort tbl = Convert.ToUInt16(ROID.Substring(0,4),16);
+ uint rec = Convert.ToUInt32(ROID.Substring(4,8),16);
+ return GetAppID(tbl);
+ }
+
+
+ public uint FindROFromTblRec(ushort tbl, uint id)
+ {
+ if(tbl==0xFFFF)
+ {
+ //PROC.INI ro
+ if (id < NumUnitVariables) return 1;
+ return 0;
+ }
+ int indx=0;
+ for(int i=0; i < numDatabases && ((ROFST_DbInfo)DatabasesInfo[i]).dbiID!=tbl;i++) indx++;
+ if (indx==numDatabases) return 0;
+ return FindRO(id,((ROFST_DbInfo)DatabasesInfo[indx]).dbiIL,((ROFST_DbInfo)DatabasesInfo[indx]).dbiAL);
+ }
+
+
+ public bool ROExists(string ROID)
+ {
+ ushort tbl = Convert.ToUInt16(ROID.Substring(0,4),16);
+ uint rec = Convert.ToUInt32(ROID.Substring(4,8),16);
+ uint off = FindROFromTblRec(tbl,rec);
+ return (off!=0);
+ }
+
+
+ public static void SkipString(BinaryReader br)
+ {
+ byte []input = {0};
+ do
+ {
+ try
+ {
+ input[0] = br.ReadByte();
+ }
+ catch (System.IO.EndOfStreamException)
+ {
+ input[0] = 0;
+ }
+ }while (input[0] != 0);
+ return;
+ }
+
+
+ public static string GetAsciiString(BinaryReader br, int len)
+ {
+ StringBuilder inpstr = new StringBuilder();
+ byte input = 0;
+ int cnt = 0;
+ do
+ {
+ try
+ {
+ input = br.ReadByte();
+ inpstr.Append(Convert.ToChar(input));
+ }
+ catch (System.IO.EndOfStreamException)
+ {
+ input = 0;
+ while (cnt < len)
+ {
+ inpstr.Append(Convert.ToChar(input));
+ cnt++;
+ }
+ }
+ cnt++;
+ }while (cnt < len);
+
+ return (inpstr.ToString());
+ }
+
+
+ public static string GetAsciiString(BinaryReader br)
+ {
+ StringBuilder inpstr = new StringBuilder();
+ byte input = 0;
+ do
+ {
+ try
+ {
+ input = br.ReadByte();
+ if (input > 0)
+ {
+ inpstr.Append(Convert.ToChar(input));
+ }
+ }
+ catch (System.IO.EndOfStreamException)
+ {
+ input = 0;
+ }
+ }while (input != 0);
+ return (inpstr.ToString());
+ }
+
+
+ // return the index into the the DatabasesInfo array
+ private short GetTable(ushort tblid)
+ {
+ short found = -1;
+ for(short i = 0; (i < numDatabases) && (found == -1); i++)
+ {
+ if (tblid == ((ROFST_DbInfo)DatabasesInfo[i]).dbiID)
+ found = i;
+ }
+
+ if (found == -1)
+ {
+ // add a new item to the list
+ found = numDatabases;
+ ROFST_DbInfo tmpDbInfo = new ROFST_DbInfo();
+ tmpDbInfo.dbiID = tblid;
+ DatabasesInfo.Add(tmpDbInfo);
+ dbinew dbinewItem;
+ dbinewItem = new dbinew();
+ dbiNewInfo.Add(dbinewItem);
+ numDatabases++;
+ }
+ return found;
+ }
+
+
+ // Add a new RO record to the arraylist of allNewRos
+ private int AddNewRO(uint id,string num,string desc,string val,short type,uint grpn)
+ {
+ int rtval;
+ AddRO tmpAddRO = new AddRO();
+ tmpAddRO.ro_id = id;
+ tmpAddRO.ro_num = num;
+ tmpAddRO.ro_desc = desc;
+ tmpAddRO.ro_val = val;
+ tmpAddRO.ro_type = type;
+ tmpAddRO.ro_parid = grpn;
+ (allNewRos[curTblIdx]).Add(tmpAddRO);
+ rtval = (allNewRos[curTblIdx]).Count -1;
+ return rtval;
+ }
+
+
+ private int AddNewRO(string num,string desc,string val,short type,uint grpn)
+ {
+ return AddNewRO(NewID++, num, desc, val, type, grpn);
+ }
+
+
+ // Add a new Group record to the arraylist of allNewGrps
+ private int AddNewGroup(uint id,string grpname,short type)
+ {
+ int rtval;
+ AddGroup tmpAddGroup = new AddGroup();
+ tmpAddGroup.grp_id = id;
+ tmpAddGroup.grp_name = grpname;
+ tmpAddGroup.grp_type = type;
+ (allNewGrps[curTblIdx]).Add(tmpAddGroup);
+ rtval = (allNewGrps[curTblIdx]).Count -1;
+ return rtval;
+ }
+
+
+ private int AddNewGroup(string grpname,short type)
+ {
+ return AddNewGroup(NewID++,grpname,type);
+ }
+
+
+ // Return the index into the allNewGrps arraylist
+ private int FindNewGroup(uint rec)
+ {
+ int rtval = -1;
+ for (int i=0; i < (allNewGrps[curTblIdx]).Count && rtval == -1; i++)
+ {
+ if (((AddGroup)(allNewGrps[curTblIdx])[i]).grp_id == rec)
+ rtval = i;
+ }
+ return rtval;
+ }
+
+
+ private int connectToNewGroupfRO(int lastaddROIDX,uint rec,uint parid,string desc)
+ {
+ int newgrpIDX;
+ // position to the correct RO group
+ if((newgrpIDX=FindNewGroup(rec))== -1)
+ {
+ // group not found, add a new one
+ newgrpIDX=AddNewGroup(rec,desc,0);
+ }
+ //update parent info
+ AddRO taddro = (AddRO)(allNewRos[curTblIdx][lastaddROIDX]);
+ taddro.ro_pargrpidx = newgrpIDX;
+ taddro.ro_parid = rec;
+ allNewRos[curTblIdx].RemoveAt(lastaddROIDX);
+ allNewRos[curTblIdx].Insert(lastaddROIDX,taddro);
+
+ //update group info
+ AddGroup taddgroup = (AddGroup)(allNewGrps[curTblIdx][newgrpIDX]);
+ taddgroup.grp_type |= ((AddRO)(allNewRos[curTblIdx])[lastaddROIDX]).ro_type;
+ taddgroup.grp_parid = parid;
+ allNewGrps[curTblIdx].RemoveAt(newgrpIDX);
+ allNewGrps[curTblIdx].Insert(newgrpIDX,taddgroup);
+ return newgrpIDX;
+ }
+
+
+ private int connectToNewGroup(int lastaddgrpIDX,uint rec,uint parid,string desc)
+ {
+ // update group info
+ int newgrpIDX;
+ // position to the correct RO group
+ if((newgrpIDX=FindNewGroup(rec))== -1)
+ {
+ // group not found, add a new one
+ newgrpIDX=AddNewGroup(rec,desc,0);
+ }
+ AddGroup taddgroup = (AddGroup)(allNewGrps[curTblIdx][lastaddgrpIDX]);
+ taddgroup.grp_pargrpidx = newgrpIDX;
+ taddgroup.grp_parid = rec;
+ allNewGrps[curTblIdx].RemoveAt(lastaddgrpIDX);
+ allNewGrps[curTblIdx].Insert(lastaddgrpIDX,taddgroup);
+
+ taddgroup = (AddGroup)(allNewGrps[curTblIdx][newgrpIDX]);
+ taddgroup.grp_type |= ((AddGroup)(allNewGrps[curTblIdx])[lastaddgrpIDX]).grp_type;
+ taddgroup.grp_parid = parid;
+ allNewGrps[curTblIdx].RemoveAt(newgrpIDX);
+ allNewGrps[curTblIdx].Insert(newgrpIDX,taddgroup);
+ return newgrpIDX;
+ }
+
+
+ private void addDifference(uint id,string val,string desc,short type,uint offset)
+ {
+ DiffRO tmpDiff = new DiffRO();
+ tmpDiff.id=id;
+ tmpDiff.type=type;
+ tmpDiff.desc=desc;
+ tmpDiff.val=val;
+ tmpDiff.oldoff=offset;
+ allDifferences[curTblIdx].Add(tmpDiff);
+ }
+
+
+ private short ReadShort(BinaryReader br)
+ {
+ short rtnval = -1;
+ try
+ {
+ rtnval = br.ReadInt16();
+ }
+ catch (Exception)
+ {
+ rtnval = -1;
+ }
+ return rtnval;
+ }
+
+/*
+ * Read in the ROFST Update file. Put the changes in array lists
+ * to that will be used to organize and merge the differences into
+ * the target RO.FST file (usually in the Approved directory). For
+ * array lists, use the number of databases from the working draft
+ * (there may be new databases created since last approval)
+ */
+ public void processAppUpdFile(string sAppUpdFile, short nDB)
+ {
+ BinaryReader brAppUpd;
+ string num, desc, val;
+ short typ, inch;
+ uint rec;
+ ushort tbl;
+ uint parid;
+ int LastAddedROIDX=-1, LastAddedGrpIDX=-1;
+ curTblIdx = 0; // initialize Current Table Index
+ allNewRos = (ArrayList [])new ArrayList[nDB];
+ allNewGrps = (ArrayList [])new ArrayList[nDB];
+ allDifferences = (ArrayList [])new ArrayList[nDB];
+ allLocations = new ArrayList();
+
+ for (int i=0; i wid)
+ {
+ doff=(ushort)(wid-siznum-l);
+ }
+ while(wid > 0 && siznum < doff)
+ { // add spaces if necessary for alignment
+ buff.Append(' ');
+ siznum++;
+ wid--;
+ }
+ }
+ idx = 0;
+ while(wid > 0)
+ { // output the value or spaces to the specified width
+ if (idx < str.Length && str[idx] != 0 && str[idx] != '\n')
+ buff.Append(str[idx]);
+ else
+ buff.Append(" ");
+ wid--;
+ idx++;
+ }
+ }
+
+
+ private string getMenuString(short type,string val,string desc)
+ {
+ StringBuilder buff = new StringBuilder();
+ switch(type)
+ {
+ case 1:
+ placeText(buff,5,17,val);
+ buff.Append(" ");
+ break;
+ case 2:
+ placeText(buff,5,17,"(Table)");
+ buff.Append(" ");
+ break;
+ case 4:
+ placeText(buff,5,17,"(Graph)");
+ buff.Append(" ");
+ break;
+ }
+ buff.Append(desc);
+ return buff.ToString();
+ }
+
+
+ public void WriteString(BinaryWriter NewFSTFile, string str,bool AddNull)
+ {
+ int n=str.Length;
+ if (AddNull)
+ n++;
+ byte [] b = new byte[n];
+ for(int i =0; i < str.Length; i++)
+ {
+ b[i] = (byte)str[i];
+ }
+ NewFSTFile.Write(b,0,n);
+ }
+
+
+ public uint saveNewMenuEntries(BinaryWriter NewFSTFile,uint id)
+ {
+ long start=NewFSTFile.Seek(0,System.IO.SeekOrigin.Current);
+ int numNewRos = (allNewRos[curTblIdx]).Count;
+ int cntNewRos = 0;
+ while (cntNewRos < numNewRos)
+ {
+ // Skip to the one to be saved
+ while ((cntNewRos < numNewRos) &&
+ (((AddRO)(allNewRos[curTblIdx])[cntNewRos]).ro_stat != 1) &&
+ ((AddRO)(allNewRos[curTblIdx])[cntNewRos]).ro_parid != id)
+ cntNewRos++;
+ // If one exists, save it and skip to the next one
+ if (cntNewRos < numNewRos)
+ {
+ AddRO taddro = (AddRO)(allNewRos[curTblIdx][cntNewRos]);
+ taddro.ro_stat = 2;
+ allNewRos[curTblIdx].RemoveAt(cntNewRos);
+ allNewRos[curTblIdx].Insert(cntNewRos,taddro);
+ // Save the offset
+ NewFSTFile.Write(((AddRO)(allNewRos[curTblIdx])[cntNewRos]).ro_offset);
+ // Save the type
+ NewFSTFile.Write(((AddRO)(allNewRos[curTblIdx])[cntNewRos]).ro_type);
+ // Get the menu string
+ string mnustr = getMenuString(((AddRO)(allNewRos[curTblIdx])[cntNewRos]).ro_type,((AddRO)(allNewRos[curTblIdx])[cntNewRos]).ro_val,((AddRO)(allNewRos[curTblIdx])[cntNewRos]).ro_desc);
+ // Save menu entry
+ WriteString(NewFSTFile,mnustr,true);
+ cntNewRos++;
+ }
+ }
+ int cntNewGrps = 0;
+ int numNewGrps = (allNewGrps[curTblIdx]).Count;
+ while (cntNewGrps < numNewGrps)
+ {
+ // Skip to the one to be saved
+ while ((cntNewGrps < numNewGrps) &&
+ (((AddGroup)(allNewGrps[curTblIdx])[cntNewGrps]).grp_stat != 1 ||
+ ((AddGroup)(allNewGrps[curTblIdx])[cntNewGrps]).grp_parid != id))
+ cntNewGrps++;
+ // If one exists, save it and skip to the next one
+ if(cntNewGrps < numNewGrps)
+ {
+ // Change stat to menu entry saved
+ AddGroup taddgroup = (AddGroup)(allNewGrps[curTblIdx][cntNewGrps]);
+ taddgroup.grp_stat = 2;
+ allNewGrps[curTblIdx].RemoveAt(cntNewGrps);
+ allNewGrps[curTblIdx].Insert(cntNewGrps,taddgroup);
+ // Save the offset
+ NewFSTFile.Write(((AddGroup)(allNewGrps[curTblIdx])[cntNewGrps]).grp_offset);
+ // Save the type
+ NewFSTFile.Write(((AddGroup)(allNewGrps[curTblIdx])[cntNewGrps]).grp_type);
+ // Save menu entry
+ WriteString(NewFSTFile,((AddGroup)(allNewGrps[curTblIdx])[cntNewGrps]).grp_name,true);
+ cntNewGrps++;
+ }
+ }
+ return ((uint)((NewFSTFile.Seek(0,System.IO.SeekOrigin.Current)) - start));
+ }
+
+
+
+ public void AddLocation(uint location,int inc)
+ {
+ int t_inc = ((locinc)allLocations[lastLocationIdx]).inc;
+ if (location == ((locinc)allLocations[lastLocationIdx]).maxloc)
+ {
+ // update the current record
+ // - need to remove current item, then insert new item.
+ locinc tmploc = (locinc)(allLocations[lastLocationIdx]);
+ tmploc.inc += inc;
+ allLocations.RemoveAt(lastLocationIdx);
+ allLocations.Insert(lastLocationIdx,tmploc);
+ }
+ else
+ {
+ locinc tmploc = (locinc)(allLocations[lastLocationIdx]);
+ locinc newloc = new locinc();
+ // new item gets last item's maxloc
+ newloc.maxloc = tmploc.maxloc;
+ newloc.inc = tmploc.inc + inc;
+ // update the current record
+ // - need to remove current item, then insert new item.
+ tmploc.maxloc = location; //update maxloc
+ allLocations.RemoveAt(lastLocationIdx);
+ allLocations.Insert(lastLocationIdx,tmploc);
+ // append the new item
+ allLocations.Add(newloc);
+ lastLocationIdx++;
+ }
+ }
+
+
+ public short saveAdditions(BinaryWriter NewFSTFile,uint parid,uint start)
+ {
+ // Initialize count of added entries
+ short count = 0;
+ // Initialize count of added bytes
+ int bytes = 0;
+
+ int numgroups = (allNewGrps[curTblIdx]).Count;
+ int grpcnt = 0;
+ while (grpcnt < numgroups)
+ {
+ if (((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_stat == 0 && ((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_parid == parid)
+ {
+ // Save new group
+ // Change stat to inprogress
+ AddGroup taddgroup = (AddGroup)(allNewGrps[curTblIdx][grpcnt]);
+ taddgroup.grp_stat = 99;
+ allNewGrps[curTblIdx].RemoveAt(grpcnt);
+ allNewGrps[curTblIdx].Insert(grpcnt,taddgroup);
+ count++;
+ // Save any children
+ short howmany = saveAdditions(NewFSTFile,((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_id,start);
+
+ // Remember the offset
+ taddgroup = (AddGroup)(allNewGrps[curTblIdx][grpcnt]);
+ taddgroup.grp_offset = (uint)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current); // ftell(ofile)
+ allNewGrps[curTblIdx].RemoveAt(grpcnt);
+ allNewGrps[curTblIdx].Insert(grpcnt,taddgroup);
+
+ // Save ID
+ if (((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_parid == 0)
+ {
+ whereisgl = (uint)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current);
+ }
+ NewFSTFile.Write(((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_id);
+ // Save the Parent ID
+ NewFSTFile.Write(((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_parid);
+ // save howmany
+ NewFSTFile.Write(howmany);
+ // save children
+ saveNewMenuEntries(NewFSTFile,((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_id);
+ taddgroup = (AddGroup)(allNewGrps[curTblIdx][grpcnt]);
+ taddgroup.grp_stat = 1;
+ allNewGrps[curTblIdx].RemoveAt(grpcnt);
+ allNewGrps[curTblIdx].Insert(grpcnt,taddgroup);
+ bytes += (int)(NewFSTFile.Seek(0,System.IO.SeekOrigin.Current) - ((AddGroup)(allNewGrps[curTblIdx])[grpcnt]).grp_offset);
+ }
+ grpcnt++;
+ }
+ // Second check new ROs
+ int rocnt = 0;
+ int numros = (allNewRos[curTblIdx]).Count;
+ while (rocnt < numros)
+ {
+ // save new RO
+ if (((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_stat == 0 &&
+ ((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_parid == parid)
+ {
+ // change the stat
+ AddRO taddro = (AddRO)(allNewRos[curTblIdx][rocnt]);
+ taddro.ro_stat = 1;
+ // Increment count
+ count++;
+ taddro.ro_offset = (int)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current);
+ allNewRos[curTblIdx].RemoveAt(rocnt);
+ allNewRos[curTblIdx].Insert(rocnt,taddro);
+ // Save the ID
+ NewFSTFile.Write(((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_id);
+ // Save the Parent ID
+ NewFSTFile.Write(((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_parid);
+ // Save -1
+ NewFSTFile.Write((short)-1);
+ // Save type
+ NewFSTFile.Write(((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_type);
+ maxtype |= (ushort)((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_type;
+ // Save value
+ WriteString(NewFSTFile,((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_val,true);
+ // Save accid
+ short aw = (short)((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_num.Length;
+ if (aw > maxaw) maxaw = (ushort)aw;
+ WriteString(NewFSTFile,((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_num,true);
+ // Calculate the number of extra bytes output
+ bytes+=(int)(NewFSTFile.Seek(0,System.IO.SeekOrigin.Current) - ((AddRO)(allNewRos[curTblIdx])[rocnt]).ro_offset);
+ }
+ rocnt++;
+ }
+ // Adjust the location information
+ if (bytes != 0 && start > 0)
+ AddLocation(start - 1,bytes);
+ return count;
+ }
+
+
+ // was a difference flagged for this RO
+ // - check via saved offsets into the RO.fST file
+ public int isDifferent(uint off)
+ {
+ int allDiffCnt = 0;
+ int NumAllDiff = (allDifferences[curTblIdx]).Count;
+ while (allDiffCnt < NumAllDiff)
+ {
+ if (((DiffRO)(allDifferences[curTblIdx])[allDiffCnt]).oldoff == off)
+ return allDiffCnt;
+ allDiffCnt++;
+ }
+ return -1;
+ }
+
+
+
+ public uint newLocation(uint oldlocation)
+ {
+ int idx = 0;
+ while (oldlocation > ((locinc)allLocations[idx]).maxloc) idx++;
+ return oldlocation + (uint)((locinc)allLocations[idx]).inc;
+ }
+
+
+ public void processGroupRecords(BinaryWriter NewFSTFile,uint end)
+ {
+ uint start;
+ while ((start=(uint)brROFst.BaseStream.Seek(0,System.IO.SeekOrigin.Current)) < end)
+ {
+ // Read ID
+ uint id = brROFst.ReadUInt32();
+ // Read Parent ID
+ uint parid = brROFst.ReadUInt32();
+ // Read How Many
+ short howmany = brROFst.ReadInt16();
+ // Check of additions and write them
+ short howmanyplus = howmany;
+ if (howmany >= 0)
+ howmanyplus += saveAdditions(NewFSTFile,id,start);
+ if (parid == 0)
+ whereisgl = (uint)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current); // ftell(ofile)
+ // Write ID
+ NewFSTFile.Write(id);
+ // Write Parent ID
+ NewFSTFile.Write(parid);
+ // Write howmany
+ NewFSTFile.Write(howmanyplus);
+ // If group - read and write menu list
+ int starti = (int)brROFst.BaseStream.Seek(0,System.IO.SeekOrigin.Current); // ftell(rofstfile)
+ int starto = (int)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current); // ftell(ofile)
+ if (howmanyplus >= 0)
+ {
+ // for orignal entries
+ for (int i=0;i howmany)
+ {
+ saveNewMenuEntries(NewFSTFile,id);
+ }
+ }
+ else
+ {
+ // if RO - read RO record
+ // Read type
+ short type = brROFst.ReadInt16();
+ // Read value
+ string val = GetAsciiString(brROFst);
+ // Read accid
+ string num = GetAsciiString(brROFst);
+ // check if changed
+ int thisdiff = isDifferent(start);
+ if (thisdiff != -1)
+ {
+ type = ((DiffRO)(allDifferences[curTblIdx])[thisdiff]).type;
+ val = ((DiffRO)(allDifferences[curTblIdx])[thisdiff]).val;
+ }
+ // Save type
+ NewFSTFile.Write(type);
+ // Save value
+ WriteString(NewFSTFile,val,true);
+ // Save accid
+ WriteString(NewFSTFile,num,true);
+ }
+ int originalSize = (int)brROFst.BaseStream.Seek(0,System.IO.SeekOrigin.Current) - starti;
+ int copySize = (int)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current) - starto;
+ if (copySize != originalSize)
+ AddLocation(start,copySize - originalSize);
+ }
+ if (end == 0)
+ {
+ maxtype = 0;
+ maxaw = 0;
+ saveAdditions(NewFSTFile,0,0);
+ }
+ }
+
+
+ public int getROAccLess(string minnum)
+ {
+ int romin = -1;
+ int roptr = 0;
+ int numroptr = (allNewRos[curTblIdx]).Count;
+ while (roptr < numroptr)
+ {
+ // skip processed entries
+ while ((roptr < numroptr) &&
+ ((AddRO)(allNewRos[curTblIdx])[roptr]).ro_stat == 4) roptr++;
+ if ((roptr < numroptr))
+ {
+ // Look for "smallest"
+ if ((minnum==null)||
+ ((AddRO)(allNewRos[curTblIdx])[roptr]).ro_num.CompareTo(minnum) < 0)
+ {
+ romin = roptr;
+ minnum = ((AddRO)(allNewRos[curTblIdx])[roptr]).ro_num;
+ }
+ roptr++;
+ }
+ }
+ return romin;
+ }
+
+
+ public void putFixed(BinaryWriter NewFstFile, string str, short len)
+ {
+ int n=len; //str.Length;
+ int strlen = str.Length;
+ byte [] b = new byte[len];
+ // write a fixed length of a string.
+ for (int i =0; n > 0; i++)
+ {
+ if (i < strlen)
+ b[i] = (byte)str[i];
+ else
+ b[i] = (byte)0; // pad with NULLs if smaller than "len"
+ n--;
+ }
+ NewFstFile.Write(b,0,len);
+ }
+
+
+ public void processAccIdRecords(BinaryWriter NewFSTFile,uint end,short len)
+ {
+ int extra = 0;
+ int roptr = 0;
+ while (brROFst.BaseStream.Seek(0,System.IO.SeekOrigin.Current) < end)
+ {
+ // Read ID
+ uint id = brROFst.ReadUInt32();
+ // Read accID
+ string num = GetAsciiString(brROFst,len);
+ // Check other accIDs in new records and save
+ while ((roptr = getROAccLess(num)) != -1)
+ {
+ extra+=(len + 4); //sizeof(ulong 16bit)+len
+ NewFSTFile.Write(((AddRO)(allNewRos[curTblIdx])[roptr]).ro_id);
+ putFixed(NewFSTFile,((AddRO)(allNewRos[curTblIdx])[roptr]).ro_num,len);
+ AddRO taddro = (AddRO)(allNewRos[curTblIdx][roptr]);
+ taddro.ro_stat = 4;
+ allNewRos[curTblIdx].RemoveAt(roptr);
+ allNewRos[curTblIdx].Insert(roptr,taddro);
+ }
+ // Write ID
+ NewFSTFile.Write(id);
+ // Write accID
+ putFixed(NewFSTFile,num,len);
+ }
+ // Save remaining RO info
+ while ((roptr = getROAccLess(null))!=-1)
+ {
+ extra += (len+4); //sizeof(ulong 16bit)+len
+ NewFSTFile.Write(((AddRO)(allNewRos[curTblIdx])[roptr]).ro_id);
+ putFixed(NewFSTFile,((AddRO)(allNewRos[curTblIdx])[roptr]).ro_num,len);
+ AddRO taddro = (AddRO)(allNewRos[curTblIdx][roptr]);
+ taddro.ro_stat = 4;
+ allNewRos[curTblIdx].RemoveAt(roptr);
+ allNewRos[curTblIdx].Insert(roptr,taddro);
+ }
+ if (extra > 0)
+ AddLocation(end-1,extra);
+ }
+
+
+ public void nextIDandOffset(ref uint nxtid, ref uint nxtoff)
+ {
+ int roptr = 0, romin = -1;
+ int numroptr = (allNewRos[curTblIdx]).Count;
+ int grpptr = 0, grpmin = -1;
+ int numgrpptr = (allNewGrps[curTblIdx]).Count;
+
+ while (roptr < numroptr)
+ {
+ if (((AddRO)(allNewRos[curTblIdx])[roptr]).ro_id > nxtid &&
+ (romin == -1 || ((AddRO)(allNewRos[curTblIdx])[roptr]).ro_id < ((AddRO)(allNewRos[curTblIdx])[romin]).ro_id))
+ romin = roptr;
+ roptr++;
+ }
+
+ while (grpptr < numgrpptr)
+ {
+ if (((AddGroup)(allNewGrps[curTblIdx])[grpptr]).grp_id > nxtid &&
+ (grpmin == -1 || ((AddGroup)(allNewGrps[curTblIdx])[grpptr]).grp_id < ((AddGroup)(allNewGrps[curTblIdx])[grpmin]).grp_id))
+ grpmin = grpptr;
+ grpptr++;
+ }
+ if (grpmin != -1)
+ {
+ if ((romin != -1) && ((AddRO)(allNewRos[curTblIdx])[romin]).ro_id < ((AddGroup)(allNewGrps[curTblIdx])[grpmin]).grp_id)
+ {
+ AddRO taddro = (AddRO)(allNewRos[curTblIdx][romin]);
+ taddro.ro_stat = 3;
+ allNewRos[curTblIdx].RemoveAt(romin);
+ allNewRos[curTblIdx].Insert(romin,taddro);
+ nxtid = ((AddRO)(allNewRos[curTblIdx])[romin]).ro_id;
+ nxtoff = (uint)((AddRO)(allNewRos[curTblIdx])[romin]).ro_offset;
+ }
+ else
+ {
+ AddGroup taddgroup = (AddGroup)(allNewGrps[curTblIdx][grpmin]);
+ taddgroup.grp_stat = 3;
+ allNewGrps[curTblIdx].RemoveAt(grpmin);
+ allNewGrps[curTblIdx].Insert(grpmin,taddgroup);
+ nxtid = ((AddGroup)(allNewGrps[curTblIdx])[grpmin]).grp_id;
+ nxtoff = ((AddGroup)(allNewGrps[curTblIdx])[grpmin]).grp_offset;
+ }
+ }
+ else
+ {
+ if (romin != -1)
+ {
+ AddRO taddro = (AddRO)(allNewRos[curTblIdx][romin]);
+ taddro.ro_stat = 3;
+ allNewRos[curTblIdx].RemoveAt(romin);
+ allNewRos[curTblIdx].Insert(romin,taddro);
+ nxtid = ((AddRO)(allNewRos[curTblIdx])[romin]).ro_id;
+ nxtoff = (uint)((AddRO)(allNewRos[curTblIdx])[romin]).ro_offset;
+ }
+ else
+ {
+ nxtid = 0;
+ nxtoff = 0;
+ }
+ }
+ }
+
+
+ public void processIdRecords(BinaryWriter NewFstFile,uint end)
+ {
+ int extra = 0;
+ uint nxtid =0, nxtoff=0;
+ nextIDandOffset(ref nxtid,ref nxtoff);
+ while (brROFst.BaseStream.Seek(0,System.IO.SeekOrigin.Current) < end)
+ {
+ // Read ID
+ uint id = brROFst.ReadUInt32();
+ // Look for new entries that precede ID
+ while (nxtid != 0 && nxtid < id)
+ {
+ extra += 8; // sizeof(ulong 16bit) * 2
+ NewFstFile.Write(nxtid);
+ NewFstFile.Write(nxtoff);
+ nextIDandOffset(ref nxtid,ref nxtoff); // passed by reference
+ }
+ // Write ID
+ NewFstFile.Write(id);
+ // Read Offset
+ uint off = brROFst.ReadUInt32();
+ // Write new offset
+ NewFstFile.Write(newLocation(off));
+ }
+ // Save new RO entries and Group entries
+ while (nxtid != 0)
+ {
+ extra += 8; // sizeof(ulong 16bit)*2
+ NewFstFile.Write(nxtid);
+ NewFstFile.Write(nxtoff);
+ nextIDandOffset(ref nxtid,ref nxtoff); // passed by reference
+ }
+ if (extra != 0)
+ AddLocation(end-1,extra);
+ }
+
+
+ /*
+ * Merge the changes into the RO.FST file (usually Approved directory)
+ */
+ public void CreateMergedFSTFile(string NewFStName)
+ {
+ BinaryWriter NewFSTFile=null;
+
+ // Open a new FST file for writing
+ try
+ {
+ NewFSTFile = new BinaryWriter(File.Open(NewFStName,System.IO.FileMode.Create,System.IO.FileAccess.ReadWrite,FileShare.None));
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show("Error Opening "+NewFStName +"\n\n" + e.Message,"Approval Error");
+ }
+
+ // Write the RO.FST header
+ Header.Write(NewFSTFile);
+
+ // Position the old FST file past the header
+ brROFst.BaseStream.Seek(Header.GetStructSize(),System.IO.SeekOrigin.Begin);
+
+ // Loop through each database
+ for (short i=0; i < numDatabases; i++)
+ {
+ // Set the current table index used to access the allNewRos,
+ // allNewGrps, and allDifferences arrays
+ curTblIdx = i;
+
+ // Loop through the Group and RO records
+ // Update the RO Group information
+ processGroupRecords(NewFSTFile,((ROFST_DbInfo)DatabasesInfo[i]).dbiIL);
+ if (((ROFST_DbInfo)DatabasesInfo[i]).dbiAW == 0)
+ ((ROFST_DbInfo)DatabasesInfo[i]).dbiAW = maxaw;
+
+ if (((ROFST_DbInfo)DatabasesInfo[i]).dbiType == 0)
+ ((ROFST_DbInfo)DatabasesInfo[i]).dbiType = maxtype;
+
+ ((ROFST_DbInfo)DatabasesInfo[i]).dbiGL = whereisgl;
+ ((ROFST_DbInfo)DatabasesInfo[i]).dbiIL = (uint)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current);
+
+ // Loop through the ID list
+ processIdRecords(NewFSTFile,((ROFST_DbInfo)DatabasesInfo[i]).dbiAL);
+ ((ROFST_DbInfo)DatabasesInfo[i]).dbiAL = (uint)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current);
+ // Loop through the accid list
+ processAccIdRecords(NewFSTFile,((ROFST_DbInfo)DatabasesInfo[i]).dbiEND,(short)((ROFST_DbInfo)DatabasesInfo[i]).dbiAW);
+ ((ROFST_DbInfo)DatabasesInfo[i]).dbiEND = (uint)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current);
+ }
+ // Save the Database info
+ uint lngbuf = 0;
+ // Save the current location in the new fst file
+ uint dblength = (uint)NewFSTFile.Seek(0,System.IO.SeekOrigin.Current);
+ NewFSTFile.Write(lngbuf);
+ NewFSTFile.Write(numDatabases);
+ uint lngval;
+ ROFST_DbInfo tmpdbinfo = new ROFST_DbInfo();
+ lngval = (uint)(tmpdbinfo.GetStructSize() * numDatabases);
+ for (int i=0;i 0 && match == null)
+ {
+ int end = ROProcessTools.matchingBrace(opt);
+ int eq = opt.IndexOf('=');
+ int len = end + 1; // +1 to include the '}'
+ int li = eq-1;
+ int ld = len-li-3; // One for '{', '=' and '}'
+ if (def == null || eq == 1)
+ {
+ def = opt.Substring(eq+1,ld);
+ deflen = ld;
+ }
+ if (ls == li && stat.StartsWith(opt.Substring(1,li)))
+ {
+ match = opt.Substring(eq+1,ld);
+ matchlen = ld;
+ }
+ opt = opt.Substring(len);
+ lo -= len;
+ }
+ // if match process option - or process default
+ if (match == null)
+ {
+ match = def;
+ matchlen = deflen;
+ }
+ Process(match,matchlen);
+ }
+
+ public void processBrace(string str, int l, ref int nfnd)
+ {
+ int nxt = ROProcessTools.nextDelimiter("{=",str,l); // -1 means not found
+ if(nxt == -1) // varUse
+ {
+ strList found = null;
+ found = vList.lookFor(str,l);
+ if (found != null)
+ Add(new seVarUse(found));
+ else
+ nfnd = 1;
+ }
+ else
+ {
+ if (str[nxt] == '{') // conditonal or menu
+ {
+ if(nxt==0)
+ { // menu
+ mList.Process(str,l,vList);
+ Add(new seMenuUse(mList));
+ }
+ else
+ { // conditional
+ processCondition(str, str.Substring(nxt), nxt, l -nxt);
+ }
+ }
+ else
+ { // must be variable definiton
+ vList.Add(str, str.Substring(nxt+1), nxt, l - nxt - 1, mList);
+ }
+ }
+ }
+
+ public void Process (string str, int len)
+ {
+ int nxtDlm = -1; // -1 = not found
+ while (len > 0)
+ {
+ nxtDlm = ROProcessTools.nextDelimiter("{",str,len);
+ if (nxtDlm == -1)
+ {
+ // add entire string as is
+ Add(new seText(str,len));
+ //str = str.Substring(len); don't think we need to do this
+ len = 0;
+ }
+ else
+ {
+ int cnt = 0;
+ if (nxtDlm > 0)
+ {
+ // add preceeding text
+ Add(new seText(str,nxtDlm));
+ str = str.Substring(nxtDlm);
+ len-=nxtDlm;
+ }
+ // add text group by delimiter, including
+ // the delimiters
+ nxtDlm = ROProcessTools.matchingBrace(str)+1;
+ cnt = nxtDlm;
+ int nfnd = 0;
+ processBrace(str.Substring(1),cnt-2,ref nfnd);
+ if (nfnd > 0)
+ {
+ Add(new seText(str,cnt));
+ }
+ // position to next delimiter grouping
+ len -= cnt;
+ str = str.Substring(nxtDlm);
+ }
+ }
+ }
+
+ public string toText(int mi)
+ {
+ StringBuilder bldstr = new StringBuilder();
+ for (int i=0; i < aryStrEntry.Count; i++)
+ {
+ bldstr.Append(((strEntry)aryStrEntry[i]).toText(mi));
+ }
+ return bldstr.ToString();
+ }
+
+ public int getLength(int mi)
+ {
+ int rtnval = 0;
+ for (int i=0; i < aryStrEntry.Count; i++)
+ {
+ rtnval += (((strEntry)aryStrEntry[i]).getLength(mi));
+ }
+ return rtnval;
+ }
+
+ public int menuCount()
+ {
+ return mList.getCount();
+ }
+
+ public string getIds(ref int cnt)
+ {
+ // return a string of the IDs
+ return mList.getIds(ref cnt);
+ }
+ }
+
+
+
+ public class strList2
+ {
+
+ private ArrayList aryStrEntry;
+
+ public strList2(string str)
+ {
+ int l=str.Length;
+ if (aryStrEntry == null)
+ aryStrEntry = new ArrayList();
+ while(l > 0)
+ {
+ int ptr=ROProcessTools.nextDelimiter("<",str,l);
+ int cptr = (ptr==-1)?-1:ROProcessTools.nextDelimiter(">",str.Substring(ptr,str.Length - ptr),str.Length-ptr);
+ if(ptr == -1 || (ptr>-1 && cptr == -1))
+ {
+ Add(new seText(str,l));
+ l=0;
+ }
+ else
+ {
+ int cnt = ptr; //(int)(ptr-str);
+ if(cnt > 0)
+ {
+ Add(new seText(str,cnt));
+ l-=cnt;
+ str = str.Substring(ptr); // str=ptr
+ }
+ ptr=ROProcessTools.nextDelimiter(">",str,l)+1;
+ cnt = ptr;//(int)(ptr-str);
+ string tmpstr = str.Substring(1);
+ Add(new seUser(tmpstr,cnt-2));
+ l-=cnt;
+ str = str.Substring(ptr);//str=ptr;
+ }
+ }
+ }
+
+ public void Add (strEntry se)
+ {
+ aryStrEntry.Add(se);
+ }
+
+ public string toText()
+ {
+ StringBuilder bldstr = new StringBuilder();
+ for (int i=0; i < aryStrEntry.Count; i++)
+ {
+ bldstr.Append(((strEntry)aryStrEntry[i]).toText(0));
+ }
+ return bldstr.ToString();
+ }
+ }
+
+ public class varEntry
+ {
+ string Name;
+ int Len;
+ strList Definition;
+
+ public varEntry(string InName, string InDef, int lenInName, int lenInDef, varList vlist, menuList mlist)
+ {
+ Definition = new strList(InDef,lenInDef,vlist,mlist);
+ Name = InName.Substring(0,lenInName);
+ Len = lenInName;
+ }
+
+ public strList lookFor(string nam, int l)
+ {
+ string tname = nam.Substring(0,l);
+ if (l == Len && (Name.CompareTo(tname)==0))
+ return Definition; // found
+ return null; // not found
+ }
+ }
+
+ public class varList
+ {
+ ArrayList varEntryAry;
+
+ public varList()
+ {
+ varEntryAry = new ArrayList();
+ }
+
+ public void Add(string InName, string InDef, int lenInName, int lenInDef, menuList mlist)
+ {
+ varEntry tmpEntry = new varEntry(InName,InDef,lenInName,lenInDef,null,mlist);
+ varEntryAry.Add(tmpEntry);
+ }
+
+ public strList lookFor(string str, int len)
+ {
+ strList rtnval = null;
+ for (int i = 0; (rtnval == null) && (i < varEntryAry.Count); i++)
+ {
+ rtnval = ((varEntry)varEntryAry[i]).lookFor(str,len);
+ }
+ return rtnval;
+ }
+ }
+
+ public class seVarUse : strEntry
+ {
+ strList Def;
+
+ public seVarUse(strList d)
+ {
+ Def = d;
+ }
+
+
+ public override string toText(int mi)
+ {
+ return Def.toText(mi);
+ }
+
+ public override int getLength(int mi)
+ {
+ return Def.getLength(mi);
+ }
+ }
+
+ public class menuEntry
+ {
+ byte id;
+ strList definition;
+
+ public menuEntry(string idptr,string def,int li,int ld,varList vlst)
+ {
+ definition = new strList(def, ld, vlst,null);
+ // save the id
+ if(li != 0)
+ id=(byte)idptr[0];
+ else
+ id=0;
+ }
+
+ public int getLength(int mi)
+ {
+ if(mi==(int)id || mi==-1)
+ return definition.getLength(mi);
+ else
+ return 0;
+ }
+
+ public virtual string toText(int mi)
+ {
+ if (mi == id || mi==-1)
+ return definition.toText(mi);
+ else
+ return "";
+ }
+
+ public string getID()
+ {
+ string rtnstr = id.ToString();
+ return rtnstr;
+ }
+
+ public int getCount()
+ {
+ return 1;
+ }
+ }
+
+
+ public class menuList : strEntry
+ {
+ ArrayList aryMenuList;
+
+ public menuList()
+ {
+ aryMenuList = new ArrayList();
+ }
+
+ public void Add(menuEntry MnuEntry)
+ {
+ aryMenuList.Add(MnuEntry);
+ }
+
+ private int _getLength(int mi)
+ {
+ int lcnt = aryMenuList.Count;
+ int rtnval =0;
+
+ for (int i=0; i < lcnt; i++)
+ {
+ rtnval += (((menuEntry)aryMenuList[i])).getLength(mi);
+ }
+ return rtnval;
+ }
+
+ private int _getLenAndLookat(int mi, ref int lookat)
+ {
+ int len =0;
+ lookat = mi;
+
+ if (aryMenuList.Count > 0)
+ {
+ len=_getLength(lookat);
+ if (len ==0)
+ {
+ lookat = 0;
+ len = _getLength(lookat);
+ }
+ if (len == 0)
+ {
+ lookat = -1;
+ len = _getLength(lookat);
+ }
+ }
+
+ return len;
+ }
+
+ public override int getLength(int mi)
+ {
+ int lookat=0;
+ return _getLenAndLookat(mi,ref lookat);
+ }
+
+ public override string toText(int mi)
+ {
+ StringBuilder rtnstr = new StringBuilder();
+ int lookat=0;
+
+ int len = _getLenAndLookat(mi,ref lookat);
+ if (aryMenuList.Count > 0)
+ {
+ for (int i = 0; i< aryMenuList.Count; i++)
+ {
+ string roval = ((menuEntry)aryMenuList[i]).toText(lookat);
+ if (lookat == -1)
+ {
+ // For Approve Individual, show all possible RO
+ // values (for conditional RO's)
+ // We may need to add a flag here later on when
+ // this logic is used in the Procedure Editor.
+ if (i > 0 && !roval.Equals(""))
+ rtnstr.Append("\n");
+ }
+ rtnstr.Append(roval);
+ }
+ }
+ return rtnstr.ToString();
+ }
+
+ public string getIds(ref int cnt)
+ {
+ StringBuilder rtnstr = new StringBuilder();
+ cnt = getCount();
+ int arycnt = aryMenuList.Count;
+
+ for (int i=0; i 0);
+ }
+ }
+
+ public class seMenuUse : strEntry
+ {
+ menuList ml;
+
+ public seMenuUse(menuList m)
+ {
+ ml=m;
+ }
+
+ public override string toText(int mi)
+ {
+ return ml.toText(mi);
+ }
+
+ public override int getLength(int mi)
+ {
+ return ml.getLength(mi);
+ }
+ }
+
+}
diff --git a/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.csproj b/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.csproj
new file mode 100644
index 00000000..dcdebb08
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.csproj
@@ -0,0 +1,138 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {134D8938-9CDC-4712-9444-D5DCC6638AB6}
+ Debug
+ AnyCPU
+
+
+
+
+ ROFST
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ ROFST
+ OnBuildSuccess
+
+
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE;Upgrade2005;
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE;Upgrade2005;
+ 285212672
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}
+ Utils
+
+
+ {551CB7B3-00B1-11D7-8590-482B59000000}
+ VlnStatus
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.csproj.vspscc
new file mode 100644
index 00000000..6031ac41
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROFST/ROFST.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\ROFST"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/ROField/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/ROField/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROField/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/ROField/ROField.cs b/PROMS/ReferencedObjects/LibSource/ROField/ROField.cs
new file mode 100644
index 00000000..7d577c9b
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROField/ROField.cs
@@ -0,0 +1,301 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: ROField.cs $ $Revision: 11 $
+ * $Author: Kathy $ $Date: 4/04/03 9:41a $
+ *
+ * $History: ROField.cs $
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 4/04/03 Time: 9:41a
+ * Updated in $/LibSource/ROFields
+ * B2003-030: get correct field type for new image
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:27p
+ * Updated in $/LibSource/ROFields
+ * fieldname special chars
+ *
+ * ***************** Version 9 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:30a
+ * Updated in $/LibSource/ROFields
+ * fieldname replace chars
+ *
+ * ***************** Version 8 *****************
+ * User: Kathy Date: 11/11/02 Time: 7:14a
+ * Updated in $/LibSource/ROFields
+ * image field type should be 32 not 20
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:17p
+ * Updated in $/LibSource/ROFields
+ * combo field number
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:11p
+ * Updated in $/LibSource/ROFields
+ * fix digit as first char in fieldname
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/25/02 Time: 2:31p
+ * Updated in $/LibSource/ROFields
+ * multitxt->variable
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/03/02 Time: 2:53p
+ * Updated in $/LibSource/ROFields
+ * missing " on image field def.
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 8/30/02 Time: 11:56a
+ * Updated in $/LibSource/ROFields
+ * image
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 8/28/02 Time: 10:59a
+ * Updated in $/LibSource/ROFields
+ * development
+ *********************************************************************************************/
+
+using System;
+using System.Text;
+
+namespace ROFields
+{
+ public enum FieldTypes: uint
+ {
+ Nil=0, SingleTxt=1, VariableTxt=2, FrmtSingleTxt=4, XYPlot=8, Table=10, Image=32,
+ MultiTxt=40, Combination=128, MultiFld=100
+ }
+
+ ///
+ /// Summary description for ROField: This class contains RO Field information. Each ROField
+ /// contains:
+ /// string fieldname - the name of the field
+ /// string recid - its database record id (used to interface to the database - null if
+ /// not created yet.
+ /// string masterrecID - its record id in the master if appropriate.
+ /// uint fieldtype - the field type as defined in the enum FieldTypes (listed above)
+ ///
+ public class ROField
+ {
+ string fieldname;
+ string recID;
+ string masterrecID;
+ uint fldtype;
+
+ // constuctor
+ public ROField(string fname, string rID, string mrID, uint fieldtype)
+ {
+ fieldname = fname;
+ recID = rID;
+ masterrecID = mrID;
+ fldtype = fieldtype;
+ }
+ public string GetFieldname { get {return fieldname;}}
+ public string GetRecID { get {return recID;}}
+ public string GetMasterRecID { get {return masterrecID;}}
+ public uint GetFieldType{ get {return fldtype;}}
+ public void SetFieldname(string name) {fieldname = name;}
+ public void SetRecID(string recid) {recID = recid;}
+ public void SetMasterRecID(string mrecid) {masterrecID = mrecid;}
+ public void SetFieldType(uint ftype) {fldtype = ftype;}
+
+ // Given a schema string, determine which RO Field type it is.
+ public uint ParseFieldType(string info)
+ {
+ int indx;
+ // formatted single line text has 'pattern' in schema definition)
+ indx = info.IndexOf("xsd:pattern");
+ if (indx >= 0) return (uint) FieldTypes.FrmtSingleTxt;
+
+ // Combination field has 'choice' in schema definition
+ indx = info.IndexOf("xsd:choice");
+ if (indx >= 0) return (uint) FieldTypes.Combination;
+
+ // image - search for 'Image_Height', in case Image is in the string from some other mechanism
+ indx = info.IndexOf("Image_Height");
+ if (indx >=0) return (uint) FieldTypes.Image;
+
+ // single line text has 'normalizedString' (pattern does too, but
+ // it would be eliminated above.
+ indx = info.IndexOf("xsd:normalizedString");
+ if (indx >=0) return (uint) FieldTypes.SingleTxt;
+
+ // now look for all of the multi-line fields: multi text, table, & XY Plot
+ indx = info.IndexOf("xsd:string");
+ if (indx <0) indx = info.IndexOf("xsd:String");
+ if (indx >=0)
+ {
+ int indxspecific;
+ indxspecific = info.IndexOf("Variable");
+ if (indxspecific >= 0) return (uint) FieldTypes.VariableTxt;
+ indxspecific = info.IndexOf("Table");
+ if (indxspecific >= 0) return (uint) FieldTypes.Table;
+ indxspecific = info.IndexOf("XYPlot");
+ if (indxspecific >= 0) return (uint) FieldTypes.XYPlot;
+ }
+
+ // indx = info.IndexOf("Image");
+ // if (indx >=0) return (uint) FieldTypes.Image;
+
+ return 1000;
+ }
+
+ // Creates a string representing the schema for this field. note that the input
+ // fieldname will override that which is stored for this ROField (for editting
+ // purposes).
+ public string MakeFieldName(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ public string MakeSchemaString(string fieldname, string width, string pattern)
+ {
+ uint ftype = this.GetFieldType;
+ StringBuilder strbld = new StringBuilder();
+ strbld.Append("\n");
+ if (ftype == (uint)FieldTypes.VariableTxt || ftype == (uint)FieldTypes.Table || ftype == (uint)FieldTypes.XYPlot)
+ {
+ strbld.Append("\n");
+ if (ftype == (uint)FieldTypes.VariableTxt)
+ strbld.Append("Variable");
+ else if (ftype == (uint)FieldTypes.Table)
+ strbld.Append("Table");
+ else
+ strbld.Append("XYPlot");
+ strbld.Append("\n");
+ }
+ strbld.Append("\n\n\n\n");
+ if (ftype == (uint)FieldTypes.FrmtSingleTxt)
+ {
+ strbld.Append("\n");
+ }
+ strbld.Append("\n\n");
+ return (strbld.ToString());
+ }
+
+ public string MakeComboSchemaString(string fieldname, bool fixd, string fixdwid, bool multi, string multiwid,
+ bool table, string tablewid, bool xyplot, string xyplotwid)
+ {
+ StringBuilder strbld = new StringBuilder();
+ strbld.Append("\n");
+ if (fixd == true)
+ {
+ strbld.Append("\n");
+ strbld.Append("\n\n\n\n\n\n");
+ }
+ if (multi == true)
+ {
+ strbld.Append("\n");
+ strbld.Append("\n\nVariable\n");
+ strbld.Append("\n\n\n");
+ strbld.Append("\n\n\n\n\n");
+ }
+ if (table == true)
+ {
+ strbld.Append("\n");
+ strbld.Append("\n\nTable\n");
+ strbld.Append("\n\n\n");
+ strbld.Append("\n\n\n\n");
+ }
+ if (xyplot == true)
+ {
+ strbld.Append("\n");
+ strbld.Append("\n\nXYPlot\n");
+ strbld.Append("\n\n\n");
+ strbld.Append("\n\n\n\n");
+ }
+ strbld.Append("");
+ return (strbld.ToString());
+ }
+
+ public string MakeImageSchemaString(string fieldname)
+ {
+ StringBuilder strbld = new StringBuilder();
+ strbld.Append("\n\n");
+ strbld.Append("\n");
+ strbld.Append("\n\n");
+ strbld.Append("VLN_FINDFILE\n");
+ strbld.Append("\n\n");
+ strbld.Append("\n\n");
+ strbld.Append("\n\n");
+ strbld.Append("\n\n");
+ strbld.Append("Lines (6 lines per inch)\n");
+ strbld.Append("\n\n");
+ strbld.Append("\n\n\n");
+ strbld.Append("\n\n");
+ strbld.Append("\n\n");
+ strbld.Append("Characters (12 chars. Per inch)\n");
+ strbld.Append("\n\n");
+ strbld.Append("\n\n\n");
+ strbld.Append("\n\n\n");
+ return(strbld.ToString());
+ }
+
+ }
+
+}
diff --git a/PROMS/ReferencedObjects/LibSource/ROField/ROFields.csproj b/PROMS/ReferencedObjects/LibSource/ROField/ROFields.csproj
new file mode 100644
index 00000000..b83d8173
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROField/ROFields.csproj
@@ -0,0 +1,125 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {0C782592-AA05-11D6-84D1-00A0CC271352}
+ Debug
+ AnyCPU
+
+
+
+
+ ROField
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ ROField
+ OnBuildSuccess
+
+
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.XML
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/ROField/ROFields.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/ROField/ROFields.csproj.vspscc
new file mode 100644
index 00000000..62af50e0
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ROField/ROFields.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\ROField"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/About.cs b/PROMS/ReferencedObjects/LibSource/Utils/About.cs
new file mode 100644
index 00000000..702da814
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/About.cs
@@ -0,0 +1,268 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: About.cs $ $Revision: 5 $
+ * $Author: Jsj $ $Date: 1/02/08 1:38p $
+ *
+ * $History: About.cs $
+ *
+ * ***************** Version 5 *****************
+ * User: Jsj Date: 1/02/08 Time: 1:38p
+ * Updated in $/LibSource/Utils
+ * upped copyright to 2008
+ *
+ * ***************** Version 4 *****************
+ * User: Jsj Date: 1/02/07 Time: 1:53p
+ * Updated in $/LibSource/Utils
+ * uppped copyright to 2007
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 7/18/06 Time: 11:40a
+ * Updated in $/LibSource/Utils
+ * turned off Microsoft Solution Provider logo.
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 1/03/06 Time: 9:08a
+ * Updated in $/LibSource/Utils
+ * upped copyright to year 2005
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace Utils
+{
+ ///
+ /// Summary description for About.
+ ///
+ public class AboutDlg : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Button btnHlpAbtOK;
+ private System.Windows.Forms.Label CopyrightMessage;
+ private System.Windows.Forms.PictureBox pictureBox2;
+ private System.Windows.Forms.Label lblProgName;
+ private System.Windows.Forms.Label lblVerRelNums;
+ private System.Windows.Forms.Label lblSerialNumber;
+ private System.Windows.Forms.Label lblSerialNumTitle;
+ private System.Windows.Forms.Label lblUserID;
+ private System.Windows.Forms.LinkLabel VolianWebLink;
+ private System.Windows.Forms.Label lblLicenseTab;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+
+ public AboutDlg(string ProgName, string SerialNoStr, string SnTitleTab, string SerialNoTitle, string VerRel, string cpyrght, string UIDstr)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+ CopyrightMessage.Text = cpyrght;
+ this.lblProgName.Text = ProgName;
+ lblVerRelNums.Text = VerRel;
+ lblSerialNumber.Text = SerialNoStr;
+ lblSerialNumTitle.Text = SerialNoTitle;
+ lblUserID.Text = UIDstr;
+ lblLicenseTab.Text = SnTitleTab;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AboutDlg));
+ this.btnHlpAbtOK = new System.Windows.Forms.Button();
+ this.lblProgName = new System.Windows.Forms.Label();
+ this.lblVerRelNums = new System.Windows.Forms.Label();
+ this.lblSerialNumber = new System.Windows.Forms.Label();
+ this.CopyrightMessage = new System.Windows.Forms.Label();
+ this.lblUserID = new System.Windows.Forms.Label();
+ this.pictureBox2 = new System.Windows.Forms.PictureBox();
+ this.lblSerialNumTitle = new System.Windows.Forms.Label();
+ this.VolianWebLink = new System.Windows.Forms.LinkLabel();
+ this.lblLicenseTab = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // btnHlpAbtOK
+ //
+ this.btnHlpAbtOK.BackColor = System.Drawing.Color.YellowGreen;
+ this.btnHlpAbtOK.Font = new System.Drawing.Font("Tahoma", 10.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.btnHlpAbtOK.Location = new System.Drawing.Point(144, 160);
+ this.btnHlpAbtOK.Name = "btnHlpAbtOK";
+ this.btnHlpAbtOK.Size = new System.Drawing.Size(96, 32);
+ this.btnHlpAbtOK.TabIndex = 0;
+ this.btnHlpAbtOK.Text = "OK";
+ this.btnHlpAbtOK.Click += new System.EventHandler(this.btnHlpAbtOK_Click);
+ //
+ // lblProgName
+ //
+ this.lblProgName.BackColor = System.Drawing.Color.Transparent;
+ this.lblProgName.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.lblProgName.Location = new System.Drawing.Point(8, 8);
+ this.lblProgName.Name = "lblProgName";
+ this.lblProgName.Size = new System.Drawing.Size(360, 19);
+ this.lblProgName.TabIndex = 1;
+ this.lblProgName.Text = "Program Name";
+ this.lblProgName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // lblVerRelNums
+ //
+ this.lblVerRelNums.BackColor = System.Drawing.Color.Transparent;
+ this.lblVerRelNums.Font = new System.Drawing.Font("Arial", 10.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.lblVerRelNums.Location = new System.Drawing.Point(8, 40);
+ this.lblVerRelNums.Name = "lblVerRelNums";
+ this.lblVerRelNums.Size = new System.Drawing.Size(352, 24);
+ this.lblVerRelNums.TabIndex = 2;
+ this.lblVerRelNums.Text = "Version 0 Release 0";
+ this.lblVerRelNums.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // lblSerialNumber
+ //
+ this.lblSerialNumber.BackColor = System.Drawing.Color.Transparent;
+ this.lblSerialNumber.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.lblSerialNumber.Location = new System.Drawing.Point(8, 72);
+ this.lblSerialNumber.Name = "lblSerialNumber";
+ this.lblSerialNumber.Size = new System.Drawing.Size(360, 16);
+ this.lblSerialNumber.TabIndex = 3;
+ this.lblSerialNumber.Text = "Serial Number: xx";
+ this.lblSerialNumber.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // CopyrightMessage
+ //
+ this.CopyrightMessage.BackColor = System.Drawing.Color.Transparent;
+ this.CopyrightMessage.Font = new System.Drawing.Font("Arial", 6F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.CopyrightMessage.Location = new System.Drawing.Point(8, 192);
+ this.CopyrightMessage.Name = "CopyrightMessage";
+ this.CopyrightMessage.Size = new System.Drawing.Size(232, 16);
+ this.CopyrightMessage.TabIndex = 4;
+ this.CopyrightMessage.Text = " Copyright C 1988 - 2008 All Rights Reserved";
+ this.CopyrightMessage.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // lblUserID
+ //
+ this.lblUserID.BackColor = System.Drawing.Color.Transparent;
+ this.lblUserID.Font = new System.Drawing.Font("Arial", 7.8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.lblUserID.Location = new System.Drawing.Point(8, 136);
+ this.lblUserID.Name = "lblUserID";
+ this.lblUserID.Size = new System.Drawing.Size(360, 16);
+ this.lblUserID.TabIndex = 6;
+ this.lblUserID.Text = "User ID: xxxxx";
+ this.lblUserID.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ //
+ // pictureBox2
+ //
+ this.pictureBox2.Enabled = false;
+ this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image")));
+ this.pictureBox2.Location = new System.Drawing.Point(272, 160);
+ this.pictureBox2.Name = "pictureBox2";
+ this.pictureBox2.Size = new System.Drawing.Size(69, 32);
+ this.pictureBox2.TabIndex = 7;
+ this.pictureBox2.TabStop = false;
+ this.pictureBox2.Visible = false;
+ //
+ // lblSerialNumTitle
+ //
+ this.lblSerialNumTitle.BackColor = System.Drawing.Color.Transparent;
+ this.lblSerialNumTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.lblSerialNumTitle.Location = new System.Drawing.Point(112, 96);
+ this.lblSerialNumTitle.Name = "lblSerialNumTitle";
+ this.lblSerialNumTitle.Size = new System.Drawing.Size(256, 32);
+ this.lblSerialNumTitle.TabIndex = 8;
+ this.lblSerialNumTitle.Text = "Serial Number Title";
+ //
+ // VolianWebLink
+ //
+ this.VolianWebLink.Location = new System.Drawing.Point(248, 192);
+ this.VolianWebLink.Name = "VolianWebLink";
+ this.VolianWebLink.Size = new System.Drawing.Size(112, 16);
+ this.VolianWebLink.TabIndex = 9;
+ this.VolianWebLink.TabStop = true;
+ this.VolianWebLink.Text = "Volian Enterprises Inc.";
+ this.VolianWebLink.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.VolianWebLink.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
+ //
+ // lblLicenseTab
+ //
+ this.lblLicenseTab.BackColor = System.Drawing.Color.Transparent;
+ this.lblLicenseTab.Font = new System.Drawing.Font("Arial", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.lblLicenseTab.Location = new System.Drawing.Point(8, 96);
+ this.lblLicenseTab.Name = "lblLicenseTab";
+ this.lblLicenseTab.Size = new System.Drawing.Size(104, 24);
+ this.lblLicenseTab.TabIndex = 10;
+ this.lblLicenseTab.Text = "Licenced To:";
+ //
+ // AboutDlg
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
+ this.BackColor = System.Drawing.SystemColors.GrayText;
+ this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
+ this.ClientSize = new System.Drawing.Size(370, 209);
+ this.Controls.Add(this.lblLicenseTab);
+ this.Controls.Add(this.VolianWebLink);
+ this.Controls.Add(this.lblSerialNumTitle);
+ this.Controls.Add(this.pictureBox2);
+ this.Controls.Add(this.lblUserID);
+ this.Controls.Add(this.CopyrightMessage);
+ this.Controls.Add(this.lblSerialNumber);
+ this.Controls.Add(this.lblVerRelNums);
+ this.Controls.Add(this.lblProgName);
+ this.Controls.Add(this.btnHlpAbtOK);
+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 6F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "AboutDlg";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "About";
+ this.Load += new System.EventHandler(this.AboutDlg_Load);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private void btnHlpAbtOK_Click(object sender, System.EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
+ {
+ System.Diagnostics.Process.Start("www.volian.com");
+ }
+
+ private void AboutDlg_Load(object sender, System.EventArgs e)
+ {
+
+ }
+
+
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/About.resx b/PROMS/ReferencedObjects/LibSource/Utils/About.resx
new file mode 100644
index 00000000..5362d584
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/About.resx
@@ -0,0 +1,4144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+
+ R0lGODlhRgAgAPcAAACK/wCN/wCP/wCT/wCR/xCZ/6ja/7jh//b7//j8/wCX/wCU/wCZ/wGZ/wKW/wKZ
+ /wOa/wSZ/waX/weZ/web/wec/wmc/wma/wud/wyc/w2e/w+d/w+f/xSe/xWh/xii/xuk/x2j/x2k/x6l
+ /yGm/ySn/yWo/yin/ymp/y2q/zCs/zGr/zOt/zar/zmu/zuw/0O0/0Wy/0a0/0iy/0i1/0i2/0u3/023
+ /0+4/1G5/1O6/1W7/1a7/1e8/1i8/1q9/12+/2C//2XB/2rD/2/F/3HE/3HG/3PF/3TH/3bI/3nJ/37L
+ /3/M/4DL/4DM/4LN/4XO/4fP/4rO/4rQ/43R/4/R/5HT/5bV/5rV/5vX/5zX/57Y/6DY/6Xb/6nc/6rd
+ /63e/6/f/7Lg/7Th/7fi/7ji/7rj/7zk/77l/8Hm/8Pn/8bo/9Hs/9Pt/9Xu/9jv/9vw/+Hz/+Lz/+b1
+ /+n2/+z3/+74//D5//P6//r9/wSb/wWc/wue/zav/0Cz/2PB/3LH/4PO/43S/47S/5LU/5jW/6La/6fc
+ /7Xi/7vk/8Xo/8nq/8zr/8/s/9Pu/97y/+P0//f8//H6//T7//z+//v+//////z8/Pv7+/n5+fb29vT0
+ 9PLy8vDw8O7u7uzs7Ovr6+np6ebm5uXl5eLi4uDg4N3d3dra2tfX19XV1dLS0s3NzcnJycfHx8TExMHB
+ wb29vbq6uri4uLa2trW1tbOzs7CwsK6urqurq6ioqKenp6SkpKGhoZ6enpycnJubm5iYmJWVlZOTk5GR
+ kY6OjoyMjIuLi4iIiIaGhoWFhYODg4CAgH5+fnx8fHl5eXZ2dnFxcW9vb2xsbGlpaWZmZmNjY2FhYV9f
+ X11dXVtbW1hYWFZWVlVVVVJSUlFRUU9PT01NTUtLS0hISEdHR0VFRUJCQkBAQD09PTk5OTY2NjIyMi8v
+ LywsLCkpKSYmJiMjIyAgIB4eHh0dHRoaGhcXFxQUFBMTExEREQ8PDw0NDQsLCwkJCQcHBwUFBQICAgAA
+ ACwAAAAARgAgAAAI/wAtCRxIsKDBgwgTKlyI0Nm/h/8EpoP4j9lDhhgzWnpojyHFiBshvoKosSRCiJoe
+ ykv40VIrigdXxVKIitqzgrbCcVtVEBk3WANVPVQV8hVLmC0f1guJlKKujxGTQRU4FSrEfJYuGfy47GO1
+ h6YgjiNpNSK8h6tIhrSU76E1puIginv3UBxPrQQd/gNHcddDfhBZoc06bpzQi2pDxvvoydIntWQRXzwp
+ +eOvqQTT/uPGdOBDcEwh7nuIiapkzom3VsYVGfBkYL58QZ78T1jBpy1N8+NE+5+toxEjB//nyt9F3rlJ
+ jkz+cOK/cp3L9W58MFhk0/6y9W56TmCoqfaglv8K/fBU5/MGu23bJsvSekul1rPSVm3bwHr//IESuF7T
+ wEzG/ZPJQMRcRdA5D8EzUDXVXCOQJtxgY9KEFFZo4YUYZqjhhgTpoMAABS0gogAEibiAFyWKCKJAbSyQ
+ oogEERCiiC6kmMJBKjBgCQgWEKSjQTre8eNADDhBkCNDWsLAigQpUFCSAzm5gJMFfXgQAxVU8KQbIUBZ
+ 5JFJMqCAEWE0+WSWVVoSCZSWLAAiAm/4eCUCDODxpJEDIenjAm3MYaacBjmpBptjMGCHAkH4aMUgU8g5
+ gIs+4imQnkQyGeWTgwyCYpRliImQDI0U9MWohxD0hSWUnGqqGwTdoapAX3R7YdCmA436BRqmvsrhrrz2
+ 6isABAQr7LDEFmvsscgmayyJvjbr7LPQDsQDBwf1ES2GdAiEggUyWlLIFQ9AkgezBLBgSR4BXMvQCAqQ
+ CMcXhOxgUBcExAGHuhmtaIhAebBpCR8CIYAvQw8MJEC2VAaAxEBxCBBGjQNHrFFAADs=
+
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ True
+
+
+ (Default)
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ AboutDlg
+
+
+ True
+
+
+ 80
+
+
+ True
+
+
+ Private
+
+
+
+ Qk0OjAMAAAAAADYAAAAoAAAAcgEAANEAAAABABgAAAAAAAAAAAASCwAAEgsAAAAAAAAAAAAApaWlpaWl
+ pqampqanpqanpqanpaWlpaWlpKSko6Oko6Oko6OkpaWlpqanpqanpqanpqampaWlo6Okpqanpqanpqan
+ paWmo6Oko6Oko6Oko6Oko6OkoqKjoaGhoqKio6Oko6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWm
+ pqanpqanpqanpaWmpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Ok
+ o6OkoqKjoqKjo6Oko6Oko6OkpKSlpKSlpaWkoKCplZW0jo65j4+5j4+6kpK1kZG1jIy5jY24jY25jY27
+ kpK1mpqtoKCno6OjoqKioqKioaGhoaGfnZ2jk5OwjY24hITDgoLEhITFhYXHhYXHhYXHjIy/jY2+jIzA
+ k5O4oaGqpKSloqKjoaGhoaGhoqKjoqKjoqKjnZ2okJC2i4u6ioq6iIi8iYm8iYm8ioq7ioq9jo64kpKy
+ lJSxmZmpoKCioaGhoaGhoaGhoaGhoaGhnp6nmJiuj4+4ioq+ioq7ioq8hITEg4PFg4PFgoLGhYXDjo65
+ mZmnoKChoqKhoqKioqKioqKioqKjlZWwjIy6i4u8iIi+g4PGg4PFg4PFhobChobCioq9k5OzlZWwmpqn
+ oKCioaGhoaGhoaGhoaGhoKChlJSvjY24iIi+gYHFgoLEgoLEgYHDgYHCgIDCf3/Bf3/BgYHCgoLDgoLF
+ goLFg4PGhITEkJC3n5+mpKSgoKCklpaviYm+g4PFgoLFgYHFgoK+iIiyjY2uiIi5iYm8iYm8iYm9jIy7
+ lJSym5uso6Okmpquioq/goLIg4PFg4PFgYHEhYW8h4e3hIS7gIDDgYHEgoLEg4PFg4PGioq9mJiroqKg
+ oqKgnJynlJSwkJC0kZGzkZGzkZGyioq3goLAgYHEgoLEg4PFhYXFiorAlpayn5+noqKloqKmpKSlmJiw
+ iYnChITHhYXFhYXEg4PFgYHCf3/ChIS9iIi4h4e7g4PChYXEg4PGjIy7m5uqpKSgoaGjlJSyh4fCg4PG
+ hITFgoLFgYHDgIDChoa4hoa2h4e4iYm6i4u6j4+6j4+6jY28l5eyoqKmpaWlpKSlnJyslJSzkZG1jo63
+ iYm7iYm6iIi5h4e2g4O8gYHCg4PChYXEioq+j4+7kJC8kpK4nJyupKSlmpqymZmzmpqylJS3iYm/hITC
+ gYHCgYHCgYHDgYHEgoLEg4PCjo65jo65jY26kZG2m5urpKSjo6Oko6OkpaWmpqanpqanpqanpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6OkpaWlpqanpqanpqanpqampaWlpaWlpaWlpaWlpaWl
+ paWlpKSlo6OkoqKio6OkpKSlpaWlpaWlpaWlpaWlpqanpqanpqanpqampaWlpaWlpaWlpaWlpaWlpKSl
+ o6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlIACmpqelpaWlpaWlpaampqempqempqelpaWlpaWkpKWjo6Sj
+ o6Sjo6SlpaWmpqampqempqempqelpaWjo6Slpaampqempqelpaajo6Sjo6Sjo6Sjo6Sjo6Sjo6KhoaGi
+ oqKjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqempqempqempqalpaWlpaWlpaWlpaWk
+ pKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SioqOioqOjo6Sjo6Sjo6SkpKWkpKWf
+ n6qZmbCYmK+Tk7WJicCHh8OHh8KIiL+MjLiMjLmRkbWZma6goKijo6Sjo6Sjo6SioqKioqKhoaKamqiM
+ jLeFhcKDg8SCgsSDg8SEhMaFhcaMjMCNjb6MjL6Pj72amrKmpqWlpaakpKWjo6OhoaGioqGioqOenqea
+ mqyTk7OMjLqIiL2JibyJib2KiruHh8CGhsGFhcKKir2Vla+fn6OhoaGhoaGhoaGhoaGhoaGfn6SYmKyV
+ la+Pj7eKiryJibuEhMODg8WDg8WCgsaEhMSNjbqXl62fn6OgoKCgoKCioqKioqKioqKjo6KWlq+OjrmI
+ iMCDg8SDg8WDg8WDg8WEhMWHh8COjriWlrCbm6mgoKShoaGhoaGhoaGhoaGhoaGhoaCWlq2Jib2Dg8WD
+ g8WCgsSBgcOBgcOBgcKAgMF/f8F/f8GAgMGBgcKCgsSCgsaDg8WKir6NjbuZma2ioqKhoaOWlq+Kir2J
+ icCHh7+Ghr6JibWLi6+Hh7aIiLqLi72Li76Kir6NjbuUlLOXl6+enqednaqQkLiHh8KJicCJib+Hh7yI
+ iLiEhLuAgMGAgMOCgsSCgsWEhMWEhMaIiMGUlLKfn6ShoaGamqiXl62YmKyXl62RkbKMjLiDg76AgMGA
+ gMOBgcSDg8WKir+Kir+WlrKdnaqcnKyenqukpKWbm62Tk7eNjb2Hh8OCgseDg8aBgcaEhL6Hh7aFhbmB
+ gcOCgsSDg8WDg8aJib+WlrCioqShoaOWlq+JicCDg8eBgceAgMZ/f8SFhbqFhbaFhbaHh7iKirqMjLqP
+ j7qPj7qPj7uUlLWenqumpqSkpKWhoaeVlbSOjruMjLqKiruKiruKiriEhLyBgcCBgcKEhMCKir6MjL2P
+ j72Tk7uUlLmZmbKlpaOenqqamrCZmbKRkbuGhsWFhcSCgsSBgcKBgcKBgcSEhMKKir2MjLyMjLyLi72T
+ k7Senqajo6Kjo6Sjo6Sjo6SlpaampqempqempqelpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6Sj
+ o6Sjo6SlpaWmpqempqempqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6SkpKWlpaWlpaWl
+ paWlpaWmpqampqempqempqelpaWlpaWlpaWlpaWlpaWlpaWjo6SlpaWlpaWlpaWlpaWlpaWlpaUgAKam
+ p6ampqWlpaWlpaWlpqamp6amp6ampqWlpaWlpaSkpaOjpKOjpKOjpKSkpaamp6amp6amp6ampqSkpKSk
+ pKWlpqamp6amp6WlpqOjpKOjpKOjpKOjpKOjpKKio6GhoaKioqOjpKOjpKSkpKWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpqamp6amp6amp6ampqWlpaWlpaWlpaSkpaOjpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKOjpKKio6OjpKOjpKWlo6CgqJycrJubrZaWtIqKv4WFxYSEx4KCx4ODwouLuJKS
+ sZmZqpycqaCgp6Sko6OjpKOjpKOjo6OjoZ6eppOTs4aGwIKCxYODxYODxYKCxoSExIqKv42NvoyMv4qK
+ wpGRup+frKampaWlpqWlpqSkpaKio6GhoaCgo5mZrJSUso6OuIuLvImJvYiIvIqKvIaGwoSExIODx4SE
+ xI2NuJqaqqGhoaGhoaGhoaGhoaGhoKCgopiYq5WVr5CQto2NuYiIvIODwoODxoODxYKCxoaGwo+PtpmZ
+ qp+foqGhoaGhoaCgoKCgoKGhoaKiop+fppKStYiIwIODxYODxoODxYODxYODxYSExYODxYiIvpWVr6Gh
+ o6KioqKioqKioqGhoaGhoaCgoZycppCQsoaGwYKCx4ODxYKCxYGBw4GBw4CAwn9/wX9/wX9/wX9/wYCA
+ wYCAxISEw4qKvYuLu4qKvpeXsKGhpKCgpJaWro6Ot4+Pt4+PtZCQs42NtIiItoWFuIiIuoqKvIyMv42N
+ vY+PupGRuJGRtpWVsJ+fp5mZrpCQuJGRuIyMvY2NuoeHvoGBwn9/wn9/wYGBw4ODxIWFxIWFxYaGxI2N
+ upqarKGhop+fpKCgpJ6epJWVrYqKu4ODwYCAwoCAwYCAwoODwoiIvIuLuomJv5aWsZ6eqZycq56eqaSk
+ paCgqJqarZaWs4+Pu4iIwomJwIeHvoiIuYWFuoGBwYGBxYGBxIODxYODxoSExI2NuZycqaKiopycqJOT
+ so6OuY2Nuo6Ot4yMtomJuIeHt4WFtoaGt4qKuY2NuZCQupCQupSUt5aWt5ycsaenpaWlpaSkpJ2drJGR
+ uYmJv4qKvImJu4SEvoCAwICAwYGBwYODwoaGw4yMvZKSuZWVuJaWuJubsqSkp6SkpZqar4+PvIeHxYSE
+ yIWFx4SExYKCw39/xIODwImJu4qKu4yMvIyMvIqKvpOTs6CgpKOjoaKio6OjpKOjpKOjpKWlpqamp6am
+ p6ampqampaSkpKSkpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKSkpKampaamp6amp6amp6ampqWlpaWl
+ paWlpaWlpaWlpaSkpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpqamp6amp6amp6amp6WlpaWlpaWl
+ paWlpaOjo6KioqSkpaWlpaWlpaWlpaWlpaWlpSAApqanpqanpqanpaWlpaWlpqampqanpqanpqampqal
+ paWlpKSlpKSlpKSkpaWlpqampqampqanpqanpqampKSkpKSlpaWmpqanp6eopaWmpaWmpaWmpaWmpaWm
+ o6OkoqKioaGhoaGioqKko6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqampqanpqanpqanpqampaWl
+ paWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6Oko6Oko6OkoqKjo6Ojo6Oko6Oko6Oko6Oko6Oko6Oko6Oj
+ np6pmpqvlZW0iorAhITHhYXHhITHg4PDhoa+ioq6jo60mJionp6loaGko6Ojo6Oko6Oko6OkpaWhnp6o
+ j4+5goLGg4PFhITFg4PGhITEiYm/jIy8i4u+iorAj4+7m5uvpKSmpaWmpaWmpaWmpaWmpKSlo6Oinp6l
+ k5Ozjo65ioq+iYm+ioq8iIi9hobBg4PFgoLGhYXEi4u8lZWvoKCioaGhoaGhoaGhoaGhoqKgoKCilJSw
+ kJC2jIy6iIi+hITCgYHFg4PFhITGg4PGhYXDjo65m5uqoqKfoaGhoaGhoKCgoKCgoaGgoaGimJisj4+4
+ hobDgoLHg4PFg4PFgoLEg4PFg4PGhITEi4u7lpauoqKhoqKhoqKioqKioqKhoKChnJymlpatjY23hYXB
+ gYHGgYHFgoLFgYHDgYHDgIDCf3/Bf3/Bf3/Bf3/Bf3/DgoLBiIi8i4u6jIy7kpK0nZ2poqKjoaGknp6n
+ m5uol5esk5Owj4+zioq4hoa6hYW4h4e6iYm8jIy7jo67jo67jo68jY28kpK2oKCknJyqkZG4j4+5jY28
+ iYnBg4PFgYHFgIDCf3/CgoLDhYXDhYXEhYXFhITGiIjClpaxoqKjo6OgoKCim5uokpKxiIi9gYHEgYHD
+ gIDCgIDChITAiIi9iIi/jo66lpaymJiwmZmunp6ppKSlpKSlmpquk5O2j4+7jIy9i4u8i4u4hoa7gYHA
+ f3/DgYHDgYHEg4PFhITFgoLIiIjAmJitpKSgoqKim5upmZmsmJiulJSyj4+2iYm5hoa4hYW3iIi3jIy4
+ jo65j4+8j4+9kZG7k5O5m5uxqKimpqampqaloqKmlZW1i4vAjY28i4u5hoa8gYG+gIDAgYHCgoLCioq+
+ kJC3k5O1k5O4lJS5l5e2nZ2vpqamm5uuioq/g4PHhITGhYXGg4PFgYHEgYG/hoa5ioq3iYm7h4fBh4fB
+ hobDjIy7mZmuoKCjoqKio6Ojo6OjoqKjo6OkpaWmpqanpqanpqanpaWlpKSkpKSkpaWlpaWlpaWlpaWl
+ o6Olo6Oko6Oko6OkpKSkpaWlpqanpqanpqanpqampaWlpaWlpaWlpaWlpKSko6Oko6Oko6Oko6Oko6Ok
+ pKSlpaWlpaWlpaWlpqampqampqampqampaWlpaWlpaWlpaWlpKSkoqKjoqKjo6OkpaWlpaWlpaWlpaWl
+ IACmpqempqempqempqelpaalpaWmpqampqempqempqelpaalpaWlpaWlpaWlpaWlpaWlpaWmpqampqam
+ pqelpaWjo6SkpKWlpaalpaalpaalpaampqempqempqekpKWjo6SioqKioqKioqOjo6Sjo6SkpKWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWmpqampqempqempqelpaalpaWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6SioqKhoaGioqKjo6Ojo6Ojo6OioqOjo6ShoaWcnKuUlLWKisGDg8iFhcaEhMaEhMSHh76JibmJ
+ ibqHh7yUlKyfn6GioqCioqKjo6Ojo6Sjo6SkpKSamq6Kir2CgseDg8aDg8WFhcOKir+MjLyLi72Kir6O
+ jrubm66kpKWmpqSlpaWlpaalpaalpaampqWjo6WamqyNjbmJib6Kir2Kir2Jib6FhcCBgcODg8SFhcOM
+ jLuTk7Kbm6ijo5+hoaGhoaGhoaGhoaGhoaGdnaWQkLWKiruIiL+EhMOBgcaCgsWDg8WEhMaDg8eFhcWO
+ jryZma2hoaGhoaGhoaGhoaGhoaChoaCenqWSkrSLi76GhsSDg8aDg8WDg8WCgsSBgcWEhMOMjLqVlbCZ
+ mamhoaGioqKioqKioqKioqGhoaKZmamUlLCOjreHh76EhMKDg8KBgcSAgMKBgcKAgMF/f8F/f8F/f8J/
+ f8KBgcGHh7yKiriJibqLi7qZmaqgoKShoaWhoaSjo6GhoaOamqmRkbOJibqGhruGhriFhbiFhbiIiLmM
+ jLmNjbyNjb6Njb2Ojr2QkLidnaidnamRkbeKir+JicCEhMeCgseBgcSAgMKAgMGDg8KEhMSEhMWDg8WD
+ g8aIiMKTk7WgoKejo6KdnaaUlLCMjLqGhr+CgsSBgcOBgcKCgr+Dg7+EhMKGhsKQkLmRkbiOjrqRkbea
+ mq2jo6OlpaKbm66Pj7yKisCMjL2Li7yIiLyCgsJ/f8J/f8GAgMKBgcODg8WDg8WEhMWJib+VlbKioqOi
+ oqKcnKiZmauVlbCOjrmKir2KirqHh7mHh7eKirWNjbeNjbyMjL2Njb6MjMCNjb+YmLSmpqempqempqah
+ oaaXl7GQkLqQkLiNjbiIiLqCgr5/f8GBgcCHh7yPj7mSkreQkLmPj7uOjryRkbqcnLGmpqegoKyRkbmF
+ hcODg8aEhMWBgcSCgr+GhreGhreFhbyFhb2BgcSCgsaBgceEhMWNjbubm6uioqKioqKioqKioqKioqKi
+ oqSlpaampqempqempqelpaWjo6SkpKWlpaWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6SlpaWmpqampqem
+ pqelpaalpaWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWkpKSlpaWl
+ paWlpaWlpaWlpaWkpKWioqKjo6OkpKWlpaWlpaWlpaUgAKamp6amp6amp6amp6ampqWlpaWlpaamp6am
+ p6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKKio6Kio6Wlpaam
+ p6amp6amp6SkpaOjpKOjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqamp6am
+ p6amp6WlpaWlpaWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKGhoaGhoaKioqKioqKioqKio6Ki
+ opubq5OTtomJwYODx4SExoSExoSExYmJv4uLu4mJu4mJuYqKuJeXqZ+foaGhoKGhoaKioqOjpKOjpJ2d
+ qpOTtoqKwIWFw4aGwoODwomJvoyMvIuLvYuLvY6OuZubqqOjpKWlpKWlpaWlpaWlpaWlpqWlpqampaGh
+ qZOTtYiIwImJvYmJvYmJvYWFwYGBxYGBwoKCw4eHvZCQtJmZqqCgo6GhoaGhoaGhoaGhoaGhoJ6epZSU
+ sIqKuomJuoaGwYODxYODxYODxYODxYSExYWFxJCQuZubraCgp6Kio6GhoaGhoaGhoaGhoZ6epJOTr4mJ
+ vISExYODxoSExYSExYODxYODxoKCxYuLupWVr5qaqZ+fo6GhoaGhoaKioqKioqKioqCgpJqaqJOTr42N
+ t4yMuoyMuImJu4KCwoCAwICAwX9/wX9/wX9/wYCAv4CAv4WFuYiIt4mJuomJu4qKuZaWrZqap5ubqJ+f
+ pqGhpJubq5WVsouLuoiIvYmJu4eHuoaGuYWFt4eHuImJu4yMvY6Ovo6OvZCQu46OvJqar6CgppeXr4qK
+ v4SExYWFxIODxYGBxIGBwoGBwIGBwYKCxIODxYSExYiIwIyMvI6Ou5qarKOjpKGhpJWVroiIvYKCw4KC
+ wIGBwIKCv4KCvoKCvoWFv4qKvYuLvouLvoyMvo6Ou5WVs6KipqSkpKGhppeXso2NvYyMvouLv4ODxYGB
+ xICAwn9/wX9/wYGBwoODxYODxImJv4yMvI+PuJubqaKiop+fpZaWr42NuYmJvouLvIuLvYqKuomJtIqK
+ tIuLuYuLvIyMvY2NvY2NvoyMv5KSuaCgrKamp6enp6OjqZycrJWVsY+PuIiIvIODwoGBwoGBvoWFuIyM
+ touLvYqKv4qKv4qKv4qKv5GRuqCgraWlp6WlqJubsYuLv4SExYWFwoKCwYaGuIaGtoKCvX9/wn9/w4GB
+ w4KCxIODxYODxoiIwJaWsaKio6KioqKioqKioqKioqKioqKio6Wlpqamp6amp6ampqSkpaOjpKWlpaWl
+ paWlpaWlpaWlpaOjpKOjpKOjpKOjpKSkpKWlpqamp6amp6amp6WlpqWlpaWlpaWlpaWlpaOjpKOjpKOj
+ pKOjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaOjpKWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKOjpKSkpKWl
+ paWlpSAApqanpqanpqanpqanpqanpqanpaWlpaWlpqampqanpqanpqanpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWloqKioqKipKSjpqampqanpqanpqanpKSlo6Oko6Oko6Oko6Oko6Ok
+ o6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpaWl
+ pKSlo6Oko6Oko6Oko6OkoqKioaGhoaGhoqKioqKin5+klpawiYnAg4PHhITFhITGhITGiYnAjIy+i4u9
+ ioq8ioq5kZGwnZ2ioKCen5+foKCgoaGhoqKin5+nmJivk5O0kpK2kZG4j4+4ioq6iIi7ioq9ioq+jY26
+ mpqroKCkoqKio6OkpaWlpaWlpaWlpaWlpaWmpqalnZ2ukJC8ioq/ioq9ioq8hYXBgYHFgoLEgYHDgYHD
+ goLCjIy2m5uno6OfoaGhoaGhoaGhoqKgn5+klZWwioq8jIy5i4u5i4u6h4fBg4PGhITFhITFg4PFjo64
+ mZmtn5+no6Ojo6OkoqKjoaGhoqKgn5+jlpauioq9g4PDgoLFhITGhITGhITGhITGhITGiYm/kpKxmpqo
+ n5+koaGhoaGhoaGhoaGhoqKhoaGkm5urlJSxjIy5iYm6iYm5iYm5iIi5hYW8goK8f3+/f3/Af3/BgIC+
+ hYW2hoa3hoa3hoa4h4e5iIi6ioq5j4+ympqpnJynn5+loaGlmZmtlJSyjY26ioq7iYm6h4e5hoa4hYW2
+ hoa3iIi5i4u8jo69kJC7kJC7kJC7m5uuo6OknZ2pkJC4jIy8jIy9hobCgoLDgYHAgYHAgYHDg4PFg4PG
+ iIjAjIy8jIy9kJC4nJyqoqKlpKSjoaGllZWuiIi8iYm7hIS+goK/gYG/goK9h4e7ioq7ioq8i4u+kJC5
+ lJS1lZW0nJysoqKlpKSjoqKmmJiyiorAhYXGhITGgoLFgYHDgYHCgIDBgYHDg4PFiYm/jIy7jIy7jY26
+ lpawoaGjpKSgmpqrkJC3jIy8jIy8jIy8jIy3ioqyiYm1iYm7ioq7i4u8jIy9jIy+kZG5mZmxoKCspqan
+ pqanp6emo6OolZWzh4fAgoLBgYHBgYHCiIi0jIyviIi7ioq9hITEhITFhITGh4fDkJC6mZmwoqKqpqan
+ pKSpl5e1i4u+i4u6iIi5h4e3goK8f3/BgIDBgYHCgYHEgoLEg4PEh4fAjY27k5O0n5+loqKjoqKioqKi
+ oqKioqKioqKio6OkpaWmpqanpqanpqanpaWlo6OkpKSlpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6OkpKSk
+ paWlpaWlpaWlpKSkpKSkpaWlpaWlpaWlpaWlpKSko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlo6Ok
+ o6Oko6Oko6OkpKSkpaWlpaWlpaWlpKSko6OkpKSkpaWlpaWlIAClpaWmpqempqempqempqempqempqel
+ paWlpaWlpaampqempqempqelpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Oh
+ oaGjo6OlpaampqempqempqekpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6SioqKhoaGhoaGi
+ oqKenqaUlLKIiMCDg8aEhMaFhcWKir+Li76MjL2MjL2Li76Li7uXl6qdnaCfn56fn5+fn5+goKChoaGe
+ nqaamq6Tk7aQkLqPj7mKiruJibuJibuJibyKir2NjbuVlbKhoaWjo6KioqOjo6SkpKWlpaWlpaWmpqSi
+ oqqVlbiKisOMjMGLi7+GhsSCgsWCgsSCgsSCgsSDg8KOjrSVlaqcnKOhoaChoaGhoaGhoaGjo5+bm6iP
+ j7WLi7uMjLqLi7mEhMCCgsWDg8WDg8WDg8WCgseKir2YmKyioqSjo6Sjo6Sjo6SioqOjo6CdnaWQkLaE
+ hMSDg8WDg8WEhMaFhcaFhcaFhcaKisCRkbiamqydnaSdnaOhoaGhoaGhoaGhoaGioqCenqWUlLGNjbmM
+ jLyKiryIiLuIiLqHh7mHh7eGhraGhreIiLWIiLWGhreFhbaFhbeGhreGhreGhriJibiRkbCYmKqamqiZ
+ mamcnKWhoaGfn6aenqaamqqWlrCTk7GOjrOHh7mGhreGhreHh7iMjLmPj7mPj7mRkbmTk7ehoamlpaOe
+ nqmWlrCQkLSMjLuGhsKCgsOAgMF/f8GBgcKAgMSIiMCMjL2Li72QkLibm6yioqWjo6SkpKOhoaaXl7CK
+ iryFhcGDg8CCgsCDg7yGhriGhriIiLmKiruKir2Pj7mXl7KdnaucnKyioqWkpKOgoKeWlrOJicGDg8eE
+ hMaEhMWCgsWBgcOBgcKDg8SLi76Njb2Njb6Pj7mSkrSTk7OhoaOjo6Genqabm6mZma2RkbWSkrWRkbGK
+ irWHh7mJibmJibqLi72MjLyLi76UlLWgoKqkpKekpKimpqeoqKWgoK2QkL2EhMaEhMSAgMSKirSKirGF
+ hbeFhbqDg8SEhMSEhMWFhcWEhMaHh8KTk7WgoKmmpqakpKmdnbCWlraSkraLi7qEhL+AgMF/f8F/f8GA
+ gMKCgsSCgsOGhr+NjbmRkbWTk7SamqyhoaSioqOioqKioqOjo6Sjo6Sjo6Sjo6Slpaampqempqempqel
+ paWjo6SkpKSlpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWl
+ paWkpKWjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6SlpaWlpaWlpaWkpKSk
+ pKWmpqempqcgAKOjpKSkpaampqamp6amp6amp6amp6amp6WlpqWlpaWlpqamp6amp6amp6WlpqWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjo6Ojo6WlpaWlpaamp6amp6amp6SkpaOjpKOj
+ pKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKSkpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaOjpKOjpKOjpKOjpKKioqGhoZ+fpZmZrZCQuIuLvYeHwYODxoSExYaGxIuLv42N
+ vIuLvo6Ou5iYr5+fo5+fn56enp6enp+fn5+fn56eo5mZqZOTs5CQuI+PuY6Ou4uLu4aGwoWFw4WFxIWF
+ xIiIvpWVsaGhpKOjoqKio6Kio6Kio6SkpaWlpaampKGhqZiYs5OTuJSUuIeHxISExYODxYODxYSExYSE
+ w4qKvZWVrZ2dop+fn5+fn6CgoKGhoaGhoJ+fpJiYq5CQtIuLu4qKvIaGwoODxYKCxYKCxIODxoKCx4qK
+ vJGRs5qaqaCgo6Ojo6OjpKOjpKSkpKKipJiYrYqKvYKCxoODxYSExYWFxYSEx4WFxoyMv5KSt5WVs5ub
+ raCgpqGhoaCgoKGhoaGhoaKioKCgopiYrYyMu4uLu4qKvYqKu4qKuYmJuYiIuYmJt4iItomJtIiItIaG
+ toWFtoWFt4aGtoGBvYCAwYGBwoSEwIuLto+Pto+PuJCQtpqaq6SkoKGhoZ6ep5iYrpaWsZKStouLu4mJ
+ uoeHuYaGt4iItYyMto+PuJGRuJOTtZWVtZqasJ+fq6OjpqKip5mZrpCQs4qKuoODwn9/xH9/woGBw4WF
+ u4mJuYqKvJGRt52dqaSko6Sko6OjpKSko5+fqJGRt4aGw4SEwoSEwoSEv4aGu4eHuIaGuImJuomJu4mJ
+ u4uLvJCQuZeXsZycrKOjpKWlop+fqJaWs4+Puo6OuIqKv4WFxYKCxoCAxYGBwYmJvI2Nu4yMvIyMvYyM
+ vI2Nu46OuZubqqKioqCgpZqaq5WVsJGRspCQsoyMtoeHt4aGt4iIuYmJuoyMvI2NvYuLwJSUtZ+fqZ+f
+ qp+frKSkp6enpaOjq5iYtZGRvJKSuZCQtouLtoeHtoSEuYCAv4GBwoODxISExYODxoWFxI2NvZaWs6Ki
+ paWlo6OjqZ6esZmZtpWVt4iIwoODxIGBw4CAwYCAwYCAwYODwoeHvo2NuJKSs5KSspWVsZycq6GhpKKi
+ o6Kio6Kio6KioqOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaSkpKSkpKWlpaWlpaWlpaOjpKOjpKOj
+ pKOjpKOjpKOjpKWlpaampqamp6Wlpqamp6WlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKSkpaWlpaWlpaWl
+ paWlpaOjpKOjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaSkpaOjpaampyAAo6OkpKSkpaWlpqanpqanpqan
+ pqanpqanpqampqalpaWlpaWmpaWmpaWmpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlo6Ojo6OjpaWlpaWmpqanpqanpqanpKSlo6Oko6Oko6Oko6Oko6Oko6OkpKSkpKSkpKSkpaWl
+ paWlpaWlpaWlpaWlpKSlo6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6OlpKSk
+ oaGkl5etkZG0jo65ioq/hYXEg4PGg4PGh4fAi4u9jIy9jY28lpazoqKlo6OioqKgoKCfnp6en5+enp6g
+ mJipkJCxjo61jo62ioq6hYXChobBhITFg4PHhITFhYXDiYm9l5eroaGko6OjoqKjoqKjoqKjo6OkpaWl
+ pKSmoKCpm5uvlJS4iorChobIg4PGg4PFhITFhobDiIjAiIjAlJSyn5+koaGen5+fn5+foKCgo6Ogmpqq
+ kZG0jIy5i4u7i4u6hITFgoLFgoLEgYHFgoLFioq7k5OxmZmqnp6koaGhoaGioqKko6OkpKSjoaGll5ev
+ iYm9g4PGg4PFg4PFg4PGhobEjIy+jo68kZG5lJS0mpquoaGnpKSjoaGioKCgoaGho6Ofn5+jlpatjo63
+ ioq8i4u8h4fAhITBhITAhITAg4O/g4O/iIi3h4e2hIS4hYW3hoa2goK8f3/Cf3/EgIDFgoLEhITChYXD
+ iIjBkpK1np6mpKSfoqKinZ2olZWwjo64iYm+iIi+iIi6iYm3iIiziIi1iYm4ioq6i4u7jo66j4+7kJC6
+ mpqxo6OooqKonp6plpavkZGyiYm5hIS9hIS6hIS7hIS+hIS/goLEi4u8m5uroKCmoKCno6OkpaWinp6o
+ kZG3h4fDiIjAh4fAiIi8iIi5h4e4hoa3iIi6iYm6ioq6ioq7ioq8jo66lpaynp6qo6OkoaGkn5+nnZ2p
+ mZmskZGzioq9h4fAhoa9hoa7ioq4ioq7i4u8jIy9i4u+jIy9kpK3mpqroaGjoKClmZmtk5Oyk5Oxk5Ov
+ ioq4h4e6h4e3h4e3ioq5i4u6i4u9j4+6lpaymZmumJivmZmwo6OmpqalpaWnpKSpoaGtlpa2kZG5jIy6
+ hoa8gYG/gIDBgYHBgoLDgoLFhobCi4u9jIy8kJC5np6qo6OkpqaloKCtlJS7iorEhITJgoLJgYHGgYHE
+ f3/CgIDAhYW7iYm5jIy4jY25jo64lZWwoKCkoqKjo6OkpKSkpKSkpKSkpKSkpKSlpaWnpqanpqampqam
+ paWlpaWlpaWlpKSlpKSlpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6OkpKSkpaWlpqanpqanpqanpqam
+ paWlpaWlpaWlpaWlpKSlo6Oko6OkpaWlpqampqampqampaWlpKSlo6Oko6Oko6Oko6Oko6OkpKSkpaWl
+ paWlpaWlpKSlpKSlIACjo6Sjo6Sjo6SlpaWmpqampqempqempqempqempqempqalpaWlpaWlpaWkpKSk
+ pKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6OkpKSlpaWmpqempqempqem
+ pqelpaajo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6SkpKWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6WioqOioqKfn6aUlLCPj7aKir6FhcWDg8eFhcSIiL+Li7qM
+ jLqLi72OjruZma+lpaKjo6SioqSioqGgoJ+fn56enqGRkbCOjrSMjLWIiLqDg8GBgcWCgsWDg8WEhMSG
+ hsGJib6QkLWcnKWhoaGioqKioqOioqOioqOioqOhoaWioqWdnayTk7aKisKEhMiFhcaDg8WDg8WEhMWF
+ hcSFhcOKir6Xl6+hoaSioqCfn5+fn5+fn5+fn6CYmKuPj7iKir2Li7yHh8CDg8SDg8SCgsaDg8SJibmS
+ krGVla6bm6igoKOhoaChoaGhoaKjo6SlpaOioqSXl7CJib+Dg8aEhMSDg8WCgsaGhsSKisGJicKIiMSR
+ kbidnaykpKakpKWjo6ShoaGgoKCfn6Kbm6mTk7GNjbiLi7yIiMCDg8WBgcaBgcWBgcWBgcV/f8WIiLmO
+ jq2Li66FhbiCgr19fcJ+fsKAgMKCgsSDg8aCgseGhsKJib6SkrScnKmhoaSioqKfn6SdnaaUlLGRkbWR
+ kbOMjLWLi7OIiLSGhriHh7qJibuJibyJib6NjbySkreenqyjo6ednayamq6WlrOUlLKOjraIiLmGhriD
+ g7yAgMF/f8SCgsKIiLyPj7eSkrWRkbecnK2jo6SioqWXl6+MjL2Li76Li72KiryKiruIiLmGhreGhriI
+ iLqKirqJibuKiruOjraTk7OXl7GgoKekpKKjo6OenqaXl66QkLaLi7qJibyJibqJibiIiLiIiLqJibuL
+ i7uOjrqUlLWcnKygoKehoaKhoaOcnKmYmK2ZmauXl66MjLiJibqIiLiGhriGhruHh7yGhsCNjbuUlLWV
+ lbKVlbOWlrSjo6empqSmpqWmpqaioqyUlLmMjMCIiMODg8SAgMOBgcKBgcGAgMKEhMCJibyMjLqLi72M
+ jLyWlrOioqampqGfn6qSkrmKisKMjMGNjcGJicKGhsGEhL6Dg7qGhraIiLeJibmJibyMjLqVla6jo56i
+ oqCioqOlpaWmpqampqampqalpaWmpqampqempqempqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWk
+ pKWkpKWkpKWkpKWkpKWjo6Sjo6SlpaWmpqempqempqempqalpaWlpaWlpaWlpaWkpKWkpKWlpaampqem
+ pqempqempqalpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6SkpKWkpKWkpKWkpKWjo6QgAKSkpKOjpKOjpKOjpKWl
+ paampqampqampqampqamp6amp6WlpaWlpaWlpaSkpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaOjpKSkpaampqamp6amp6amp6amp6SkpaOjpKOjpKOjpKSkpKSkpKSkpKOj
+ pKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaSkpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOj
+ op+fpJiYq5KSsoyMu4WFxIODxoSExYWFw4iIvoiIv4iIvomJvo+PupubrqSko6OjpKOjpKKio6KioaCg
+ oJmZpY6Os46Os4mJuYSEw4ODxoODxIODxYSExIaGwYqKvY+Pt5eXrqCgoqCgoKGhoaKio6Kio6Kio6Ki
+ o5+fpZ+fpZmZrYuLvoGByoSExoSExIODxYODxIODxYODxYeHwZCQtp2dp6KioqKioqGhoaCgoJ+fn5mZ
+ ppaWrY+PtoiIvYaGwIODxoSExYSExoWFxIuLvJCQso+PsZSUr5ubp6CgoqGhoaGhoaGhoaKioqKipJ2d
+ q5SUtYuLv4aGwoSExIODxYODxYODxoODx4SEx4aGxZOTt6GhqKamo6SkpaSkpaOjpKGhoJmZqJGRsoyM
+ uomJv4iIwIODxYODxoODxYKCxYKCxYODxoKCw42NspaWpI+PrYCAvn19wn5+wX9/woCAwoKCxYSExoiI
+ woqKv4mJwIqKv5CQuJubq6OjoaOjoaSkoKCgop2dpZiYqY+Pr4iItIWFuIWFuYaGuYiIu4mJu4uLuZOT
+ spubqqKipaSkpZ6eq5iYspWVtZKSt46OuomJvIODv4CAwoCAwoKCwYiIuoqKuImJvImJv4uLvZaWsqGh
+ p6Skop2dqpGRuIyMvYyMvYuLvYqKu4iIuYaGuIaGtoiIuYqKvIuLu4+PtZWVr5SUsZSUs56eqaWloqCg
+ p5WVso+PuYqKvoqKvouLu4uLuIiIuIeHuYiIuYqKuouLvI6OupaWs52dq6KiqKKipKOjoZ+fpJqaqpiY
+ rJOTtI2NuouLuoiIuYSEu4GBvoKCwIWFv4mJv4+PupOTtpKSt5KSt6CgqKWlpKampKKiqZqas5eXtpKS
+ uoqKw4SEx4KCxICAw4CAwoODv4mJuoqKuYqKuouLu4uLvJCQuZycq6Sko6Cgp5iYsZaWtpWVtpaWtpGR
+ uI2NuIqKtoaGtoWFtoaGuIiIuIqKuoyMu5KSs56epqCgpKKio6SkpKamp6amp6amp6WlpqWlpaampaam
+ pqamp6amp6WlpqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpKOjpKOjpKWlpaam
+ pqamp6amp6WlpqWlpaWlpaWlpaWlpaWlpaWlpaampaampqamp6amp6WlpqWlpaWlpKSkpKOjpKOjpKOj
+ pKOjpKKio6Kio6Kio6OjoyAApaWlo6Oko6Oko6Oko6OkpKSlpaWlpKSlpKSlpKSlpaWlpaWlpaWlpaWl
+ paWlpKSko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6OkpaWm
+ pqanpqanpqanpqanpaWmo6OkpKSkpaWlpaWlpaWmpKSlpKSlo6Oko6OkpaWlpaWlpaWlpaWlpaWlpKSl
+ o6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqajn5+okZG0ioq9hITGg4PGhITFhITFg4PFgoLG
+ goLGgoLHhobAk5OxoaGmo6Oko6Oko6Oko6Oko6OinZ2lkpKujY2ziIi6goLCgoLFhITFhITFhYXEhobB
+ iYm+jo65lJSxnJyooaGhoaGhoKCgoaGhoqKjoqKjoqKjn5+lmpqrlJSyi4u8hITEhYXDg4PEg4PEg4PE
+ g4PEh4e/kJC1lpawoKCko6OhoqKioqKioaGhoKCflJSskJCyjIy4hYXAgYHGg4PFhITFhITFi4u9kZG3
+ j4+5jo61lJSsnp6ioqKgoaGhoaGhoaGhoaGgm5uqk5O1kJC5kJC5ioq/hYXFgoLEgoLFg4PFhITFh4fC
+ jo68nJyuo6OmpKSlpKSlpKSlpKSlpaWimJiti4u5h4e+h4e/goLFg4PFg4PFgoLFgoLFg4PFhITDioq6
+ lZWskpKthIS8fX3Ffn7Bfn7Bf3/BgIDBgoLDhobCjIy/hYXHhITJg4PIiIjBlpaxoqKjoqKioqKioqKh
+ nJymk5Oui4uzhYW5hYW4hYW4hYW5hoa5iYm4jo60lZWtnJymnp6mn5+ooKCpnZ2slZW2jY2+ioq/hobB
+ gYHFgYHDgYHBiIi6ioq4iYm6iYm6jY25kpKzmJiuoKCnpaWioKCnlpaxj4+4i4u8ioq8ioq7iIi6h4e5
+ hYW2iIi4ioq6kZG1lpawlZWxlpawmZmrnp6npKSjn5+pkJC4i4u9jIy8jIy9jY25i4u3h4e5h4e5iIi5
+ ioq7jIy9jIy+jY2+lJS4l5ezn5+qo6OjoKCjmpqrk5OzjIy8jIy8i4u8hoa+goK/gYG9g4O9iIi4ioq7
+ jIy7jY25jY26jY27mpqto6OmpqajoaGpmZmym5uwnp6ulpa3iorBg4PDgoLAgYG/iIi4iYm5ioq6ioq6
+ ioq6i4u7ioq+lpayoaGmoqKknJyql5eylZW1lZW0lZWzkpKyi4u0hoa4hYW2hoa2hoa5iYm9iorAi4u/
+ kJC5mJiwoKClo6OipKSlpaWmpqanpqanpaWmpaWlpaWmpqanpqanpqanpaWmpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6OkpKSlpqanpqanpqanpqampaWlpaWlpaWlpaWlpaWl
+ paWlpaWmpqanpqanpqanpaWmpaWlpKSlo6Oko6Oko6Oko6OkoqKjoqKioqKioqKiIAClpaWlpaWkpKSj
+ o6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6SlpaWlpaWmpqampqempqem
+ pqelpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6SkpKSmpqampqempqempqempqekpKWkpKSlpaWlpaWm
+ pqempqempqempqakpKSjo6SlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWl
+ paWnp6OgoKqOjrqDg8aEhMWDg8SDg8SDg8WEhMWDg8WDg8WBgceKiryamqmjo6Cjo6Sjo6Sjo6Sjo6Sj
+ o6OcnKmPj7WKiruDg8KCgsSEhMWEhMWEhMWGhsKKir6Li72NjbyWlrCgoKKhoaGhoaGhoaGgoKChoaGi
+ oqOhoaOamqyTk7ONjbuKir6Li72Kir6Dg8OEhMWEhMaIiMKPj7eVla6cnKihoaOioqKioqKioqKioqKh
+ oaGUlK6KiriEhMCBgcWCgsSEhMWDg8aJib+MjLuKir2NjbqXl62bm6WenqCgoKChoaGhoaGhoaGfn6OT
+ k7GPj7ePj7mJicGEhMaEhMaEhMWCgsSDg8SHh8GNjbmTk7SgoKilpaSkpKWkpKWkpKWkpKWmpqOZmbCN
+ jbqGhr+AgMSBgcOBgcOBgcOBgcOBgcSEhMOLi7qSkrGUlLCIiLx/f8aAgMN/f8J/f8F/f8F/f8KFhb6I
+ iL2Dg8aFhceEhMiKisKMjL6Pj7icnKiioqOjo6GenqeVla+NjbeHh7uHh7mFhbiFhbiFhbmGhrmHh7mI
+ iLyIiL2Tk7CZmaqZma2amq2dna2Pj7yMjMCHh8ODg8aDg8WBgcKGhrmIiLiJibqKiryMjLqRkbSQkLSX
+ l6+fn6akpKKioqWdnamXl7COjruLi76Li7yKirqIiLmFhbaGhriPj7WTk7OTk7SWlrGZma2enqafn6Si
+ oqOgoKeWlrKRkbiPj7iQkLiMjLqIiLuHh7iGhreHh7iHh7iKiruMjL2MjL2Njb6Li8CYmLKioqajo6Ke
+ nqaYmK+NjbuLi7yIiL+EhMGCgr6CgryIiLmJibmKiruMjLuNjbmOjrmPj7mcnKyioqWkpKSjo6agoKig
+ oKigoKmfn6mTk7WJib2IiLiGhreHh7iIiLiKiruLi7yLi7uLi7uKiryWlq6hoaWkpKOfn6eZma2UlLWT
+ k7WUlLOOjraIiLuIiLmFhbaGhraDg8CDg8aEhMeFhceGhsWTk7igoKikpKOjo6Sjo6Smpqempqempqel
+ paalpaWlpaWmpqempqempqelpaalpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWj
+ o6Sjo6SlpaWmpqempqempqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqempqempqelpaalpaWlpaWj
+ o6Sjo6Sjo6Sjo6Sjo6OioqKioqIgAKWlpaWlpaWlpaWlpaWlpaWlpaOjpKWlpqamp6amp6ampqWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaOjpKWlpaWlpaampqamp6amp6amp6OjpKSkpaWlpaWlpaWlpaWlpaWlpaWl
+ paSkpKSkpKWlpqamp6amp6amp6ampqSkpKOjpKWlpaWlpaamp6amp6amp6ampqWlpaOjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaampKKiqJubr5KSt4yMvYuLvIWFw4KCxoODxYOD
+ xYODxYODxYKCxoyMu5ubqaKin6GhoaOjpKOjpKOjpKOjo52dqZCQuISExYKCxYODxIODxIODxISExYSE
+ xYWFxoWFxY+Pup2dq6OjoaGhoaGhoaGhoaGhoaGhoaCgoKCgopWVsoyMu4qKvYyMvImJvYSExISExYSE
+ xomJwIyMvZGRuJ2dqKGhoaGhoaKioqKioqKioqKiop2dp46OtYSEwYGBxYGBxIGBxIODxImJvouLvIqK
+ vY2NuZeXrpycqKKio6CgoJ+fn6CgoKGhoaGhoZ+fo5OTsY2NuYmJv4SExYSExYSExYODxIKCw4GBw4OD
+ woqKu5aWrqGhpaSkpKSkpaSkpaSkpaSkpaCgqZOTtoeHwoKCxYKCxIGBw4GBw4GBw4CAxIODwIuLuJCQ
+ tZWVrZeXq5KSsouLuYaGvYCAw39/wX5+w4ODu4WFuoKCw4KCxIODxYaGxYiIxIeHxoqKwZeXsKGhpKOj
+ op+fppKStImJvomJvIiIuoeHuYWFuIaGt4WFuoGBwYODwoODxY2NuJeXrZubqpycq5mZroyMvoaGx4SE
+ yYSEyIWFxYiIuoaGt4aGuIqKuYeHvoKCxYSExIODxY6OuJ6ep6SkoaKio6KipZycrJSUtI2NvIqKvoqK
+ u4mJuoaGuIuLsJCQr5KSs5OTtJSUs5WVs5SUs5mZrKCgo6GhopycqpeXr5OTtJOTs5GRtJCQs42NsoeH
+ uIaGt4aGuIiIuoqKu4uLvIyMvYyMv5iYsqOjp6WlpJ+fppeXr4yMu4eHwIWFwoSEwISEvIaGt4eHuIiI
+ uYuLt42NuIyMuo+PuZqarqKipaOjo6OjpKOjpKSkpaSkpZ6eqZ2dqZOTtImJvYmJuYiIuYeHuIiIuImJ
+ uomJvIqKvYyMvJGRtpubqJ+fpKGhpKOjpKGhppycq5SUsI2Nt4qKuoiIuYeHuIWFtoGBvoGBw4ODxYSE
+ xoWFxYyMvpaWtJ+frKOjpqOjo6OjpKOjpKamp6amp6amp6ampqWlpaWlpaamp6amp6amp6ampqWlpaWl
+ paWlpaWlpaWlpaSkpaOjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqamp6amp6amp6WlpaWl
+ paWlpaSkpKOjpKWlpaWlpaamp6amp6amp6ampqWlpaWlpaOjpKOjpKOjpKOjpKOjpKKioiAApqanpqan
+ pqanpqanpqanpqanpaWlo6OlpaWmpqanpqanpqanpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6OkpKSlpaWl
+ paWmpqanpqanpaWmo6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6OkpaWlpqanpqanpqanpaWmo6Ok
+ o6OkpaWlpaWlpqampqanpqanpqanpKSlpaWlpaWlpaWlpKSkoqKjoqKjo6Oko6Oko6OkpKSkpaWlpaWl
+ paWlp6ejnp6skpK4j4+8jo68h4fDhYXGhITGhITGhITGg4PFgoLGjY26l5eun5+loqKgoaGhoaGio6Ok
+ pKSjo6OknJyqk5O0jIy9i4u8hobCg4PGhITFhITFhYXFhobEkJC6mpqvoaGnpKSkoqKioaGhoaGhoaGh
+ oaGgoKCgmZmljIy2ioq9jIy9iYnAhITGg4PEhITFhITGhITGh4fEkZG4np6oo6OjoqKhoaGhoaGho6Oh
+ oaGjlpavjY27iYm9iIi8iIi8iIi8ioq+jo69jY2/j4+7lpaxnJynoaGjoqKioqKhoKCgn5+en5+goKCk
+ oaGilpatiYm+goLHgoLGg4PFhITFg4PEgoLFhITDiIi9jo61nZ2noaGioqKjpKSlpKSlpKSloaGom5uu
+ kZG4h4fDg4PIg4PGgYHFgYHDgYHDgYHDgoLChYW/j4+ynJymnp6jmpqnlJSvjo61h4e7hoa7hoa5goK8
+ f3/AgIDCgYHDhYXChYXChYXGh4fFj4+7nZ2so6Oko6Oin5+nkpK1iIjAioq+iYm8iIi7h4e2g4O6gIDB
+ gYHDgoLEg4PGjY26mJitnp6loKCjn5+mlpawkJC5kJC6jo67iYm+iIi5hoa3h4e1hYW8goLEgoLGg4PG
+ goLHiIi/lpawoKClo6OioaGklpaylJS0lJS1kpK2kZG2kJC0jo6yjY2uj4+tkpKukpKzj4+8jo67jY29
+ kpK3nJyppKSfn5+lk5O0k5O1k5O1k5OykJC0ioq6h4e5h4e5h4e5iIi5iYm5iYm7jY28kpK3mpqwo6On
+ p6ejoaGok5O0h4fBhYXChYXDhYW+hoa3hoa3hoa3iIi1i4u1i4u3j4+0mpqpnp6loaGmoKCmoaGlpKSj
+ oqKlnp6pn5+omZmulJSzjo63iIi6iYm5hYW2h4e4iYm7ioq9jIy/jY2/jo69lJS3mpqyn5+po6OgoaGi
+ lZWwjY25iYm7iYm7ioq5h4e5gYG/gIDBgYHCgoLEgoLGhYXEk5O2mZmxmpqwoKCqpaWko6Oko6OkpKSl
+ paWmpqanpqanpqanpaWlpaWlpqampqanpqanpqanpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6OkpaWm
+ pqanpqanpqanpqanpaWlpaWlpqampqanpqanpqanpaWlpaWlpaWlpKSlo6OkpaWlpaWlpqampqanpqan
+ pqanpaWlpaWlpKSko6Oko6Oko6Oko6OkIAClpaampqempqempqempqempqempqakpKSkpKSlpaampqem
+ pqempqalpaWlpaWlpaWlpaWlpaWlpaWkpKWkpKSlpaSlpaWlpaampqempqempqekpKWkpKSlpaWlpaWl
+ paWlpaWlpaWkpKWjo6SkpKSmpqampqempqempqelpaWkpKSkpKSlpaWlpaalpaempqempqempqalpaWl
+ paWlpaWlpaWkpKSioqOioqOjo6Sjo6Sjo6SkpKSkpKSlpaWnp6ShoamUlLaLi8KHh8WEhMaFhceFhceF
+ hceEhMeDg8aKiryXl6+goKaioqKioqKhoaGhoaGioqGioqSdnamVlbKQkLmOjruHh8CFhcSEhMaEhMaF
+ hcaEhMeKir+YmLChoaekpKWkpKWjo6ShoaKhoaGhoaGhoaGdnaaRkbOJibiIiLuKirqJibqGhr+Dg8WE
+ hMWDg8eFhcaNjbyZma6ioqWjo6SioqOhoaKhoaGioqCgoKSSkrSRkbaOjriIiL6EhMGEhMCHh8OHh8OK
+ isCRkbqYmLKenqmioqGioqKioqKioqKgoKCfn56enqGbm6aQkLKHh7yGhr2Ghr6EhMWEhMWDg8aFhcOK
+ ir2Pj7eTk66enqGhoaCioqGjo6OkpKWkpKWgoKmbm66QkLqJicGJicGJicGIiL+Dg8KCgsKBgcOBgcOI
+ iLuVlaqdnaCiop6amqiTk7CSkrKMjLiKirmEhL1/f8J+fsOAgMGCgsCFhcGEhMOHh8KOjr2Xl7Sfn6uk
+ pKWjo6OdnaiTk7SOjrmPj7eKir2Li7qGhryAgMB/f8KBgcKCgsSBgceNjbqVlbGWlq+YmK2cnKmgoKag
+ oKWZma2Pj7mJibyJibmHh7aDg7qAgMGAgMOBgcSDg8aIiMGLi7+Njb2WlrKhoaWhoaSYmK6VlbOUlLSU
+ lLWUlLSTk7KRkbCPj6qIiLWFhbyGhr+GhsOMjL6Li7+QkLmcnKulpaCgoKOWlq6Wlq6UlLCPj7WLi7qI
+ iLyIiLmHh7mIiLmJibqJibuJibyLi7uSkrWZma+ioqinp6OioqeXl7GOjrqKir6Hh72IiLqIiLiGhriI
+ iLSIiLaJibiJibqLi7mRkbOcnKibm6iamqyfn6ikpKOioqWcnKqYmK+Xl7OTk7eNjbqJibuJibqGhraG
+ hriIiLuLi7yLi7+IiMSIiMSHh8aRkb6fn62mpqKfn6ORkbKOjraOjrSNjbSIiLqCgsCAgMJ/f8GAgMGA
+ gMSDg8SIiL2OjrmQkLmTk7ifn62np6OkpKWjo6Sjo6Sjo6SlpaampqempqempqalpaWlpaampqempqem
+ pqempqalpaWlpaWlpaWlpaWlpaWkpKWkpKWjo6Sjo6SlpaampqempqempqempqalpaWlpaWlpaampqem
+ pqempqalpaWlpaWlpaWkpKWkpKSlpaWlpaampqempqempqempqalpaWkpKWjo6Sjo6Sjo6SlpaUgAKWl
+ paampqamp6amp6amp6amp6amp6ampqWlpaSkpKWlpqamp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaOj
+ pKSkpKWlpaWlpaampqamp6amp6WlpqSkpKSkpKWlpaWlpaWlpaWlpaWlpaSkpKOjpKSkpKampaamp6am
+ p6amp6ampqSkpKSkpKWlpaamp6amp6amp6amp6ampqWlpaWlpaWlpaWlpaSkpKKio6OjpKOjpKOjpKOj
+ pKOjpKWlpKSkpZ+fqZaWs4uLvoiIwoODxYSEx4WFx4SEyYWFyI2NvZeXsZ6epqKioaKioaKioqKioqGh
+ oaKioJubqJSUs4+PuIuLvIeHwYKCxISExYWFxYSEx4WFx4mJwo2NvJiYrqKipaWlpKSkpaSkpaOjpKKi
+ o6KioJ+fpJaWr4yMu4uLuYuLt4uLuImJu4aGwISExoODxoaGxI6OuZqaraKipaSko6OjpKOjpKKipKGh
+ oqKioKGho5OTspGRtoqKvYSExYGBxoGBxYODx4KCyImJwZOTt52draKip6SkpKKioqKioqKioqKioZ+f
+ oZmZpY+PsYmJuomJuYmJuIaGv4SExYODxoSExIqKvpGRtpeXr5ycqKCgn6Cgn6GhoaGhoaOjo6Skpp+f
+ qpWVtI6OvYyMvo2NvY2NvomJwYSEwoGBw4KCw4mJupSUq5ycoZ6enqGhnJmZqZCQtY6Oto2NuIyMuIaG
+ vYSEvYODvYGBwISEwIWFwoiIwYuLvo+PvJOTuJmZsKWlpaWlpKGhppubq5SUs46OuYyMvIiIv4ODxIGB
+ xIGBwoGBwoGBxImJvJGRtJKSs5GRtZOTspqaqqGhoqOjopmZrpCQt46OuImJuoSEvH9/wX9/w4GBxIKC
+ xIiIwIyMvIyMvo2NvZWVtJ+fqKOjpKCgpJaWsZKStpKStZOTtZKSspKSsImJtoKCwH5+xYCAw4aGv4uL
+ vIyMvY2NvJiYsKOjpKKio56epJ+fopWVrIqKuIeHvYiIu4iIuYiIuYiIuYmJuomJvImJvIqKu5CQtJiY
+ rKKipqeno6Skpp6eq5iYsY2Nu4mJvIiIuoiIuYmJtoiItoeHuIiIuomJvImJvYqKu5KSs5OTtJWVs52d
+ qqWlo6OjpKCgppiYsJGRuYyMvouLvouLu4mJuoaGuIaGuImJuoqKvYeHwoSExoODyIqKw5OTup+fr6en
+ paOjppWVrpKSsI+PsYmJuIKCwYCAw4GBwn9/wX5+woCAwIWFu4qKuIqKvY6OupSUtZ6erKWlpaWlpaSk
+ paSkpaSkpKSkpKWlpqamp6amp6ampqWlpaWlpaamp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaSk
+ paOjpKSkpaamp6amp6amp6amp6ampqWlpaWlpaampqamp6amp6ampqampaWlpaWlpaSkpKSkpKWlpaam
+ pqampqamp6amp6ampqWlpaSkpKOjpKOjpKSkpSAApaWlpaWlpqalpqanpqanpqanpqanpqanpqanpKSl
+ o6OkpaWmpqanpqanpaWmpaWlpaWlpKSlpKSlpKSlo6Oko6OkpKSlpaWlpaWlpqampqanpqanpaWmpKSl
+ pKSkpKSlpKSlpKSlpqalpqampKSlpKSlpaWlpqalpqanpqanpqanpqamo6OkpaWmpqanpqanpqanpqan
+ pqanpaWmpaWlpaWlpaWlpaWlo6OkoqKjoqKjo6Oko6Oko6OkoqKknZ2olpawj4+2i4u7iYnAgoLFg4PG
+ hITHhYXGjo69mpqwnZ2toqKlo6OioqKioqKioqKioaGhoqKgmpqokJC1iYm8hoa+goLFg4PEhITFhITG
+ hYXGiIjCjo67j4+6m5uto6OkpKSkpKSlpKSlpKSlo6OlpKShnZ2mkZG0jo62jo63jY22i4u8hobDgoLH
+ hITFhobCjo67mJivoaGkpaWio6Oko6Oko6Oko6Oko6OjoqKgnZ2kkZG1ioq/g4PFgoLGg4PFg4PFg4PG
+ hITGh4fDk5O3oaGpp6ejpaWlo6OjoqKioqKioqKin5+mk5OviYm6iYm6iIi6hITAgoLGg4PGhYXEi4u9
+ kJC3lpawnZ2ooaGioqKioKCfn5+foKCgoqKhoaGkmZmwjY29jIy/jY28jIy9iYnBhITFg4PEgoLCiIi6
+ lJSrnZ2fn5+dnp6en5+cmpqkk5Oxjo63j4+2jIy5i4u5iYm5hYW8goLBg4PCg4PEjIy/jo6+jY2+kJC7
+ lZW1oqKopaWlpqajoqKllZWxiYnAiYnAhITFg4PGgoLDgIDCgIDCg4O/jo6zkJC0kJC1lJSxmZmtnJyp
+ oaGhnJyolZWxkZG0jo63hYW/f3/Df3/Cf3/CgoLDh4fBjIy8i4u9jo66lpaznZ2roqKnpKSlpKSilJSx
+ kJC1kpK0k5O0k5O0jY25goLCgIDEgYHBhYW9i4u5ioq6jIy8i4u/kZG4nZ2qo6Oko6OioaGilZWtjIy2
+ i4u3ioq3iIi5iIi5h4e5h4e5iYm6iYm8ioq7kJCxlZWsnJyoo6OlpaWloqKonJyvkZG5jY27jIy4jIy3
+ i4u3h4e6hoa5iIi6iYm7iYm8iIi+iIi+h4fBjo64m5urpKSjo6OkpKSjoKCnk5O0jY27i4u7iYm7iYm6
+ hYW4hoa3h4e6hYXAg4PEhITEiYnAlZW1nZ2voKCspaWopqann5+qlJSviYm6goLCgIDEgYHCgYHCgIDC
+ gIDAhIS5iIi2i4u5j4+5lJS0l5ewnJyro6OnpaWlpaWlpaWlpaWlpKSko6OlpaWmpqanpqanpaWmpaWl
+ paWlpqampqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6OlpaWmpqanpqanpqanpqanpaWm
+ paWlpqampqampqanpqampaWlpaWlpaWlo6Oko6OlpaWlpaWlpqampqanpqanpaWmpKSlo6Oko6Oko6Ok
+ IAClpaWlpaWlpaWlpaampqempqempqempqempqempqakpKSjo6SlpaampqempqempqakpKSjo6Sjo6Sj
+ o6Sjo6Sjo6SkpKSlpaWlpaWlpaWmpqampqempqelpaajo6Sjo6Sjo6SkpKSmpqampqempqempqelpaWl
+ paWlpaampqempqempqelpaWlpaWlpaampqempqempqempqempqempqalpaWlpaWlpaWlpaWjo6SioqOi
+ oqOjo6Sjo6ScnKqXl7CPj7eLi7uHh7+CgsaDg8WDg8WCgsaLi76YmLGbm66cnK6jo6ejo6OioqKioqKi
+ oqKioqKhoaGdnaaRkbGFhb6CgsWEhMWDg8WEhMWEhMWHh8KOjruQkLmVlbShoaimpqSkpKWjo6SkpKWk
+ pKWkpKWkpKSbm6qQkLSRkbKNjbeJibyFhcODg8aEhMWFhcSLi72QkLeWlrCenqejo6Gjo6Sjo6Sjo6Sj
+ o6SkpKSfn6eUlK+IiL6Dg8WCgsaDg8WDg8WDg8WEhMSHh8GHh8OPj7qenqumpqSlpaWlpaWjo6OioqKj
+ o6GenqaSkrSLi7mJibqDg8CAgMWCgsSFhcOKiryQkLaTk7OYmK2fn6WioqKioqKhoaGfn5+goKCioqCg
+ oKOTk7OOjrqMjL2Li72IiMCDg8WDg8ODg8OJibuUlKydnaCfn52enp6enp6fn52cnKCWlqiSkrGQkLSK
+ irqKiruHh7+CgsOBgcKBgcOCgsWKisCNjb6SkrqXl7SWlrSbm6+jo6empqSioqeWlrKJib+Dg8aEhMWD
+ g8SBgcOBgcKCgr+IiLmIiLuIiLyNjbeUlLCXl66Xl66goKWcnKeUlK6MjLeFhb+AgMSAgMJ/f8F/f8GF
+ hb2MjLqLi7yLi72SkrWXl7CenqqkpKSkpKWlpaSWlrCRkbWSkrSSkrSPj7qDg8eBgcOBgcCGhruKireJ
+ ibmJibqKirqNjbuPj7qXl7Cjo6Ojo6Samq2SkrKQkLKRka+Pj7KJibmHh7mHh7mIiLqIiLqIiLuKiruQ
+ kLSPj7ORkbKZmayioqWlpaWfn6uYmLKWlrSUlLOOjraIiLyIiLqFhbiHh7mJibqHh76Dg8eDg8aDg8aL
+ i76YmK6ioqOjo6Sjo6SkpKOgoKaZma2Pj7aIiLyIiLqFhbiFhbiBgb6AgMKCgsKGhsCSkrWVlbOenqyj
+ o6ikpKimpqempqiXl7OGhsF/f8aBgcKBgcKBgcKAgMCFhbiIiLaIiLuKir2RkbeRkbiVlbScnKyjo6Wl
+ paWlpaWlpaWlpaWlpaWkpKWjo6SlpaampqempqelpaalpaWlpaWmpqempqempqelpaalpaWlpaWlpaWl
+ paWlpaWlpaWkpKWjo6Sjo6SmpqempqempqempqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWj
+ o6SkpKSlpaWlpaWmpqempqempqekpKWjo6Sjo6Sjo6QgAKWlpaWlpaWlpaWlpaWlpqamp6amp6amp6am
+ p6amp6ampqWlpaOjpKWlpqamp6amp6ampqWlpaOjpKOjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaampqam
+ p6amp6amp6OjpKOjpKOjpKSkpKWlpqamp6amp6amp6WlpqWlpaWlpqamp6amp6amp6WlpqWlpaWlpqam
+ p6amp6amp6amp6amp6ampqWlpaWlpaWlpaWlpaSkpKKio6Kio6OjpJiYr5CQuI2NvImJwYODxoKCxIKC
+ xIKCxoaGwI6OuJOTtpSUt5qasKOjp6WlpKOjpKKio6KioqKiop2dqJeXrpCQtYiIv4ODxoSExoSExoOD
+ x4eHwYyMuo+Pt5WVspubraKip6WlpKSkpaSkpaOjpKSkpaWlpKGhqZiYsZCQtY2NuIqKu4WFw4SExoSE
+ xoSExoWFxYSExYaGw5GRt56eqKOjoaKioqOjpKOjpKSko6Cgp5WVtIiIwYKCxYKCxYODxoSExoSExoWF
+ xYiIwYaGwoyMvZiYsKKipaWlpaWlpaWlpaWlpaOjo6KioaGho5mZrI2Nu4SEw4GBw4CAwoODwIyMuZCQ
+ tZSUsZSUsZiYrp+fpqKio6KioqKioqKioqCgoJ+fn5+fopmZqpOTsYyMuYaGwYODxYSExISExImJvpWV
+ r52dop+fnp6enp6enp6enp+fnZycopWVq46OtIqKu4qKu4uLuoaGwYGBxYGBw4GBwoGBw4mJvpGRt5WV
+ tZaWtJmZsZmZsZ+fq6WlpaOjppiYsYuLvoSExYODxYKCxICAwoGBv4WFuoaGvYiIvoqKvYqKvImJvImJ
+ vIyMu5qarJ2dqJKStIWFwoGBxoKCxIGBw39/w4ODu4iIt4qKu4qKu4uLu4uLvYmJwJGRt56eqaWlpKSk
+ pZ+fqpaWsZKStI2Nu4KCx4SExYGBw4SEuoeHt4iIuoiIuoiIuomJu4+PtZGRtJeXr6Ojo6OjpJWVs5KS
+ tZGRs5GRsY6Os4iIuoeHuYWFuIaGuIiIuoiIuomJuYqKu4qKu4iIvZCQtZ6ep6OjpKKip5ycrpeXs4+P
+ u4mJv4mJvIiIuoWFuIeHuISEvYGBxIODxISExYqKvY2NupiYr6Kio6Kio6OjpKOjpKSko6Cgp5SUs4mJ
+ vomJu4eHuoKCvoGBwICAwYODv4qKuoqKu4mJvpSUtKKiqKampaamp6WlqJmZtYqKwoKCxoGBxIGBw4GB
+ woWFuYeHuIiIuYeHvYKCxYKCxYKCx42NvZycrKWloqOjpKWlpaWlpaWlpaWlpaWlpaWlpaOjpKamp6am
+ p6amp6ampqWlpaWlpaWlpaWlpaSkpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKamp6amp6am
+ p6amp6amp6WlpaWlpaWlpaWlpaSkpaOjpKWlpaWlpaWlpaSkpKSkpKWlpaWlpaWlpaWlpaSkpKOjpKOj
+ pKOjpCAApaWlpaWlpaWlpaWlpaWlpaWlpqanpqanpqanpqanpqanpqanpaWlo6OkpaWmpqanpqanpqan
+ paWlo6Oko6Oko6Oko6Oko6Oko6OkpaWlpaWlpaWlpaWmpqanpqanpqanpKSlo6Oko6Oko6OkpaWlpqan
+ pqanpqanpqampaWlpaWlpaWlpaWlpaWlpKSko6OkpaWlpqanpqanpqanpqanpqanpqanpaWlpaWlpaWl
+ paWlpKSkoqKjoKCkm5uskZG3iIjChITGhITGhITFg4PFgoLFh4e+jIy5jo65kpK2n5+qpKSlpaWlpaWl
+ o6OkoqKjoKCkmpqrl5evkJC2hobAhITIhYXHhITIiorBjo67kJC3lpaxmZmsoKCnpKSlpKSlpKSlpKSl
+ pKSlo6OkoqKmnZ2slZW0jo67i4u9iYm8ioq8h4fChITGhYXFhYXFh4fCkpK2m5uqoKCko6OjoqKjoqKi
+ o6OjoaGlmJivi4u+g4PHhITGgoLFgYHEgoLFhYXGhobEhobEhITGjo65nZ2qpqakpKSlpKSlpaWlpaWl
+ pqakoqKll5esi4u6hITCgoLEgYHFhYXBjIy3kpKxlZWvlJSvmZmtn5+mo6OioqKjoqKjoqKioqKioqKh
+ n5+il5eokZGwi4u4iYm6ioq8i4u9i4u9i4u8ioq9kpKzmpqonp6hn5+enp6enp6en5+dl5eojIy2iIi6
+ iYm5ioq4hITAgYHDgYHDgIDCgYHBh4e7j4+zk5OzlJS1lJS2lZW2mJiyn5+rpaWlo6OmmJiyi4vAhITG
+ goLGgYHDgoK+hIS6hIS6hoa9jIy8h4fChITFhYXEhYXEhobAlJSxmJiujY26g4PFgYHGgYHFgYHFhoa9
+ h4e3h4e3iYm4ioq7hITDhITEhITFiIjBk5O0n5+opKSlpaWkm5uujIy9g4PGhITGg4PFh4e8hoa4hoa4
+ h4e5iIi6iYm6j4+1kJC1lJSwnJyopKSjo6Okm5utmpqul5exjo63iYm6h4e5hYW4hYW4hYW5h4e5iIi5
+ iYm5ioq6ioq7ioq8k5Oxnp6joqKioaGlnZ2tkZG6i4vAjIy/i4u+iYm7iIi4hIS9gYHBgYHEhITEiYm8
+ j4+4kZG2lpavnp6no6OioqKjo6OjoKCmlZW0i4u/ioq+ioq9g4PCgYHBgIDCg4O+iIi5ioq7ioq7jY22
+ lpavoKCopaWkpaWmp6emmZm0j4+/i4vAiYm8iIi7hoa6hoa3h4e3hYW9g4PEhITFhITFg4PHiYnBlZWz
+ oKCnpKSjo6OkpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Ok
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6OkpaWmpqanpqanpqanpqanpaWlpaWlpaWlpaWlpaWlo6Ok
+ paWlpaWlpaWlpKSlo6Oko6Oko6Oko6OkoqKjoqKjo6Oko6OkIACjo6SlpaWlpaWlpaWlpaWlpaWlpaWm
+ pqempqempqempqempqempqekpKWjo6SkpKWmpqempqempqelpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6SkpKWl
+ paWlpaWlpaWmpqempqempqekpKWjo6Sjo6Sjo6SlpaWmpqempqempqempqalpaWlpaWlpaWlpaWkpKWj
+ o6Sjo6SlpaWmpqempqempqempqempqempqelpaWlpaWlpaWlpaWioqaamquWlrGKir+EhMeEhMaEhMaD
+ g8WEhMSEhMSDg8SFhcKMjLqXl62ioqalpaWlpaWlpaWlpaWjo6aamq2YmK2Xl66YmK2UlLKKisCFhcaF
+ hceGhsaGhsWJicCVlbOfn6aioqOjo6OkpKWkpKWkpKWkpKWlpaOdnayVlbWPj7uMjL6MjL6Li7yHh8GE
+ hMWEhMaEhMWJicCTk7aamq2goKWioqKioqOioqOioqOioqKhoaSYmK+Li7+Dg8eDg8eDg8aBgcWCgsOF
+ hcKGhsWEhMaOjruXl7Gfn6ekpKOkpKWkpKWkpKWlpaSjo6eamrCMjL2EhMOCgsWDg8WDg8WEhMSFhcOE
+ hMCKirmRkbKYmKyfn6Wjo6GioqOioqOioqOioqKjo6GhoaKXl6mKiriJibqLi7mJib+GhsSGhsOGhsSJ
+ ib+SkrSZmamenqKgoJ+fn5+enp6enp2ZmaSSkq6OjrSJibmEhMCBgcOBgcOAgMKBgb+FhbeHh7eKiraM
+ jLuQkLqVlbSUlLWWlrWdna6kpKampqSgoKiXl7GRkbiQkLWIiLuEhL2EhLqFhbqIiLiFhcGFhcWFhcaF
+ hcaIiMOLi7+SkrSbm6qTk7OJib+Jib+Jib+IiL+Pj7SMjLSIiLiHh7mDg8GCgsSCgsWCgsWDg8aKir+Y
+ mK+ioqWlpaOZma+MjL6IiMKJib+Jib2IiLqGhrmGhrmHh7qJibmQkLWRkbaXl7Cbm6ubm6mdnaekpKSh
+ oaaioqSbm6yOjrmIiLyIiLqGhrmFhbiFhbeHh7iIiLqJibuKiruKiruIiL2QkLOenqSjo6GioqKenqmR
+ kbmLi7+MjL2Li72KirqDg76AgMGAgMKDg8CIiLuKirqMjLqNjbuPj7iYmK+ioqOioqOjo6KenqiVlbOQ
+ kLmRkbaSkrSRkbSJibmFhbyHh7qKiriKirmLi7qQkLSSkrKWlq6fn6ilpaWlpaWdnbCVlbiQkL2Njb6L
+ i7yJibmIiLeDg7yAgMGBgcKCgsSDg8aJicCKir6QkLmdna2np6OlpaWjo6SkpKWlpaWlpaWlpaWlpaWl
+ paWkpKSjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sj
+ o6SlpaampqempqempqempqelpaalpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SioqOi
+ oqKioqKjo6QgAKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpqamp6amp6amp6amp6amp6ampqWlpKSkpKWl
+ pqamp6enqKamp6WlpqOjpKOjpKOjpKKioqOjpKSkpKWlpaWlpaWlpaWlpqWlpqampqWlpqOjpKOjpKOj
+ pKSkpKampaamp6amp6amp6ampqWlpaWlpaWlpaWlpaSkpaOjpKSkpKampqamp6amp6amp6amp6amp6Wl
+ paWlpaWlpaampKSkppaWs4uLvYWFxYSExoSExYSExYODxYSExISExYSExIeHwJCQtJycpaGhoqSkpKWl
+ paWlpaWlpaSkppubrpqaq5ubqZeXro2NuYaGwoSExoWFx4SEyIODyoeHxJSUtKGhpaKio6Kio6Kio6Oj
+ pKSkpaSkpaOjppycrZGRuYuLv4yMvo2NvYiIwoWFxYODx4SExYeHwYqKvpWVs5ubq6GhpaOjoqKio6Ki
+ o6Kio6Kiop+fpZWVsoqKv4mJwImJwIiIwoWFwoODwIODwIaGwpCQupiYr56eqKKipaOjpKOjpKSkpaSk
+ paamo5+fqpCQu4SEyIODyISExYSExYSExYODxoODxoaGvoeHvY6OtpqaqaGhoaGhoaKioqKio6Kio6Oj
+ oqKio5qaqpCQtYmJu4mJuIeHvYSEw4ODxoSEx4iIwY6OupWVsJ2dpqGhoaGhoaCgoJ+fn5+fnZuboJOT
+ q4qKuIODwICAxICAw4CAwX9/wX9/wYGBvYaGtoaGuYyMuJKStZSUtJSUtpSUt5SUtp6eq6ampKOjppyc
+ rJWVs4+PuYmJvIWFvYWFuoaGt4ODvYGBwoODxIWFxImJwoyMv4yMvo+PupubqpycqJOTs4+PuJCQtpCQ
+ tI6OtoyMt4eHuoKCwICAw4GBxIKCxIKCxYSExYyMvZmZrqGhpaSkop2drJSUtpKSuJGRtouLvImJvIeH
+ u4WFuoiIt46OspOTspSUs5iYsJiYsJWVspiYraCgpaOjpKKipZeXsoyMvYmJvYiIu4iIuoeHuIWFtoWF
+ t4iIuoqKu4uLvIuLvYyMuZOTspubqqCgoqGhoZ2dp5CQuImJwIyMvYyMvYaGwoGBw39/w4CAv4WFuoqK
+ uYqKuYqKvIqKvomJv5CQt52dqKKio6Kio6GhpaCgp56eqpqarpWVso+Pt4mJuIeHtoaGuYSEv4SEv4SE
+ wIuLupCQtJKSsZiYraCgpqWlpqKiqpmZtJCQvoyMwYyMvouLu4WFvoGBwYCAwYGBwoKCxImJwI2NvI2N
+ vY2NvpaWtaOjp6ampaSkpaSkpKSkpKSkpKSkpKWlpaWlpaSkpaOjpKOjpKSkpKWlpaWlpaWlpaWlpaWl
+ paWlpaSkpaSkpKWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKWlpqamp6amp6amp6ampqampaWlpaWl
+ paWlpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjoqKioqKioyAAo6Oko6Oko6OlpaWlpaWlpaWl
+ paWlpaWlpqampqanpqanpqanpqanpqanpqanpaWlpKSkpKSmpKSlpKSlpKSlpKSlo6Oko6OjoaGho6Oj
+ o6Oko6OlpKSlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6OkpKSkpaWlpqanpqanpqanpaWmpaWlpaWl
+ paWlpaWlpKSko6OkpKSkpaWlpqanpqanpqanpqanpaWmpaWlpaWlpaWloKCrkpK5hYXFg4PGhITFhITF
+ hITFhYXFhITGhYXFiYm/kJC2mJiroKCgoaGhoqKio6OkpaWlpaWlo6OmoKCpnZ2ql5evjY26hITEgoLG
+ g4PGhYXHhYXHhITJiYnEl5ezoqKloqKjoqKjoqKjo6OkpKSlpKSlnZ2sl5eyj4+5i4u9ioq/iIjChITH
+ g4PHhITEh4fBi4u9kZG2mJiunp6ooqKlo6OjoqKjoqKjoqKjnp6nlZWwjIy6ioq/jIy9iYnBiIjDhYXD
+ goLDgoLCh4e8lJSxnJysoqKmpKSjo6OkoqKjo6OkpaWlpKSmm5uvj4+8iYnDiorChYXGhITFg4PGhITF
+ iIi/i4u8jIy6j4+1nJymoqKfoaGhoqKhoqKjoqKjoaGkmpqrkJC2i4u9i4u7hoa9goLBgYHEg4PEiYnA
+ kZG4mJiynZ2qoaGjoqKgoaGhoaGhoKCfnp6fmJimjIy1goLCgIDEgYHDgIDBf3/Bfn7Cfn7BgYG8hIS4
+ iYmzjY20j4+3j4+6jo67j4+8jIy/mJiypaWlo6OnmJiyjY27iIjBh4fBiIi9h4e7g4O9f3/CgIDBgYHC
+ hITDh4fDiorAjIy+jY2+lpaxnJynmZmrk5Ozk5OzkZG1jY26iIi9goLAf3/CgIDCgYHEg4PEgYHHh4fA
+ k5Oym5uqnZ2ooqKjo6OkmpqukpK4j4+7i4u+ioq/jIy6i4u0ioqxjIy0ioq7jIy8ioq/j4+7lZWzlpaw
+ mZmsoqKin5+nkpK3iorAjIy+ioq8iYm7h4e4hYW2hYW3iIi6ioq7i4u9i4u9kJC3lJS0lZWxm5uooaGh
+ n5+jk5OyjY25jo64ioq9hobChIS/goK+hIS6h4e3iIi4iIi6iIi9iYm/iIjBjo65nJypoqKjoqKjo6Oi
+ o6Ojn5+nmJivj4+5iYm9iYm5hoa5gYG+gIDDgIDDgYHDh4e9jY23jo61j4+0lpatoqKkpqakmpqykZG7
+ kJC8jY2/iYnChITFgYHDgIDCgYHBhoa9jIy6iYnAiYnCh4fFi4u/mpqvpKSmpaWlpKSko6Oko6Oko6Ok
+ pKSlpaWlpaWlpaWko6Oko6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpKSkpKSkpKSlpKSlpKSlpaWlpaWl
+ paWlpKSko6Oko6OlpaWmpqanpqanpqanpqanpqampaWlpaWlpaWlpKSkpKSkpKSkpKSkpKSko6Oko6Ok
+ o6Oko6OkoqKjoqKiIACkpKSjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWmpqampqampqempqempqem
+ pqelpaWjo6SioqKioqKjo6Ojo6Sjo6Sjo6SioqOioqKjo6Ojo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWl
+ paWkpKSjo6Sjo6Sjo6SlpaWmpqampqempqelpaalpaWlpaWlpaWlpaWkpKSjo6Sjo6SlpaWmpqempqem
+ pqempqelpaampqSioqeXl7SLi8GGhsaEhMaEhMWEhMWFhcaFhcaHh8aKir+RkbeZma2goKShoaGhoaGh
+ oaGhoaKjo6Sjo6ehoaigoKmYmLKNjb6EhMWCgsaDg8WDg8WDg8aEhMiHh8WQkLudna6lpaWkpKSioqOi
+ oqOioqOjo6Sjo6Wamq+SkreRkbiSkreNjbyGhsOHh8GHh8KJicCMjLuRkbaXl66cnKiioqSjo6Ojo6Sj
+ o6SioqOioqScnKqOjrmJib6Li72IiMGDg8eDg8aBgcaCgsaGhr+NjbSRka2bm6mioqWkpKSjo6Sjo6Si
+ oqOjo6SdnauVlbORkbiPj7uKisGFhceEhMaFhcSJib+Li7yMjLuRkbOXl6yenqOhoZ+hoaGhoaGioqKi
+ oqKamqqQkLeLi72Li72JicCEhMWCgsWCgsGGhr2MjLeSkrWXl7GhoaakpKKhoaKhoaGhoaGgoKKXl6qO
+ jrSHh72CgsGBgcKBgcKAgMF/f8J/f8GCgryGhrWIiLKLi7CKireJib6Kir6Jib6Kir+JicCTk7ehoamk
+ pKaYmLKKisCKir+MjL6Li72GhsCAgMSAgMGAgMGAgMKBgcSCgsaEhMaMjL2QkLmVlbSbm6yamqyTk7KS
+ krSMjLyJib6Dg8J/f8N/f8GBgcKCgsOCgsWEhMWKiryUlLCZmayamqugoKWlpaGdnaqTk7aQkLqPj7uO
+ jruRkbWQkLCJibSDg79/f8Z/f8eBgciLi7+UlLaTk7aUlLOgoKKhoaOXl7GNjbuMjLyMjLyLi7qIiLiG
+ hriGhriHh7mJibqLi7yKir6Li72Li72OjrqXl66hoaKkpJ6Xl6qPj7ONjbaJibuJibqIiLiHh7eGhreG
+ hreGhrmGhryGhr2IiL2MjL2Tk7OenqWioqGioqOjo6Kfn6aWlrCOjrqKir6KirqIiLuCgr9/f8KAgMGB
+ gcCGhr+JibyLi7uKir2NjbmWlq6hoaOmpqGbm6+Tk7iSkrmNjb+EhMmEhMeCgsSBgcGFhbyJibeIiL6E
+ hMWCgsmFhceKisGTk7ienqykpKalpaWlpaSkpKSjo6Sjo6SkpKWlpaWlpaWlpaWkpKSjo6SkpKWlpaWl
+ paWlpaWlpaalpaampqakpKSjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWjo6Sjo6Slpaalpaalpaalpaal
+ paalpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6SioqMgAKWlpaOjpKOjpKOjpKSk
+ pKWlpaWlpaWlpaWlpaWlpaWlpaWlpaamp6amp6amp6amp6ampqWlpaOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKKioqKioqOjo6OjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKOjpKSkpKWlpqamp6amp6am
+ p6WlpqWlpaWlpaWlpaWlpaOjpKOjpKSkpKampqamp6amp6amp6amp6enpaGhqZKSuIiIw4aGw4SExISE
+ xYWFxoWFxoaGxYyMwJGRuZeXsJ+fpqOjoaGhoaGhoaGhoaGhoaCgop+fpp+fqpiYs46OvoaGxoODx4OD
+ xYODxYODxYKCxYWFw5GRuZ6eraKiqKWlpaSkpaOjpKKio6Kio6Kio6CgppqarpaWtJWVtZWVtJKSt4yM
+ vIqKvYuLvYqKvo2NupSUspeXr52dqKGho6Ojo6OjpKOjpKOjpKGhpZ6eqJKStoyMvImJv4KCx4ODxYKC
+ xYKCxYeHv4+PtpWVrpeXpp2dnqGhoaOjpKOjpKOjpKOjpJycqZeXsZGRuI2NvYmJwoODx4SExYODxoeH
+ wYuLvY2Nu5OTtJmZrJ6epKGhoaGhoKCgoKGhoaGhoZ6eppKStIuLvYyMvomJwIODxoSExoODxIeHvYuL
+ touLto2Nt5OTs5+fp6Sko6Ojo6KioqCgopiYq4+PtoqKu4mJuoeHu4CAwYCAwX9/wX9/wYKCvIeHtYeH
+ s4uLroaGtYeHuomJu4mJvIqKvYqKvY2Nu5KStp6eq6amo6CgqZWVtZWVtZWVs42NvYSEx4KCxICAwoCA
+ wYCAwoCAxIGBxoWFwo+PuJWVspqarp6eq5qarZOTspGRsouLuoODw4CAxICAwX9/wYCAwYGBwoGBxIeH
+ wIqKvouLu5WVsJ2dqKKio6Ojop+fp5ubrZubrpSUtJWVtJOTs4uLt4KCv39/xYGBxYKCxYmJvoyMvIyM
+ vo6OvJWVtKGhpqSkn5ycp5GRtoyMvI2Nu4yMuYmJuYeHuYeHuYeHuYiIuYmJu4WFw4SExoODxoeHwZWV
+ saCgpKOjn5iYqoyMuIiIvYmJvIiIuoeHuYeHuIeHt4WFuISEu4aGvIeHvImJu46Ot5OTspqarKGho6Ki
+ oqOjoqCgpJaWsIqKvouLvYqKvIODwYCAw4CAwYCAv4SEvIiIuYuLvIyMvYuLvpCQuZycqqCgoqOjoJub
+ qpGRtoyMu4qKvIaGwoSEwoKCwoWFvIiIt4WFvIKCxoKCxYWFxo2Nv5OTt5OTt5eXs6SkpqampKWlpaSk
+ paOjpKOjpKOjpKSkpaWlpaWlpaWlpaOjpKOjpKWlpaWlpaWlpqamp6amp6amp6WlpaSkpKOjpKOjpKOj
+ pKWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paSkpKOjpKOjpKOjpKOjpCAApaWlpaWlpKSko6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqan
+ pqanpqanpqanpqanpaWlo6Oko6OkpKSlpaWlpaWlpaWlo6Oko6OkoqKjoqKio6OkpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlo6Oko6Oko6Oko6OkpaWlpqanpqanpqanpqampaWlpaWlpaWlpaWlpKSko6OkpKSk
+ paWlpqanpqanpqanp6emo6OompqvlZW2jY28hobDg4PGhITFhobEjIzAkpK5lJS3mZmyoKCoo6OioqKj
+ oaGhoaGhoaGhoKChnJyml5eyjY29hobFhITHg4PGg4PFg4PFg4PFg4PEjo63mpqsoaGnpqalpaWlpaWl
+ pKSlpKSlo6OjoaGkmZmtlJSzlZW1lZW0kZG4jIy+i4u9hYXEhITFhITFhYXFi4u9mJitoaGkoqKjoqKj
+ oqKjo6Oko6OkoaGlnZ2pkpK1iIjBg4PGg4PFg4PFgYHFhYW+jo62lZWvmpqonJylnZ2enp6doaGio6Ol
+ o6Oko6OkmJivkJC3jY28iYnBhITHhYXGg4PFhITGg4PIiYnBlJS0mpqsnp6moqKjoqKhoaGhoaGhoKCg
+ oaGgmJirkJC2jY27iYnAhITFhYXEhITFiIi9jIy4jIy4jIy1k5OsmZmmoaGkpKSko6OkoqKknJyoj4+3
+ i4u8i4u7h4e+gYHEgIDBgIDBfn7Cg4O7hoa1iIizjIythoa2hYW3hoa5iIi7iYm7iYm8jIy7kpK2mJiw
+ n5+ppKSlpKSmnZ2snp6smJixkZG5iYnAgYHEgIDCf3/CgIDDgYHFhYXDjY27kpK0k5O2lZW0nJysnJyr
+ lJS1jIy6iYm8g4PCgYHDgYHBgIDBf3/BgYHCgoLDg4PFgoLGh4fBlZWyoaGjoqKio6Oin5+ml5evkZG1
+ kpK0k5OzjIy5g4PBf3/Df3/CgYHDiIi9ioq7ioq7jo64lpazmJixnp6ro6Ojm5upkJC2jIy7jY26i4u9
+ ioq8iYm6h4e4hoa3iIi5goLAgoLEhITFg4PGhobDkJC3nJypoqKin5+jkZGyh4e+iYm8iYm8iYm5iYm5
+ hoa5hYW6hYW8iIi+ioq7ioq7iYm8iYm9j4+4nJyooqKjoqKio6OhnZ2pkJC3ioq+hITEgoLDgYHCgYHA
+ goK7hYW3iIi5iYm6ioq8i4u+jo67lZWzm5usoaGinp6jl5eskZGxkJCxkJCwiYm3h4e5h4e2hIS6gYHD
+ goLEg4PFjIy7kZG4kpK4lZW1lZW1o6OnpqakpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6Ok
+ o6OkpKSlpaWlpaWmpqanpqanpqanpqampKSloqKjoqKio6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Ok
+ o6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6Oko6OkIACjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6SlpaWlpaWlpaWkpKWjo6SlpaWlpaWmpqampqempqempqempqelpaWlpaWlpaWlpaWl
+ paWlpaWlpaWkpKSjo6SioqOioqKlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sl
+ paWmpqempqempqempqalpaWlpaWlpaWlpaWkpKWjo6Sjo6SlpaWlpaWlpaWkpKaenqqXl7GRkbiGhsOE
+ hMWDg8aHh8ONjb2MjL2MjL6RkbqenqympqSkpKSioqOioqOhoaGioqCfn6OWlq2Li7yEhMWDg8WDg8WD
+ g8WEhMWEhMWFhcOIiL6KiryUlLCgoKWlpaWlpaWlpaWlpaWlpaWkpKSgoKaTk7OTk7OUlLOQkLiMjL2L
+ i7+FhcWEhMaEhMaFhcSJicCRkbadnaeioqKioqOioqOioqOjo6Ojo6WenqqTk7aIiMGDg8WDg8WDg8WC
+ gsSBgcaHh7+OjreTk7GWlqycnKWhoaKenp6dnZ2hoaGjo6Wfn6iZma+Pj7qLi72IiMCDg8aDg8WDg8WC
+ gseHh8KKir+QkLmdnamioqSioqKioqKioqKhoaGhoaGenqKXl6qRkbOOjrePj7eOjreRkbSNjbiMjLmL
+ i7mNjbaTk62YmKadnaCgoKCioqOkpKShoaaXl7CPj7iMjLuHh8GDg8WCgsSBgcKBgcKDg7uJibGNjauL
+ i6+GhreFhbeFhbiFhbmGhrqHh7qKiriQkLOUlLSVlbSZma+hoaekpKWdnauYmLGRkbmJicGDg8aBgcSA
+ gMN/f8J/f8SFhcCLi7uLi72MjLyLi76SkrWcnKuenqqVlbSIiMKDg8WCgsWBgcOBgcGAgMF/f8GAgMGB
+ gcKBgcOCgsWGhsSOjrqamquhoaSjo6Kfn6aWlq+RkbaSkrSOjrqGhsOBgcWAgMSBgcKHh7uKirqKiryO
+ jreUlLCXl6+amrCZmbGjo6efn6mTk7ONjbmLi7yLi7yLi7yKiruIiLeEhLiAgMGAgMKAgMSCgsWGhsOJ
+ icGKisCXl7ChoaSkpJ+ZmaqOjrWQkLORkbKMjLiHh72FhbyEhLqFhbqIiLmFhcKEhMODg8SFhcKQkLac
+ nKiioqOioqKjo6CenqePj7iDg8aEhMWCgsSCgsGEhLuFhbaFhbeIiLmKirqHh8CEhMOFhcOIiMKUlLOh
+ oaejo6CdnaSVlayQkLKQkLGOjrCJibOCgrt/f8GAgMKAgMSKiriPj7aSkraUlLWXl7SamrChoamlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6SioqKioqOkpKWlpaWlpaWmpqempqempqempqak
+ pKWjo6SioqKjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWkpKWjo6Sjo6QgAKOjpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKWlpaWlpaampqamp6amp6amp6amp6WlpqWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjo6Ojo6OjpKWlpaWl
+ paWlpaWlpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKWlpqWlpaWlpaWlpqWlpaWlpaWlpaWlpaWl
+ paSkpaOjpKOjpKOjpKKipZ6eqpeXsI2Nt4aGwoODxYSExYODxYaGwYyMuoyMvYyMvZGRup+frKeno6Wl
+ paOjpaKio6Ojo6Cgo5eXrIuLuoODw4KCxIODxoSExYSExISExIWFxIqKv4qKvZGRtJubp6KioKOjoqWl
+ paWlpaWlpaampaOjppycq5SUspWVsZWVsZCQt4mJv4WFxISExoSExoaGxImJwJCQt5qaq6KioqKioqKi
+ oqKio6Kio6GhpJycqZKSt4iIwoSExoODxoODxYODxYCAxIaGvYuLuYyMuY6Ot5WVr6CgoqGhoaGhoZ6e
+ np6enaCgoaCgqJqarpCQuImJwYWFxIODxYODxYKCxoeHwYuLvIuLvo6Ou52dqqOjpaOjo6KioqKioqKi
+ oaCgopiYqpCQso6Oto6OtpCQtJGRtI+Pto6Ot42NuI+PtZKSsZSUr5iYp52dn5+fnqGhoKOjo52dqpGR
+ uI6OuoiIwYSExYODxYKCxYGBw4aGu4iIt4mJtIiIs4aGtYWFt4WFuIWFuIWFuIWFuIeHuIqKuImJvIuL
+ v4qKwZCQuZ2dq6SkpZ2dq5GRuYiIwoSExoODxoKCxYCAw319w4KCvIiIuIqKuoqKvYuLvpGRuZiYsKGh
+ pqOjpZycrpKSt4qKwIODxYGBxYGBw4GBwoCAwYCAwYGBwoGBxIKCxIODxYWFxI6Oupqaq6Gho6Kio56e
+ p5eXr42NuYWFwoKCxoCAx4GBwoaGuoiIuIiIuo+PtZCQtY6OuI6Ot46OuJOTtqGhqaOjpZqarZGRtYqK
+ vYmJu4qKuouLuIeHuoCAwH9/wYCAwoCAxIWFw4mJwomJwY2Nu5ubrKKipaWloJqaqpGRtJGRsoyMuYqK
+ u4mJvIeHuYeHtoaGuIODv4GBwoGBxoaGwo2NuZOTsZubqKKioqOjoaOjoJ6ep4+Pt4ODxYSEw4SEw4aG
+ voeHuIWFt4WFt4iIuIeHvYWFwYWFw4aGxIqKvpmZr6OjpaWlop6epZSUrY+PtJCQspCQsIaGvH5+xH19
+ xIGBwYqKt4qKuIqKuYyMu4yMvI+Pupubr6KiqaWlpqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSk
+ paOjpKOjo6KioqOjo6SkpKWlpaWlpaamp6amp6amp6WlpqOjpKOjo6KioqOjo6OjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaampqamp6amp6SkpaOjpCAApKSlpKSk
+ paWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWmpaWmpqanpqanpqanpqampqal
+ paWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6OkpKSlpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6Ok
+ o6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6OkpKSjnZ2plpaykZG3i4u7goLD
+ hITDhITEhobBiYm8jIy7jY26kZG3l5ewoaGopqakpaWlpaWlo6OkpKShnJypjY26goLGgoLFgoLEh4e/
+ iYm+iYm/iYm/iYm/jIy7k5OznZ2ooqKhoaGgoaGhoqKipaWlpaWlpqakpKSlnJyslpazlpaykZG0ioq9
+ hITFgoLGhITGhITGg4PHioq/mZmvo6OjoqKioqKioqKioqKio6OhoaGllpaxiIjBg4PGg4PGhITEgoLF
+ goLEh4e9ioq5i4u3ioq6jo63mZmpoaGhoaGhoaGhoKCgnp6enZ2em5uokpK1ioq/hITFg4PGgoLFgYHG
+ h4fBi4u9ioq9jY26mZmuoqKmo6Oko6OkoqKkoqKioqKin5+ll5erkZGyj4+zjo63jY26jY25i4u8jIy7
+ i4u6i4u5jY23kpKwnp6jn5+fnp6en5+eoKCgnJyqjo67h4fDg4PHg4PHg4PGhITEh4e9iIi7iIi6hoa7
+ hYW6hYW3hYW3hYW4hYW3hoa3hoa2hYW4hITBhITFhITHiIjFk5O4oKCqpKSkoaGnlJS1hobEgYHKgoLI
+ gYHGf3/EgoK8hYW2h4e3iIi6ioq7kpK3lpa0l5exm5usoKCnoaGnm5utkpK3iorAiIjAhYW/gIDCgIDB
+ gIDBgYHDgYHDgIDEgoLDiIi+ioq+k5O0np6npaWgoKClkpK0hITDgYHHgYHHg4PEhoa9iIi5h4e5jo6y
+ jIy6h4fBhITDhITDiYm/l5exo6OmpqakoaGomZmukJC1j4+1jY23h4e8gYHBfn7Cf3/Bf3/CgoLAhobA
+ ioq/i4u+jY28nJyso6Okpqahm5uqj4+3jIy6iYm8iIi8jY21i4uzhYW3gYG9gIDCgIDChYW+i4u6jY24
+ jY22kZGznZ2moqKio6Ohn5+mlZWyjY26jo65iYm8iIi7iIi4hoa2hoa3g4O9goLCgoLDgoLFh4fCk5O2
+ nJyrn5+ooqKloqKknJyolZWtlpaslparjY2zh4e4h4e3h4e2ioq2iYm6ioq7iYm8ioq8kZG3lpaznZ2s
+ o6OmpqakpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6OjoqKioqKjpKSlpaWlpaWmpqan
+ pqanpqanpaWmo6Oko6OjoqKjoqKko6Oko6OkpKSlpKSlpKSlpKSlo6Oko6Oko6Oko6OkpKSkpaWlpaWl
+ paWlpaWlpaWlpaWmpqanpqanpqanpaWmIAClpaWkpKSkpKSkpKSlpaWlpaWkpKSioqOioqOioqOjo6Sj
+ o6Sjo6Sjo6SkpKWlpaWlpaWmpqampqempqempqempqelpaalpaWlpaWlpaWlpaWlpaWlpaWkpKakpKWk
+ pKWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6SioqSioqOjo6Ojo6Sjo6SkpKWkpKWkpKWkpKWkpKWlpaWl
+ paWlpaWlpaWlpaWkpKSlpaKbm62SkreMjL6Hh8GDg8KEhMOGhsGKir2MjLqMjLqOjriXl66enqejo6Sl
+ paWlpaWlpaWlpaWjo6SZma2MjLyFhcSGhsCGhsCLi7yNjbuNjbyNjbyNjbuRkbWamqyioqOjo6ChoaGh
+ oaGhoaGjo6OlpaSlpaWgoKqZmbCWlrKPj7WIiL2CgsSBgcWCgsWDg8aDg8eIiMORkbienqqlpaKioqSi
+ oqKioqKioqKioqKcnKmPj7iFhcSEhMWEhMWDg8WEhMSIiMCJib+Hh7+Dg8CHh7yTk7CgoKKhoaGhoaGh
+ oaGioqGgoKGZmaSOjrGFhb2CgsSCgsaCgsaDg8WGhsGMjLyLi72Pj7iZmayioqKjo6Kjo6Sjo6SioqSi
+ oqOioqKenqaZmaqUlLCOjraLi7uJib+Jib6Li72Li72Kir2KiruOjrWWlquhoZ+goKCfn6Cfn52dnZ6Y
+ mKiRkbeJicGIiMOIiMGIiMGIiMCKiruHh72Ghr6Hh7uHh7iGhriFhbiFhbeGhraGhrWFhbeDg7+CgseE
+ hMiHh8WKisGWlrahoamlpaSlpaScnK2MjL6FhcWGhsOGhsGEhL+IiLiGhraFhbiJibeNjbaRkbiQkLmQ
+ kLmQkLmWlrGenqidnaqbm66UlLWNjb2FhcKAgMOAgMGAgMGBgcGAgMOCgsKHh7yLi7iLi7mPj7adnaim
+ pp+enqiQkLiGhsKHh8KGhsOLi72OjrWMjLOLi7KLi7eDg8KAgMiDg8aIiMCQkLiZma+fn6mkpKWjo6ac
+ nKyXl7CVlbCKiruCgsN/f8N/f8F/f8GCgr+Fhb2IiL6Li7+NjbyRkbiYmLCfn6ikpKOenqmTk7SMjLuN
+ jbmOjreOjrSJibeBgb5/f8GAgMGAgMGFhb2Ghr6Ghr+JibyLi7qWlq+goKWjo6ChoaSbm6qWlq+WlrCO
+ jriJibuIiLiGhreBgb1/f8KAgMKBgcOAgMeGhsOVlbKdnaqdnaqhoaalpaKhoaWZmauamqibm6aUlKyP
+ j6+MjK+IiLSIiLmKiruKiryMjLmQkLSTk7KRkbaYmLCioqempqSlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWkpKSjo6SioqSioqOioqOkpKWlpaWmpqampqempqempqekpKWjo6SioqOioqOioqOjo6Sk
+ pKWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6WkpKWlpaWlpaWlpaWlpaWmpqWmpqempqempqcgAKWl
+ paWlpaSkpKSkpKSkpaWlpaWlpaOjo6KioqKio6OjpKOjpKOjpKOjpKOjpKSkpaSkpaSkpKampqamp6am
+ p6amp6amp6WlpqWlpaWlpaWlpaWlpaWlpqamp6amp6amp6WlpqWlpaWlpaWlpaWlpaWlpaSkpKOjpKKi
+ o6KioqKioqOjo6Ojo6OjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaampaSkpJeXsY2NvYeHwoKC
+ xIODwoWFv4eHvYmJvomJv4iIv4yMupiYqqCgo6Ojo6OjpaSkpaWlpaampJycrZaWs5KSto2NuouLu4uL
+ u4yMvIuLv4qKwIqKwYuLwJOTtpqarKGhpKOjoaKioqGhoaGhoaGhoaOjoZ+fqJeXsJSUs5OTr4mJuIKC
+ woCAxYKCxIODxYODxYmJwJOTtZycq6GhpqSkpKOjpKKio6KioqOjoZ+fpZSUsoiIwoODxoSExoSExoaG
+ xIqKwIuLwISExoKCx4ODw4yMtpmZpqKinqGhoaGhoaGhoaKioJ6epJKSsYWFv4CAw4CAxIODw4SEw4aG
+ woyMvIuLvYyMvJWVsKCgo6OjoKKioqOjo6OjpKOjpKOjpKGhpJycqJeXro+PtomJvIiIv4mJvomJvouL
+ vYuLvYqKvo6OuZWVrp2do6CgoKCgoKCgoJ+fn5qaopKSqo+Ps42NuYyMu42NvI2NvIqKvomJwIeHvoeH
+ vYyMtY2Ns4mJtomJtImJs4eHtYSEuIGBv4CAxoSExoiIxI2NvouLv5OTt6KiqqampaSkpaGhp5eXspGR
+ uo+Pu4uLvIqKuoiIuYaGt4aGuIqKt42NtoqKvoiIwYiIwYaGw4yMvJqarZ+fqJ6eqpaWsomJwYKCyIOD
+ xIGBwn9/wX9/woKCwIaGvYiIvIeHvoeHvoyMuZmZq6OjoZ+fppSUso+PuY6OuI6OuZGRtZSUsJGRrYmJ
+ s4CAw39/xYODw4eHwYuLvY+PuI6OupWVs6CgqKSkpJ6eqpSUtI6OuYSExICAxYGBwoCAwIGBvoWFvIaG
+ vYuLvI6OvI+PupOTtZOTtpiYsKGhpqOjpZ2dq5iYrZaWr5KSs4qKu4KCwn9/w4CAwYCAwYGBwoCAxIGB
+ xIaGv4yMuY6Ot5SUs5+fpqOjoaKiop+fpZaWsJOTtI6OuouLu4iIuoKCvX5+wn9/wYCAwX9/w4ODw42N
+ upeXsJ2dqp2dqqCgpqOjo6Kipp2dqpqaqpiYq5SUr5CQsoqKtYaGuYiIuYmJuomJu42NuJCQtY+PtZWV
+ sJ2dqaOjpaampKWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaWlpaWlpaWlpaWlpKSkpKOjo6KioqKio6Sk
+ paWlpaampaampqamp6amp6SkpaOjpKKio6KioqOjo6OjpKSkpaWlpaWlpaWlpaSkpKOjpKOjpKOjpKOj
+ pKOjpKSkpaSkpaSkpaSkpaSkpaampaampqampyAApaWlpaWlpaWlpKSko6OkpaWlpaWlpaWlpKSko6Ok
+ o6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpaWlpqanpqanpqanpqanpqanpaWlpaWlpaWlpaWlpaWlpaWl
+ pqanpqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpKSko6Oko6OjoqKioqKioqKio6Ojo6Oko6Oko6Oko6Ok
+ o6OkpKSlpaWlpaWlpaWlpKSmnp6tkJC5hobEg4PGhITDhITBiYm7hITBgoLGg4PHhYXDjo63mpqqoKCi
+ oqKhoqKkpKSkpaWlpqakmpqwlZW2lZW1kZG3jIy8jIy9i4u9h4fDhITHhYXGiIjDj4+8nJytoqKkoqKh
+ oqKioqKioaGhoaGhoqKfmpqpk5Oxk5Owjo6zhoa8goLEgoLGgoLFg4PFhYXEkJC2mZmtoaGmpKSjo6Ok
+ o6Oko6OkoqKjoqKhnJyoj4+3hobChobDhYXEhITFiIjBiYnAhITGhYXFhYXFkJC3mJipnJyin5+eoKCg
+ oaGhoaGho6OfnZ2mjY22hITCg4PAg4PCh4e+i4u7i4u8i4u9jY27kZG2l5eunp6mo6OhoqKioqKio6Ok
+ pKSkoqKlnZ2plZWxkJC2iYm+iIi+iYm9ioq9i4u9i4u9i4u9i4u9jo65mJito6OfoaGhoKCgoaGfnZ2j
+ lpaqj4+xioq4iYm7ioq7i4u8ioq+iYm/iYm/ioq/jo62lJSslZWqkZGtj4+tjo6uh4e2f3+/fn7DgoLD
+ hYXCjIy8jY2+jY2+lZW2oKCrpaWmpaWmpqakoqKnmJixj4+5ioq9ioq7iIi5h4e4iIi4ioq6ioq9iorA
+ hobFhYXHhITHi4u+m5uspKSjnZ2rj4+5hYXDhITGg4PFgYHDf3/BgIDBhoa7h4e/g4PHg4PGhYXGiYm+
+ lJSwn5+loqKjnJyplpaxlJSwlJSwk5OxkZGyjIy2f3/EgIDDgYHChoa+iIi+g4PFg4PGgoLHjY28nZ2q
+ pqahoaGnkpK3hITHgoLHgoLEgoLCg4O+hIS6g4O6h4e5ioq9jIy/jY29jY2+jY2+kpK3np6ppaWipKSj
+ oqKlmpqsjY28hITDgYHDgYHCgIDBgYHCgYHDgYHDhoa9i4u4jY22kpKxmpqqoKCkoqKio6OhoKCllJSy
+ jIy7jIy7i4u8hobBgIDEf3/Bf3/Bf3/BgIDBiYm5lJSvl5evlpawlZWym5uroqKlpKSjoqKlmpqtk5Oy
+ kZGzjIy4h4e7iIi5h4e5iIi5iYm5iYm7iYm9jY23mZmpn5+koaGkpKSlpaWlpaWlpaWlpaWlpaWlpaWl
+ pKSlo6OkpaWlpaWlpaWlpaWlpKSlo6Oko6OkoqKio6OjpKSlpaWlpaWmpqanpqanpqanpKSlo6Oko6Oj
+ oqKio6Oko6OkpKSlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpqan
+ IACjo6Sjo6Sjo6SioqOioqKjo6SlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sl
+ paWmpqampqempqempqempqelpaWlpaWlpaWlpaWlpaWlpaWmpqempqempqempqalpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWioqOioqKioqKioqOjo6Sjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWgoKmUlLeJicOFhcaE
+ hMSEhMGKiryFhcSEhMaDg8WFhcKPj7ebm6ihoaKhoaGhoaGhoaKioqOjo6SlpaSfn6qYmLGRkbqLi7+L
+ i72Ojr+IiMWGhseHh8aKisKRkbmYmLKjo6elpaWjo6SioqKioqKioqKhoaGfn6OZmauTk7COjrSGhr6C
+ gsSCgsWCgsWDg8WEhMWEhMWLi72YmK+hoaWjo6Ojo6Sjo6Sjo6SkpKOenqeXl6+Tk7OTk7OOjrmLi7uM
+ jLyIiMGDg8aEhMWGhsSSkrebm66goKWhoZ+fn5+enp6hoaGhoaGjo5+cnKaOjraJibqJibqKiruKiruK
+ iruKiruMjLuSkrWRkbWWlrCenqajo6GioqKioqKioqKkpKKfn6iVlbKPj7mJib+Jib6Jib6JibyKiruL
+ i72Li72Kir2Pj7eVlbCcnKmjo6GhoaGhoaGiop+ZmaePj7WLi7uJibqKiruMjLyLi7+JicCJicCJib+Q
+ kLeZmayfn6GdnaGVlauOjrKHh7mBgcB/f8J/f8KDg7+KirmKiruMjL2SkrmVlbaWlrSenq2lpaampqWh
+ oaqTk7eKir+MjL2Li72KiruJibmIiLmIiLmIiL6FhcWGhsWFhcaIiMKSkreenqijo6ScnKuRkbiHh8KC
+ gsWCgsWBgcN/f8KFhbiDg72CgsWEhMaFhcSMjLyTk7SZma2enqWioqChoaSamquamquamqmWlq2Kirp/
+ f8WAgMJ+fsGFhbqGhryCgsOCgsSDg8WDg8eNjbydnaqmpqGhoaaUlLKHh8GGhsKEhMKGhr+JibmIiLmG
+ hreJibiFhcKDg8mEhMiEhMmEhMePj7udnaqkpKKhoaaYmK+Li76Hh8GHh8GEhMOBgcSBgcOAgMGAgMOH
+ h7yKirmKiruLi7mSkrOcnKadnaagoKSjo6GhoaOcnKmOjriMjLyHh8KDg8aCgsWBgcN/f8F+fsOJibWN
+ jbOIiL6Jib6Kir6Jib+UlLSgoKejo6ScnKqWlrGUlLSNjbqJibyJibqIiLmGhreHh7iIiLmIiLqMjLiT
+ k7WRkbWQkLeWlq+fn6alpaSlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6SlpaWlpaWlpaWlpaWkpKWjo6Sj
+ o6SioqKioqOkpKWlpaWlpaWmpqempqempqelpaaioqOioqKioqKjo6Sjo6SkpKWlpaWlpaWlpaWjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaUgAKOjpKKioqKioqKioqKioqKioqamp6amp6am
+ p6ampqSkpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpKampqamp6amp6amp6amp6WlpqWlpaWl
+ paWlpaWlpaWlpaampqamp6amp6amp6WlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjo6KioqKioqKio6Oj
+ pKOjpKOjpKOjpKOjpKSkpKWlpaCgqZOTt42Nv42Nv4yMvImJvIWFxISExYODxoaGw46OuJeXqp+fo6Gh
+ oaGhoaGhoaGhoaGhoaKipJ2dqpiYsZGRuYyMv4mJwoWFxIaGxYaGx4WFyIqKxJOTu5iYs52drKSkpqam
+ paWlpaOjpKKioqKioqOjop6eo5mZp5CQsYWFvoGBw4KCxYKCxYKCxYODxYSExYSExouLvpiYrqGhpKOj
+ o6OjpKOjpKOjpKSkopubrpSUtZOTtI6OuYuLvIuLuoeHwISExYODxoSExJGRtpmZr6Ghp6SkpKOjo6Gh
+ oJ+fn56enqGhn5+fo5SUr4mJvYqKu4mJuYqKu4uLvIuLvIuLvIuLvYuLvY+PuJubqqOjoqKio6KioqKi
+ oqKioqOjoZubq46OuYqKv4qKv4mJv4qKvouLvYuLvYqKvIuLvpCQt5SUspqarJ+fpaKioqKioqGhoaGh
+ oZaWrYqKuomJu4mJu4mJuoqKvYqKwIiIwYqKv5GRuJaWr56ep56epZeXqo6OsoiIu4KCwoCAw39/w4KC
+ voeHt4mJuYqKuoWFwoWFxYWFxoqKwZiYsqWlpqenpJubsZCQvIyMvo2NvYyMvYyMvIqKu4eHuIWFvISE
+ w4WFxISExouLwYyMvpKSuJ+fqqOjpKSkpJmZsI6OvImJvomJvIiIu4eHuIGBvoCAwYKCxIaGw42Nu5GR
+ tZiYraCgpaOjoqKioaCgopqaq5ubqpeXrouLvIGBxoCAxICAw4WFuYODvIGBwYGBw4GBxIKCxYiIwZWV
+ tKCgp6Sko6KipZubq5SUs5GRs4yMuImJvIqKuomJuYaGtYODwIKCxoSEx4SEyIWFx4uLwJeXtJ+fqaSk
+ o6Cgp5OTtIeHwoeHwoWFxIODxYGBxIGBw4GBwoeHu4qKuYuLvIuLvYuLvYyMvJSUsJubqKCgo6OjoqKi
+ oaGho5SUsoeHwYKCxoODxYODxYGBxH9/w4WFu4qKt4iIvYODxIODxIWFxYqKvpaWr6GhpaKipJycqpWV
+ spOTtZKStpKStI+PtIiIuYeHuIaGt4aGuImJuIeHvYODxYSExIODxY2NupycqKSkoaOjpKWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaOjpKSkpaWlpaWlpaWlpaWlpaOjpKOjpKKio6Kio6SkpaWlpaWlpaamp6amp6am
+ p6WlpqOjo6KioqKioqOjo6OjpKSkpKWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKWlpSAAo6Oko6OjoqKioqKioqKioqKipaWmpqanpqanpqanpaWmpKSlpaWlpaWlo6OjoqKioqKioqKi
+ o6Oko6Oko6OkpKSlpqanpqanpqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpaWlpqampqanpqanpqanpqan
+ pqanpaWmpaWlpaWlpaWlpaWlpKSlo6OkoqKioqKioqKio6Oko6Oko6Oko6OkpKSjo6OknJyqlJSyjo65
+ iYnAhYXDhYXCg4PFhITFh4fCjY26lJSympqqnZ2ioaGhoaGhoaGhoaGhoaGinZ2mmJivlZWxjo65h4fC
+ hITFg4PFhITGg4PIiYnEk5O8mZm0nZ2vpKSnpaWlpaWlpaWlpKSlo6OkoqKioaGjnZ2nkpKxhoa+gYHD
+ gYHDgoLEg4PFhITFg4PGhITFi4u9kZG3nZ2oo6OioqKjoqKjo6Oko6OkpaWioKColpayjo66i4u8i4u9
+ hobChITGgoLIhobEkpK3mZmroKClo6Oko6Oko6Oko6OjoKCgnp6enJygmZmolJSxj4+1i4u6hYXBhYXD
+ hobEhobFh4fDjY29jIy8kJC1nJyopKShoqKjoqKjoqKio6Ohn5+mkpK0iIjAiorAioq/jIy9jIy8jIy8
+ i4u9ioq9j4+2lJSxlpavnZ2ooqKioqKioqKio6Ohm5unkpKxjIy5ioq6ioq5hITAg4PDhITEh4fCjo67
+ lZWzl5ewnp6nnZ2ml5eukZGzjY20h4e8h4e8hoa7hYW5h4e2iIi4g4O/goLCgYHFg4PFjY28nZ2tpqak
+ p6eknp6vlJS5kZG6kJC5jY29jIy9i4u7hYW8gYG/g4PChITDiYm/jY29i4u/kZG5np6rpKSlo6OjlZWy
+ j4+5kJC4j4+3ioq6hIS+gIDBgIDBgYHCg4PEhYXDh4fCjY28l5eynJyrn5+loaGimJirlJSxjo64ioq+
+ iIi/iIi9iIi7g4O9gIDBgIDCgIDEgoLFiIi9lZWumpqqnJyqoKCnpKSjoqKlm5utm5utlJSwj4+zj4+0
+ iIi5gYG+gIDDgIDFgoLGhYXFi4vAkpK4lZW1m5uvoqKno6OlmZmtjY28hYXFg4PHg4PHgoLGgYHDhoa6
+ iYm5iYm6ioq8i4u9i4u9i4u9kpK0mJirn5+joqKhoqKioqKimpqrjIy8goLGgIDIgYHHgYHEhYW7iYm2
+ hoa8gYHCgYHEg4PEgoLFiIjAlZWxoKClpKSioKCnk5O1k5O2lJSzkJC1ioq5iIi5h4e4h4e4iIi3hoa9
+ goLEgoLGgoLGgoLHjIy7nZ2opKSfoqKipKSko6OkpKSlpaWlpaWlpaWlpaWlpaWlo6OkpKSlpaWlpaWl
+ paWlpaWlo6OkoqKjoqKio6OjpKSkpaWlpaWmpaWmpqampaWmo6OkoqKioqKioqKio6Ojo6Oko6OkpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6Oko6OkIACjo6Sjo6SioqSioqKioqKioqKlpaWl
+ paampqempqempqempqalpaWlpaWlpaWjo6OioqKkpKSkpKWkpKWjo6Sjo6SkpKWmpqampqampqakpKSk
+ pKSlpaWlpaWlpaWlpaWlpaWlpaWlpaempqempqempqempqempqempqWlpaWlpaWlpaWlpaWlpaWjo6Oi
+ oqKioqKioqOjo6Sjo6Sjo6OioqWdnauWlrGQkLaIiL+EhMSDg8aDg8aEhMWDg8eIiMCOjrmSkrWZma2g
+ oKGgoKChoaGhoaGhoaGgoKKcnKaYmK2QkLeIiMGEhMWBgcSCgsWEhMSHh8CPj7mZmbSgoK6lpaimpqal
+ paalpaWlpaWlpaWlpaWkpKSdnaeTk7OJib6CgsOBgcOBgcOBgcOCgsODg8aEhMWKir6RkbaXl6+goKWj
+ o6KioqOioqOioqOkpKOhoaaYmK+Pj7mLi72Li72KiryHh76Hh8GKisCSkrecnK2cnKqhoaGioqGjo6Sj
+ o6Sjo6SioqOiop+dnaGXl6iTk7COjreFhcGDg8WDg8aDg8eGhsWLi7+NjbySkrWYmK6enqWioqGioqOi
+ oqOioqOkpKCgoKWTk7SJib+Li72Li72IiMGHh8KGhsOJib+RkbSVla+Xl6ydnaehoaOioqKioqKioqKj
+ o6GYmKyOjraKirqKiruFhcCCgsSDg8WCgsWDg8SIiMGMjL2UlLSgoKejo6GamquRkbaSkrKPj7OLi7eJ
+ ibiIiLeGhriDg7+BgcOCgsWEhMSOjrmamq6enqugoKqmpqWkpKiamrOSkruPj7uNjb2Njb6Hh8CCgsKB
+ gcKDg8GHh7yLi7qKiryNjbyYmLKkpKalpaWioqSYmK6UlLSRkbeLi72EhMSAgMSBgcKAgMF/f8KBgcSC
+ gsaEhMaGhsSIiMOQkLmdnaqjo6Gfn6WYmKuMjLuJicGLi72Li7yHh76CgsGBgcOAgMSCgsSKir+QkLeW
+ lrCVla6SkrKamq2mpqKjo6ScnKyXl7GVlbKSkrOLi7mCgsJ/f8N/f8KAgMOBgcaFhcKRkbaWlrWVlbaZ
+ mbGgoKqkpKSgoKiSkraIiMGHh8OJicGIiL+GhryIiLeJibiJibqKiryMjL2MjL2MjL2NjbuRkbabm6mi
+ oqGhoaGioqKdnaeUlLGOjriNjbmLi7qGhr2JibWFhbuBgcGBgcKBgcKBgcSGhr+MjLmWlq+goKSkpKCi
+ oqSXl7CUlLSQkLiMjLyKiryKirqIiLmIiLeGhr2CgsOAgMWBgcSDg8WCgsaKir6YmK2ioqKioqKioqKj
+ o6SkpKSkpKSkpKSkpKSkpKSkpKSjo6SkpKSkpKSkpKSkpKSkpKSjo6Sjo6Ojo6KioqKioqOkpKSkpKSk
+ pKSkpKSkpKSjo6SioqKioqKioqKioqKioqOjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWj
+ o6Wjo6Sjo6QgAKSkpaSkpKSkpaOjpKKio6Kio6WlpaWlpaWlpqWlp6amp6amp6WlpqWlpaWlpaSkpKOj
+ o6WlpaWlpaWlpaSkpKSkpKSkpKSkpKSkpKSkpKOjpKOjpaSkpaWlpaWlpaWlpaWlpaWlpaWlpaampqam
+ p6amp6amp6amp6amp6WlpqWlpaSkpaWlpaWlpaSkpaOjo6KioqGhoaOjo6OjpKSko6KipZmZr5CQuYiI
+ wYSExYODxoSExYSExYODxoaGw4qKvo+PuJWVsZubqKKioqGhoaCgoKGhoKGhoZ+fo5qaqZGRs4WFv4KC
+ xIGBxYKCw4aGwIeHv46OuJaWr5qaraCgrKiopqamp6Wlp6WlpqWlpaWlpaWlpaOjp5iYr4qKvoODxYKC
+ xYGBw4GBw4GBw4CAxIODw4mJvpCQtZaWr52dqKGho6KioqKio6Kio6Kio6GhpZeXr46OuouLvoyMvYyM
+ vYqKu4qKuo2NuZGRtpaWsZubrZ2dq6GhpKGhoaKioqOjpKOjpKOjpKGhpJubppSUq4yMtYWFwIODxYWF
+ xoSEx4aGxIuLv46OvI6OvJqar6CgqKGho6GhoaGhoqKio6Kio6CgpJycqJKStIuLvYyMvIiIwYSExYOD
+ xoKCx4eHwpGRtpSUs5eXrp+fpKOjoKKioqKioqKioqSkoJmZrY6OuYmJvoaGwIKCxYODxYODxYKCxYKC
+ xYSExYmJwJeXsKGhpqWloZ6ep5OTspOTs5GRtIqKuIqKuYiIuoKCv4CAwoKCxISEwouLvZSUs5mZrZeX
+ sJmZr6Ghp6ampJ2drpGRu42Nvo6OvY6OvYiIv4WFvoSEvYWFvImJuYqKuomJvI6OuJycraWlpKOjpqGh
+ p56eqpiYsZGRuI6Ou4uLvoeHv4KCwX9/wn5+wYCAwoODw4aGxIWFxYWFxYuLvpmZsKOjo6OjoqCgo5WV
+ r4+Pt42NuIqKvIKCw4CAwn9/xIGBw4iIvZKSt5SUtJOTtpGRtZGRtJiYraOjo6OjpJ2dqpWVspGRuIuL
+ vYSExIGBxoCAxICAwn9/w4ODwIuLt5OTsZWVs5aWtJeXs5ycrqOjp6SkppeXsZSUtZSUtJCQuIyMvImJ
+ uIaGuIeHuYiIuoqKvIuLvIyMvYuLvoqKv4qKwZSUtKCgpaKioKGhoZ6eppiYrJWVsJOTs4+PtoqKuYWF
+ vICAwYCAwoCAwoGBwYaGvoqKu5aWsZycq52dqKCgpKKiop+fp5WVs4yMvYuLv4yMvIqKuomJuISEvICA
+ woCAxYGBxIGBxIODxYODxIWFwpCQt52dqKOjoaKio6OjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKOjpKOjpKKioqKioqOjpKOjpKOjpKOjpKOjpKOjpKKio6KioqKioqKioqKioqOj
+ o6OjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpKOjpCAApaWlpaWlpaWlpaWlpKSlpKSl
+ paWmpaWmpaWlpaWlpqampqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6Ok
+ o6Oko6Oko6OkpKSlpKSlpaWlpaWlpaWlpKSkpKSlpqanpqanpqanpqanpqanpqanpaWmpKSlpaWlpaWl
+ paWlpaWlo6OkoaGhoqKho6Oio6Okn5+olZWyiYnBg4PHg4PGhITFhITHhITHhobDjIy8kJC3k5Oympqr
+ oaGjoqKioqKioaGhoqKgn5+jmZmrkJC1hobBgYHEgYHEgoLChoa+i4u5jIy3lpavmpqqm5uooKCnpqam
+ pqanpqanpaWmpaWlpaWlpaWloaGolJS1iIjCg4PGg4PFgoLEgYHEgYHDgYHCiIi7kJCylpasnJyooqKj
+ oqKioqKioqKioqKjoqKjnZ2okJC3i4u+jIy9jIy9jIy9i4u8iYm8kJC0lJSxk5O0lZWynZ2qoqKlo6Oi
+ oaGhoaGho6Ojo6OknZ2qlpawjo63hITAgIDFhITFhITGhobEjIy+jo68jY29j4+7nJyspKSmpaWkoqKj
+ oaGhoqKipKSim5urk5O0jY25ioq8h4fAg4PGhITFhITFg4PGhobDjIy8kpK1mJitn5+koqKhoqKioqKi
+ oqKio6Oilpawi4u8hobDgoLFg4PEg4PFg4PFg4PFhITCiYm8k5Oyn5+no6OkpKSjoaGlmZmrkJC2jIy7
+ i4u7iIi7g4PAf3/Ef3/Bg4PAi4u4kpKzk5O0kZG2kZG2lZWzm5uupKSloKCrlJS4j4+9kJC8j4+7jIy6
+ ioq5iIi3h4e3iYm6ioq7iYm8jIy5lJSxnJyrnZ2soKCqnp6rmJixlpazl5eykpK2ioq8g4PDf3/Df3/A
+ gYHAhITAhYXCh4fCjIy9j4+6lZW1n5+qo6OkpKSin5+klpasjY22hYW/gIDDf3/Cf3/Bhoa7j4+0k5Oy
+ k5O0kpK2kpK3kpK0lpaunZ2no6Ojnp6om5uslJS0iIjCgYHJg4PFgYHEgIDEgoK/jIy0k5OukJC1jY25
+ j4+6jY29kpK4np6spaWln5+qnZ2rmpqrkpK1ioq9iYm6hoa4hoa3iIi5iYm6ioq7i4u/ioq/iorAiorA
+ kpK2np6po6OhoaGhn5+kl5etkZG1jo65ioq9iIi/gYHEgIDCgIDCgYHBhYW8ioq4iYm7lZW0l5eylpaz
+ m5uto6OioqKjl5evj4+4jY28i4u9iYm7hoa9f3/Bf3/CgYHCgYHDgoLEgoLEhITDgYHGiYm9mZmrpKSh
+ pKSlpKSkpKSko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkoqKjo6Oj
+ o6OkpKSkpKSkpKSkpKSko6OkoqKjoqKioqKioqKioqKio6Ojo6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpKSkIACjo6SlpaWlpaWlpaWlpaWlpaWmpqempqempqelpaalpaWmpqempqempqelpaal
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SlpaWlpaWlpaWkpKSi
+ oqKkpKSmpqempqempqempqempqempqelpaWkpKWlpaWlpaWlpaWlpaWjo6ShoaGioqCenqeVlbKMjL2D
+ g8eEhMaEhMaEhMaEhMaGhsSNjbyPj7mUlLOVlbGamqujo6GioqKioqKioqKiop+cnKSQkLSFhcODg8aD
+ g8WEhMSIiL+Li7uLi7qRkbGXl6uZmauenqakpKCjo6SmpqempqempqempqelpaWkpKWgoKqTk7eIiMOE
+ hMeEhMWDg8WDg8KBgcGIiLmOjrOTk62ZmaednaOioqKioqKioqKioqKioqKioqOenqiRkbWMjL2MjL2M
+ jL2MjL2Li7yKiryPj7eTk7KVlbGXl6+enqmioqWkpKSioqKhoaGioqKioqWXl7CQkLmHh8KBgcaCgsOD
+ g8SEhMSMjL6OjryNjb2Njb2Rkbienqqjo6WlpaWjo6WioqOhoaGioqOVlbCMjLyJib6Hh7+BgcWDg8WE
+ hMWEhMWDg8aGhsOOjrqZma2enqahoaOioqGhoaGioqKhoaOamquOjrmFhcSDg8eEhMWEhMWEhMWEhMaF
+ hcOLi7yTk7GcnKWhoaGjo6OkpKSioqSamqyOjrmMjLuMjLuGhsGCgsOBgcGBgb+Hh7mPj7KRkbKPj7eO
+ jruOjrqNjbuUlLSioqehoaiXl7OTk7mTk7mUlLmOjryKiryIiLiGhreJibmKiruKiruJibyMjLmUlLOZ
+ ma+hoaicnK2ZmbCZmbCUlLWJicCDg8aBgcWAgMKAgL+Bgb6Cgr+EhMGIiL6OjrmQkLmSkriamq+kpKWj
+ o6KdnaiRkbWGhsCBgcOCgsGDg7+GhriMjLKRkbCRkbGRkbSPj7mPj7qPj7yQkLiXl6yioqKenqeenqiZ
+ ma6MjL2CgsiEhMaCgsSBgcKKiraSkq+QkLWKisCEhMeDg8eBgcmJicGbm6+mpqSkpKWcnKyWlrKOjrmK
+ ir2KiruHh7mGhreHh7iJibmKiryKisCLi7+MjL6Tk7Wbm62hoaejo6OioqKjo6CXl66NjbuLi72Kir6B
+ gcWBgcGAgMGAgMGEhLuJibeIiLmJibyJib6JicCMjLyYmLCkpKOhoaOcnKmUlLGOjrqLi7yJibyAgMV/
+ f8KAgMGBgcOBgcOCgsSDg8SDg8SDg8SLi7qZmaqkpKGlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SioqKjo6SkpKWlpaWlpaWlpaWjo6Sjo6SioqOioqKi
+ oqKioqKioqKjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaUgAKOjpKOjpKSkpaWlpaWl
+ paWlpaWlpaamp6amp6amp6ampqWlpaamp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaSkpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjo6KioqKioqWlpaamp6amp6amp6amp6amp6amp6Wl
+ paSkpaSkpaWlpaWlpaWlpaOjo6GhoZiYq4yMvYODx4SExoSExoSExoODxoaGw42NvI+PuZOTtpSUtJmZ
+ rqCgpaOjoaKioqKioqKioqSkoJycp4yMt4KCxIODw4SExYqKwY6OvY2Nvo6OvJKSs5GRspaWrJ+fpKOj
+ oaKioqOjpKamp6amp6amp6Wlp6CgqpiYsoyMv4aGxoWFx4SExoSEw4mJuomJu4yMs46OsJCQr5aWqZ6e
+ o6GhoaKioqKioqKioqKioqKio5ycqY+PuIqKvouLvYuLvIuLvIuLvIuLu4qKvI+Pt5eXrpycp6Kio6Oj
+ pKOjpKOjpKOjo6GhoZ2dqJKStoeHwoSExoSExYODxIODw4mJvIyMvI2NvY2NvJCQuZeXsqOjpqWlpKSk
+ paSkpaSkpKGho5qaqI6OuYuLvoiIwIODxoODxYKCxIODxYSExYODxoaGwpCQtp2dqaKio6KioqKioqKi
+ oaCgopubqZCQuIaGw4ODxoSExYODxYSExYSExYWFxIuLvpOTtJubqqCgoaCgoKGhoaOjo6KipZycqpaW
+ spOTs4yMuouLvoqKvImJuYiIuYaGt4iIuIqKuYeHwIODxoSExYSExY+Pt5+fp6SkpJ6erJiYspeXs5aW
+ tY6OvImJvIiIuIeHuIaGt4mJuoqKu4mJvIyMuJSUsJycqaOjpKKip52drZSUtomJwIKCxYODxYKCxYGB
+ wYGBvoGBv4GBwoODxIKCxYiIv4yMvI+PvJeXs6Skpaamo5mZro6OuouLvoqKu4mJuY+PsI6OroyMr46O
+ r5CQso6Ot4yMu42NvYyMvo+Pu5eXr6KioKGhoZ2dqJKStoiIwoSExoSExYGBxI2NtIuLtIiIuIiIvIOD
+ xoSExoSExoKCyIqKv5ubrqampKOjpp2drZiYs4+PuoqKvouLvIiIuYeHuYeHuIeHuYiIvIqKvoqKv5OT
+ tpubrqCgp6KipKKipaOjpKOjoZiYrI+Pt4yMu4qKvoODxYKCw4GBwoSEu4eHtoeHuIeHuYiIuoqKvIqK
+ vo2Nu5mZr6Sko6OjpJ6eppGRtoqKvouLvIqKvYKCxICAwYGBwYGBw4KCw4ODxIODxIKCxYyMuJeXrp+f
+ qKSko6WlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKKioqKio6SkpaWlpaWlpaWlpaOjpKOjpKOjo6KioqKioqKioqKioqOjo6OjpKOjpKOjpKWlpaWl
+ paWlpaWlpaWlpaWlpaWlpSAAo6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpqampqanpqanpqanpaWlpqan
+ pqanpqanpqampaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6Oko6Oko6Oko6OkoqKj
+ o6OjpaWlpaWlpaWlo6OkpKSlpaWlpaWmpqanpqanpqanpaWmpKSlpKSlpaWlpaWlpqalo6Oil5erioq8
+ g4PIhITHhITHg4PIhobCioq8jIy6k5O1lJS2l5ewn5+opKSjoqKjoqKioqKioqKipKSgnZ2oj4+3iIi7
+ ioq7jIy8iYnBhYXFhYXGhobGjIy/kZG0lpaqnZ2joqKhoqKioqKio6OjpaWmp6empKSpmJi0i4u/hobF
+ hITGg4PIhobEioq7ioq6hoa/hoa+hIS+iYm4lpaon5+doKCgoaGhoqKioqKioqKioqKinJyoj4+5ioq+
+ i4u9i4u8i4u9hYXEhYXEg4PFh4fBkpK0nZ2moaGhoqKio6Oko6OkpKSjoaGklpauiYm/hYXDhobDiIjA
+ iYm7iYm8jIy8jIy8i4u9j4+6l5eynZ2ro6OlpKSlpKSlpKSlpKSloqKknJypjo64hYXCg4PFg4PFhITF
+ hITFhITFg4PEgoLFhobCkJC2nZ2poqKjoqKioqKio6OhoKCkk5OyjIy8i4u9h4fCg4PHg4PFg4PFhYXC
+ ioq9k5OzmpqtnJyroaGkoaGhoKCgoaGho6OioaGmm5usmpqtlJSykZG1k5OzkJCziIi6gIDAgIDAgoLB
+ goLDg4PFhYXFioq+jo66mpqrpKSin5+olJSzlZWylJSxjY25iYm7iYm5h4e4hYW2h4e5iIi6iIi8j4+2
+ m5unoaGhoqKipKSioaGolZW1iorAi4u/ioq+h4fBgoLAgIDAf3/BgIDBg4PEg4PHiorAjY29j4+7l5ez
+ pKSlpqajmZmwkpK3kpK1kpK0kZGykJCxkJCwjY2viYmyiYm5ioq6ioq7i4u9kJC6l5exnZ2po6OioqKg
+ mJisioq/g4PHg4PHhYXFkJC2jY23h4e5g4O9goLEg4PFg4PFhITGg4PHiYnBlZWzoaGnpaWlpqakm5uw
+ j4+8i4u/i4u9iYm6h4e4hYW4hYW5h4e7iYm9i4u9kpK2m5uunp6rnZ2rnp6qpKSlpKSknZ2om5uql5eu
+ j4+2iYm8iIi6h4e5hoa4hYW3hYW4h4e5iIi6ioq7ioq8ioq9kZG4np6qo6OknJyrkpK0j4+3kZG1jo64
+ hITFgYHEgIDBgIDBgYHBgYHDg4PEiIi9jo61lpaunp6npKSio6OkpaWlpaWlpaWlpaWlpaWlo6Oko6Ok
+ o6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkoqKioqKjpKSlpaWlpaWlpaWlpKSk
+ o6Oko6OjoqKioqKioqKioqKio6Ojo6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlIACjo6Sjo6Sjo6Sj
+ o6SkpKSlpaWlpaWlpaWlpaWlpaampqempqempqalpaWmpqampqempqempqelpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6Ojo6Ojo6SlpaWlpaWkpKWjo6Sjo6Sjo6SkpKWm
+ pqempqempqempqalpaWkpKWlpaWnp6Wjo6eVlbKKir2Jib6Kir+Kir+Kir+Kir2Jib2KiryRkbSYmLCf
+ n6mjo6Sjo6Sjo6SioqOioqKioqKkpJ+dnaiPj7iLi7uKirmHh8CFhcWEhMaFhcWMjL+SkriYmLCenqag
+ oKCgoKChoaGioqKioqKjo6Snp6WioquSkrqFhciEhMiDg8iGhsOLi7yLi7yFhcOEhMSDg8WGhsCPj7Gb
+ m6Kenp6enp6fn5+hoaGioqGioqKcnKiWlrCNjbqKir2MjLuLi72GhsSEhMWEhMWDg8iJib+Xl62hoaKh
+ oaGhoaGioqKjo6OioqWenqiWlrCMjLmLi7qKiruKiruMjLuMjLuLi7yLi7yKir2MjLuWlrGjo6WkpKWk
+ pKWkpKWlpaWjo6acnKuWlrKOjrqFhcOCgsaDg8WEhMWEhMWEhMWEhMWDg8WIiL+WlrGhoaSioqOioqKi
+ oqKjo6GioqOYmK2Xl62UlLCNjbeGhr+AgMSBgcOBgceMjLyXl7CZma2bm6yjo6Sjo6OhoaGgoJ+hoaCh
+ oaWZma6WlrOUlLSUlLKSkrSLi7yDg8OBgcKAgMKBgcOAgMaDg8SKiryPj7iOjrqZmaujo6GgoKWZma6U
+ lLONjbiKirqKirqIiLmGhriFhbeHh7mIiLqIiL2QkLacnKaenqSdnaSfn6WgoKeXl7GLi76MjL2Li72K
+ iruEhL5+fsJ/f8GBgcKCgsWHh7+Kir2OjruWlrSdnaylpaSlpaSfn6uXl7KUlLWTk7STk7OSkrGQkLKK
+ irWHh7aHh7qEhMKGhsOFhcSKir+Tk7Wamq6goKijo6OamqiRkbSPj7mRkbiRkbiPj7qKiruEhL+AgMKA
+ gMOBgcSDg8WDg8WDg8aFhcaMjL2Zma+kpKWkpKWYmLOOjr2MjL6Li7yJibmGhrmFhbiDg7uCgsGEhMOF
+ hcOHh8KQkLiamq6enqqfn6mkpKWkpKWjo6Wjo6Kbm6mOjreKiruJibmIiLiGhriFhbiFhbiHh7mJibqK
+ iryKir2Kir6NjbuWlrKjo6SgoKaamqyVlbCUlLCSkrKIiL+Dg8GAgMGAgMGAgMGBgcKCgsSDg8SJib+S
+ kreamq6hoaijo6OlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6OioqKioqKjo6SlpaWlpaWlpaWkpKWjo6Sjo6SioqKioqKioqKioqKioqOjo6Sj
+ o6SkpKSlpaWlpaWlpaWlpaWlpaUgAKSkpaOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpqamp6am
+ p6ampqWlpqWlp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOj
+ pKSkpaSkpaSkpKWlpaWlpaWlpaWlpaOjpaOjpKOjpKSkpaamp6amp6amp6WlpqSkpaSkpaGhppaWso2N
+ u4uLvIuLuoqKuoqKu4uLvIqKvYuLu4+PtZWVrp6epaOjo6SkpKOjpKOjpKOjpKKio6KioqGho5qaqpGR
+ tYuLvYeHwYODxIODxoaGxIuLv4+PvJKSuJ2draSkpaOjoaCgoKCgoKGhoaKioqKio6Wlo6GhqpCQuYmJ
+ womJwomJv4qKu4qKvYaGxISExoSExoKCx4qKvZeXqp6enZ6enp6enp+fn6GhoKCgopubqJSUsY6OuYuL
+ u4yMuoqKvoWFxIODxoSExYODxoaGw5GRt52dpqKin6GhoaGhoaGhoqOjoqCgppaWsJGRt4+PuI2NuYuL
+ uYqKu4yMvIuLvIuLvIuLvIyMu5CQt5eXrqSkoqSkpaSkpaSkpaWlpKKip5aWtY+Pu42NvYeHwoODxYOD
+ xIODxYSExYSExYODx4SExI6OuJubqaKio6Kio6Kio6KioqGho5ycqJubqZiYrZKStIqKvIODwoCAxH9/
+ xYmJu5WVsZmZrZqaq5+fp6OjpKOjpKKipKGhoaCgoKCgopycqZSUs5SUs5KStYuLvYSExIKCxYGBwoGB
+ woGBxIWFwYqKvI2NuZGRtpWVsJ+fpaOjoaKio5+fppiYroyMvIqKvYuLuomJuYeHuYaGuIaGuIiIuImJ
+ uo+PtpiYrJiYrZeXrZWVrZubqZmZrY6OuIuLvoqKu4aGv4KCwYCAwYCAwYCAwoWFvYqKu46OuJKStJaW
+ spqasJ+fqqOjpaSkpZubrpOTt5SUtZSUs5GRsoyMt4iIuYaGuYODwIGBxIKCxYODxoSExIaGwo2NvZiY
+ sKKipaKipJycp5aWrZSUtI6OuYuLvYWFwIGBwoCAw4GBw4KCxYSExoSEx4WFxoeHxI+Pu5ycraSkpaKi
+ ppmZr5CQuouLv4uLu4mJuYiIuIODu4GBwIGBw4GBxIKCxYCAyI2Nu5qarZ6eqp+fqqSkpaSkpaSkpKWl
+ op+fppOTs4mJvoiIuoaGuYWFuIWFuIaGuIiIuImJuYuLu4uLvIuLvY2Nu5SUsqOjo6SkopubrJaWsZaW
+ r5SUr5CQtIKCwYCAwoCAwX9/wYGBw4GBxYaGw4yMvpCQupGRt5eXsqOjpaSkpKWlpaWlpaWlpaWlpaWl
+ paSkpaOjpKKio6Kio6OjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjo6Ojo6OjpKSkpKWl
+ paWlpaWlpaSkpaOjpKOjo6KioqKioqKioqKioqKio6Kio6Kio6OjpKWlpaWlpaWlpaWlpSAApaWlpKSk
+ o6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpqampqanpqanpaWmpaWmpaWmpqampqampaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6OlpaWmpqampqampaWmpaWlpaWlpaWlpaWlpKSk
+ o6Oko6OkpaWmpqanpqanpqanpqampaWlnp6nkJC3ioq+jIy7i4u6ioq5ioq6ioq7iYm+jY25mJiqnp6k
+ oqKgoqKio6Oko6Oko6Oko6Oko6Oko6OhnJyok5OyjY25h4fBhITGgoLGhITCioq+jY28jY29j4+8nZ2t
+ paWlpaWkoqKioKCgoKCgoqKio6Oho6OinJypkZG1jY27jIy7iYm+iIi/hobCg4PIhITGhITFhobEkZG3
+ np6moaGenp6enp6enp6eoKCcm5ukkZGyjIy6i4u8ioq9iYm/hobDhITGhITFhITFhobDjIy8mJiuoqKi
+ oaGioaGhoaGhoaGhoqKhnZ2olJS0kZG3j4+6jIy8ioq8ioq7i4u8i4u8i4u8ioq8jY27lJSznZ2moqKi
+ o6OkpKSlpKSlpKSlnp6qlJS1kZG4kpK4iorAg4PGg4PEg4PFhITFg4PGhITEjIy7mZmtoKCjoaGioqKj
+ oqKjo6OioaGkmZmrl5etkZG1iYm+g4PEgYHGgoLDiYm5kJCvlZWrmZmqnp6no6Ojo6Oko6Oko6Oko6Oj
+ oKCinp6hnp6jlJSwkZG0i4u8hITEgoLGgoLEf3/CgIDCgoLFhobCiIjAiYnCj4+6l5ewnZ2qoaGlo6Oi
+ oqKjm5uqjo66i4u+i4u8ioq7iIi6hoa4hoa2hYW7hobAiYnAjY26k5OylJSxlZWunJynoKCjmZmrjY25
+ h4e/gYHEgIDDgIDCgIDBhIS8ioq3ioq6jo64kZG2j4+5kZG5mpqvoqKmp6einZ2slJS2lpa0k5O1jo65
+ ioq6h4e7goK/gIDDgYHDgoLEg4PFg4PHg4PGiIi/k5O0oaGmpqainZ2pkpKyjIy5iIi+hobBgYHDf3/C
+ gIDCgYHDgoLEhITHhYXIiYnEjIzAkpK4n5+ro6Omo6OmoaGml5ewjY27i4u8ioq7h4e8goLAgYHCgYHC
+ gYHCgYHEhYXBjIy5k5O0lpaynJytpaWkpKSlpKSlpaWkoqKmmJiujY25i4u1h4e3hYW4hYW3hoa4hYW9
+ hYW+h4fAiIjBh4fCiYm/kZG0n5+lpKSinZ2qlpaxlZWylJSyj4+2iIi+goLCf3/Cf3/CgoLDhYXAjY28
+ kJC5kJC4jo66kpK3np6ro6OlpKSkpaWlpaWlpaWlpaWlpaWlpKSko6OjoqKjo6OkpKSkpKSkpKSko6Ok
+ o6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlpKSko6OkoqKjoqKioqKioqKi
+ oqKioqKioqKioqKjo6OkpaWlpaWlpaWlIAClpaWlpaWlpaSjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWmpqampqempqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWk
+ pKSlpaSmpqampqempqempqelpaalpaWlpaWlpaWlpaWkpKSjo6Sjo6SkpKWlpaalpaalpaajo6WcnKmQ
+ kLWKiruKirqLi7uHh76Hh76Hh76Hh7+Pj7ecnKigoKKhoaGhoaGhoaKioqSjo6Sjo6Sjo6Sjo6OYmK6L
+ i7yFhcKDg8WEhMSEhMOJib2Li7qLi7yOjryTk7efn6ulpaWmpqWkpKSioqKgoKChoaGhoaGdnaeVla+Q
+ kLeMjLyKir6FhcSCgseDg8aEhMaEhMaHh8KMjL2Zma+jo6SioqKgoKCenp6enp6enp2Xl6aOjrSMjLiK
+ iryIiMKFhcWEhMaFhcWFhcWHh8KMjLyRkbWcnKmkpKGioqOhoaKhoaGioqCdnaWXl6yVlbGTk7WMjLyL
+ i76MjL2MjLyMjLyMjLyLi7yLi7yPj7mYmK2ioqGioqKioqKjo6OkpKSioqebm62WlrKXl7GVlbOKisCD
+ g8eDg8WDg8WCgsWEhMSNjbuYmK6hoaSjo6KhoaGioqKioqOioqOenqeWlq6QkLaKir6CgsSBgcaEhMaI
+ iMCRkbONjbONjbOWlqugoKOjo6KioqOjo6Sjo6Sjo6ShoaaenqWamqaPj7GIiLyDg8SCgsWCgsSBgcN/
+ f8F/f8GCgsSDg8aEhMeIiMWNjb+RkbqVlbWcnKyioqSioqOcnKqPj7mLi72Kir2Kir2JibqHh7iFhbmB
+ gcCBgcWBgcmFhcSTk7GWlq+YmKyenqWiop+dnaSOjrWDg8SBgcWBgcSBgcKFhbyIiLeHh7yHh72Hh76I
+ iMCKir+OjriZma2enqqkpKWenquVlbSTk7aPj7uMjL2JibyDg7+AgMOBgcKBgcODg8WDg8WFhcWJicGN
+ jbqSkrSgoKalpaKbm62NjbqHh7+GhsGBgcWAgMN/f8F/f8GAgMKBgcODg8SIiMKLi8CMjL+Ojr6UlLad
+ naykpKampqGbm6qPj7iLi76KisCEhMSBgcSAgMKAgMKBgcKBgcOGhr2Hh72Hh8CKir6VlbOjo6WkpKWk
+ pKWlpaSgoKmXl7KTk7OSkrGJibaGhraFhbeCgr2AgMSBgcSDg8aDg8aDg8aEhMaKir+Wlq6hoaOioqOb
+ m6uUlLSPj7mLi72KiryEhMKAgMSAgMGEhL6KirmOjrmOjrqOjrqOjrqRkbiYmLGjo6akpKSjo6SlpaWl
+ paWlpaWlpaWlpaWkpKWkpKSlpaSmpqampqampqalpaWjo6Sjo6Sjo6Sjo6SkpKSkpKSkpKSkpKSjo6Sj
+ o6Sjo6SkpKWlpaWlpaWlpaWkpKSjo6SioqOioqKioqKioqKioqKioqOioqKioqOkpKWkpKWkpKUgAKWl
+ paWlpaWlpaSkpaOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaamp6amp6amp6ampqWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKWlpqamp6amp6amp6amp6WlpaWlpaWl
+ paWlpaWlpaOjpKOjpKOjpKOjpKOjpKOjpJ6eppeXrI6OtYmJuYmJuoaGvYCAxYCAxX9/xoODwoyMuZSU
+ sJubqKCgoqGhoaGhoaKioqOjpKOjpKKipJycrI+PuYWFxIODxoSExIWFxIqKvYuLu4qKu42NuJOTs5yc
+ qqOjpaWlpaWlpaWlpaWlpaKioqGhn5ubppWVr4+PuIqKvoqKvoSExYODxoSExYSExYSExIeHwY6Ou5OT
+ tp6eqqWloqKio6KioqCgoJ+fnpycoZWVqZCQro+Ps4aGwIWFxoWFx4WFxoWFxoiIw42NvZGRt5WVsZ2d
+ qKOjoqKio6Kio6GhoaGhn5ubqJSUspOTso6OuouLvYuLvYuLvouLv4uLv4uLv4uLvY+PuJeXrp+fpKOj
+ oaKioqKioqKio6OjpKKip52drJaWs5WVtY2NvIaGxIODxoODxYODxYSEw42NuZiYrKGhpKOjoqKio6Ki
+ oqGhoaKiop2dqJWVsI+PuImJv4SExYKCxoODxYiIwY2NvIuLvoqKvYuLupSUq52dn6GhoKKioqKio6Oj
+ o6GhpqCgqJ2dq5OTsoqKuoKCwYCAw4GBw4GBw4CAwn9/wYCAwYGBw4ODxIiIwY+PvY2Nvo2NvpOTt5qa
+ r6CgqaOjpJ2dqZCQuIuLvYuLvYuLvYqKvIeHu4CAwX9/wYCAwoGBxIeHwJGRtJOTs5KStZeXrpubp5aW
+ rYqKvISEwoSEw4KCw4aGvoqKt4SEuYCAwoGBxYODxoKCx4iIv5SUsZmZqpubraOjp6GhqJeXso+PuYuL
+ vYuLvoODwn9/woCAwYCAwYGBwoODxYWFxYmJwIyMvY2NvJSUtKCgpaSkoqCgp5OTtYeHwoKCxYKCxYGB
+ xICAwn9/wX9/wYGBwYaGv4qKvImJwIiIxIiIxYmJwpeXs6SkpqWlpZmZr42NuomJwISExoSExYKCxYCA
+ wn9/wYCAwoKCwoCAxIGBxYGBxoSEw46OuZubrKOjpqSkpaamo52drJKSuJSUtZKStYqKuIaGuIKCvX9/
+ w4GBwoKCw4SExYSExYSExYSExYaGw5GRt5+fpqOjoKGhpJiYsIyMv4uLv4SExYODxoKCxIODvoeHt4eH
+ uoiIvYmJv4qKv4yMvY+PupaWsqOjpqWlpaOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpqamp6amp6am
+ p6ampqSkpKOjpKOjpKOjpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaOjpKOjpKKi
+ o6KioqKioqKioqOjpKOjpKOjpKOjpKOjpKOjpCAApqanpaWlpaWlpaWlpKSlo6Oko6OkpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpqampqanpqanpqanpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWmpqanpqanpqanpqanpaWmpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Okn5+o
+ mJiulJSwjo62hoa/gIDFgYHEgYHEgoLEgYHFhITBj4+1nJynoaGioaGhoaGhoaGhoaGhoqKknJyqkJC5
+ h4fDhITGhITFg4PBiYm8ioq8ioq8jIy6kpKympqooqKio6OjpKSlpaWlpaWlpaWlpaWlo6Ogl5erjY22
+ jIy6ioq9hITFhITFhITFhITFhITFh4fCjY27k5O1mZmuoKCmpKSjo6OkoqKjoqKioKCfnJyhlpaojY2x
+ hIS/g4PEhITGhYXGhYXGiIjDjo68kZG6lZWzm5uroKCko6OjoqKjoqKjoqKjoKCjmZmpkpKzjY25i4u8
+ i4u8jIy8iIjCg4PHhITGhITGjo67l5evn5+lo6OhoqKioqKioqKioqKioKCkoKCnoKCqmJixjo68hobE
+ hITHhITGhITFhYXEjIy6lpasnp6joaGioaGkoqKjoqKjo6OinZ2llpaukJC3iYm/hITFhITFg4PGiIjB
+ jIy8i4u9i4u9jY27lpavnp6in5+dnp6eoaGhoqKioqKioqKknp6qlJS0i4u+i4u8ioq5hIS/gIDEgIDC
+ f3/Bf3/Bf3/Bf3/DhYW/jIy7jIy9jY2+k5O4m5uvnp6roaGppaWkoqKklZWyjIy8ioq+jIy9iYm+gYHD
+ gIDBf3/Bf3/Cg4O+iYm6h4fBh4fBhYXDjo63mpqpl5esioq7ioq7ioq7iYm7ioq5h4e7gYHBgYHBgYHC
+ goLGiIjBi4u6jIy6lZWxm5uqo6Olo6OmnZ2rlZWzi4u8hITDgYHDgIDBgIDBgIDBgYHCg4PDiYm/jIy8
+ jIy+jY28lZW0oqKlo6OioqKimpqrjIy8goLGgoLFgYHEgYHDgIDDgIDBg4O9iYm6h4e/hobBiIjCiorD
+ j4+8nJyupKSmpKSlmpqujY29hITGhITFg4PFgoLFgIDCf3/BgIDBgYHCgoLEgoLEgoLEgoLFh4fAlZWx
+ oqKlpKSkpqajnp6rlJS3lJS1jo65ioq6hIS/gIDCgIDBgYHBgYHCg4PEhITFg4PGhobDjY27kJC4m5uq
+ oqKjpKSgn5+okZG5hITGhITGhITHhobAiIi3hIS4gYHCgoLEgoLGhobCj4+6lpazmpquoKCppKSlpKSl
+ o6Olo6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqanpqanpqanpqampaWlpaWlo6OkpaWlpaWlpaWlpaWl
+ paWlo6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpKSko6Oko6Oko6Oko6OkpaWlpaWlpaWlpKSlo6Oko6Ok
+ IACmpqempqelpaalpaWlpaWlpaWjo6Sjo6SkpKWlpaWlpaWlpaWlpaWjo6SkpKSmpqampqempqempqem
+ pqempqempqempqalpaWlpaWlpaWlpaWlpaWkpKWjo6SlpaWlpaWlpaWlpaWlpaWlpaWmpqempqempqem
+ pqempqalpaWlpaWlpaWlpaWkpKSjo6Sjo6SioqWdnaqXl7GPj7mHh8GCgsWCgsWCgsWCgsSAgMaFhcCM
+ jLaUlK2fn6GhoaGhoaGhoaGhoaGhoaCgoKKWlrKIiMGEhMeFhcaGhsOJibuKiryKiryNjbiRkbSTk7KU
+ lLGgoKKioqGjo6Ojo6WkpKWlpaWlpaWnp6SZma6NjbaIiL2Dg8WDg8WDg8WDg8SEhMSEhMaFhcSOjrqZ
+ ma2hoaakpKSjo6Sjo6Sjo6SioqOgoKWZmaeNjbOEhL+Fhb6FhcCIiMGMjL+Njb6Ojr6Pj72Pj72UlLef
+ n6mjo6GioqKioqOioqOjo6Kbm6qSkrSNjbmLi7yLi7yKirmFhcGDg8WDg8aFhcaLi7+Tk7Wbm6ygoKSj
+ o6GioqKioqKioqKioqKhoaOdnamYmK+VlbGIiMCDg8WDg8WDg8WCgsaEhMWRkbaenqWgoKCgoKGioqKi
+ oqOioqOjo6KZma2NjbmJibyKiruKiryMjL2NjbyJicGFhcWEhMSEhMSPj7ednaejo6GgoKCfn5+enp6h
+ oaGjo6GenqeWlrGTk7aSkraNjbyLi72JibuIiLiFhbp/f8J/f8F+fsOEhLyJibiJibqKiruMjL2Njb6T
+ k7mamrCgoKmmpqSkpKWVlbKNjbuMjLyJib+EhMWCgsSBgcKAgMODg7yGhrmFhb6GhsCHh8GIiL+Tk7Kg
+ oKSenqWPj7aKiruKiruLi7qHh72BgcKBgcGBgcGAgMSHh8GMjLyMjLyMjLyMjLqYmK2goKSjo6OlpaWh
+ oaiTk7aEhMSAgMaAgMOBgcGAgMGBgcGHh7yKirqLi72OjruVlbScnK2ioqSjo6Ojo6Ofn6aWlq+QkLaQ
+ kLSLi7qIiLyHh7uHh7mHh7iFhb+GhsCGhsGIiL6Li72Ojr2amrGhoamlpaWioqiXl7OJicCDg8WDg8aC
+ gsWBgcKAgMF/f8GBgcKBgcOCgsWDg8WFhcGLi7qRkbOfn6ajo6SlpaOfn6uTk7ePj7uOjryGhsKDg8WC
+ gsOAgMGAgMGBgcKDg8SCgsaHh8KOjrqQkLeQkLibm6qioqOjo6GgoKSXl6+Kir6Kir6Kir+KiruGhrt+
+ fsGBgcKBgcWHh8GOjrmVlbGZma2Zma6Zma6hoaelpaSkpKWkpKWjo6SlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWmpqempqempqempqalpaWlpaWjo6SkpKWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6SlpaWlpaWl
+ paWkpKSjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWjo6QgAKamp6amp6amp6ampqWlpaWlpaOjpKOjpKOj
+ pKSkpKWlpaWlpaWlpaSkpaOjpKOjpKSkpaSkpaWlpqWlpqamp6amp6amp6amp6WlpaWlpaWlpaWlpaWl
+ paWlpaSkpKWlpaWlpaWlpaWlpaWlpaWlpqamp6amp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpKKipJ2d
+ qpaWsZGRuIiIwYKCxYKCxYODxYODxYGBx4eHv42Nt5KSsJeXqJ+fn6CgoKGhoaGhoaGhoKGhoZ6eppmZ
+ qouLu4aGwYiIvYiIu4mJuomJvIqKvIqKvI6OuJSUsJiYq6GhoqGhoKKioqKipKOjpKSkpaWlpaSkppqa
+ sIuLvoKCxYKCxYKCxIODxIODxIODxIODxYWFxIuLvJeXrqCgpaOjo6OjpKOjpKOjpKSkopycqZCQt4aG
+ wISEv4WFvoWFvYWFwoaGxIaGxIeHxI6OvZOTuJubsKOjqKWlo6KioqKioqKio6SkoZiYrY2NuoqKvouL
+ vIuLu4WFwoODxYKCxoSExYuLvpOTt5SUtJmZraCgpqOjoqKioqKioqKioqOjoaGho5ycqZSUs4mJv4OD
+ xISExoSExoKCyIWFxJCQt5KStJubqp+foqGhoKGhoaGhoaKio6Skop2dqZaWsJKStIyMuYqKuoaGw4aG
+ xIWFxYSExoSExoODx5CQt56ep6SkoqGhop+fn56enp+fn6Kin5+fppeXr5GRto6OvIyMvYyMvYuLuoaG
+ vYCAwn5+wn5+woODuoaGtoiIuImJuomJuoqKu4yMvY6OvZCQu5iYsqSkpqWlpZ2drY+PuYeHwYWFxIKC
+ xYGBw4CAw4ODu4aGuISEvoKCxYSExYKCx4yMu5qaq6Cgo52dppaWrouLu4uLuoiIv4ODw4CAwoCAwYCA
+ woWFvIyMuouLv4aGxIeHw4aGw4+PtZ6epqSkoaSko6Skppubr5GRuI+Pt4qKuYWFvIWFu4SEuoiIuYiI
+ uoyMuJWVsJubq5ubrJycqqCgpaSko6GhppycqZiYp5WVrYuLt4iIuomJuIiIuYSEvIWFvoWFwImJvYmJ
+ u4iIvoqKvo2NvpeXs6Ojp6Skpp6erZSUtYmJv4mJvIODwICAwn9/wX9/wYGBwoKCxIODxoeHwoqKvYqK
+ vIyMu5eXq6Cgo6SkoqGhppeXsIyMvoaGw4KCxoKCxoKCxIGBwYCAwYGBwYCAxIWFwIqKu4yMu4yMvIyM
+ u5mZraGhpKOjoqCgpJmZq5KStY6Ouo2Nu4iIv4GBwn9/wYCAwoaGvIqKvIyMvZCQuJWVspaWsZWVsqCg
+ p6WlpKSkpaSkpaSkpaOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqamp6amp6amp6WlpaSkpaOjpKSk
+ pKWlpaWlpaWlpaWlpaSkpKOjpKOjpKOjpKOjpKOjoqSko6WlpaWlpaWlpaWlpaOjpKOjpKSkpaWlpaWl
+ paWlpSAApqanpqanpqanpqanpqampaWlpKSlo6Oko6Oko6OkpKSkpaWlpaWlpaWlpKSlo6Olo6Oko6Ok
+ pKSkpaWlpaWmpqanpqanpqanpqampaWlpaWlpaWlpaWlo6OkoqKjo6OjpaWkpaWlpaWlpaWlpKSkpqam
+ pqanpqanpqanpqanpqampaWlpaWlpaWlpaWloaGomZmvj4+5h4fChITHgoLGgoLFg4PFhITFiIi/jIy7
+ jY23k5OvnZ2jn5+fn5+foKCgoaGhoKCin5+lnp6mmJiskpKykJC0jY23ioq8ioq9ioq9i4u+iYm/jIy7
+ lpavoKCioaGhoaGhoaGhoaGioqKko6Olo6Omo6Omnp6rkJC5hITDgoLDgoLDgoLDhITEg4PGhYXEiorA
+ jo64nJyqoqKkoqKioqKjo6Oko6OkoqKlmJiwi4u+hobDh4e/hoa9g4O/g4PEgoLHhYXFiorAj4+9mpqv
+ oqKopaWlpaWlo6OkoqKjoqKioaGkmZmtj4+4i4u8i4u9hobBg4PFgoLGhYXDjIy8kpK1lZWzmJixn5+q
+ pKSlpKSkoqKjoqKioqKioaGjnp6olJSyiIi/goLGg4PFg4PFgoLHh4fDkJC5lpayl5evl5eun5+mo6Og
+ oaGhoaGhoqKhoaGknJyqlpawkJC3iIi+hYXCgoLFgoLIhITHhITGhITGjY27lpaxoKCmo6OioqKjoqKi
+ oKCgn5+enZ2hmZmqk5O0jIy7i4u9i4u8i4u7ioq5h4e6g4O7g4O6g4O6hYW3hYW2h4e4ioq5ioq5ioq6
+ iYm9iorAiYnCkJC7n5+rpaWlpKSml5eziYnCgYHIgYHGgIDEg4O9hYW5hIS9gYHDgYHGg4PHh4fCkJC3
+ l5etm5unnp6lm5unj4+2iIjAg4PFgIDFf3/Df3/BhIS8iYm3iYm8hobFhITIhITHhYXHioq+mJitoaGj
+ o6OhoqKknZ2smJiykpK3jIy6iYm6iIi3hoa2iIi5i4u1kJCylZWxmZmwmZmyl5e0oqKppqajoaGmm5uq
+ lpatjo61ioq5iIi6h4e7hIS8hIS9g4PAg4PChobBiIi/iIi+iIi+ioq+l5eyo6OnpaWln5+rmJizjIy+
+ hobBgoLCgIDCgIDCf3/BgIDCgIDDhobAioq9ioq9ioq+i4u8l5esoKCjo6Oio6Ojnp6qj4+6iYnBh4e/
+ iIi9hITAf3/Df3/CgIDChIS/ioq7i4u6ioq7ioq8ioq+l5exoKClo6Ohn5+mlJSykJC3jo66iYnAhITE
+ gYHFgIDCg4O7h4e4iIi7jY27kpK3k5O0lJSzk5O1oKCnpaWio6OlpKSlpKSlo6OlpKSkpaWlpaWlpaWl
+ paWlpaWlpaWlpaWmpaWnpqanpqanpqampaWlpKSko6Oko6OkpaWlpaWlpaWlpKSlpKSlpKSlpKSlo6Ok
+ oqKjoqKjo6OkpaWlpaWlpaWlpKSlo6Oko6OkpaWkpaWlpaWlIACmpqempqempqempqempqelpaalpaWk
+ pKSjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWkpKSjo6Sjo6SkpKWlpaWmpqWmpqampqempqelpaalpaWl
+ paWlpaWkpKSioqOioqOjo6OkpKSkpKSjo6SioqOkpKWmpqampqempqempqempqelpaalpaWlpaSioqac
+ nK6UlLWLi76Hh8KEhMaDg8aEhMWDg8WEhMWIiMCJib+NjbqXl6ugoJ6fn5+fn5+fn5+goJ+goKScnKmZ
+ mauVlbCWlq+RkbKMjLqLi7+Li76Li76Li7+NjbyRkbaZmayjo6ChoaGhoaGhoaGhoaGioqGjo6OgoKaf
+ n6eYmLCNjbuFhcGCgsOCgsOCgsOEhMaGhsWKir+RkbeXl6+hoaSjo6KioqOioqOjo6Sjo6ScnKqQkLmI
+ iMGIiMGIiMCFhcGDg8WDg8aFhcKJib6MjL2Ojr2cnK2lpaWmpqSlpaWlpaWkpKWjo6Kbm6qUlLKPj7iL
+ i7yGhsKCgsaDg8WCgsWFhcSLi76Tk7WXl66enqmkpKalpaWkpKWkpKWioqOjo6GdnaiSkrSIiMCCgsaD
+ g8WDg8WDg8WFhcWPj7uXl7KVlbOYmK6Zmaufn6WioqGhoaGhoaGenqOamqmWlrGPj7qHh8GDg8WBgcaB
+ gcWCgsaDg8eGhsWOjruZma6fn6iioqSioqOioqOioqOioqKfn6GXl6ePj7KKirqKiruKirqKirqGhr2D
+ g76Dg7yDg7qEhLiGhrWFhbeFhbaFhbmFhb2Ghr2IiL+FhcGFhcOFhcaKisGamrClpaWnp6Oamq+MjL+F
+ hcWGhsKFhb+Hh7qDg75/f8J/f8SBgcWDg8WLi72Pj7mPj7mVlbGenqScnKWRkbSIiMGFhcOFhcCFhb6E
+ hLyHh7WGhrqDg8OEhMeFhceFhceFhceKisGVlbKfn6Wjo6ChoaSYmLCSkriNjb2Li72KiruIiLmGhraG
+ hreLi7SOjrWOjrmPj7mRkbuRkbyfn66np6WkpKSenqiXl7GOjrmNjbeOjrWLi7eFhb2Dg7+BgcKBgcOC
+ gsaGhsOKir6Kir2MjLuYmK6kpKWmpqShoamYmLGQkLyIiMODg8WBgcWBgcOAgMKAgMGEhL+IiLuKiruK
+ ir2NjbqVlbKenqehoaOioqKjo6Cfn6WSkraMjLyKiryLi7qHh7yDg76EhLyDg7yIiLmKirqKiruKiruL
+ i7qSkraYmK+bm6qgoKWgoKWVlbKMjLyIiMGEhMaDg8iDg8SFhbyHh7eGhrmJibeRkbOVlbKVlbSVlbST
+ k7Wdnaujo6SkpKSkpKWkpKWkpKWjo6Sjo6WlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqampqempqelpaam
+ pqalpaakpKWkpKSlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6SioqOioqOjo6OkpKSlpaWlpaWkpKSjo6Sj
+ o6SkpKWlpaUgAKamp6amp6amp6amp6amp6amp6WlpqWlpaSkpKSkpKSkpKOjpKWlpaWlpaWlpaWlpaWl
+ paSkpKOjpKOjpKSkpaSkpKSkpKWlpqamp6amp6WlpqWlpaWlpaWlpaOjpKOjpKKio6KioqKioqKioqKi
+ oqKio6OjpKWlpqamp6amp6amp6amp6WlpqWlpJ2dqZKStI2Nu4uLvoyMvYiIwYWFxYODxYKCxIODxIGB
+ x4aGw5OTtJ+fpaGhn6CgoJ+fn5+fn6CgnqCgoZubqZSUsJSUsJCQs4uLvIqKwIuLvouLvouLvoqKv4+P
+ upiYr6CgpaKioqGhoaGhoaGhoaGhoaGhoaGhop2dppaWr4qKvISExYSExYODxIKCw4ODxIWFxIuLv5KS
+ tpmZr5+fqKKioqKioqKio6Kio6Kio6OjpZubrY2NvYmJwomJwIaGwoSExoSExoWFxYmJvouLu4uLu5GR
+ tp6eq6SkpqWlpaWlpaWlpaWlpaKippiYr4+PuIqKvoaGwoKCxoODxYODxYODxYWFxIeHw46OvJubqqKi
+ o6Ojo6SkpaSkpaSkpaOjpaGho5eXr4iIv4GBx4ODxYODxYODxYSEx4qKwZGRuZKSt5KStpiYsJ+fpqKi
+ oqKioqKioqGhoZycpZSUr42NuYeHwYODxoKCxoKCxYGBxIGBxYSEw46OupqarZ+fqKSko6SkpKKipKKi
+ o6Kio6Kio52dpZiYqY+PsoiIuoeHu4eHu4eHu4KCwn9/xX9/xICAwIKCu4WFuIWFt4WFt4KCvYCAwoKC
+ woSExISExYSExoSExomJwJaWs6SkpqWlpZubr5OTt5KSuJGRt4yMuoWFv4CAw39/w39/wn9/w4ODwYqK
+ vIuLvYiIwY6OuZubqZycp5KSso6OuI6OuYyMuIqKuYqKt4SEuICAwYKCxYSExoSExoWFxoWFxoqKwZiY
+ s6KipaSkoKCgpJOTsoyMvIuLvYyMu42NuYyMt4iIt4eHtoeHt4iIuoqKvIqKvYuLvYuLwJWVt6GhrKen
+ paOjpZycrJeXsZOTsZGRsY2Nt4WFvoCAwYGBwoGBw4SExIiIwYuLvYyMvYuLvpaWsaCgqKampKOjp52d
+ rZqasZSUt4yMv4aGw4SEwYSEv4KCvoiIuomJuomJvIqKvZCQt5ubq5+fpqCgpaGho6KioJ2do5KSsYyM
+ uIyMuYuLuYyMtouLtImJtoeHtoiIuImJuYmJuoqKu46OuJubq5qarJiYrp6eqKOjopycqY6OuYaGw4WF
+ w4aGw4eHv4mJt4eHuoeHtYyMspCQs5KStpKSt5KSt5WVs5qaraCgpqSko6OjpKSkpaSkpaSkpaOjpKOj
+ pKSkpaWlpaWlpaWlpaWlpaWlpaWlpaampqamp6amp6amp6amp6WlpqSkpaSkpaWlpaWlpaWlpaWlpaWl
+ paWlpaSkpKOjpKKio6KioqKioqSkpKWlpaWlpaWlpKOjpKOjpKSkpSAApqanpqanpqanpqanpqanpqan
+ pqanpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6OkoqKjoqKipKSlpqanpqan
+ pqanpaWmpaWlpaWlo6Oko6Oko6OkoqKjoqKioqKioqKioqKio6OjpKSlpqampqanpqanpqanp6enpaWo
+ mZmvjIy6ioq+i4u9i4u9jIy8iIjBg4PGgoLEgoLEg4PEjIy7mpqroqKioqKhoKCgoKCgn5+fn5+fnZ2i
+ mJiokpKvkJCyiYm7iYm+jIy/jIy/jIy/jIy/jIy+kJC5nJyspaWhoqKioqKioaGhoaGhoaGhoKChnJyl
+ lJSuiYm8g4PDgoLEgoLEgYHDg4PEhITEiIjBjo67lpaynp6ppKSjo6OkoqKjoqKioqKjoqKjoqKjnZ2p
+ kZG5i4u+iIjBhITGhITFhYXFi4u+i4u9jIy7kpKynJymo6OjpaWkpaWlpaWlpaWlpaWloKCqmpqvkJC4
+ hYXDgYHHg4PFhITFhITFhITFiYnAjY26kJC3nJyqoqKkoqKio6OkpKSlpKSlpKSln5+pkZG2hobBg4PF
+ g4PFg4PFhITFg4PGiYnBjIy+i4u/jo68nZ2so6Olo6OioqKioqKioaGjnJymjo62hobAgoLEgYHFgYHE
+ gYHEgYHDgoLCjIy3l5esnp6po6Olo6Oko6Oko6Oko6OkoqKjoqKjnp6om5uplJSuiYm5goLCgoLBgIDE
+ gYHDgYHDhIS/h4e4iIi1h4e1hYW3goK9gYHBgoLAg4PBhITEhITFhYXFiIjBjIy9kJC5n5+qpaWloKCp
+ np6rnp6rmJiyiYnBg4PGgIDEf3/Cfn7BgIC/hYW7iIi6ioq9i4u9kZG2mZmsnZ2nnJynlpaulZWwkJC1
+ iYm7h4e8f3/CgIDCgoLDg4PFhITFhYXFhobEi4vAlpa1oKCpo6OioaGjl5etk5O0kZG1kJC2kJC0kJCz
+ iYm4h4e2hoa2h4e4ioq6ioq7i4u8jIy8jo6+mZmzpaWopKSom5utmpqtlJS0i4u7g4PAgIDDgIDBgIDB
+ gYHAhYW/iYm+i4u+jIy/jY2+k5O4mZmwoqKopaWloaGooaGpm5uvmZmzkpK3ioq5iIi4hYW3h4e6iIi7
+ ioq8i4u9jIy7kZG0lZWxnZ2poaGko6OioaGimpqnlZWukpKykpKykpKxjo60h4e5h4e5hYW4h4e5iIi6
+ iIi9i4u9l5evmJiumpqtoKCnpaWioaGlkpKzjY27i4u8i4u8ioq7iIi5iYm3jIyuiYm1iIi9iYm+iYm/
+ i4u/k5O1mpqtoaGmpKSjo6Oko6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqan
+ pqanpqanpqanpqanpqano6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6OjoqKioqKipaWlpaWl
+ paWlpKSlo6Oko6OkIACmpqempqempqempqempqempqempqempqelpaalpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6SmpqempqempqempqalpaWlpaWjo6Sjo6Sjo6Sjo6Oi
+ oqKioqKioqKioqKioqOkpKSlpaampqempqenp6aioquUlLaJib+Li72Li72MjLyGhsKDg8aDg8WDg8WC
+ gsSLi7eSkq+cnKejo6GioqKioqKgoKChoZ+dnaKXl6mSkq+Pj7KJibmIiLyKir2MjL+MjL+MjL+MjL+T
+ k7mYmLGfn6ikpKOjo6SioqKioqKhoaGioqCfn6OWlq+Jib2EhMODg8ODg8KCgsKBgcSDg8aDg8aCgseE
+ hMWNjbybm6yjo6Sjo6Sjo6SioqOioqKioqOgoKWamquQkLiHh8OEhMaFhcWEhMSKir6Li72Li76SkrWd
+ naehoaChoaGioqOkpKWlpaWlpaWlpaWgoKqbm6+NjbyEhMSCgsWDg8WEhMWDg8aJib+Li72QkLednaei
+ oqKioqOioqOioqOjo6SkpKWkpKWfn6mRkbeLi72IiMCDg8aEhMWEhMWEhMWEhMWDg8aIiMKWlrOjo6ak
+ pKSjo6Sjo6OhoaOcnKiVlbCIiL6Dg8WBgcWBgcSBgcSBgcKBgcKLi7aQkLCTk66bm6iioqWjo6Sjo6Sj
+ o6Sjo6Sjo6SioqObm6uVlbKKir2EhMKEhMKCgsSCgsSBgcSCgsKKireRkayPj62OjqyDg7uAgMCBgb+B
+ gcCCgsKEhMSEhMWIiMKKisCJicGMjL6Zma+kpKalpaShoamWlrSJicKEhMiDg8eCgsZ/f8OAgL+Dg7qG
+ hreHh7mHh7uQkLWamquenqadnaeioqKdnaaWlq6Pj7aHh72AgMOAgMGAgMGAgMKCgsSDg8WFhcSMjL2N
+ jb6KisCUlLahoaijo6SdnaednaaamqaUlKyNjbWJibmIiLeGhreGhreGhreIiLiJibqKiruPj7iQkLmW
+ lrWhoaylpaicnLGUlLSOjruHh8OCgsaBgcOAgMF/f8GDg7uCgr6BgcSCgsaEhMSNjb6Ojr6Tk7mfn6yl
+ paOenqeZmbGZmbGamrGXl7GOjrWGhrqFhbiGhrmIiLqKirqKiruLi7yLi7yLi7yWlq+goKWjo6KioqOh
+ oaKZmaiSkrCRkbKOjraJibyJibqIiLmCgr2BgcGBgcOBgcSEhMSKir2RkbiXl7Gfn6ikpKKhoaaSkrSM
+ jLuKiryKiryJibyKiriOjrCGhrWGhraFhb+Dg8aEhMWEhMWLi7+YmLGhoaakpKOjo6Sjo6SlpaWlpaWl
+ paWkpKWjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqempqempqempqempqempqejo6SkpKWlpaWl
+ paWlpaWlpaWlpaWlpaWkpKSjo6Sjo6SioqKioqKkpKSlpaWlpaWlpaWlpaUgAKOjpKWlpqamp6amp6am
+ p6amp6amp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpaSkpKOjpKWlpaWlpaWlpaSkpKOjpKOjpKOjpKOj
+ pKOjpKWlpqamp6amp6amp6WlpaWlpaSkpKOjpKOjpKOjpKKioqKioqKioqKioqKio6SkpKWlpaamp6en
+ p6Kiq5mZspGRt4yMuIuLu4aGwoSExYSExYODxoWFw46OuJOTsJiYp56eoaKioaKioqKioqKiop+fopeX
+ qZOTrZGRr4mJuYODwoODxISExYeHwoyMvo2NvpOTuJmZsaGhqaWlpKOjpKOjpKOjpKKioqKioqOjn56e
+ pJCQtYSExIKCxIODw4ODw4KCxIGBxYKCxYODxoGByIWFw5OTtKCgp6OjpKOjpKOjpKOjpKKipJ+fppmZ
+ rY6OuouLvYyMvIiIwIKCxoKCxIKCxYmJv5CQt5GRtZaWr6OjoaGhoaGhoaKio6SkpKSkpqCgqpqar46O
+ voaGxYSExoSExYODxYSExYODx4iIwY+PuZeXsJ6ep6KioqKioqKio6Kio6Kio6Ojo6WlpZ+fqpKSuIiI
+ woWFxYSExYODxISExISExYSExYODxoeHwZaWsqOjpqWlpaOjpKSko6CgppWVsYeHv4ODxYKCxoGBxYGB
+ xIKCw4GBw4aGvY2NtI+PsJKSrJubpaGhoqOjpKOjpKOjpKOjpKKipZ2dqpiYroqKvoSExISExIKCxYKC
+ xIKCxIGBxoSEwIuLtJKSrJCQroODvYGBv4GBv4CAwICAwYGBwYODxIiIwYqKwIqKwIqKwI2NvZWVtKKi
+ p6amo52drY+PvYSEx4SExoSExoKCxYKCwYSEu4WFtoaGtoiIuI+Ps5KSsJKSs5WVsZycqKKioqOjoZ6e
+ pJKSsYaGv4CAw4CAwYCAwYCAwYGBxIaGw4yMvYaGxIaGxISEx42NvpycrqampKKipJ2dqZWVro2NtYmJ
+ uYiIuIaGt4aGt4aGt4aGt4aGuIiIt4yMtY6OtpSUs5SUs5ycrqiopqOjqpeXtomJwoSExoODxoGBxH9/
+ wYWFuIGBvoCAwoCAwoKCxIODxYWFxISEx46OvZ+frKeno6KippmZrJmZrJubq5eXro6OtYiIu4aGuIaG
+ t4iIuIqKuoqKuoqKuoyMu4uLvJaWr5+fpaKio6OjoqGhpJOTspCQs5CQsYyMtYmJuomJuYODv39/wYCA
+ woKCw4KCxYODxYSExISExY2NvJycq6WloaKippeXsY+PuI6OuI6Ot4+PtY+PsomJuIaGtYODvYKCxIKC
+ xYODxYODxYWFxIyMvJiYr6GhpaSkpKWlpaamp6amp6amp6ampqSkpaOjpKOjpKWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaampqamp6amp6amp6amp6amp6SkpaSkpKWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKKi
+ oqKioqSkpKWlpaWlpaWlpSAAoqKio6OkpaWmpqanpqanpqanpqanpqanpqanpKSlo6OkpaWlpaWlpaWl
+ paWlpaWlo6Olo6OkpaWlpaWlpaWlpKSlo6Oko6Oko6OkpKSkpaWmpqanpqanpqanpqanpaWlpaWlpKSk
+ o6Oko6Oko6OkoqKioaGhoaGhoaGio6OjpKSkpqamoaGqm5uwlJS2jo65ioq9hYXDhITGhITGhITGg4PG
+ hITFjIy9lZWunp6joKCfn5+foaGhoqKipKShmpqrlJSukpKujY23goLDgoLEg4PFg4PGh4fCjo66k5O2
+ lJS3mJixoqKopqakpKSlo6Oko6Oko6Oko6OioaGjm5upkpKziIi+iYm+hITCgYHEgYHEgYHFgYHFgIDG
+ hYXEkJC4nJypo6Oio6Oko6Oko6Oko6Oko6Oknp6nlpati4u7ioq6hoa+goLCgIDEgIDEh4e+kJC2kZG1
+ k5Ozm5upo6OhoqKioaGhoaGho6OioqKnmZmyjo6+hobGhITIhITGhITFg4PFg4PFgYHHjIy8mJiwnJys
+ nZ2qoqKioqKioqKioqKjoqKjoqKknZ2qk5O3iYnChYXGhYXGg4PEgoLDg4PEhITEgoLHiIjBlZWznJyr
+ pKSlpKSlpKSlpKSknJyrjo65iYm/ioq+hobDgoLFgYHEg4PDiIi9jo61kJCylJStmZmknZ2eoKCgoqKi
+ o6Oko6OkoqKlnp6pl5ewioq/hYXDg4PEg4PFg4PFg4PFg4PGhYXBi4u4kZGvjY2xg4O/gIDDgIDCf3/B
+ f3/Bf3/BgYHChoa/iYm/iorBiorBjY29lJS2mZmwoaGmpqajnZ2si4u9g4PIg4PGg4PGg4PDh4e9hoa6
+ gYG9gYG/g4PAhYXCiIi+jY23k5OymJitn5+mnp6lmpqrkZG0iIi+goLEgYHCgIDBf3/DhITAioq/h4fE
+ hYXFhITGh4fDjo69mZmypaWlpaWlmJixjo65ioq7iYm6iYm5hoa3hYW2hoa3hoa4h4e3i4u1jY20kJCx
+ kpKylJSxm5urpaWlpaWolpa2h4fFgoLJgoLHg4PDh4e6gIC+f3/Bf3/BgIDBgYHCgYHDg4PGgoLIi4vA
+ m5uwpaWlpaWlo6OmoqKjnp6kk5Owioq8ioq7iIi6h4e4h4e4iIi5ioq6ioq6ioq6i4u8k5OynJypoaGk
+ o6OioaGkmJitl5etmpqokpKvh4e7hITAgYHCgIDBgYHBgYHCgYHDgoLEgoLGhobCkpKzn5+npaWjoqKl
+ nZ2pnJyqmpqqlZWujo60ioq4iYm4goK+gIDBgYHEg4PFg4PFhITFhITFg4PFjY25nZ2qpaWjpKSkpaWm
+ pqanpqanpqanpqanpKSlo6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpqan
+ pKSlo6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSkoqKioqKjpKSlpaWlpaWlIACioqOjo6Sjo6Sl
+ paampqempqempqempqelpaWjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWkpKWkpKSlpaWlpaWlpaWkpKWj
+ o6Sjo6SmpqempqempqempqempqempqempqalpaWkpKWjo6Wjo6Sjo6Sjo6OhoaGhoaGhoaGhoaGioqOj
+ o6Sfn6iVlbSNjbyMjLyLi76EhMaEhMaEhMaDg8eDg8aJicCTk7OdnaihoaKhoaCgoKCgoKCioqKhoaOZ
+ mayUlLGNjbeEhMGBgcWBgcOCgsSEhMSEhMSIiMCPj7mXl7KgoKqlpaalpaWlpaWkpKWjo6Sjo6SkpKOh
+ oaWbm6qTk7KLi7uHh8CDg8SBgcWBgcWBgcSBgcWFhcCLi7uYmK6jo6KioqKioqOjo6Sjo6SioqSgoKea
+ mq6SkrWLi7mGhr6CgsOBgcaDg8KHh7yKiriNjbeTk7GcnKmhoaOioqKioqKioqKioqGhoaGcnKqQkLqF
+ hcaEhMeEhMaEhMWEhMWDg8WCgsaHh8GMjLyWlrKenqqgoKejo6OioqKioqKioqKjo6KgoKWVlbKHh8KD
+ g8eDg8eEhMWEhMSDg8SCgsSCgsaIiL6UlLOdnaqioqSjo6SkpKWlpaShoaiXl7GOjrqNjbyIiMCFhcSD
+ g8WFhcOKir6MjLuTk7OUlLGYmKqdnaGenpydnZ2goKChoaGkpKKhoaeUlLOKisCEhMaGhsSEhMSDg8WE
+ hMWDg8aHh8KNjbqUlK+VlauOjrOGhr2IiLmHh7uFhbyDg7uCgruCgryGhruHh72Jib+OjruVlbScnKyh
+ oaaioqSlpaOfn6uPj7qEhMWGhsOGhsOJib+Jib2Fhb+AgMGAgMKAgMWGhsSOjryTk7aVlbOXl66enqaY
+ mKyRkbaMjLyHh8CCgsaCgsSAgMODg76Hh7yHh8GFhcWFhcWIiMKOjruQkLmWlrOkpKWlpaWbm6+Tk7aQ
+ kLaOjraIiLmGhreFhbaFhbeHh7aKireKiriLi7iMjLePj7SZmamgoKOioqSjo6abm7GLi8KHh8WJicGI
+ iMCEhMCAgMN/f8F/f8GBgcOBgcOBgcOBgcWHh7+MjLyVlbWfn6umpqSmpqWhoaeVlbGLi7qJib2KiruK
+ irqIiLmHh7mJibmJib2EhMGFhcCGhsGKir6Tk7Oenqajo6GioqOfn6WenqeYmK6NjbiDg8CBgcOBgcOB
+ gcKAgMGAgMKBgcOCgsOIiL+Kir2Vla+goKSkpKOkpKSioqWfn6iamq2SkrOLi7iIiLmEhL6AgMKAgMKA
+ gMSCgsWDg8WEhMWEhMWIiL6RkbWdnaqjo6Ojo6SkpKSmpqWmpqempqempqempqakpKSjo6Sjo6Sjo6Sj
+ o6SkpKSlpaWlpaWlpaWlpaWlpaWmpqampqempqempqempqekpKWjo6SlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWkpKSjo6Sjo6SkpKSlpaUgAKSkpKOjpKOjpKSkpaWlpqWlpqWlpqWlpqSkpaOjpKOjpKOjpKSk
+ paWlpaWlpaWlpaWlpaWlpaSkpKSkpKWlpaWlpaWlpaSkpKOjpKWlpqamp6amp6amp6amp6amp6amp6Wl
+ pqWlpaWlpKSkpKOjpKOjpKOjo6KioqGhoaGhoaKioqKio56eppSUso2Nu4uLv4eHwoSExoSExoODx4SE
+ xouLvpeXsaCgpqOjoqKioqGhoqGhoaCgoKCgoJqaqJaWr46OuoWFxIGBxoKCxIGBw4KCxIODxYSExIiI
+ wY6OupubrKSkpaampKWlpaWlpaWlpaSkpKOjpKKipqCgp5ubqpKSs4eHwYODxoKCxoKCxIGBxIGBxIGB
+ xIeHvZCQs52dpqSkoKKioqKioqOjo6Sko5+fp5iYsJKSt42Nu4iIv4ODxYKCxoODxYSEw4eHvoeHvoWF
+ wY6OtZ2dpaOjoKKioqKioqKioqOjoaGhoZeXq4uLvYODxoODxYODxYODxYKCxoKCxYaGwYuLvIiIwJCQ
+ t56eqKSko6OjpKKio6KioqKioqOjoaCgpZGRtYeHwYeHwYaGwoSExISExIODxIKCxYiIvZGRtJiYrZ6e
+ qKOjo6Kio6OjpKWlpJycrZGRuI6Ou4mJwYWFxYSExoSExoaGxImJwIiIwYqKvo+PuJiYrZ+fo6Cgn56e
+ np6enqCgn6GhopycqpCQt4eHw4mJwIaGxISExYSExYWFxImJwI6OuZKStpeXrZmZqJSUrY+PsouLtoqK
+ uIqKuIeHuIWFuYWFuYWFu4iIu42NuJOTtZeXspqarp2dq5+fqaSkpaKip5aWs4qKv4qKv4uLvoqKvoaG
+ wYKCw4GBwoGBwYaGv4yMvZKSuZOTuZKSuZaWsZycqJiYrJGRto2Nuo2NuYmJvIaGwIWFv4SEu4ODvoOD
+ xIWFxIWFxY+Pu5OTt5KSt5eXsaKip6WlpaOjp5qar5KSto2NuomJu4iIuIaGuIaGtYmJtYqKuYmJvYuL
+ vIqKvIyMuZWVrpycpZ+fpKOjo6KiqJmZtI+PvoqKw4aGxIKCxoGBxICAwYGBwYGBw4CAxICAwoaGu42N
+ tZCQtJSUsp6erKenpKWlpZ6erI6OvYeHwYmJvImJuoqKuYiIuYeHuIaGu4SEwoKCxoKCxYKCxYKCx4yM
+ u5ubqKOjoKKio6SkoZycqY2Nu4SExoKCxYCAxIGBw4GBwoCAwYCAwoGBw4KCwYeHvoaGwZCQtZ2dp6Ki
+ o6GhpaOjpJmZr5GRt42NvImJvoWFv4CAw4CAwX9/wYCAw4KCxYODxYWFw4iIv5SUs5ubrJ2dqqCgp6Oj
+ pKOjpKSkpKWlpaamp6amp6amp6ampqSkpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaSkpKampqam
+ p6amp6amp6WlpqSkpaSkpKSkpaSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKOjpKOjpKSkpSAApqampaWk
+ o6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlpaWlpaWlo6Oko6OlpaWl
+ paWlpaWlpKSko6OkpKSlpqanpqanpqanpqanpqanpqanpaWnpaWmpaWlpKSko6Oko6Oko6OkoqKioaGg
+ oKCgn5+imZmrlJSzjY26hobCg4PGhITFhITGhYXFiIjCkZG3n5+npKSjoqKjoqKjoqKjoaGioaGgn5+f
+ lZWsjY26hYXEg4PHhITFg4PEgoLDgoLEhITEiYnAjo67kJC4nZ2qoqKkpKSkpaWlpaWlpaWlpaWlpaWk
+ oKCnnp6pmZmujY26goLGgoLFgoLFgoLFgoLFgoLEgYHDiIi6lZWpnp6goaGgoqKioqKioqKio6Oinp6p
+ lJS1jIy+iIjBg4PHg4PGg4PFg4PFg4PEgoLFgoLEhITDjY21m5umo6OgoqKioqKioqKioqKjoaGimpqp
+ jY25g4PFg4PFgoLFgoLGgoLGhYXCioq8iYm+i4u8lJSyn5+mpKSjo6Oko6OkoqKjoqKioqKhnZ2oj4+3
+ jIy8ioq9hobBg4PFgoLFg4PDiIi+kZGykZGxlZWun5+koqKioqKjoqKjoqKjmZmvjo69iYnBhITHhYXF
+ hYXFhYXFhITGg4PHg4PGgoLHi4u+mJiuoaGioaGhoKCgnZ2dnp6cnJyimJisk5O1jIy9ioq+hYXEhITG
+ g4PHhobFjo67k5O1k5O0mZmunp6mm5umkpKwiYm6iYm6iYm5iIi6hoa7hoa6hoa4iYm4jo60j4+0kJC4
+ kZG5kZG6mpqvoqKmpaWknZ2skJC5jY28jIy+hobCg4PEgoLDgYHCgYHBh4e9iYm+iYnBiorCjo69lJS2
+ mZmtnp6lmpqqlJSxk5OzkZG2i4u7iYm7g4O/f3/CgoLDg4PEhYXEkJC7kpK5kZG5lJS1m5utpaWkp6ei
+ m5uvj4+8i4vAi4u8ioq6iIi3iYm0iIi2iIi6ioq9iYnAiYnAiIjBiYm/kJC2mZmqoaGho6Oho6OmmZm0
+ i4vChYXIhYXHg4PFgYHDgIDBgIDCgoLDhYW/jIy2i4u2j4+0l5esn5+mpKSlpaWloaGplpa1kJC6jo64
+ ioq4iYm5h4e5hIS5gYG/gIDEgoLEgoLEg4PFg4PFjIy6m5uro6OioqKio6OimZmui4u9hobEh4fChYXC
+ gYHEgYHDgIDBgIDBgYHCgYHCgYHEg4PEjY25mJitnZ2onZ2oo6OkmZmvkJC4jY28iIjCgYHHgoLEgYHC
+ f3/BgIDCgYHEg4PEhYXDiYm/k5O0mJiwmJiwm5uspKSjo6Oko6Oko6OkpaWlpqampqanpqanpqampaWl
+ o6Oko6OkpKSko6OkpaWlpKSlpKSlpKSlo6OkpKSkpqampqanpqanpqanpqanpKSlo6Oko6Oko6OlpKSl
+ paWlpaWlpaWlpaWlpaWlpaWlpKSko6OkIACmpqelpaakpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWjo6SkpKSlpaWlpaWlpaWjo6Sjo6Slpaampqempqempqem
+ pqempqempqempqalpaWlpaWjo6Sjo6Sjo6Sjo6OhoaGenqCbm6aTk7GMjLuFhcODg8eFhcaFhcaFhcaL
+ i7+MjLyRkbednaqjo6Sjo6SioqOioqOioqKhoaGenqKRkbCFhcGBgceDg8WDg8WEhMWDg8OCgsOHh72L
+ i7uMjL2SkrWenqijo6Sjo6SkpKSlpaWlpaWlpaWmpqWhoaiZma6Pj7mGhsODg8SDg8aDg8aDg8aDg8aD
+ g8WFhcKPj7GcnKGgoJ2goKChoaGioqKioqKhoaOdnamVlbOKisCDg8eEhMaEhMaDg8WCgsWCgsWDg8SF
+ hcGMjLqXl6ufn6ChoaChoaGioqKioqKhoaOhoaObm6iOjraDg8WEhMaEhMaEhMaHh8KLi7uJibyKiryW
+ lq+fn6aioqOioqOjo6Sjo6Sjo6Sjo6OenqWVlbCKir6Kir6Dg8SBgcaDg8WEhMSHh8KSkrKTk7GQkLOY
+ mKmjo56hoaGioqOioqOhoaOYmK6Li7+EhMeGhsWFhcaFhcaFhcaFhcaEhMaFhcSGhsKSkrSfn6ejo6Gh
+ oaGhoaGgoKCenp6bm6GWlqqQkLSKir2EhMWDg8aEhMaEhMaGhsONjbyTk7aYmK+dnaijo6OgoKWSkrCN
+ jbaKiriKireKiriKiriKiraHh7WIiLiHh7qHh7yJib2Kir2Njbyamq+jo6ampqOgoKmSkreMjL6GhsSF
+ hcaEhMWCgsOBgcKAgMKAgMWAgMaCgsaIiMKQkLqWlrOcnK6ioqSenqWWlq6Pj7eLi72Li72FhcOBgcOB
+ gcGBgcGCgsGFhcGKir+Li7+Li7+OjryXl7KioqWmpqObm6+QkLuMjL6MjLyMjLyLi7aIiLmGhrmHh7mH
+ h76CgsaDg8aDg8aCgseHh8KTk7OenqOioqKjo6OioqeZmbOLi8GEhMiEhMWCgsOBgcKBgcOGhsCLi7uK
+ ir2Jib6OjraYmKmenqOenqalpaWnp6Ohoamdna6YmLGPj7eJibuIiLyCgsCAgMKBgcKBgcOCgsSDg8KJ
+ ibuSkrKamqqfn6WioqKjo6GamquTk7SRkbaQkLeLi72Dg8OCgsGBgcCAgMGBgcGBgcKDg8KHh7uOjraU
+ lLKVlbCZma2ioqOenqiZma6Tk7WKir+EhMaDg8aBgcOAgMGAgMGBgcKBgcOCgsWDg8aHh8KJicCNjbuY
+ mK6kpKOjo6Sjo6Sjo6SkpKSlpaampqempqempqempqakpKSjo6SlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sj
+ o6SlpaWmpqampqempqempqempqekpKWjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6QgAKWl
+ paOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWl
+ paampqamp6amp6amp6WlpaSkpKOjpKSkpaamp6amp6amp6amp6amp6amp6amp6WlpaWlpaOjpKOjpKOj
+ pKKipZycqZmZpZWVrYiIv4GBx4ODxYSExYWFxoyMvo2NvpCQuZiYsJ6eqKOjpKOjpKOjpKOjpKKio6Gh
+ pJmZqo2NuISEwYGBxIGBw4GBw4KCwoKCwoaGvoeHvIaGv4uLu5qaq6KipaOjpKOjpKOjpKSkpKWlpaWl
+ paKiqJycr5CQuoaGw4eHwoWFwIKCw4KCxYODxYODxYWFxIyMvZeXrZycn56enZ+fn5+fn6GhoaKioqKi
+ o5ycqZaWsJCQuYSExoSExoSExoKCxYGBxIODxIaGwIyMupaWrJ6eoqGhn6CgoKCgoKGhoaKioqKiop6e
+ p5WVsomJv4ODxYSExoODx4iIwoyMvYuLvoqKvZaWrp2dpKGhoqKio6Kio6Kio6OjpKSko6Cgp5mZrpKS
+ tYqKvoSExIKCxYGBxoaGwoyMvIyMvJKStZKSs5aWrZycpKCgnqGhoaGhoaKiop6ep5KStYqKv4yMvoyM
+ voaGxYWFxoWFxoWFxoWFxYiIwY2Nu5mZraGhpKOjo6Kio6GhoaGhoZ6eopaWp4+Pr4uLtomJuoODxISE
+ xoSEx4iIw4yMvY2NvJOTtp6eqqCgpqGhpKGhpZqaqpmZp5OTr4+PsY+PsJCQsY6OsoWFt4eHuoiIuoiI
+ u4mJvIuLupKStJqarqKip6amo6CgqZKSt4eHxIWFxoWFxYWFxYODxYCAw39/wYCAwoGBxYaGwI6OuJaW
+ s52drZ2drZ6erJmZr4+PtoqKu4mJu4mJu4SEwYGBwoGBwYKCv4SEv4KCxISExYSEx4iIw5CQupmZsJ+f
+ qaSko5ubrJGRto6Ouo2NuI2NuImJu4iIuoeHt4SEu4GBxIKCxIODxYODxoiIwY2Nu5SUsqCgpKGhoZ6e
+ pp6eqJqarY+PuoSExoODxIGBwn9/woSEvYmJuomJvIqKvYmJvpSUsJycpp2dpZ6epaKio6SkpZ6erJeX
+ tJCQu4uLv4uLvYODwoGBw4CAwYCAwYGBwoKCwomJu46OtJiYqp6epZ6epaKioqKiop+fppmZrpWVspGR
+ t4qKvYmJvIiIuYKCvoCAwoGBwoODwYmJu4mJu4mJuoqKu46OuJaWrqKio6GhpaKipKCgp5aWs4iIwYSE
+ xoODxYKCw4GBwoGBwoGBw4GBxIKCxYODxYKCx4mJwJiYr6Sko6OjpKWlpaWlpaWlpaWlpaWlpaamp6am
+ p6amp6ampqSkpKOjpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKSkpKampqamp6amp6amp6amp6SkpaOj
+ pKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpSAApaWlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Ok
+ o6Oko6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpqampKSko6OkpKSl
+ pqanpqanpqanpqanpqanpqanpqanpaWlpaWlpKSko6OjoqKlnZ2ql5euj4+1iYm6iIi8iYm+ioq+i4u+
+ jIy+kpK4lJS1l5exnp6oo6Oko6Oko6Oko6Oko6OjoaGknJyqj4+4hYXBgYHEgYHEgYHEgoLDhoa9hoa9
+ hYW/ioq5lparnZ2koqKio6Ojo6Oko6Oko6Oko6Okpqaknp6skJC7iIjDiIjDhobCgoLDgoLEg4PFgoLG
+ hYXEi4u9kZG2np6noaGgnp6dnZ2dn5+fn5+foqKgn5+lmZmsjo65hITFhITGhITGhITGg4PFg4PEhYXB
+ jY25l5etn5+koaGhoaGgoKCgoKCgoKCgoqKgn5+ll5evkpK1kJC2ioq+i4u9i4u+jIy+i4u+jIy8l5ew
+ np6nn5+ioKCgoqKioqKjoqKjoqKjpaWhnZ2qkZG3ioq/hITEgoLEgIDGhYW/iYm7jIy7kpK2k5O1l5ev
+ np6loaGhoaGgn5+foaGho6Ogn5+mk5O1ioq+i4u9hYXEhITGhITGhITGhYXFiIjCjY28l5exoKCmo6Oj
+ oqKjoqKjoqKjoqKgmpqokZGxjIy2iIi6goLCgYHDgYHFiIjBjY29j4+8lZW1l5exnp6po6Olo6OjoqKj
+ oKClm5uqk5OwkZGykZGwjY2yh4e5hYW4h4e5iIi6iYm7ioq7ioq7jY27kpK1oKCop6eioqKnmpquk5O2
+ kpK3lZW0i4u+gIDGgYHCgIDBf3/ChYW9jo62k5OxlJSxlZWzlpa0m5uvm5uvlJS0jY24iYm7hITBg4PC
+ goLCgYG/gYG+gYHDgoLEg4PFg4PGiYnBkJC7k5O3mJixo6OmoKCnmJivk5O0kJC1ioq7ioq7ioq5hYW9
+ gYHCgYHCgYHDgYHFh4fAjIy7k5OznJyoo6OhoqKinZ2lmZmrkZG0ioq7ioq8iIi6hoa5hIS5hoa6ioq8
+ i4u9jIy9kJC4mZmvm5uqmZmpmpqooaGhoqKjmZmxj4+9jIzAi4vAhobFg4PFgoLDf3/Bf3/BhITAioq7
+ jY29jIy9kpK4mZmvnZ2noaGhoqKio6Ohm5urkJC3ioq7iYm8ioq7hYXAgYHBgIDCgoLAiYm7ioq8i4u9
+ i4u9ioq+jIy7k5OxoKCjo6OinZ2pnJyrmpqvkZG3jIy9hITEgYHDgIDBf3/BgIDCgYHDgYHEgYHGhobD
+ jY26l5evpKSjo6Oko6OkpKSlpaWlpaWlpaWlpaWlpqanpqanpqanpqampaWlpaWlpaWlpaWlpaWlpKSl
+ o6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6OkpaWlpqanpqanpqanpqanpaWl
+ IACjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SlpaWl
+ paWlpaWlpaWlpaWlpaampqempqempqelpaajo6Sjo6SkpKWmpqempqempqempqempqempqempqelpaWm
+ pqWjo6WdnamXl6+RkbiMjLaKiriKiruLi7yMjLuNjbuSkraUlLWXl7Kdnayjo6Wjo6Sjo6Sjo6Sjo6Si
+ oqWenqiXl66OjrmKir2Jib2JibyIiLyHh76IiL2Ghr6MjLWWlqmdnaKfn6ChoaGioqKjo6Sjo6Sjo6Sj
+ o6SgoKaXl7OMjMCHh8SHh8SEhMWCgsWCgsWBgcaFhcKKir2NjbuTk7Sfn6Wjo6KhoaGenp6dnZ2fn5+c
+ nKSZmamOjriEhMWDg8aDg8WDg8WEhMWEhMSGhsGMjLqTk62bm6agoKKhoaGhoaGhoaGgoKCgoKCdnaOY
+ mKyTk7OSkrOSkrOLi7qGhsGFhcOGhsSHh8OOjruamq6goKahoaKhoaGhoaGhoaGioqOioqOgoKWVlbKJ
+ icGEhMaDg8aCgseGhsCHh7uKirePj7KSkrOVlbGVlbKdnaijo6ChoaGgoKCfn5+dnaSYmKyQkLeJicCF
+ hcSEhMWDg8WEhMaGhsWIiMKOjruZmbChoaejo6Sjo6Sjo6SioqOioqOkpKGZmayOjraHh72CgsOBgcOB
+ gcOBgcSEhMOFhcSKisGYmLKenqqgoKeioqWjo6Sjo6OhoaSamqyTk7OSkrKPj7SIiLqHh7mFhbiFhbiI
+ iLiKirqLi7yMjL2Njb6Tk7ecnK2jo6akpKShoaecnK2YmLGMjL2FhcaDg8aBgcSAgMOFhbuJibmNjbmO
+ jrqNjbuNjbyRkbegoKqjo6eZmbGMjL2FhcODg8ODg8OEhMCCgr+AgMGBgcKCgsSDg8WEhMWEhMWHh8KQ
+ kLmcnK2jo6akpKWjo6Wfn6eXl7CKiryKirqFhb+BgcKAgMKAgMKAgMSHh7+OjrmTk7WVlbOYmK+dnamh
+ oaWhoaKcnKaQkLKHh7uJibmIiLmGhrmFhbiGhrmIiLuKiruPj7mSkraVlbOUlLSUlLKamqihoaChoZ+X
+ l66NjbuKir+Hh8GDg8aBgcWAgMOAgMGBgb+EhL+GhsCLi72Njb2Njb2OjryUlLSgoKWioqOioqCcnKeY
+ mK2Wlq6OjrWDg8CAgMN/f8OBgb6GhriJibmKiruLi7yMjL2Li72Li72Pj7mbm6mhoaGcnKmWlrCSkrWM
+ jLyGhsODg8WCgsSAgMJ/f8F/f8GBgcOAgMSEhMCMjLeRkbSWlrCjo6Gjo6Sjo6Sjo6SkpKSlpaWlpaWl
+ paWlpaWmpqampqempqempqelpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKWmpqempqempqempqcgAKSkpaOjpKOjpKOjpKOjpKOjpKSkpaSkpaSk
+ paSkpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaSkpaSkpKSkpKSkpKSkpKampqamp6amp6amp6Wl
+ paSkpKOjpKSkpaamp6amp6amp6amp6amp6amp6ampqenpKGhqZWVs4+PuIyMuoyMuIuLu4yMvYuLvYeH
+ wYiIwYmJv4+Pupqar6SkpqWlpaSkpaOjpKOjpKSko6Cgp5aWsZCQt4yMuoqKvYmJvomJvYqKv4eHwoaG
+ woODw4uLuJiYpp+fnZ+fn6CgoKGhoaOjoqOjpKOjpKKipZmZro2NvYiIwoeHw4WFxYODxoODxYODxoaG
+ woqKvo6OupKStZiYrqGhpKOjo6Kio6CgoZ6enZ6enZaWqouLuIODxIGBx4KCxYODxYODxYODxoeHwo+P
+ uJSUsJWVrZmZpaCgoaKioaGhoaGhoaGhoaKin5eXqpKSsJKSsZGRso2NuIaGwIODxIODxYODxoaGxI2N
+ vJiYsKCgp6OjpKKioqGhoaGhoaGhoqOjopqarIuLvYODx4ODyIODx4mJwYmJvYuLuZCQtJOTsJOTr5WV
+ r5iYrZ+fpqOjoqKioqGhoaGhn5aWqo+PtYyMuYiIv4ODx4SExYODxoSExYiIwZCQuZiYsJycraSkpaWl
+ pKOjpaOjpKOjpKKio6CgpZOTs4iIvoODw4KCxYGBw4GBw4GBw4GBxIGBx4aGxJWVtqGhqKKipaOjpKOj
+ pKOjpKOjpKCgpZWVsY6OuIqKu4eHvIeHuoWFuYWFt4eHuImJuYuLuYyMu42NvY+PvJGRuZubrqWlpKKi
+ p5aWs4uLv4KCyIGByYODyIODxIaGvYaGu4eHvIeHwImJwY2NvZCQuZaWsqGhpqeno56erI6OvISEx4WF
+ woSEwYSEwoKCwoGBwoGBwYKCxISExYODxoSEw4iIv4+Pu56erKSkpaampKOjpZ6eqZaWs4uLvYWFwYGB
+ xICAxX9/w4CAwYWFvIyMto6OuI6Ouo2Nu42NvJCQuZubrqKipKOjoZeXq4qKuImJuYiIuYaGuIWFuIaG
+ uYiIuYyMt5KStpOTtZKStpSUtJmZrpycqJ6epaKin5mZqYuLuISEwIWFwISEwYaGvIODvoCAv4GBvoSE
+ v4iIv4yMvY2Nvo6Ovo2NvZCQuZqaraGhpaKioqCgop6epZmZqpKSs4eHvYWFvYODvISEuIaGtoeHuIqK
+ uoqKuomJvoiIwYeHwoqKv5aWr6CgoqGhoZiYrIyMu4WFxISExoODxYKCxYGBwoGBwYCAw4KCxIeHv46O
+ t5KSspSUsZqaq6OjoKOjoqOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpqWlp6amp6amp6amp6WlpaWlpaWl
+ paWlpaWlpaSkpaSkpaSkpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpqWlpqWlpqWlpaWlpaWlp6am
+ p6ampyAApKSlo6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlpKSko6Oko6OkpKSlpKSkpKSko6OkoqKj
+ oqKjoqKjo6Oko6Oko6Oko6OkpKSlpqampqanpqanpqanpqampKSko6OkpKSlpqanpqanpqanpqanpqan
+ pqanpqamn5+slJS2j4+3j4+1kJC1kpK1jo67h4fEhITGhITHhITGj4+4n5+opqajpKSlpKSlo6Oko6Ok
+ paWinp6pkZG4jY29i4u/h4fChYXDhYXDhobEhITGhITGhITFjY24mZmmn5+cnp6en5+foKCgoaGho6Oj
+ pKSjo6OkmpqujIy9hobDhITFgoLGgoLGgoLFhobCioq+jo66k5O0mJisnp6loqKjoqKjoqKjoqKjoKCh
+ m5ugjo6zhoa/g4PDg4PEgoLEg4PFg4PFg4PGiYnAkpK1l5evmZmsnZ2koKCgoaGgoaGhoaGhoaGhnp6j
+ k5OvkZGxkJCxi4u3hITAgoLEgoLEgYHFhITCiYm9kZG3nZ2roaGmo6Oko6OkoqKioaGhoaGgoqKimpqs
+ i4u8hITFh4fDh4fDjIy9jY24kZGzk5Oxk5OwlZWrlpapnp6koqKjoqKjoqKjoaGio6OflJSui4u5iIi9
+ hobAhITFhITFhobDiIi+jIy5lJSynZ2qn5+po6OmpKSlpKSlo6Oko6OkoqKkl5evi4u9g4PGgoLHg4PF
+ goLEgoLEgoLEgoLFgYHGhYXDkpK2oKCopKSlpKSko6Oko6Oko6Oko6OjlZWxjIy9iYnAiYm9iYm6iIi5
+ hYW2hoa2hoa6hYW+hoa/iIjBiorAj4+7mZmxo6Omo6OnlJS1iYnCiYnDi4vAiorAh4fAiIi8g4O9g4O/
+ hoa/iYm/jo67mZmwn5+oo6OjpaWioaGolpa0jY2/iYnAhobCg4PFgYHEgIDCf3/BgoLDg4PFhYXDioq+
+ jIy7jo66mZmuoKCopKSkoqKnl5exjY28i4u+hobDhobChYXAg4O/hIS7ioq0jIy1i4u7iIjAhobDhYXE
+ hobElJS0oaGnpaWgnp6mkZGziIi8iIi7hoa5hYW5hoa3iYm0jo6yk5O0k5O1lZWzmpqtnp6pnZ2pm5uq
+ oaGinp6kkJCyh4e8iYm5h4e6h4e7hIS9goK+g4O9hoa8i4u7jIy9jY2+jo6+jY29jo68l5ezo6Olo6Ok
+ o6OhnZ2mk5Oyjo64i4u7ioq6iIi4hoa3hYW3hYW2iIi4iIi9hITChITEhITFh4fDlJSzn5+jpKSdnJyo
+ i4u8goLIhITFg4PFgoLFgYHEgIDCgIDCg4PEh4fAioq+jo64l5etn5+koaGjoaGjo6Ojo6Oko6Oko6Ok
+ pKSlpaWlpaWlpaWlpKSlpKSmpaWmpaWmpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6Ok
+ o6Oko6Oko6OkpaWlpqampqanpqanpaWmpaWlpaWlpqampqanIACjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sk
+ pKWlpaWlpaWlpaWkpKSjo6SlpaWlpaWlpaWkpKSjo6OioqKioqKjo6Ojo6Ojo6Ojo6OioqOlpaWmpqam
+ pqempqempqempqakpKSjo6SkpKWmpqempqempqempqenp6agoKqZmbCWlrOUlLKSkq+Tk6+SkrOKir+D
+ g8eFhcWHh8OPj7uZmaygoKOjo6OkpKWkpKWkpKWkpKSkpKOenqmSkraLi76IiMKEhMWDg8aDg8aDg8WE
+ hMWFhcWNjb2YmK2goKKgoJ+enp6fn5+fn5+fn5+hoaGioqOgoKebm62QkLmIiMKFhcOGhsKFhcKFhcKK
+ iryNjbmRkbaWlrGcnKmioqGioqOioqOioqOjo6OgoKSWlqyKiriIiLuGhr6Dg8OCgsWEhMaEhMaEhMeG
+ hsSNjbyXl7Cfn6ajo6KhoaCgoKCgoKChoaGgoKKamqiTk6+RkbKLi7eDg8CBgcSCgsOCgsODg8KHh72M
+ jLeWlrCioqSjo6Sjo6Sjo6Sjo6SioqOhoaKdnaWYmKuRkbaMjLuOjrmOjrmLi7yNjbiOjreNjbmPj7eV
+ la6cnKOgoKCioqKioqOioqOioqOhoaKTk7GJibuEhMGCgsODg8GHh8CNjbqPj7aRkbKWlq6cnKukpKOk
+ pKWkpKWkpKWkpKSioqWenqqRkbeHh8KFhcSFhcSEhMWEhMWEhMaEhMaDg8aDg8WJib+VlbGgoKekpKWk
+ pKWkpKWjo6Sjo6SioqWWlrKOjrqNjbuMjLmKirqJibmIiLeFhbiCgr+AgMSAgMOBgcWLi7yYmLGgoKmk
+ pKWkpKacnKyYmLCXl7CUlLSOjrqIiL6Fhb+Dg72EhL2Hh7qKirqRkbadnaqioqWhoaaioqSioqSfn6qc
+ nK+RkbqGhsSDg8aCgsSAgMJ/f8GAgMKEhMGKiryNjbqMjL2NjbuSkrSYmK+ioqekpKWZma+Pj7qRkbiP
+ j7qOjrqNjbiLi7aKirWMjLSJibqIiL6GhsOEhMaEhMWHh8KQkLegoKelpaKhoaWXl6+Jib2JibuJibuI
+ iLiJibKMjK6Nja6QkLKSkrSYmLGcnKudnamdnamfn6eioqOioqGXl6uNjbWMjLaIiLqEhMCDg8CDg76E
+ hLqIiLiKirqLi72MjL6MjL+Njb6QkLuXl7OioqekpKSkpKKdnaiQkLWLi7uKiryLi7uKirqIiLiGhraF
+ hbaFhbqDg8CDg8SDg8WCgsWFhcSRkbaenqejo6Cbm6iMjLqCgseCgsaCgsaDg8eEhMODg8CAgMGCgsOC
+ gsaFhcWOjruZma6fn6ecnKicnKmhoaSjo6Kjo6Sjo6Sjo6SkpKWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sk
+ pKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6SkpKSmpqampqempqelpael
+ paWlpaWmpqYgAKWlpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaOjpKOjpKSkpaWlpaWl
+ paWlpaKioqKioqKioqKioqKioqKioqKioqWlpaWlpaampqamp6amp6amp6WlpaOjpKOjpKSkpaamp6am
+ p6amp6ioppycrZWVspeXsJaWsJOTrZKSsIiIv4ODxoWFxIeHw4+Pu5qarqOjpqSko6KioqOjpKSkpaSk
+ paWlpKGhp5qarZKStoeHwoSExYODxYODxYODxYODxYaGxI2NvJiYrqGhpKOjoaCgoJ+fn56enp+fn5+f
+ n6Ghn5+fo5iYrJKSto2NvI2NvYyMu4qKuoqKuouLu4yMupCQs5OTspaWsZ2dqKKio6KioqKio6Kio6Ki
+ op+fp5KStouLuoSEv4GBwoGBxIKCxYSExoSExoWFxoODx4uLv5ubrqSkoqKioqKioqCgoKCgn6GhoZ2d
+ o5mZqZOTsYuLuIWFwYKCxoODxIODxIODw4iIvIqKuYyMt5WVraKioaOjo6OjpKOjpKOjpKKipJ6ep5aW
+ rpCQtY+PtZCQtJCQtJGRs4qKvISEw4ODxoKCxoaGwpOTsp+fpaCgn6CgoKKioqKio6CgpZmZroyMuoWF
+ w4ODxIKCwoODwImJupGRtJKSs5eXrpqaqJubp6OjpKOjpKSkpaSkpaWlpKKip5eXspCQuYyMvIuLvYiI
+ wYSEx4WFxoWFxoWFxoWFxIeHwI6OuJycqaGhoqSkpKSkpaSkpaSkpaOjpKGhpp2dq5aWsZOTso6OtIiI
+ uoiIuYeHuYCAwH5+woGBwYGBwoGBw42NtZqaqqKipqWlpaSkpaOjpqOjpJ2dp5CQtYWFwISEv4WFvoOD
+ vIeHuoiIuYyMtpOTsJiYrZiYsJeXsZ2dqaOjo6Wlo6WlpZiYs4iIxISEx4ODxICAwn9/wYGBv4iIuYmJ
+ uomJvYqKvouLvouLvpGRt6Cgqaeno6Ojp5ycrZubrZSUtJGRuJCQt46OtYyMtYiIuoeHvoWFxIWFxYWF
+ xIeHwY2NuZCQt5ycqqSko6KippeXsYyMvIyMuouLuoyMto2NsI2NrY2Nro+PsJCQspCQt5WVtJubrZ6e
+ qKOjpKOjpaSkoJubqI6OtoaGvYSEwYSEwISEwIaGvIeHuIeHuImJuYuLvIuLvYuLvpCQupaWtZiYsp6e
+ q6OjpqWlo5+fp5aWsJCQtYyMuouLu4uLu4mJuYeHuYSEuoGBv4GBwoKCxYODxYODxYWFw42NuJubq6Oj
+ o56ep5CQtoWFwoWFw4WFwoSExIeHvYeHu4CAwoKCw4SExZGRupWVtpWVtpeXs5WVsZWVsJ+fpaOjoaKi
+ o6OjpKOjpKOjpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paOjpKOjpKOjpKOjpKOjpKOjpKWlpaamp6amp6amp6ampqWlpaWlpSAApaWlpKSkoqKjoqKioqKjo6Ok
+ o6Oko6Oko6OkpKSkpaWlpaWlpaWlo6Oko6OkpKSlpaWlpaWlpaWloqKioqKioqKioqKioqKio6OkpaWl
+ paWlpaWlpaWmpqanpqanpqanpaWmpKSko6Oko6Oko6Oko6OkpKSjnp6pmpqum5utmJivk5O0hobAg4PD
+ hYXEhobDjo67mZmuoqKmo6OlpKSlo6OkoqKio6OkpKSloaGnnJyskZG4hobDhITDgoLFgYHDgYHEgoLG
+ hITEjIy8mJiuoaGlo6OioqKjoqKjoaGhn5+fnp6en5+foKCenp6hmJirjIy8i4u+jIy9jIy9i4u8iYm6
+ ioq6kZGzkpKylZWvnJyno6OioqKjoqKjoqKioqKioaGkmpqsjIy7h4fCg4PEgoLEgoLEg4PFhYXHhYXH
+ hYXGiIjClJS2oKCoo6OjoqKjoqKioqKioaGgnZ2hmJiqk5OxjIy5hYXBg4PFhITFhITFhYXEioq9ioq7
+ jIy2k5Oum5unoKCgoqKho6Oko6OkpKSjoqKlmZmukpK1j4+2j4+0jY23ioq7ioq7hITDhITEhITEhYXE
+ i4u8mJiroKCioqKhoKCgoKCfoKCjmpqsjY28hobDhITDg4PCgYHDgYHDgYHDiIi8j4+2lpavnJymoqKg
+ oaGho6Oko6OkpKSkpKSkn5+pkZG4jIy9i4u+h4fCg4PGhITFhYXGhYXGhITGiIjCjY28lZWxoKCkoqKi
+ o6OjpKSlpKSlpKSlpKSlo6OkpKSjoKCnkpK0iIi8iYm6iIi5gYHAf3/BgIDBgoLDgoLEgoLEh4e8jo60
+ lZWwnJyto6OnpaWlnp6rkZG5iIjBhobAhYW+hIS9hoa4hYW5jIyyjo6ziYm8iYm8ioq+ioq/kJC4mpqt
+ oaGmoqKllZWziIjChITGg4PEgIDCgIC/hYW2iIi3hYXBg4PHhITGhITGhITGkJC5n5+opqaioqKnmpqv
+ lJS1kJC3kJC3j4+2i4u2iIi6hYW7hITChYXEhITFh4fBjY26kZG0kpK0mZmuoqKloKColZW0kJC5kJC3
+ jo63j4+zj4+wjIyujIytjY2tiYm3iYm7ioq+kJC5nZ2rnp6pnp6po6Oknp6ojo63hITDhYXBhITBiIi8
+ iIi5hoa3hoa3hoa4iYm6ioq9jo66kZG4kZG5kpK4mJiyo6OnpqakoaGmnp6onJyok5OxjIy6i4u7i4u7
+ h4e9gYG+gIDBgYHDg4PFg4PGhobCj4+3lZWxnJypoaGjoaGlmpqsk5OykpKzkpKxjY22hYW/gIDCgYHB
+ gYHCiYm7jY29jY2+jY2+jY2+jY28k5O0n5+lo6OhoqKioqKjo6Oko6Oko6OkpKSlpaWlpaWlpaWlpaWl
+ o6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6OkpaWlpqan
+ pqanpqanpqanpaWlIAClpaWlpaWkpKWioqOioqKjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSj
+ o6SkpKSlpaWlpaWlpaWjo6OioqKioqKioqKioqOjo6SkpKWlpaWlpaWlpaWmpqempqempqempqakpKSj
+ o6Sjo6Sjo6ShoaWdnaqbm66Zma+Tk7WHh8KEhMOEhMWIiMCMjLyNjbuTk7SgoKakpKSkpKWkpKWkpKWi
+ oqKlpaOenquSkriIiMOEhMaDg8WCgsWCgsSBgcWEhMKKiryLi72Skraenqijo6KioqOioqOioqOhoaGg
+ oJ+enp6enp2cnJ6VlaiLi7qKiryKiruKiruKiruJibqJibqJibuTk7GdnaWhoaGhoaGioqOioqOioqOj
+ o6Gfn6WTk7SHh8KDg8WDg8WDg8WDg8WDg8WEhMaFhcaKisGOjryYmLCjo6SkpKWjo6SioqOioqKjo6Gg
+ oKKYmKeSkq6Li7aEhL+CgsODg8OGhsOKir2Kir2OjriUlLCamqafn5+goKCgoKChoaGjo6OkpKSioqWb
+ m62UlLSTk7SOjriKiruJib2EhMOEhMOEhMSFhcOJib6SkrOdnaahoaGhoaGioqGfn6GXl6mNjbmFhcSF
+ hcSEhMWDg8WDg8WDg8WDg8WHh7yJibqNjbiYmKyioqChoaGhoaGioqOkpKSioqaZmbCMjL6Li7+MjL2G
+ hsGBgcaDg8aDg8aEhMiIiMONjb2Tk7ebm66jo6KioqKioqKioqOkpKWkpKWkpKWkpKWioqWdnaqRkbaI
+ iL2IiLuCgsKBgcJ/f8GAgMKCgsSDg8WEhMWDg8WJicCRkbSamqmioqalpaWbm66Njb+Hh8SHh8GGhsCI
+ iLqFhbmLi6+NjbGHh72Dg8SEhMSEhMSEhMWHh8OQkLmcnKuenqiQkLSKiruIiLuHh7mFhbmFhbiFhbaC
+ gsCCgsWEhMWEhMWEhMaEhMaQkLifn6empqGgoKeWlrGQkLiQkLeRkbeNjbmJibuGhryBgb+CgsKDg8SH
+ h8CMjLuOjrmOjrmOjrqTk7Ofn6eioqWZma6UlLSVlbOSkrOQkLKOjrCNja2Li62GhrWGhreIiLiJibuM
+ jLqTk7eSkreXl7GhoaahoaWYmK6RkbSQkLSQkLKLi7eIiLmHh7eFhbiBgcCCgsGAgMOHh7+NjbyMjL6O
+ jryamrCjo6empqSlpaWioqabm62NjbuLi7yLi7qJib2EhMGBgcKAgMGBgcKCgsaGhsSNjbqWlq+dnaih
+ oaSioqOjo6OgoKaYmK6Tk7KNjbiGhr+BgcKAgMKCgsCIiLmFhcOGhsaFhciIiMSNjb2MjL6Skrqdnami
+ oqGioqKioqKioqKjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6SlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqampqempqempqcgAKOjpKSkpKOjpKOjpKOj
+ o6KioqOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKWlpaWlpaWlpaOjo6KioqKioqKi
+ oqKio6OjpKWlpaWlpaWlpaWlpaamp6amp6amp6ampqWlpaOjpKCgpaGho52dqZiYsZOTtY2NvIWFxoSE
+ xYSExIWFxIaGxIeHwpKStaCgpaOjo6SkpaSkpaSkpaSkpKCgpJeXsYuLwISEx4SExoODxYKCxYGBxoaG
+ w4qKvouLvJCQt5CQt52dqaOjoqKio6Kio6Kio6Kio6GhoZ+fn5+fnZycnpSUpomJuIiIu4qKvIuLvIuL
+ vIuLvIiIu4yMtpWVrZ6epKKioKGhoaGhoaKio6Kio6GhpJmZrIyMu4ODxYODxYODxYODxoWFxoWFxoSE
+ xouLwJCQupWVtJ6erKSkpaSkpaSkpaOjpKOjo6CgpZycp5qap5OTrY2NtISEv4CAw4GBw4ODxIuLvYuL
+ vo6OuZqaq6KioKCgn5+fn6CgoKCgoKGhoaGhpZ6eqJ2dqZeXsY+Pt4uLu4mJv4WFxISExYSExYSEw4mJ
+ vpCQtpeXrKGhoaGhoaGhoaKioJ+fo5iYqo+PspCQs4WFwYKCxoODxYODxYSExYODxoiIv4uLt5GRsJqa
+ qKKioKGhoaGhoaGhoaOjoqOjpZmZr4yMvoyMvYeHwYKCxYGBxYKCxoKCx4eHwYuLv42NvJaWs6GhqKSk
+ pKKio6KioqKioqKio6OjpKSkpaSkpaKip6KipZubrY2Nu4SExIGBxIGBwoCAwYCAwYGBw4GBxIODxYOD
+ x4iIwpSUs56epKKioaSkpaGhqZOTuYuLwYqKwIqKv4mJu46Os4qKsoWFu4KCw4GBxYODxoODxYODxYKC
+ xouLvpqarZ6eqJGRt42NuI2Nt4uLuImJt4eHuIGBv4GBwoKCxIODxYODxYSExYSExouLvpqaraOjpKKi
+ pJycqZWVr5GRtJCQsoyMtYWFvYCAwoCAwYGBwoaGvoyMuo2NuoyMu4yMvIuLvY+PuJycqKOjoZ6eqZeX
+ sJOTtZOTtZGRs5CQsI2NsIeHtYKCvoKCvYKCvoWFwIaGwIaGwoeHw5OTtqCgp6SkoqCgp5mZrpGRsoyM
+ uIiIuomJuIaGuoCAwIGBwoCAxIWFvomJuomJvIuLvZOTtaKipqamo6ampaampKKiqJaWs42NvI6Ouo6O
+ uYiIv4GBxYGBw4CAwX9/xIWFv4mJvY6OupWVsZaWsJeXr5ycqaGho6CgpZaWsIyMvoWFw4KCxoGBxYOD
+ voeHuoODwIODxYKCx4eHxIyMwI2NvZGRuZOTuJqar6CgpaOjoaKioqKioqKioqSkpKWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaSkpaOjpKOjpKOjpKWlpaWlpaWlpaSkpaOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpqamp6ampyAApKSlo6Oko6Oko6Oko6Oko6OjoqKjo6OkpKSkpaWkpaWlpaWlpaWlpaWl
+ paWlpaWlpKSlo6OkpKSkpaWlpaWlpaWlo6OjoqKioqKioqKioqKio6OkpaWlpaWlpaWlpaWmpaWmpaWm
+ paWmpaWlo6OkoKCmnJyomJitkpK0jIy8hobEhITFhITFhITFg4PGg4PGiIjClJSyoKClo6Oio6OkpKSl
+ pKSlpKSloKCmk5OziIjBg4PHhITGhITGgoLGh4fBi4u9jY26kJC3kpK1lJSzn5+no6OioqKjoqKjoqKj
+ oqKjoqKjoqKgn5+fl5emjIyyiIi5iIi7ioq8i4u8i4u9i4u8j4+2lZWsmJionZ2koqKgoaGhoaGhoaGi
+ oqKioaGkmJiti4u9goLGgoLGgoLGg4PHhITHhYXFiYnBjIy+j4+5mZmvoqKnpaWlpaWlpKSlpKSlpKSj
+ oKClmpqql5eukZGzh4e9goLDgYHFgoLEh4e+ioq8ioq+jo65m5uqpKSfoaGhn5+fn5+foKCgoaGfoKCj
+ nZ2qmZmtkJC3ioq7iIi/hobEhYXGhobFh4fFioq/j4+2lZWtnJymoaGhoaGhoaGhoqKgn5+jmZmqkpKw
+ iYm6g4PDgoLGhITFhITGg4PGiIjBjY26k5OxmJinnZ2goqKhoaGhoaGhoaGhoaGinZ2nlpaxjo67h4fB
+ hITFgoLGgIDGgYHFiIjAi4u7jo67kZG5m5uvpaWkpKSlo6OkoqKioqKioqKio6OkpKSlo6Oko6OkoaGm
+ mJiwi4u/g4PHg4PFgoLDgYHCgIDBgIDBgYHCgoLEiIjBi4u+jo67lZWwn5+koqKhpKSlm5uuk5O4kZG6
+ kpK4kJC3jo61hYW7gIDBgIDCgIDCgoLEgoLFg4PEgoLGiIjAl5ewoKCmlJS1k5O1kpKyj4+1iIi7goLA
+ gIDCgIDBgYHCgoLEgoLGhITEiYm/jIy/kpK2nZ2ppaWioKClmZmtl5esk5OtjIy0hoa8hYW9hYW7hIS7
+ h4e4ioq5jIy8jIy9i4u9j4+4kJC2nZ2opaWfoaGlm5uslJSzk5O1lJS0kZGzioq5goK/gYG/gYG/gYHA
+ gYHCgoLDg4PEg4PFkJC5n5+opqahn5+plJS1k5O0jo62kJCzioq5gYHBf3/DgIDDhYW/iYm7iYm6i4u4
+ kZG0lZWxnJyroKCopKSmpqakoqKnmpqumZmulZWyioq9g4PFgIDFgIDDf3/ChIS9iYm5i4u6jIy8jo66
+ jIy7kpK0mpqroaGkoqKjnJypk5O0jY28jY26i4u7hoa9g4O/gIDDgYHGhobBi4u9j4+7kpK4l5e0mpqx
+ nJyuoqKopKSioqKioqKioqKioqKjo6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6OkpKSkpaWl
+ paWlpaWlpKSlpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqanIACkpKSjo6Sjo6Sj
+ o6Sjo6Sjo6SioqOioqOjo6Sjo6WkpKWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6SkpKWlpaWlpaWkpKSj
+ o6OioqOioqKioqKioqOjo6WkpKWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6OZma2RkbSLi7uFhcKDg8WE
+ hMWEhMWEhMWDg8aEhMSMjLuYmK2hoaSjo6KioqOjo6SkpKWlpaWhoaiTk7WGhsKCgseCgsaDg8aEhMWI
+ iMGHh8GLi7yUlLOUlLOamqygoKWjo6KioqOioqOioqOioqOjo6OioqOZmaqNjbWGhruIiLmJibqKiruL
+ i7yMjLqQkLaTk7GWlqyXl6ibm6KgoJ+hoaGhoaGhoaGioqKfn6WWlrCKir6GhsKGhsKHh8KIiMKIiMKJ
+ icGNjb2Li7+Njbyamq2kpKSlpaWlpaWkpKWkpKWjo6WenqiXl6+RkbaKir+Dg8WCgseFhcWJicCLi7uK
+ iruJibyOjrmamqujo6CioqKhoaGfn5+fn5+fn6CdnaWXl66Pj7aKiryKirqHh8CEhMeGhsaGhsWLi8CS
+ krmXl6+cnKagoKKhoaGhoaGhoaGhoaCcnKaTk7GKir2AgMaCgsaDg8WDg8WFhcWIiMGOjrqRkbaVlbGc
+ nKWgoJ2fn5+hoaGhoaGioqCdnaWVla6OjraJib+Dg8WDg8aBgceBgcSGhr6KiruMjLuRkbaWlrCfn6ml
+ paSkpKWkpKWjo6SioqOioqKioqKioqOjo6SkpKOenqmRkbeGhsSEhMaEhMWDg8SBgcKAgMGAgMGCgsKF
+ hb6KirqMjLyJicCNjbuZmayenqWioqKhoaWdna6ZmbSWlraRkbmIiL+CgsN/f8J/f8F/f8GBgcOCgsWC
+ gsWDg8SIiL2UlLGdnamYmK+Xl7KSkrSLi7uEhMOBgcWBgcOAgMGAgMGAgMKCgsOHh7+Li7yMjL2Li76V
+ lbOioqWjo6Sfn6mcnKmSkrKKirmIiLqIiLmIiLeIiLWJibaJibmLi72Njb2Pj7iTk7OTk7Obm6qjo6Gh
+ oaObm6qZma6VlbOTk7aMjLyFhcKDg8KBgb+Bgb+AgL+AgMGBgcOCgsSCgsSPj7efn6impqGfn6mUlLWU
+ lLSVlbCQkLWFhcCAgMaBgcKEhL6KirmKirqKiruMjLmMjLmMjLqMjL2VlbOhoaimpqSkpKaioqigoKmU
+ lLSJib+GhsOFhcCEhL6Dg7yFhbuFhbyFhb+Hh8CLi72OjrqTk7SamqygoKWjo6KhoaKenqaZma2UlLKM
+ jLqFhcKAgMSAgMOEhMCKirqMjLqOjrqRkbmTk7eamrCenqukpKempqSioqOioqOioqOioqOjo6Sjo6Wk
+ pKWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6SkpKWlpaWlpaWlpaWkpKSkpKSlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWmpqYgAKKioqOjo6OjpKOjpKOjpKOjpKOjpKKioqOjoqOjo6OjpKSkpaWl
+ paWlpaWlpaWlpaWlpaWlpaSkpKOjpKSkpaWlpaWlpaWlpaSkpaKio6KioqKioqKio6KipKSkpaWlpaWl
+ paWlpaSkpaOjpKOjpKKio5WVsouLvYWFwoKCxYODxISExYSExYSExYSExomJv5SUr5+fpKKioqKio6Ki
+ o6Kio6OjpKKipp2drZKSuYiIwYWFw4WFwoODxYSExYODxoODx4qKv5WVspycq6GhpaKio6Kio6Kio6Ki
+ o6Kio6Kio6Gho52dqpGRt4eHv4mJuoiIuYmJuYuLuoqKvYqKvI6Ot42NuJCQtZiYqp6eoaCgn6CgoKGh
+ oaGhoZ+fo5mZqpKStYyMvIyMvIyMvI2NvI2NvI2NvI2NvYyMvo2NvpGRuZycq6Sko6WlpaWlpaWlpaWl
+ pJ+fqZeXsJCQuIiIwIODxoSExoSExYiIwIyMvYuLvouLvYeHvI6OtpubqaOjoKKioqKioqGhoaCgnpub
+ o5SUrY6OtIqKuoqKuYmJvIaGwoWFxoWFxoWFxoqKwZKSupubr6GhpKKioKGhoaGhoaGhoZ6epZaWromJ
+ vYCAyIODxYODxYSExYODxoaGw42Nu4+PuY6OupWVsp+fp6KioJ+fn5+fn6GhoaOjoJqaqo6OuIeHv4KC
+ xoKCxYGBxYKCxIaGv4qKvImJvoiIwJGRtZubqaKipKWlpaSkpaSkpaSkpaSkpaKipKKioqKioqOjo6Sk
+ o5+fqZKStoaGw4SExoSExYKCxIGBw4CAwoGBwISEvIiIuImJuYmJvIqKvI+PuJWVspqaq6CgoqOjoKGh
+ ppmZsJCQu4mJwoWFxoODxYCAwn9/wX9/wYGBw4KCxYODxIiIvY+PtJWVrpqaqp+fp5eXsY6OvIaGwoOD
+ xYODxYGBw4GBwoCAwoGBwIWFvIqKuomJvYqKvYuLvZOTtZ6eqaSko6Sko52drJCQuYuLvIuLuImJt4iI
+ t4mJtoiItomJuIuLuZCQt5OTs5OTs5OTs5WVsJ2dp6KiopycqZycqpSUtIyMvYaGxIWFxoWFwoGBwYCA
+ wICAwYGBwoGBwoGBxIGBxI2NtZ+fpqWloqKipZ2dq5OTtI+PuISExIGByIODw4SEvoiIuImJuoqKuoqK
+ u4WFwIGBxoKCxYKCyI6Oup+fqaamo6WlpaSkpp2dro6OvIuLvo2NvIyMu4qKuYWFuoCAwX9/w4GBxIWF
+ wYyMupKStpGRuZiYsZ+fqKKio6Gho6Kiopqaqo2Nu4ODxoGBx4KCxISEv4mJuYiIvIeHvoeHv4iIwYmJ
+ wY6OvZaWtKCgqqampKWlpaSkpaOjpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaSkpKOj
+ pKOjpKOjpaSkpaWlpaWlpaOjpKOjpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpSAAo6OkoqKi
+ o6Ojo6Oko6Oko6Oko6Oko6OkoqKjoqKjo6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6OkpKSl
+ paWlpaWlpaWlo6OkoqKjoqKioqKioqKjo6OkpaWlpaWlpaWlpaWlpaWloqKmnJysjo66hYXEgoLGg4PE
+ g4PFg4PFg4PFgoLGhobBk5O0n5+moaGhoqKioqKioqKjoqKjoaGkmpqtlJS1jo68jY29jo68ioq+hITF
+ hITFhYXFiYnAj4+6lpaxoaGkoqKjoqKjoqKjoqKjoqKjoqKjo6OinJyqlJSyjo66i4u9ioq7i4u5ioq6
+ ioq7h4e/g4PEhITFhYXDkZG0n5+loqKfn5+fn5+foKCgoqKgm5uolJSxkZG1kZG3ioq+i4u+i4u+jIy9
+ jIy9jIy9jY29kpK3m5uuoqKnpKSko6OkpaWlpaWlp6ejnJytkJC5iYnCg4PHhITFhITGiIjBi4u+i4u+
+ i4u+i4u+i4u9lJStn5+io6OioqKioqKioqKioqKgmZmojo60jIy5jIy4ioq6hYXCg4PGhITFhYXFhYXG
+ g4PIiorCmZmyoqKmo6OjoaGhoaGhnp6ll5etj4+2h4fAg4PFg4PFhITFhITFhITFh4fCi4u9i4u9j4+5
+ mpqqoqKjoqKjoKChnp6eoKCfoKCilpauiIi/gYHHgoLFgoLFgYHFh4e/iYm/hITFhITEhITEkJC3np6m
+ pKSho6OlpKSlpKSlpKSlpKSlpKSlo6OjoqKioqKio6Ojo6OkmZmui4u+g4PGg4PFgoLEgYHEgYHCg4O9
+ hoa1hoa4iYm6iYm6jo61k5OylpaxnJypoqKkoqKgnp6jk5Owhoa/goLEg4PFgoLEgIDCf3/Bf3/BgIDC
+ goLEiYm8kJC0lpatmpqom5unoqKhl5evjo64jY25iYm9goLGgYHDgYHDgIDChIS7iYm4iYm8iYm8i4u9
+ kpK1mpqtoKCnpKSjo6OknZ2rmJixlZWylZWvkZGwiYm2iIi4hoa3hYW5ioq3kJCzkZG1lJSylJSykpK0
+ mpqrpKSgoKCkmZmtjY27hYXEhITFhYXDhYXCgYHCf3/BgIDCgYHCgIDCgYHDgoLCjo61nJykoqKho6Oj
+ oaGlk5O1hobDg4PFg4PEhYW/iYm3h4e5iIi5iYm6hYXAgoLFg4PFg4PFgoLGjY27nJyqpKSjpaWlpaWl
+ np6rkZG6jIy+jIy9jIy8iIi9gYHEgIDCgYHBhYW/iYm7ioq6ioq9jIy9lJS1nJysoaGlo6OioqKjlJSy
+ h4fBg4PGhITFhYXCiYm5hIS9gYHDgIDFgYHFgoLGg4PHhITIiorAmJiyo6OnpqakpaWlo6Oko6Oko6Ok
+ o6Oko6OjoqKipaWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6OkpKSkpaWlpaWlpaWlo6OkpKSkpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlIACioqKioqKioqKioqOjo6Sjo6Sjo6Sjo6Sjo6SioqOioqKj
+ o6Sjo6SlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWkpKWioqOioqKioqKioqOj
+ o6SlpaWlpaWlpaWkpKWfn6qVlbSHh8KDg8aDg8SBgcOCgsSDg8WDg8WBgceJib+YmK2jo6GioqKhoaGi
+ oqKioqKjo6GgoKWUlLOOjryMjL6NjbyJicCCgsaBgcSCgsWJib+MjL2OjruXl7GkpKOioqOioqOioqOi
+ oqOioqOioqOjo6KXl6+OjruLi76MjL2MjLuOjraLi7mHh8CFhcOFhcOGhsKMjLmYmKugoKKioqGgoKCf
+ n5+fn5+goJ+Xl6yRkbOPj7eKir6GhsKGhsOFhcSJicCMjL2NjbySkrabm66ioqelpaSkpKWkpKWjo6Sl
+ paWnp6Odna6MjL+Dg8iFhcaEhMaIiMCLi76Li76Li76Li76Li76ZmbChoaSgoJ+goKCioqKioqKioqKh
+ oaOVla6Li7eMjLaJibqEhMKDg8WFhcWFhcWFhcWFhcWFhcaPj7ufn6unp6OlpaWjo6SioqCYmKuQkLaL
+ i7uHh8CEhMWEhMWEhMWDg8aHh8GMjLyLi7yQkLiYmK6goKWjo6KioqOioqOhoaGfn52ZmaaOjraEhMKC
+ gsaCgsWCgsaJib+IiMCEhMWFhcSFhcSLi76Zma+hoaSjo6Kjo6Sjo6SkpKWkpKWkpKWkpKWkpKWjo6Si
+ oqKioqKkpKGdnauNjbyDg8eEhMWDg8WCgsWFhb2Hh7aFhbeGhreHh7mOjrORkbGTk6+bm6mgoKWgoKWi
+ oqOgoKSUlK+Ghr2BgcOBgcOAgMJ/f8F/f8GAgMOCgsSKir2QkLeXl6+amqqZmamamqihoaGcnKiamqqY
+ mK2OjrmCgsWCgsOBgcOEhLqHh7eJibuLi76Li76SkraTk7WVlbKcnKqioqSjo6Sjo6Sjo6SkpKOgoKWV
+ la6IiLqIiLiCgr2AgMCBgcGEhMCLi7qSkrSTk7OWlrCcnKmioqOhoaOWlrCIiMCDg8ODg8GDg8KCgsOB
+ gcKAgMGBgcKBgcSBgcWCgsOJibqPj7OZmaednaSfn6OgoKKYmKuLi7qJib2KiryJibqIiLmHh7mHh7iE
+ hL+CgsSCgsWDg8WDg8WDg8WJib2Xl6+hoaWkpKOjo6SioqSVlbKMjLyLi72Jib+CgsWBgcOAgMKDg72H
+ h7mJibmJibqJibuQkLOVlbKbm62hoaakpKOioqOVlbKOjruLi7yKirqJibuFhb6AgMGAgMKBgcOBgcOB
+ gcWFhcWLi76Pj7yUlLeenqumpqSlpaWlpaWlpaWlpaWlpaWkpKWjo6SioqKkpKSlpaWlpaWlpaWlpaWl
+ paWlpaWkpKSjo6Sjo6Sjo6SlpaWlpaWlpaWkpKSkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaUgAKWl
+ paOjo6KioqKioqKio6OjpKOjpKOjpKOjpKOjpKOjo6KioqOjpKOjpKSkpaWlpaWlpaWlpaOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjo6KioqKioqKio6OjpKWlpKSkpqCgqpiYsouLv4aGxYODxYKC
+ xIKCxIKCxYODxYGBx4WFw5GRtp2dp6OjoaKioqKioqGhoaKioaGho5ubqpSUs42NvIyMvIiIwIODxYKC
+ xIGBxIeHvYmJvI2NupSUtJ2drKOjpKOjpKKio6Kio6Kio6Kio6Kio6OjopycqpSUspGRt4+PuYyMvIaG
+ w4aGxIWFxYSExoWFwo2NuJiYrJ+fo6GhoaGhoaGhoaGhoZ+fn6CgnpaWrI6OuImJvoWFw4WFwoaGw4mJ
+ wIyMvo2NvJKStpubrKGhpqSkpaSkpaSkpaSkpaSkpaOjpKKiqJWVtYuLwImJwoiIwYiIwYqKvYmJu4qK
+ vYuLv4yMvZKSt6CgqKSkpKKio6CgoJ+fn6KioqKioqGho5eXr4yMuomJuoODwYODw4ODxIODxYWFxYWF
+ xoWFxZCQuJmZsKKiqKampKWlpaWlpaKio5WVr4yMuYeHwISExYSExYODxIKCxoeHv4qKvIyMu5GRtZmZ
+ q6CgpaKio6Kio6Kio6Kio6Kio6CgopOTrYmJuIeHvYiIv4SEwoKCxIODxISExYODxoWFxI2NvZOTuKCg
+ qaampKWlpaWlpaWlpaWlpaSkpaSkpaSkpaSkpaSkpaOjpKOjpKOjoZ+fp5aWs5CQuJGRt4uLvImJvImJ
+ uoeHuIaGt4WFtoeHuImJuY6OtZOTsJOTsJSUsJqarKGhpKCgpJWVsIeHvoCAxIGBw4CAwX9/wX9/woKC
+ wYmJu4qKu4uLvJKStJeXr5SUsJSUrpycpp2dpJmZqpCQtoqKvoqKvYmJvIiIuoeHuYiIuoqKu4uLvoWF
+ xYaGxISExoiIwpKStp2dqKOjpKOjpKSko5+fqJycrZmZrZCQsoSEv4CAwH9/wIODvoiIuYqKuoyMvZaW
+ sZubrJubrJ2dqKKiopmZrIyMu4iIvYWFv4GBxIKCw4GBw39/wYCAwX9/xYKCwomJuomJuomJuo2NtpKS
+ r5qapqGhn6CgopOTsYyMuouLvIqKuomJuIeHuIKCvoGBwoGBxIODxYODxYODxIWFwYWFwo+Ptp2dqKWl
+ o6OjpKKipJWVsY2NuIaGvoGBw4GBw4GBw4ODvIaGuYeHuYeHuomJuZCQsZKSsZKSspeXsJ+fqaSko6Oj
+ pJqaq5mZrJeXr46OuIWFwYGBwoCAwX9/wX9/wX9/w4KCw4yMvY2NvI2NvpGRuZ2draeno6WlpaWlpaWl
+ paWlpaWlpaWlpaWlpaOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKWlpaWlpaam
+ pqamp6amp6amp6amp6WlpqWlpaWlpaWlpaWlpSAApKSkoqKioqKioqKjo6Oko6Oko6Oko6Oko6Oko6Ok
+ o6Oko6OjoqKio6OkpKSkpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oj
+ oqKioqKioqKjpKSioaGolpa0i4vAhobFhYXHhITGgoLFgoLFgoLFgYHGhobBjIy7mJitoqKjoqKjoqKi
+ oqKioqKioqKhn5+jmpqrlZWxjo66h4fBg4PFgYHFgYHChYW7iIi5h4e7kJC0nZ2poqKko6Oko6Oko6Ok
+ oqKjoqKjoqKjoqKjoaGjm5uqk5Oxjo62ioq8hYXDhITGhYXGhITHhobDj4+3mZmqoKCioaGhoaGhoaGh
+ oaGhoaGhoaGgnZ2hkpKviYm8hYXChYXChYXCh4e+i4u+jo68k5O1mpqtnJyroqKlo6OkpKSlpKSlpKSl
+ pKSlo6OkmZmvjo68iorCi4vBi4vBjIy+ioq8iYm8iYm8iYm+jY29k5O2oaGnpKSjo6OkoqKioKCgoKCg
+ o6Ohn5+mk5OziIjBhITFgoLDg4PEg4PEg4PEg4PFh4fDkpK3mZmvn5+ppKSlpaWlpaWlpKSmnp6skJC4
+ hobAg4PEg4PFg4PEgYHEhoa/iYm8i4u5jo65kJC4l5evoKCko6OioqKjoqKjoqKjoqKjnZ2ojo62h4e8
+ h4e7hYXAg4PEg4PFg4PFg4PGhobDjIy9k5O2mpqwoqKnpaWkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlo6Oko6OjoqKinp6nmJiwlZW0jY28i4u9ioq7iIi5hoa5gYG+g4PBg4PBhITAhoa/hobAhoa/
+ kpKzoKCloKCmlpawjY25hYXAf3/FgIDFf3/EgIC/hoa5ioq4ioq6ioq7kZG1lpawlZWxlZWxlZWvnJyn
+ l5eskJC2j4+4kZG2kJC2ioq6iIi7iYm4iIi8hobEhITGgoLIhobEjY28lZWynZ2poqKjo6OkpaWioKCo
+ mpqvlJS1iIjAhITCgIDCgoK8hoa3ioq4i4u5jIy8j4+4kJC4kpK2mpqsoqKinp6mk5O0h4fAgYHFgIDE
+ gYHDgIDCf3/Bfn7Dg4PAiYm7ioq6ioq7ioq6iYm6jY21mJipo6OeoaGglJSwjIy7iYm+ioq8iYm8hITA
+ gYHCgYHCgYHDg4PFhITFhITFhITEg4PGi4u7mpqpo6Ogo6Oko6OjlpaxiIi/gYHFgIDFgIDChIS9hYW4
+ hoa2hYW5iIi3jo6xi4u2jY25jY26jo65lpawoqKlo6OknZ2qmZmtkZG2iIjBg4PFgYHEgYHCgIDBfn7C
+ goK/h4e8hYXDhobEhITGiorAmZmwpaWlpaWlpaWlpaWlpKSkpKSkpaWlpaWlpaWlpKSlpaWlpqampqan
+ pqampqampaWlpaWlpaWlpKSlo6Oko6OkpKSkpKSkpaWlpqanpqanpqanpqanpqampaWlpaWlpaWlpaWl
+ IACjo6SioqOioqKioqKioqOjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6OioqKjo6OkpKSkpKSlpaWlpaWk
+ pKWkpKWkpKWkpKWkpKWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6OioqKioqKkpKKhoaaWlrKKisKFhcaFhceF
+ hceEhMWCgsWCgsWGhsCNjbeQkLSbm6ukpKGioqOioqOioqKioqKjo6GhoaKZmauPj7iHh8GEhMWBgceC
+ gsSHh72JibmJibmHh7yPj7KdnaSjo6Gjo6Sjo6Sjo6Sjo6Sjo6SioqOfn6Wbm6qVlbKQkLiKir2EhMOD
+ g8WDg8aDg8aIiMGNjbySkraamqyhoaChoaGhoaGhoaGhoaGhoaGfn6SVla6KirqFhcCFhcKFhcCIiL2J
+ ibyJib2OjriWlrGYmK+YmLCioqWkpKOjo6Sjo6SkpKWkpKWfn6mQkLqJicGJicGLi8GMjL+KiryJibyJ
+ ibyJibyJibuNjbmUlLShoaakpKOjo6Sjo6SioqOgoKCgoKCbm6WUlK+MjLqGhsGDg8SDg8SDg8SDg8OF
+ hcGJib6Pj7mZma+hoaakpKOkpKSmpqWlpaWfn6yRkbqGhsSDg8WDg8SEhMWHh7+Li7uMjLmMjLmOjreT
+ k7KamquhoaOioqGioqOioqOioqOioqOYmK2Pj7mIiL+EhMKDg8SEhMWDg8eDg8aGhsKKir6OjruZma+g
+ oKekpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Wjo6KgoKSYmK2Pj7mMjLyK
+ iryKirmIiLqDg79/f8KAgMOAgMOAgMOAgMWAgMWFhb+SkrCenqShoaOcnKmXl6+RkbaLi7uHh72Ghr2H
+ h7mHh7aFhbuHh7yGhr+OjraVlbCUlLOTk7OWlq6enqSenqOamqmVla6SkrKSkrKPj7OLi7aGhruDg8GC
+ gsaDg8aHh8OOjruWlrKenqmjo6Sjo6OioqOhoaWcnKqSkrWGhsGDg8SCgsOEhLyEhLmDg7uEhL6Hh7+N
+ jbuLi72NjbuTk7WamquioqOioqKWlrCKir6EhMGDg8CAgMR/f8J+fsOBgb6IiLmLi7mKiruLi7qLi7qK
+ irqMjLeVlaygoJ+goKCXl6uTk7GUlLCRkbOHh76BgcOBgcKBgcKBgcODg8WEhMWEhMWEhMWCgseLi72b
+ m6qlpaGjo6SkpKOZma2JicCDg8WFhcCEhL6Hh7mFhbeDg7iHh7SMjLCKiraEhMGFhcOFhcSJicCUlLOh
+ oaajo6Samq6Pj7mHh8KEhMWCgsWBgcSAgMJ+fsOBgb2FhbqDg7+BgcWDg8eGhsSLi7+UlLafn6umpqSl
+ paWlpaWjo6Sjo6OlpaSlpaWlpaWlpaWlpaWlpaWlpaampqempqempqalpaWlpaSkpKSjo6Sjo6Sjo6Sj
+ o6Sjo6SlpaWmpqampqempqempqempqempqWlpaWlpaUgAKSkpaSkpaSkpKKio6Kio6OjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKKioqKioqKio6OjpaSkpaSkpaSkpaSkpaSkpaSkpaSkpaSkpaOjpKOjpKOjpKOj
+ pKOjpKOjpKKio6KioaKioqCgpZiYrYyMvoWFxYSExoSExoODxoKCxYSExIqKu5CQs5OTr5ycp6OjoaKi
+ o6Kio6KioqKioqKiop2dqJCQtYaGwoGBxoCAxoODw4eHv4qKu4qKvImJu4qKuZOTrJ2doKGhoKKioqOj
+ pKOjpKOjpKOjo6CgpJmZq5WVspCQuIqKvoWFxIKCx4ODxoeHwYaGwYuLvI6OupKSt5ubraKioqGhoaGh
+ oaGhoaGhoKCgopiYrIqKvISEw4SEwoWFwYWFwIeHvYmJu4iIu4yMuZKStZaWsZiYrqKipaSkpKOjpKOj
+ pKWlpKOjpZmZsI2NvYqKwIqKv4uLvoyMvImJu4mJu4mJu4mJu4yMt5GRspmZrKKipaSkpKOjpKOjpKOj
+ pKGho5+foJmZpJSUq4+PsoiIu4SExYSExIODxIODxISEw4aGwIyMuZubq6KipaOjo6OjpKSkpqKiqZ2d
+ rI6OvIeHxYWFxYSExISExYiIv4iIwYyMu4+PtpOTsZqaqJ+fpKKioqKioqKio6Kio6Kio5+fppOTs4yM
+ vYaGw4ODxoODxYSExYeHwoeHwoqKv4yMvZGRt5+fqKSko6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpKSko6CgpZiYrYqKvYqKvYqKuYeHuoODv39/wn9/wYCAwoGBw4KCxIGBxYOD
+ xI6Ot5eXq5ycpqGhoqCgpJiYrZSUtJGRt4yMuYqKuImJuIWFu4KCvYODvoWFvoqKuI6Oto+PuJOTs5yc
+ qKCgpKCgoZycpZSUrpGRspGRspCQs4mJuoGBwH9/w4KCxIaGwY2NupOTtZeXsZubrKCgp6KipqOjopyc
+ q5GRt4aGwYGBxYODwoWFvoaGuYODu4CAv4GBwIiIvoyMuo+PuZOTtpeXsZycqaKipKSkopeXr5GRtZCQ
+ tIuLt4KCwIODvYKCvoWFuIiIt4mJuYqKuoeHv4eHv4aGwIiIvpCQtJqapJ+fn5ubpZycpZycpZSUroiI
+ vYGBw4CAwoGBwoKCwoKCw4ODxISExYSExYODxouLv5qasKOjpKSkpKOjpJ+fqJWVs4yMvImJvoiIvIiI
+ uoaGuoiItIuLsImJtIKCwIGBxoKCxoKCyIeHw5SUtKGhpqOjpJubrI+Pu4WFxYKCx4ODxoKCxYCAxIGB
+ voODuYKCvYCAxIGBxIaGwoyMvJKSt5aWs56erKampKWlpaWlpaOjpKKio6OjpKSkpKWlpaWlpaWlpaWl
+ paWlpaWlpqamp6amp6Wlp6SkpaSkpKSkpKSkpKSkpKOjpKOjpKOjpKSkpaamp6amp6amp6amp6amp6Wl
+ pqWlpSAApaWlpaWlpaWlpaWlpKSkpKSkpKSkpKSko6Oko6Oko6Oko6Oko6Oko6OkoaGioqKjo6Oko6Ok
+ o6Oko6OkpKSlpKSlpKSlpKSlpKSlpKSlo6Oko6Oko6Oko6Oko6Oko6OkoqKjoKCjnZ2nlZWxioq8g4PD
+ goLEg4PEgoLEgYHEhITDiIi8kZGymZmon5+ioqKhoqKioqKjoqKjo6OinJypkJC2h4fBhYXDg4PBg4PC
+ iIi9jIy6ioq8iYm8iIi9jY23mZmln5+anp6foKCgoqKio6Oko6OkpKSjoaGml5ewj4+5ioq+hYXEg4PG
+ hITFh4fCjIy7jIy7i4u8jo66lpawoKCmo6OkoqKioaGhoaGhoqKgoKCilpauiIi/hITDhYXChYXBhYXB
+ hobAioq8ioq7iIi9jIy5l5euoKClo6Oko6Oko6Oko6Oko6Okn5+pkZG3jY29jY29jIy9i4u9i4u8ioq6
+ ioq6iYm7jIy4kpKxmJionp6ioaGjo6Oko6Oko6Oko6OkoaGloKCkmJipkJCwjIy1iIi7h4fBhYXEhITF
+ g4PGgoLFiIi8lZWuoaGio6Oio6OkpKSjoqKmmpqvkZG4h4fEhYXGhobFhYXFhITFg4PGg4PGi4u8lJSw
+ mpqooKCioaGgoqKioqKioqKio6OioaGkmJiui4u8hYXEg4PGg4PFg4PFhITFjIy9jY28jY29jo68lJS0
+ oqKko6Oko6Oko6OlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkoqKlmZmui4u+
+ i4u9iYm7g4PAf3/DgIDBf3/BgYHDgYHEgYHHg4PGi4u+lpavnJyqmpqpn5+jn5+klJSwjo66jIy8i4u8
+ ioq7h4e8g4O+goK8hIS7iIi5iYm6iIi7jIy5kpKzmZmsmpqrmpqplpaskZGykZGyj4+1iYm9goLEf3/E
+ f3/Bg4O+i4u3kpKykZG3j4+6j4+6kpK2m5uso6Okm5usjIy7hobDh4fChobAiIi7hIS+gYG/gYG9hYW6
+ i4u3i4u5kJC3kZG4k5O1mpqro6Ojo6OknJyrmpqrm5uolZWsioq3iIi4h4e2hoa3hoa3h4e4hoa+goLF
+ g4PGgoLHhYXFj4+6mpqon5+fnJykmpqmlZWrjY22hoa+gYHCgIDAgIDBgYHCgYHCgYHEg4PFhITFhITG
+ h4fEkZG5n5+rpqakpKSko6Ojn5+nlJS0jIy8jY25i4u4i4u3jY2wiIi1gYHAf3/EgYHEg4PFhYXFiIjC
+ j4+6m5uupKSkoqKll5ewi4u+hobFh4fDh4fBg4PAhYW6goK9f3/DgoLDh4fBjY26kZG2lZWympqtoKCo
+ paWkpaWlpaWlpKSlpKSlpKSko6OkpKSlpaWlpaWmpaWmpaWmpaWlpqampqanpqanpqanpqampaWlpaWl
+ paWlpKSko6Oko6Oko6OkpaWmpqanpqanpqanpqanpqanpaWmIACjo6SlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKWkpKWkpKWkpKWkpKWkpKWj
+ o6SioqOioqOjo6Sjo6ShoaahoaWamquPj7iIiLyCgsKBgcOCgsOCgsOCgsODg8KJibuWlqugoKGioqCh
+ oaGhoaGioqOioqKgoKWVlbGMjLuOjrqLi7yJibqKiryLi76Kir6Li72JibyLi7qQkLSamqafn5ydnZ2f
+ n5+hoaGioqKjo6Sjo6ShoaaYmK+NjbyEhMWEhMaFhcWIiMKNjbyMjL2MjL2NjbqWlrCgoKWjo6Ojo6Sj
+ o6SioqKhoaGhoaGfn6OYmKuNjbmHh8CGhsGGhsKHh8GLi72Li72KiryKiruOjreXl6yjo6Gjo6Sjo6Sj
+ o6SkpKOhoaaYmLCNjb2MjL6Njb2MjL2Li7yKiruKiruKiruKiruPj7OYmKidnaOgoKChoaCioqOjo6Sj
+ o6Sjo6ShoaWamq2Tk7OMjLiIiLqJibmIiLuEhMSEhMaEhMaLi72Xl6ycnKWhoaGioqGjo6OkpKSfn6iR
+ kbaGhsSGhsWHh8SGhsaFhcaEhMWFhcSKir6RkbeXl6+dnaaioqChoaGhoaGioqKioqKioqGfn6WUlLOI
+ iMCEhMWDg8WDg8SEhMWHh8KLi72Njb2QkLuSkrmWlrSjo6Wjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWmpqSjo6aamq2NjbyKiryDg8GAgMOBgcKAgMF/f8GAgMOAgMWCgsaK
+ ir6VlbCamqybm6ucnKmgoKOgoKGYmKuMjLuLi7yLi7yIiMCGhsCEhL2Dg7uGhraIiLmJibuMjLmOjraN
+ jbeNjbqUlLKbm6mZmauRkbGPj7SJibyDg8OCgsOBgcGCgryJibSQkLCQkLKIiL+FhcaFhcaHh8KWlrGi
+ oqWhoaaamqySkrWLi72Li7yFhcGCgr+Bgb6EhLmJibSKireJibqJibyKir2OjruYmLGjo6Sjo6Shoaaf
+ n6WgoKSbm6iPj7KJibiHh7iGhreGhraEhLyAgMWDg8WEhMaDg8eHh8OTk7aenqahoaGcnKOWlqqMjLWE
+ hL+CgsOCgsGBgcCAgMGAgMGBgcKBgcOBgcSDg8WEhMWEhMaMjL+bm6+mpqSlpaWlpaOfn6iXl7CUlLSV
+ lbOSkrKQkLGKireBgb9+fsOAgMKBgcSEhMWLi8CNjb6Pj7yYmLKlpaWlpaObm6ySkraPj7qQkLmOjrmJ
+ ibmCgsB/f8KAgMKDg8KMjLuPj7mQkLaQkLeUlLScnKqjo6OlpaWlpaWlpaWlpaWlpaWlpaWjo6SlpaWm
+ pqampqempqempqelpaWmpqempqempqempqalpaWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Smpqempqempqem
+ pqempqempqcgAKKioqOjo6Skpaampqamp6amp6amp6WlpaWlpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKOjpKOjpKSkpaSkpaSkpaSkpaSkpaOjpKKio6Kio6OjpKGhpp6eqZWVsomJv4SE
+ xoSExYSExYSExYKCxYGBxYODw46OtpubpKGhoKGhoaGhoaGhoaGhoaKiop+fpZmZrZaWsZSUsomJv4OD
+ w4KCxIODxYaGw4yMvIyMu5GRs5aWrJ6epKGhoJ6enp2dnZ+fn6CgoKKioaCgppqar5CQuIaGxIWFxYSE
+ xYiIwY2NvIyMvYyMvY2Nu5aWsJ+fpaOjoaKioqOjpKOjpKOjpKOjop+fopeXrI2NuYeHwIaGwYWFwYaG
+ wYmJv4uLvYuLvYqKvo6Ot5WVrZycpqGhoaKioqOjpKOjpKSko6Cgp5SUto6Ou42NvI2Nu4yMu4uLvIuL
+ vIuLvImJvI6OtpOTr5iYqZ6eoqCgoKCgoKCgoKKio6OjpKOjpKGhpZaWso6OvIuLvYuLu4iIvYKCxIKC
+ xIKCxouLvpaWsJ2dp6GhoaCgoKGhoaKioaGhpJmZr4yMvIyMvY6OvYiIw4SEx4SExoSExIuLvIyMvYyM
+ u5GRtpqaq6KioKGhoaGhoaGhoaKioaKioqCgpJmZrJSUsomJvoSEw4WFwYaGwIuLvYyMvY+PuZGRuZWV
+ tZ+fqqWlpaOjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampKOj
+ p5WVtIeHw4KCxoGBxIGBwoGBwn9/woGBxICAx4qKvZSUspKStJKStJGRtZeXr5+fpaKin5ycpZCQtIyM
+ uYeHv4WFwIWFv4WFvIaGt4aGt4eHuYmJuYqKuoqKu4qKu4uLupiYraGho6CgpZWVsYmJvIqKu4qKu4iI
+ u4mJtYuLr46Oro+PsIeHvYODxISExoSEx4eHxJWVtKKipqWloqGhppaWsYmJv4aGw4aGwoODwoaGuoqK
+ s4mJtomJuomJuoiIvI6OtpKStJWVtJycrKOjpKOjpKSko6GhppqarJSUspCQsYqKt4mJt4SEvH9/woGB
+ woGBw4ODxYODx4eHw5GRt56eqaKioqKioJeXqoiIuoGBw4ODwYODwYGBwoGBwYCAwYCAw4GBw4GBw4OD
+ w4SEw4mJv5CQupqasKampKWlpaampJ+fqZqarZubrJqarpOTtYuLuoODwX9/w39/wYGBwoKCxIqKv4qK
+ v4+Pu5eXs56eq6WlpaampJycrJeXsJmZrpaWsouLvoODxIGBw4CAwYCAwoKCxIODxYSExYSExYODxoeH
+ wpKStZ6eqKOjpKWlpaWlpaWlpaWlpaWlpaWlpaOjpKSkpKampqamp6amp6amp6Wlpaampqamp6amp6am
+ p6WlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKWlpqamp6amp6amp6ampyAAoqKioqKioqKjpKSkpaWmpqan
+ pqanpqanpaWmpaWlpKSlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpKSl
+ pKSlpKSlpKSlpKSloqKjo6Oin5+llJSxiYm/hITFg4PEg4PEg4PFg4PFgoLGg4PEioq6j4+1m5uloKCf
+ oaGgoaGhoaGhoaGhoaGhoKCjnZ2olZWyiYm/hYXEhYXFhYXGhYXGhITHh4fEkZG1mZmsnp6koaGhoaGh
+ oaGhn5+fnZ2dnp6eoaGgm5upjo65hYXFhITGhITHiIjBi4u8i4u8jIy9jY27lpaxn5+no6OioqKioqKi
+ oqKio6OkpKSkoqKlmpqsjY25hobAhYXBg4PEgoLFgoLFhYXDjIy+jIy+i4vAkpK1nZ2moaGhoaGhoaGh
+ oqKio6OjoqKlnZ2qlpayk5O1kZG3jY27ioq8ioq7i4u8i4u8j4+3k5OwmJipnp6joKCgoKCgoKCgoKCg
+ oKCgoqKioaGmmpqsj4+6jY29iYnBhITEg4PDgoLEgIDGioq5k5Oyl5evnZ2noqKioaGhoKCgoaGgoaGj
+ mZmujY28jY28iIjChITFg4PGhYXEiYm7i4u8ioq+kJC4mJiun5+noqKioaGhoaGhoaGhoqKgoaGinZ2o
+ l5eviYm+hobChYXChoa/ioq8jIy9kJC4kZG5lpa0n5+qpaWlpaWlpaWlpKSko6Oko6Oko6Oko6OkpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqako6OnlZW1hobEg4PHg4PGgoLFgYHEgIDDf3/Fh4e8
+ iIi9hYXDhobDhYXDhITFi4u9mJitoaGhn5+jk5Owh4e/hYXBhobBh4e+iIi5hoa3hYW3hYW3iIi4ioq5
+ ioq7ioq7kJC0l5eroKCjoKCkmJiukZG1jo61jY22jIy3jY2xi4uvhoa3hYW9g4PEg4PFgoLGhobEjY29
+ j4+5nZ2qpKSjnp6pj4+5hITFhYXEhYXFi4u5j4+vi4uyhoa6iYm7iYm6iYm6iYm5ioq6jo65lpayoqKl
+ pKSjoaGmmpqslJSzk5O0k5Oyi4u2hIS+gIDCgIDCgYHDgoLEgoLFgoLFg4PHiYnAmJiwo6Ojo6OhnZ2l
+ jo6zhYW9h4e5iIi5goLBgIDCf3/Bf3/BgIDCgYHCgoLCiIi9kJC1lJSymJivoKCopaWlpaWlpaWloaGp
+ mJivkZGzioq7g4PCgYHEgIDCgIDDgoLCiIi8jIy8jIy9jIy9kJC6mJiynZ2spaWloaGonp6qnJyolZWu
+ iIi+iIi7ioq5g4O9fn7CgIDBgYHDg4PFhITFhYXDhYXDioq9mJiuoqKlo6OkpKSlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWmpqanpqanpqanpaWlpaWmpqanpqanpqanpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6Ok
+ paWmpqanpqanpqanIACioqKioqKioqKjo6OkpKWlpaampqempqempqampqWlpaWkpKWjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKWkpKWkpKWkpKWkpKWkpKSenqaTk7KIiL+EhMWE
+ hMWEhMWCgsWCgsWBgcaEhMSKiryQkLWTk6+dnaOgoJ+goKCgoKChoaGhoaGhoaCenqWVlbGKir+EhMWE
+ hMWEhMWFhcWEhMeGhsaNjb+UlLWenqeioqGioqGhoaGhoaGhoaGenp6enpybm6GWlqyPj7iKisCKir6K
+ ir6Li7uLi7qKiryNjbuWlrKfn6ijo6Sjo6Ojo6OioqKioqKioqOkpKOfn6iSkrWGhsKGhsGDg8SCgsWC
+ gsWBgcaDg8WLi76Li76Pj7ucnK6kpKKioqChoaGhoaGhoaGjo6GioqSenquYmLCSkreOjruKiruJibuK
+ iruKiryKir6QkLeUlLCZmaqfn6OhoaGgoKCgoKCgoKCgoJ+enqKamqqUlLCNjbmHh8CDg8SCgsWCgsSB
+ gcWHh76Li7mLi7mRkbOdnaeioqKioqKioqGgoKGcnKaVlbCLi76Hh8OEhMaDg8eGhsOJibyKiruJibyQ
+ kLeYmK6enqaioqOioqOioqKhoaGhoaGfn6KcnKaWlq+Jib2FhcKEhMOHh8CKiryLi7uNjb2OjruNjb2R
+ kbmdna2mpqSlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWm
+ pqSkpKaamq+MjL+Dg8eBgcmBgcmAgMeAgMWGhruFhbyBgcKBgcWDg8aDg8eIiMGMjL2Xl6+ioqOhoaKZ
+ maqLi7uIiL2Hh72Hh7yHh7mGhriFhbaGhreHh7eIiLmJibmQkLOXl6uZmamgoKGfn6SVlbGQkLiQkLeN
+ jbaQkLKOjrKIiLeDg72BgcKCgsSBgcaFhcOLi7uOjriQkLmdnaulpaSenqqSkrWMjLuNjbqOjruRkbKN
+ jbOHh7eHh7eKirqFhcKEhMKDg8KCgsSFhcKPj7efn6mkpKSgoKeYmK+Tk7STk7aNjbuGhsCCgsOAgMKA
+ gMGBgcOCgsWCgsWDg8WDg8aGhsKRkbeenqmjo6SioqGbm6iPj7OGhryDg75/f8F/f8F/f8GAgMGBgcKE
+ hMGJibyNjbiPj7WQkLaSkrWYmK6jo6WlpaWmpqSioqeXl7KLi72Dg8SBgcWAgMV/f8SAgMCFhbqJibmG
+ hsKGhsOFhcWHh8OQkLqcnK6jo6elpaakpKajo6Sfn6WVla2SkrCHh7yAgMJ/f8F/f8GAgMGCgsOEhMSF
+ hcSDg8aGhsKUlLOhoaSjo6OkpKSlpaSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqempqempqalpaWl
+ paampqempqempqalpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6SlpaampqempqcgAKSkpKKioqKioqKioqKi
+ o6SkpKampqamp6amp6amp6ampqWlpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKSkpaSkpaSkpaSkpaOjppubrJCQt4aGwoODxoSExYODxYODxYKCxoODw4qKvJGRtZaWr5ycp5+f
+ oaCgoKCgoKCgoKCgoKCgoZycpZOTsYiIv4SExoSExoSExYWFxYSExoaGxIyMvpSUtpmZsaOjpaOjoqKi
+ oaKioaGhoaGhoaCgoKGhnJiYpY6Os4yMuYyMuoeHv4eHv4aGwYaGwIyMuJeXrp+fpqSkpKSkpKOjpKOj
+ pKOjo6KioqKioqOjoZubq4+Pu4iIw4WFxIODxoODxoKCx4SExYmJv4mJvZCQuJKStp6erKamo6Kio6Gh
+ oaGhoaGhoaCgop2dppeXrJGRtI+Pt4qKu4mJu4mJuomJu4mJvY+Pt5KStZiYrp6epqGhoqGhoaGhoaCg
+ oKGhn56eopiYqZOTr42NtYWFvYCAwoGBw4KCw4ODwoeHvYuLuYmJu4mJupOTr6CgoqKioqKioqOjoJ2d
+ ppOTr42Nt4mJvoiIwIiIv4iIv4mJvYqKuomJvI6OtZOTsJqarKCgpaOjoqKio6Kio6KioqOjn52dpJKS
+ soiIvoODw4SEw4aGv4qKu4yMu4yMvI2NvIyMvYmJwI+PuZ2dq6ampKWlpaWlpaWlpaWlpaOjpaOjpKOj
+ pKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaKip5mZsY+PvIyMv4yMvIyMu4eHvoWF
+ voGBwYCAw4GBxIODxYiIwIyMvIqKvpSUs6CgpaOjop+fpZWVr46OtoyMt46OtIuLtIaGuIWFtoaGtoWF
+ uYmJt4+Ps5GRsJWVrZSUsJqaqJ6epZmZq5KSs5GRtJCQso6OtImJuYSEvoKCwoGBwoCAxYaGwYuLvY2N
+ uo2Nuo6Oup2drKWlpaKip5qarZaWspWVspWVsY6OtoiIuoeHuIaGt4SEwIGBxYKCxoGByIODxIiIvYyM
+ uZaWr6KipaSkpJ6eqZeXsZKStpCQuYWFw4GBxYCAwoCAwYGBw4ODxYSExoWFxYWFxYWFxYmJwJWVs6Gh
+ p6Sko6OjoZqaqYmJvH9/xH9/wn5+wn5+wn9/woODv4eHu4aGv4eHv4eHwIaGwYuLvZaWsKKipKWlpKam
+ pKKip5aWs4mJwYeHwoaGwIWFvoSEvYWFuoaGtoODvoKCw4KCx4SExoyMvJeXsZycrJ6eqqOjpqenpKWl
+ pp+fqZeXrouLu4KCw4GBxICAwX9/wX9/wYCAwYKCwoSExYSExYqKvpWVsp6ep6Kio6Ojo6OjpKSkpKWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpqamp6amp6amp6ampqWlpqamp6amp6ampqWlpaWlpaWlpaWlpaSk
+ paSkpaSkpKSkpaWlpqampyAApaWlpKSjoqKjoqKioqKioqKjpKSlpqampqanpqanpqanpaWmpaWlpKSk
+ o6Oko6Oko6Oko6Oko6Oko6Ojo6Ojo6Oko6Oko6Oko6Oko6OkpKSlpKSlpKSlo6OmnZ2sl5ezj4+6h4fC
+ g4PFhITFgoLGgoLGhYXDi4u7kZGzl5eunZ2noaGioKCgoKCgoKCgoKCgn5+hmpqnk5Oyh4e+goLFg4PF
+ hITFhITFhITGhobEjIy9k5O0mZmvoaGqpaWmpKSkoqKjoqKhoaGhoaGhoaGhn5+hlpapjY2yiYm3hYW+
+ g4PDgoLDg4PDiIi+kZGynJymo6Ogo6Oio6Oko6Oko6Oko6OkoqKjo6OioKCklZWyiYnAhYXEg4PGhITG
+ hITHhobFiorAjY27jo63kpKylZWxnp6qpaWkpKSlo6OjoaGhoaGgoKCimJiqj4+0jY23i4u5iYm6iYm6
+ iYm6ioq5jo62k5Oyl5etm5uqoKClo6OhoaGhoaGhoKCgoKCempqmkZGxjY22hoa/gYHEgYHDg4PDg4PE
+ hITDh4e+ioq7i4u3kJCxmpqmoqKeoaGhoqKio6Ohm5upkZGzjY23jY22ioq5ioq6i4u6ioq8i4u8j4+3
+ lJSvkZGxmZmroaGjoqKioqKjoqKjoqKjoaGim5upj4+3hYXAh4e/h4e+iYm6ioq9iYnCiYnBiIjCiorA
+ j4+7mZmvoqKlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6OkpKSlpaWlpaWlpaWlpaWlpaWlpKSkpaWl
+ paWlpaWlpaWlpqako6OnoKCrnJytmJiwkJC4iIi+gYHEgIDCf3/DgoLEiIjAjIy8ioq+i4u9k5O0nZ2o
+ o6Oio6Ojn5+mmpqomJiqk5Oui4u1hoa4hYW2hYW4iIi2jo6yk5OxkpKxkZGykJC0k5Owm5unnZ2kl5er
+ kpKxjo6zioq3hYW+gYHDgIDDgIDChIS/h4e/iIjAiIjBhobBhobBkpK1oKCqpaWkn5+pmJixl5exlpav
+ kJCzi4u3h4e6goK+f3/CgYHEgYHFg4PEiYm9jIy5i4u6j4+0np6mpaWhn5+plZWzkpK1k5O0h4fCgYHG
+ gIDCgIDBgYHDg4PFhYXGhYXHhYXHhITHhobEkZG3n5+oo6OkpaWhn5+lkJC0goLDgoLAgoK/g4O+g4O8
+ g4O6hIS9gYHDgoLFgoLGgYHIhYXDkpK0n5+lo6OjpqakoqKolpazjo69kJC6kJC3i4u4iYm4h4e5goK9
+ gIDCf3/EhITBioq9kJC3lpaxlpazl5eyoaGop6ejoqKplpa2i4vAgoLIgYHGgoLEgIDCf3/Bf3/Bf3/B
+ gIDCgYHGiIjAkpK0mJiwmpquoaGloqKioqKjo6OkpKSlpKSlpKSlpaWlpaWlpaWlpaWlpaWlpqampqan
+ pqanpqanpaWmpaWmpqanpqanpqanpqampaWlpaWlpaWlpaWlpaWlpaWlpaWlpqamIAClpaWlpaWlpaWj
+ o6OioqKioqKjo6OkpKSlpaampqempqempqelpaalpaWkpKSjo6Sjo6Sjo6Sjo6SioqKioqKjo6Kjo6Oj
+ o6Sjo6Sjo6Sjo6SkpKWlpaSioqeWlrSQkLuKisGFhcWDg8WDg8WFhcOFhcOKir2OjriTk7Cbm6ehoaGh
+ oaGhoaGgoKCgoKChoZ+fn6GUlK2Hh7+CgsWCgsSDg8SDg8SCgsSEhMSKir+QkLmVlbOcnKujo6alpaWl
+ paWkpKWioqOioqKhoaGgoKGcnKaUlK2Pj7KIiLiBgcODg8KEhMGJibqQkLOTk66YmKqenqOioqKjo6Oj
+ o6Sjo6Sjo6Sjo6Sjo6KamqqMjLuDg8WCgsWCgsWDg8WEhMWKisCNjbyNjbySkrWRkbOZmaqioqWlpaWk
+ pKWkpKWjo6OhoaKenqOUlK6MjLmMjLiJibuJibqJibqJibuKiriQkLGUlK+cnKienqagoKSioqKioqKh
+ oaGhoaGhoZ6ZmaiNjbaFhb6CgsWDg8SDg8SDg8WDg8WDg8WCgsaGhsCNjbWXl6mfn6GgoKCgoKChoaGe
+ nqWYmK2UlLKSkrKPj7OLi7mLi7uMjLyOjr2RkbmVlbOUlLOTk7KcnKWjo5+ioqKioqKioqOjo6KdnamV
+ lbGQkLaMjLmLi7qLi7qKiryGhsKDg8eEhMeGhsWPj7ybm66jo6SkpKOjo6SkpKWlpaWlpaWlpaWlpaWl
+ paWkpKSjo6Sjo6SkpKWlpaWlpaWlpaWlpaWjo6Sjo6WlpaWlpaWlpaWlpaWmpqSnp6OgoKmTk7aHh8KC
+ gsaBgcSAgMGBgcGGhr+Li7qLi7yMjLuSkrSZmaygoKaioqKioqOjo6Kjo6CcnKaQkLOHh7uIiLmGhriH
+ h7aMjK+Rka6SkrOSkrKSkrKSkrCTk66YmKqbm6eWlqyPj7SJibmJibmGhr2CgsGCgr+Cgr6Hh7qDg8GB
+ gceCgsaCgsaEhMSNjbmamqylpaShoaiYmLCZma+YmK+Wlq+OjreEhMF/f8N/f8GAgMOCgsKIiL2Li7qK
+ iruKiruLi7mXl6qioqGcnKuTk7eVlbSSkrWGhsOBgcWAgMKAgMGAgMKCgsSEhMWFhcaFhceEhMiHh8ST
+ k7WgoKekpKOkpKSioqSZmauNjbeOjrSLi7WIiLWGhreCgrt/f8OBgcKCgsOCgsWDg8SHh8CNjbiZmayh
+ oaSkpKOhoaicnK2ZmbGXl7OTk7aNjbqKiryFhb9/f8OBgcOCgsGHh7yKiruJib6IiMGIiMKRkbigoKmn
+ p6Kfn6uPj7yEhMiGhsSGhsOEhMKAgMF/f8F/f8F/f8GAgMSDg8WMjLuUlLGUlLOUlLSfn6ajo6KioqOj
+ o6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWmpqampqempqempqelpaWmpqampqampqempqalpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaUgAKWlpaWlpaWlpaSkpaOjo6KioqKioqOjpKSkpaampqamp6amp6am
+ p6WlpaWlpaSkpaOjpKOjpKOjpKKioqKioqKioqKio6OjpKOjpKOjpKOjpKOjpKOjpJ2drI+Pu4qKwYWF
+ xYSEx4SExoWFwouLuoyMu4uLvImJvpCQtp2dp6GhoKGhoaGhoaGhoaGhoaGhn5+fopKSsIaGv4ODxIOD
+ xIODxIODxIKCwomJvIuLvIqKv5CQuZycqqGhpaWlpaWlpaWlpaSkpKKio6Kiop6eo5iYqZKSsYiIvIGB
+ xIODwYWFwYiIvY6OtpCQtI+PtZCQs5eXq5+foqKioaOjo6OjpKOjpKOjpKGhpZWVsYiIwYKCx4ODxYKC
+ xYODxIqKvo2NvIyMvY2NvI2NvJKStZ2dpaKioKOjpKSkpaSkpaSkpZ+fp5iYrJGRs4yMuoqKvIqKu4mJ
+ u4mJu4mJuYiIuoqKuJeXqJubpp+foqKioKKioqKioqKioqGhoaGhoJmZqYqKuoCAxYGBw4GBwoKCw4KC
+ xYKCxYKCxYKCxYODxYyMt5ubpaKinaCgoKCgoKGhn5mZq5OTspOTs5GRtomJvYqKvYqKvYqKv5CQupWV
+ tJSUtZSUtJqaraCgpKGhoKGhoaKioqKioqOjoZqarJCQuIyMvIyMuouLuYuLvIWFxIODxoWFxYeHw5CQ
+ u5ubrqSkpqWlo6OjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKOjpKSkpKWlpaWlpaWlpaWl
+ paSkpKSkpKWlpaWlpaWlpaWlpJ6eqpGRuIWFxIODxoSExYKCw4CAwYaGvIuLuYmJu4qKu5GRtZaWr56e
+ pqKioqGhpKKio6OjopycqY+PuImJv4qKu4mJuYiIuIyMro2Nq46Or5CQspCQs5GRs5OTsJWVrJeXq5WV
+ rZGRs4mJvIqKvImJuoqKuYmJt4aGtoaGuIGBwoCAw4GBxIKCxYWFw4yMvJWVspqaqKGho6OjpZ6eqJ6e
+ qZubro6OuoSExYGBxoCAwn9/wYCAwIiIuoqKuYiIvIiIvoiIvoeHv5KSsZ+fop+fpZmZrpiYr5OTtIeH
+ woGBxYCAw4CAwYCAwYGBw4ODxYSExYWFxoSEyIeHxZWVtqCgpqOjo6OjpKSko6OjpJycqpubqZOTrYqK
+ tYKCvn5+w39/wYCAwYGBw4GBxIiIvY+Pto6OtpSUsKCgpKOjoqOjo6WlpKSkpp2drI+PvIyMv4eHw4GB
+ xoGBw4KCwYmJuYSEwYCAx4GBxoKCxoSEw5GRt5+fqKamop+frJGRuY6OvY6OvY6OvImJv4KCwn9/wX9/
+ wYCAwoKCxImJvYyMuYmJvIuLvJOTtZ+fp6Sko6OjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWl
+ paWlpaampqamp6amp6amp6WlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpSAApaWlpaWl
+ paWlpaWlpaWlo6OkoqKioqKioqKjpKSkpqampqanpqanpqanpaWmpaWlpKSkoqKioqKioqKioqKioqKi
+ oqKioqKio6Oko6Oko6OkpKSjoKCnlZWziIjBhITGhITGg4PGhobBiYm6iYm8i4u8i4u8jIy7kJC3mZms
+ oqKgoaGhoaGhoaGhoaGhoaGgnp6ikpKwi4u4hYXBgoLFg4PFhITDiYm6ioq7i4u7ioq9kZG3n5+oo6Ok
+ o6OkpKSlpaWlpaWlpaWkoaGjmpqsk5OxiYm9goLEg4PChobDi4u9hYXDg4PGgoLGg4PDjIy5mJiqoKCi
+ oaGgoaGhoqKjo6Oko6OkoaGllpayiYnBgoLGgoLEgYHCh4e6ioq4jIy5jY27jY28kZG3mJiwoKCloqKg
+ oaGhoqKkpKSlpaWknJytkpK2jIy6iYm8iYm9iYm9iYm9iYm7iIi6ioq4kZGwmJimnZ2hoKCgoaGhoaGh
+ oqKioqKio6Ohnp6lkZGyhobAgoLEgYHCgoLEgYHEgYHEgoLEgoLFg4PEj4+1l5etnZ2koaGfoKCgoKCg
+ oaGflZWskZGzkpK0j4+4ioq9hITEg4PFg4PHh4fDkJC6lZW0mZmvoKCnoqKjoqKhoaGhoaGhoqKio6Oh
+ nZ2olpawkJC2jY25iYm5hYXDhITGhITGh4fDjo67lJS0nJyuo6OnpqakpKSlo6Oko6Oko6OkpKSlpaWl
+ paWlpaWlpaWlpaWlpKSkoqKjoqKjpKSkpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6OjmJiuioq/goLI
+ hITFhITFiIi7h4e4h4e5iIi5iYm6iYm7ioq7ioq9j4+4lpavnJyooqKjo6OimJivjY27ioq+i4u8ioq6
+ jo6wjY2tjY2sjo6ujo60ioq8ioq7iYm8j4+1l5ermpqmmJiri4u6ioq7ioq7iYm6iIi4hYW4f3/BgIDC
+ gYHCgIDDhITAi4u6i4u9kpK2mJiunp6ko6Oho6Onm5uuj4+7hobEgoLGgoLEgIDDf3/AhYW4iIi4iIi7
+ hoa/hYXDhYXDhITEkZG2np6loaGfm5uklZWskZGxjIy4hIS/gYHCgYHBgIDBgYHCgoLEg4PFhITFhITG
+ hobGjo69mpqvoaGlo6OjpKSkoqKmmpquk5OzjIy4hIS+gIDCgIDBf3/BgIDBgIDDh4e7jIy1jo60lpat
+ mJiqn5+ioqKho6OioaGmm5uulZW1j4+8h4fFhITHg4PFg4PCh4e4goLAgYHDgoLEgYHFhITDk5OzmZms
+ oaGmpaWioKCplZW1kJC6kJC7j4+9h4fCgYHFgIDCf3/BgIDCiYm6hoa/goLFg4PFhYXEkpK2n5+npKSj
+ o6Oko6Oko6OkoqKjo6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpaWmpaWlpKSl
+ o6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlIAClpaWlpaWlpaWlpaWlpaWlpaWjo6SioqKioqKioqOkpKSl
+ paWmpqempqempqempqalpaWlpaWjo6SioqKioqKioqKioqKioqKioqKjo6Sjo6Sjo6Obm6uMjLuDg8aD
+ g8aCgseHh8KKiryJibqJibmKirqMjLuRkbaYmK6enqaioqKhoaGhoaGhoaGioqChoaGZmaqMjLeFhcGD
+ g8SCgsWEhMGJibqKiruLi7qJibyPj7WcnKmioqOjo6Sjo6Sjo6SkpKWlpaWlpaWkpKaWlrGIiL+Dg8WC
+ gsSFhcGLi7yFhcODg8WDg8WCgseGhsKSkrKfn6OhoaGhoaGhoaGhoaGioqKhoaWcnKuWlrOOjruKisCJ
+ ib2Hh7qKirmLi7mLi7mMjLiSkrWYmLCenqmioqWjo6OhoaGhoaGioqOioqiWlrSOjruLi7yHh76EhMKF
+ hcKDg8OGhr+NjbeTk6+ZmamdnaGdnZ+enp+goKChoaGhoaGioqKenqWUlLOIiMCDg8SDg8SBgcOBgcOB
+ gcSBgcSBgcWEhMKPj7SXl6ycnKWgoKGhoaCgoKCgoKCenqKYmKqRkbGNjbaJibyDg8SDg8WEhMWEhMWD
+ g8aIiMKWlrSfn6ikpKWkpKSjo6OioqGhoaGioqGdnaiWlrCRkbaOjrmLi7yDg8KDg8SDg8aGhsOOjrqU
+ lLSTk7Samq6jo6empqSlpaWlpaWjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWkpKWioqOioqKjo6Sl
+ paWlpaWlpaWlpaWkpKWjo6Sjo6SioqScnKqRkbiJicCKir6Kir6JibuIiLmHh7mIiLiIiLuDg8ODg8OD
+ g8WHh8GRkbabm6qhoaOioqKbm6qYmK6ZmayXl66Pj7OQkLGOjrCNjayLi7GIiLqJibqLi72Li72Kir6S
+ krOdnaOfn6GSkrKLi7qKiryLi7qIiLyBgcJ/f8GBgcOAgMWEhMCJibqJibqKirqLi72Pj7mamqyjo6Cf
+ n6SUlLWHh8SFhceDg8WFhb+Hh7mFhbiGhreHh7qGhsCFhcOEhMOEhMOJib+VlbKenqijo6GcnKWQkLGR
+ kbCOjraFhb6BgcKBgcKAgMGBgcKCgsSDg8WDg8aGhsSMjL2Njb6QkLucnK+ioqWjo6Kioqaamq+OjryF
+ hcOCgsSBgcKAgMGAgMF/f8KDg7uGhrmLi7eTk6+amqihoaGhoaChoaCjo6Cfn6aTk7KPj7qMjL2Li7+K
+ ir6JibuIiLuBgcCAgMKBgcKAgMWGhr+SkrKVlbSVlbOamq6hoaaioqSamq6Pj7yPj7yIiMSFhciEhMaB
+ gcWBgcKJibiFhcCEhMWEhMWDg8aEhMaMjL6amrCkpKelpaSjo6Sjo6Sjo6SioqOjo6Sjo6Sjo6Sjo6Sl
+ paWlpaWlpaWlpaWlpaWlpaWmpqempqempqelpaalpaWlpaWjo6SlpaWlpaWlpaWlpaWlpaWjo6QgAKWl
+ paWlpaSkpKSkpKWlpaWlpaWlpaOjo6KioqKioqOjo6SkpKWlpqamp6amp6amp6WlpqSkpKOjpKOjo6Ki
+ oqKioqKioqKioqKioqKio6Kio6Kio52dqJKSs4iIwImJv4mJv4qKvYqKu4qKu4mJu4mJuY+PtJiYrZ+f
+ pqKioqKioqKioqGhoaGhoKCgopiYrI2NuYWFxIKCxoGBxoSEwYiIu4qKuIuLuouLu42NuJiYq6KioKKi
+ oaKio6OjpKOjpKOjpKWlpKWlpaOjp5qar5GRt4mJvImJvomJv4WFwoODxYODxYKCxoSExoyMvJmZq6Gh
+ oaGhoKGhoaGhoaGhoKCgopubq5WVspKStJKStI+PtomJuoqKuoyMvIyMu42NuZCQtJaWrJ2dp6KipaOj
+ pKOjpKOjo6KioaGhoaCgppaWtI2NvYiIwYWFw4WFw4ODxIeHvomJu4qKu4+PtJqaqKCgoZ+fn56enp+f
+ n6CgoaGhoaKioJmZrIuLvoODx4ODxoODxYKCxYKCxIKCxYKCx4WFwY6Os5eXq52dpaCgoqGhoaGhoaCg
+ oZ2do5mZqZKSsI2NtYiIvIODxIODxYSExoSExoKCyIeHwpKStpqarqOjpaSkpaSkpaSkpKOjoqGhop2d
+ o5iYq5GRtY2NuoqKvoWFxIKCxIGBxYWFwY2NupOTtpWVs5mZr6Cgp6OjpKWlpKWlpaWlpaSkpaOjpKOj
+ pKOjpKWlpKWlpaWlpaWlpaOjpKOjpKOjpKOjo6KioqSkpKWlpaWlpaWlpaWlpaSkpaOjpKKipKOjpJqa
+ ro6OuoqKvYqKu4mJuoiIuYeHt4WFuYODwYKCxIKCxIGBxomJvZeXrqGhpKGho6KioqGho56eppmZq5OT
+ sJGRspCQsZCQsIuLs4aGuIaGuYmJuouLvYuLvo+PupOTtZiYrZqappGRsoqKuomJu4aGv4KCxICAw39/
+ wn9/xIWFv4mJuomJuYmJuYmJuY6Ot5CQt5aWsJ+fpaGho5eXrYqKvomJv4qKvImJuomJuIeHuIaGuYSE
+ voWFwoSExYWFxIqKvpWVs56eqaCgpaKiop6eppGRs42NtoyMt4SEv4CAw4CAwn9/wYCAwYGBw4GBxYWF
+ womJvoiIwIiIwYeHxZKSuaCgqaSkoqGhpJ6eppaWrouLuYODw4CAxYCAw39/wYODu4WFuImJs4+PsJSU
+ rpWVrZiYqpubp5+fo6KioJ+fpJmZrJmZrJiYrZSUso+PtomJu4ODwn9/wX9/wX9/woGBw4SEwomJv4mJ
+ wYeHw5CQuJ6eqaWlop+fqJCQuIaGxYKCyIODyIKCyIODw4iIuYSEvYKCw4ODxYSExoWFxYuLwJGRuZmZ
+ saOjqKampKSkpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpKSkpKWlpaWlpaWlpaWlpaWlpqWlpqWlpqWl
+ paWlpaWlpaSkpaOjpKOjpKSkpKSkpKSkpKOjpCAApaWlpaWlpKSko6OkpKSkpaWlpaWlpKSlo6OkoqKi
+ oqKioqKjpKSkpaWmpaWmpaWmpKSlo6Oko6Oko6Oko6Ojo6OioqKioqKioqKioqKio6OhoKCkm5urk5Oz
+ jIy9jIy9jIy9i4u8ioq8i4u8i4u5kJCzkpKvl5epn5+kpKSioqKioqKioqKio6Ogn5+ik5OviIi+h4e/
+ h4e+h4e+ioq7ioq6hYXBhobAhITDjIy5m5uno6OeoaGhoaGio6Oko6Oko6Oko6OkoqKmnZ2tmJizkpK5
+ jo66ioq9hYXDgoLGg4PFg4PGg4PFjIy7mZmtoaGloqKioaGhoaGhoaGhoqKgn5+jkpKykZGzkpKykJC0
+ jIy4ioq6ioq7i4u7jo66kpK0lpavl5ernJyjoqKjo6Oko6Oko6Oko6OjoKCinJymkZG2iYnBhobFhITG
+ hITFiIjAjIy7jIy6iYm+jIy6mpqooaGhoaGgn5+fnp6en5+eoKChnp6ll5evjY26iYm+hobBg4PFg4PF
+ goLGgoLHhYXEjIy6lZWtmZmln5+goaGgoaGhoaGhoaGhnJylkZGxjIy2h4e8g4PEg4PIhITGhITGg4PH
+ iYnBk5O2mpqtn5+npKSkpKSlpKSlpKSlpKSkoqKklpatkJCzjY24iYm+hITDg4PHg4PGh4fBjY24kZGy
+ kpKzlJSyoKCmpKSko6Oko6OkpKSkpaWlpaWlpKSlo6Oko6Oko6OkpKSkpaWlpaWlpKSlo6Oko6Oko6Ok
+ o6OjoqKjo6OlpaWlpaWlpaWlpaWlpKSlo6OkpKSjmpqtkJC5j4+6i4u7iYm6iIi4hIS6gYG/gYHEgoLE
+ goLDgIDGiYm9mZmro6OhoqKjoqKipKSfm5uqkZG1kJC1kZGykZGxjY20iIi5hoa5h4e4iYm6i4u8i4u+
+ kJC4lpaxmZmsmZmrlZWti4u5iIi8hoa+hYXAhoa9hIS8hIS7h4e5iYm4iYm5iYm5iYm5jIy3jY25kZG3
+ m5uso6Ohn5+llZWukpKzjo64ioq7iIi6h4e6g4O+g4PAhITDhobDi4u+k5O2nJyrn5+ooqKkpKShoKCk
+ mJiujY26hYXAgoLEgYHDgIDBf3/Bf3/Bf3/DhIS/h4e9h4e/hITDhITEjIy9lpa0o6OppqakoKCnnJyo
+ mJirjo60iYm7h4e9hIS9hIS7hYW2hoa3ioq0i4u3ioq9ioq8iIi/kpK0n5+mo6OgoaGhoKCknZ2nmZmq
+ k5Ozi4u9g4PEf3/Gfn7Df3/BgIDBgYHBgYHDgoLGg4PHhobDjo67nZ2rpqahoaGmlpayjY28jIy9jY28
+ jIy8iIi8hIS9gIDCgYHEg4PFg4PHh4fEk5O2mpqwoaGppaWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6Ok
+ o6Oko6Oko6OkpaWlpqampqampqampaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlpKSlo6Oko6Oko6Oko6Ok
+ IAClpaWlpaWlpaSjo6Sjo6SkpKWlpaWlpaWlpaWjo6SioqKioqKioqSjo6SkpKWkpKWkpKWjo6Sjo6Sj
+ o6Sjo6Sjo6SioqOioqKioqKioqKjo6CcnKmRkbWNjbuLi72KiryKiryLi7yLi72MjLuRkbSVla+Skq+X
+ l6aenqCioqGioqKioqKioqKhoaKcnKeTk6+MjLaLi7iJibmKiriJibuGhsGCgsaCgsaEhMKOjrebm6ij
+ o5+hoaGhoaGhoaKioqOjo6Sjo6Ofn6iUlLWQkLqNjb2Kir+FhcOCgsaDg8WDg8aFhcWNjbqXl66fn6aj
+ o6KioqOhoaKhoaGhoaGioqChoaGUlK6SkrCQkLOLi7iJibyKiruJibuNjbiRkbOVla+YmK2bm6menqKg
+ oKCioqKjo6Sjo6SioqWcnKqTk7KIiL6FhcSFhcaGhsSIiMGJicCIiMGHh8KJicCSkrSenqShoaGhoaGh
+ oaGfn5+fn52enp+WlquSkrOPj7aLi7yGhsKDg8WDg8WGhsKIiMGJib+OjrmVla+Zmaefn6ChoaChoaGh
+ oaGgoKKamqiMjLaHh72CgsOCgsaEhMaEhMaEhMaFhcWPj7qXl7Gamq2hoaajo6SkpKWkpKWkpKWkpKSi
+ oqaYmLCOjriIiL6EhMODg8aFhcWIiMGLi7yQkLaQkLSPj7aWlrGjo6Kjo6Sjo6Sjo6Sjo6SkpKWlpaWl
+ paWkpKSjo6Sjo6Sjo6SkpKWkpKWkpKWjo6Sjo6Sjo6Sjo6SioqOioqOjo6SlpaWlpaWlpaWlpaWkpKSi
+ oqOXl6+OjrmOjrqLi7yLi7uGhryBgcB/f8KAgMKCgsOBgcSGhsGQkLacnKijo5+ioqCioqKkpKCamquU
+ lLKVlbCSkrKPj7WIiLmHh7qHh7iGhriJibqLi7uLi7+Tk7Wbm6ydnamenqaenqWQkLSLi7iMjLaLi7eI
+ iLmHh7eGhrWGhraIiLiJibmKirmLi7mKirqMjLqRkbWbm6ukpKGjo6KcnKiSkrKLi7qJibyIiL2Fhb+C
+ gsKBgcKEhMCKir2Pj7qSkriVlbSTk7acnK6ioqWioqKenqaQkLeFhcGEhMGDg8KAgMSAgMJ/f8KCgr6G
+ hruGhr6EhMOFhcCLi7qTk7OZma6hoailpaWhoamWlrKSkrWOjreMjLeLi7eIiLiGhreFhbeHh7WFhbmD
+ g8GDg8aDg8aIiMCTk7SgoKejo6GhoaGgoKGWlq2RkbWOjrqJicCGhsKGhr+IiLiAgMB/f8GBgcGBgcOC
+ gsOGhsCOjrqTk7WenqqlpaKioqWenqmZma6VlbKVlbKQkLWGhr9/f8SAgMGBgcOCgsWEhMWMjL2Xl7Ka
+ mq+ioqimpqSmpqSlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SlpaampqempqempqelpaalpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaSjo6Sjo6Sjo6QgAKWlpaWlpaWlpaWlpaSkpKOjpKSkpaWlpaWl
+ paWlpaOjpKKioqKio6OjpKSkpaSkpaSkpaSkpaOjpKOjpKOjpKOjpKOjpKKio6KioqKioqOjoZqaq4+P
+ uIuLvIqKvYmJvImJu4qKu4qKvIuLu5GRtJSUsJWVr5ycpKCgnaCgoKKioqKioqOjoZ6epZeXrpOTs5CQ
+ tIqKuYqKuoqKvIaGwoODx4SExYaGw46OuJSUsJ2dpqKioKGhoaGhoaGhoaKioqOjoqOjo52dqpCQuIqK
+ vouLvIaGwoGBx4ODxYODxYWFxImJv5SUs5qaq5ycqKKioqKio6Kio6GhoqGhoaGhoZ6epJiYqpKSsouL
+ uYiIu4mJuomJuouLt5CQtZSUr5WVr5eXrJ+fpaOjop+fn6CgoKKio6SkpKGhp5aWsoeHwYODxIODxIWF
+ woiIwIqKv4SExYODxoKCx4uLvZqaq6SkoaGhoqGhoaGhoaGhoaCgn5uboY6OsYyMuIqKvYWFxIKCxoOD
+ xYODxYmJv4qKv4qKv46OuZeXrpycqJ+foKCgn6GhoaKioaCgopiYqouLuoKCxIGBxoKCxIODxYSExoWF
+ xYyMvpKSt5eXsZycq6KipaOjpKOjpKSkpaWlpaOjpp6eq5eXso6Ou4eHwYSExYSExoWFxIqKvomJv4mJ
+ voqKv4+PupmZrqKio6Kio6OjpKOjpKOjpKOjpKSkpaWlpaWlpaSkpKOjpKOjpKOjpKKio6OjpKOjpKOj
+ pKOjpKOjpKOjpKKioqKioqOjpKSkpaSkpaSkpaOjpKKio5mZrI6OuYqKvouLvYqKvoODwn9/woCAwYCA
+ wYKCwoWFwpGRt5iYr5ycrJ+fp5+fpaGho6KioZ+fppubqpiYrZCQtoqKvIiIuoiIuYaGuIWFt4iIuYuL
+ u4yMvJaWspycrJ6eqqGhpaGhpZeXrZSUr5SUrY+PsYiIuIeHuIWFtoaGtoiIuIuLuY2NuY2Nuo6OuZGR
+ tZaWr52dqKKio6Kio5qarI6OuoqKvYuLuYqKu4WFwISEv4KCv4eHu4yMuYyMvIyMvouLwIuLwJWVt56e
+ q6Ojo6Kio5WVsI6OuI2Nt4iIvYODw4ODwIKCv4aGuYSEvYSEwYWFwYiIvZCQs5CQtpGRtZmZrqOjpqOj
+ p5eXs4+PuIyMu4qKu4mJu4iIuYaGuIaGt4aGuIGBvoGBw4WFwoqKvpaWr5ubqp+fpqGhpKOjoqCgo5SU
+ r42NuoyMvI2Nu4+PuZCQto2Ns4KCv39/woCAwoKCwoWFvouLtpSUsJycqqGhpaSkpKOjpKKipJmZrJOT
+ spKStIqKvH9/xoGBw4GBwoGBw4KCwoaGwIyMvJCQuY+Pu5WVtZ+fq6WlpaWlpaWlpaWlpaSkpKOjpKOj
+ pKOjpKOjpKOjpKSkpKWlpaamp6amp6amp6amp6WlpqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSk
+ pKOjpCAApaWlpaWlpaWlpaWlpKSlo6Oko6OkpaWlpaWlpaWlpKSlo6OkoqKioqKjo6OkpKSlpKSlpKSl
+ pKSlo6Oko6Oko6Oko6Oko6OkoqKioaGjn5+lnJynl5etj4+3iYm9iIi+h4e+h4e9iYm8ioq9i4u7lZWx
+ m5unoKCioKCfnp6eoKCgoqKioaGinZ2nl5eukJC2ioq7iYm6ioq8h4fEhYXHhYXGhobFjo6+lJSzm5uo
+ oKCioaGhoaGhoaGhoaGhoaGhoaGioKCmmpqtkpK2jY29i4u8hobAg4PFhITEhYXDioq9i4u9jo65lpax
+ nZ2noaGhoqKjoqKjoqKjoqKhn5+jlparj4+zioq6iYm7iYm7iYm8ioq6kZGxkZGxkZGyk5OwmZmqn5+l
+ oqKioqKioKCgoKCfoqKinp6pkJC2hobEhYXEhYXDiIjAiorAhITHhYXGhYXGiYnBlJSzn5+loqKjoqKj
+ oaGhoaGhoqKhoKChmZmni4u1iIi6g4PDgoLGg4PFg4PFg4PEg4PGg4PGiIjAk5O0np6noaGioaGhn5+f
+ n5+foaGgn5+imJiqjIy4hYXCg4PEg4PDhITEhobDjIy9kpK2lZWzm5utoqKlo6Oko6Oko6Oko6OkpKSj
+ oKCol5ezkZG5jY28jIy9h4fCgoLGg4PFhITGg4PGg4PGh4fCkpK2np6po6OkoqKjoqKjo6Oko6Oko6Ok
+ o6OkpaWlpaWlpaWlpKSlo6Oko6OkoqKio6Ojo6Oko6Oko6Oko6Oko6Oko6OkoqKjoqKjo6Oko6Oko6Ok
+ o6OkpKSjnZ2qkpK1jY27i4u9hYXFgoLFgIDCgIDBgYHBhITAkJC1lJS1lJS3k5O5k5O5mJi0nZ2poqKi
+ oaGkmZmskJC2jIy7i4u9ioq7iIi5hoa3hYW2h4e4iIi7jo62kJC4lJS0mpqumpqvmpqsm5upmpqol5er
+ kZGwi4u1iIi4hoa2hoa2iIi4i4u6jY28jIy9kZG4kJC2kZG1l5evnp6moqKjl5evkJC2jo64jo63jIy4
+ iYm6iYm4h4e2iIi3ioq6jY29jY2+jo69lZW1mpqwoKCrpaWloqKknJyolZWxkpK0jY24iYm8ioq6h4e5
+ g4O8goK+hIS+h4e9ioq7iIi/iIi+hYXCj4+4n5+opaWlnZ2sl5eyjo66ioq9iYm7iYm5iIi4hYW5goK+
+ gYHBg4PCiYm+k5Oym5uqmpqqmZmrnp6no6OioqKjnJyoj4+1jY26jo65j4+3jo64gYHFgYHCgYHBgYHC
+ hoa/jo62kpKwmJiqn5+koqKko6Olo6OkoaGmlJS1kpK1jo64h4fAgoLGgYHDgYHCgIDChoa8h4e/goLH
+ g4PGhYXGiorAlpa0oqKopqakpaWlpaWlpaWlpKSko6Oko6Oko6Oko6OkpaWlpaWlpqampqanpqanpqan
+ pqanpaWmpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6OkIAClpaWlpaWkpKWioqOioqKioqKjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6Sjo6SioqKioqKioqSjo6SkpKWkpKWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sfn6afn6Wa
+ mqiQkLOIiL+Jib6Dg8SDg8WDg8WCgsWEhMKNjbmYmKugoKKioqChoaGgoKCenp6goKCdnaaXl66QkLeL
+ i7yKirqLi7yGhsOFhceGhseGhseHh8aNjb6amrChoaSioqChoaGhoaGhoaGhoaGioqCdnaWamqmamquR
+ kbWMjLyJibyJibuJibuJibuJibyKir2Jib+Tk7SenqiioqOioqOhoaGioqOioqOjo6KgoKSXl6uKiruJ
+ ibuKiryKiryKiryLi7yKirqQkLKSkq+Xl6qenqOioqGioqKioqKioqKgoKCgoKCdnaiQkLaLi7yLi76L
+ i7uHh7+EhMaFhcWFhcaKisGQkLqbm6ykpKGioqOioqOioqOhoaKhoaChoaGbm6eNjbWCgsGAgMSBgcSD
+ g8WFhcWFhcWEhMaJicCRkbeYmK6enqeioqOhoaGhoaGfn6CenqCenqKZmamTk7CMjLmJibyJibyJibuK
+ iruRkbWTk7WVlbSbm62hoaajo6Sjo6Sjo6Sjo6SioqSenqmYmLCUlLWOjryGhsSDg8eEhMaEhMaFhcaE
+ hMaJicGPj7uYmLCjo6Sjo6Sjo6SioqOioqOioqOjo6Sjo6Sjo6Slpaampqempqempqempqejo6SioqKj
+ o6Ojo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKOgoKeZma6SkrWLi72FhcSDg8SCgsKA
+ gMKCgr+NjbKSkrGOjrqMjL6Njb6Njb6SkrmgoKyjo6ShoaSWlq+Li7yMjLyKiruKiruIiLmGhreGhreH
+ h7qBgcOCgsWCgsaHh8GNjbyOjrqVlbKdnaiamquSkrOMjLiJibmJibmGhraGhrWJibaLi7mJib+FhcaF
+ hcaFhceGhsWPj7ycnK2ioqOenqaXl62Tk7GPj7eJib2JibuJibqIiLiGhreHh7iKirqNjbyUlLaZmbGg
+ oKqlpaWlpaWlpaWjo6SVlbGMjLuKir6KiryIiLyFhcGCgr2Dg7+Hh7yKirqIiL6FhcKFhcKDg8SMjLub
+ m6ujo6KgoKWamqyUlLKOjrmLi72Li7qIiLqDg8GBgb+BgcGFhb+Li7uMjLuSkrSTk7OYmK2fn6Wjo6Ki
+ oqOioqOWlrCSkrKTk6+NjbeCgsWCgsOBgcKAgMKFhb6OjreTk7GTk7OTk7OSkrSWlq+enqekpKOioqWW
+ lrKPj7uLi76GhsGBgcSBgcOAgMGCgr6BgcGCgsSEhMaGhsSLi76Tk7eZmbChoaimpqSlpaWlpaWlpaWl
+ paWkpKWjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaampqempqempqempqelpaalpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaUgAKOjpKKioqKioqKioqKioqKioqKioqOjpKOjpKOjpKOjpKOjpKOjpKKioqKioqKioqKi
+ o6OjpKSkpaSkpaSkpaSkpaOjpKOjpKOjpKCgppycqZGRtoiIvoiIvoSExIODxYODxYKCx4SExI2NuZiY
+ q56epaGhoaGhoaGhoaGhoaGhoZ6enpycopCQsoiIvIqKu4uLvYaGxIWFxoWFxoWFyIeHx46OvpubsaKi
+ qKWlpaSko6GhoaGhoaGhoaGhoaKioJ6epJeXrJOTsZKSsoqKvomJwIiIvoiIvImJu4mJu4iIvpOTsp2d
+ qKKio6Kio6Kio6Kio6GhoaKioaCgpZiYro+PuIqKu4qKu4uLvIyMvYyMvYyMvYqKvI+PtJeXqZmZpZyc
+ pKKioaGhoaKioqKioqOjoZ+fopSUq4mJvIqKu4yMuoeHv4ODxYSExoaGxYqKv4yMv5CQupycraWlo6Ki
+ o6Kio6Kio6Kio6Ghop2do5iYqpGRsomJuoiIuYWFvoKCxYSExYWFxoqKv4uLvZSUs56epqKio6Kio6Ki
+ o6GhoqKioJ+fopiYp5KSr4uLuImJu4mJu4mJu4mJvIqKu4uLuomJvpOTtZ+fqKSko6OjpKOjpKOjpKOj
+ pKKipJ+fqJiYsI2Nu4eHxIWFxoSExoODxYWFxYWFxoqKwY+PupeXsqCgqaWlpKOjpKOjpKOjpKKio6Ki
+ o6OjpKOjpKWlpaamp6amp6amp6amp6amp6amp6SkpaKioqKio6OjpKOjpKOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKSko5+fqZGRt4SEw4KCxIGBw39/xIODvIuLsImJtIuLuIuLuouLvY2NvpKSuZ2drqSk
+ p6ampqSko56epZOTsImJvYmJuYmJuoiIuYeHtoWFuYGBwoGBxIKCxYKCxoeHwYyMvY2NvZOTtp+fqJWV
+ soyMvIuLvImJu4iIuYaGtoeHtIiItYWFvIKCxIODxYSExoWFxYODx4qKwZqasKSkpKKio5ycppCQtImJ
+ vYqKvIqKvIqKuYqKt4SEvYGBwoODw4SEw5KStZaWtJaWtZmZsZ+fqqSkpaWlpZeXso2Nu4qKvouLvomJ
+ v4eHvYSEu4aGuYeHuYaGvoWFxISExYWFxYODx4qKv5mZraOjoKGho5WVso2Nu4yMvYyMvYmJvoKCwYGB
+ wYCAwYSEvIiIuIqKuouLvIuLvJGRtpiYraCgpaSkoqKio6Kio5ycqpSUsJCQs4+PtY2Nt4iIu4iIu4aG
+ u42NtZKStIyMvYeHxIaGxIWFxYqKv5aWsKGhpaOjpJqarY6Ou4aGxIODxoODxYKCxIKCv4CAwICAwYKC
+ xIaGxY2NvZWVtZaWtJaWtJqasKGhqKampaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKSkpaWlpaWl
+ paamp6amp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpSAAo6OkoqKjoqKjo6Ojo6OjoqKi
+ o6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OjoqKioqKioqKioqKjo6OkpKSlpKSlpKSlpKSlo6OkoqKlnp6p
+ kZG3iYm/h4fBg4PEg4PFg4PFgoLHhYXCjY25lJSwmpqonp6joaGhoaGhoaGhoaGhoaGhnZ2jlpapjo6w
+ jY2yj4+0jIy+hYXHhYXHhITJhYXFj4+7nJywnp6upKSnpaWlpaWlo6OjoaGhoaGhoaGhoqKgnp6kl5er
+ kZG0i4u8iIi+iIi/iIi9iIi8iYm8iYm7j4+0lpatnZ2koqKioqKjoqKjoqKjoqKioaGhmZmsj4+6i4u+
+ i4u9ioq7i4u8jIy9jIy9jIy9i4u+j4+3l5epnZ2in5+gn5+foaGhoaGhoqKhoKCkmpqrkpKyjo60ioq5
+ hYW/gYHDgYHFhITEioq+jIy9j4+6lZW0n5+rpaWko6OkoqKjoqKjo6Oin5+mmJiskpKvkpKxjY23hoa+
+ goLCgoLEhITDioq/jIy9ioq+k5O0oKClo6OhoqKjoqKjo6OioaGjmpqpkZGxiYm6iIi8iIi9iIi9ioq7
+ ioq7ioq7iYm8jIy4mZmro6Ojo6Oko6Oko6Oko6Oko6OkoKCmmJiujo66hobEhITGhITGg4PEgoLEhITE
+ ioq/j4+6l5eyn5+qpKSlpKSlpKSlo6Oko6Oko6Oko6OkoqKjo6OkpaWlpaWmpqanpqanpqanpqanpqan
+ pqano6OkoqKioqKio6OkpKSlpKSmpKSlpKSlpKSlo6Oko6Oko6Oko6OkpKSjn5+ok5O1jIy8ioq7iYm6
+ iYm2iYmziIizhoa3iYm6iYm7i4u7kpK1m5utnp6soKCrpKSnpaWlpKSjnJynjIy2iIi6iYm6ioq4hoa7
+ gIDAgIDCgYHEg4PFgoLGhobBjY26kZG2mZmwoaGmm5urk5O1kJC4kJC2j4+0j4+xiYmzg4O7gIDBgIDD
+ gYHEg4PFg4PHi4vAlJS3mZmwoqKnpKSkn5+lkJC0iIi+i4u8jIy7jY25hYW+gYHBf3/DgoLDiIi8jIy5
+ jY27jIy/lJS4oKCqpaWkpaWlmJiyjo67ioq+iYm+iYm/iYm/iIi7h4e5hYW9hITChITFhITFgoLIioq/
+ kZG3l5evoKCkoqKjlpavj4+6i4u+ioq+ioq9h4e+hYW7hIS5hoa4iIi4iYm6ioq7kJC2k5OzlZWympqs
+ oKCkoqKioqKjoqKklpawkJC3kZG0kJCzj4+zj4+yjo6ujo6wioq7hITGhITHhITHhITIhYXGjY27m5uq
+ oqKin5+mk5O1ioq/iYnAiYnAhITCgoLCgYHBf3/Cg4PBjY26lJS1i4u/iYnBh4fDjo68nZ2tpqakpaWl
+ paWlpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6OkpKSkpaWlpaWmpqanpqanpqanpqanpqampaWlpaWlpaWl
+ paWlpaWlpaWlpaWlIACkpKWkpKWkpKWkpKWjo6SioqOioqOkpKWkpKWkpKWkpKWjo6Sjo6Sjo6Sjo6Oj
+ o6KioqKioqKioqOjo6SkpKWkpKWkpKWjo6WcnKqRkbiKisCHh8KEhMSCgsaCgsWDg8aGhsKJib6OjrmU
+ lLGZmaqfn6KhoaGhoaGhoaGhoaGhoaCdnaSWlqyQkK6OjrCLi7mFhcOEhMaDg8iGhsaNjb6UlLWbm7Cd
+ na+lpainp6ampqalpaWjo6OhoaGhoaGhoaCdnaSUlLCKiryHh7+Hh72IiLyJibyJibyJibyKiryMjLeV
+ la2enqSioqChoaKioqOioqOioqOhoaKWlq+Li7yNjbqMjLyLi7uMjLyMjL2MjL6Li76Pj7mVlbGcnKag
+ oJ+goJ+fn5+goKChoaGjo6Cfn6SYmK2UlLKSkrCLi7iHh76Hh7+Hh8CIiL+Li7uKir6UlLSenqqjo6Wk
+ pKWkpKWjo6SioqOjo6GcnKqTk7SSkrOTk7CJib2Dg8WCgsSCgsSDg8SLi7uMjLyOjruZmbCjo6Sjo6Ki
+ oqKioqOgoKWamquUlLGRkbOOjraNjbWOjrWMjLqKiryKiruKiruLi7yOjrWcnKakpKCjo6Ojo6Sjo6Sj
+ o6SkpKOdnaqPj7mFhcaDg8iDg8eDg8WCgsSDg8GIiL6MjLyWlrKfn6mkpKWlpaWkpKWlpaWkpKWkpKWk
+ pKWkpKWkpKSioqOkpKSlpaWlpaalpaempqempqempqempqempqekpKWioqOjo6SlpaWlpaalpaalpaal
+ paakpKWjo6Sjo6Sjo6SkpKOgoKeVlbKQkLiQkLiQkLWNjbOJibSFhbaGhraIiLiLi7iPj7aUlLKXl6+X
+ l7CXl7Ojo6inp6WlpaWgoKiUlLCPj7SLi7iHh7yCgsGAgMOAgMKBgcSCgsWCgseGhsKOjrmUlLKcnKuj
+ o6WgoKaZma6UlLSTk7STk7KPj7SFhbt/f8F/f8KAgMGBgcKBgcWEhMORkbmcnK6fn6ugoKmkpKWenqmT
+ k7SPj7iPj7aLi7uHh7+BgcR+fsSBgcCHh7uJibmJibuJibuOjrmVlbWcnK6hoailpaWbm7CNjb6Hh8KI
+ iMCJib+Jib2JibuFhbyCgsCCgsODg8WDg8aKir2RkbWYmK+bm6yenqijo6Obm6eZmaqUlLGNjbqKiryK
+ irqIiLiGhraGhraGhriIiLiOjrWSkrKTk7KTk7OTk7OZmayjo6GioqKjo6OWlrGQkLeRkbWQkLSSkrGT
+ k62Ojq6Hh7eBgcKBgcaDg8WEhMaDg8eFhcaPj7ucnKuioqGjo6KXl7COjruKir+IiMGGhsSCgsWBgcSB
+ gb6Hh7iMjLmKir6Dg8eDg8eBgcmHh8OYmLKjo6WkpKWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sj
+ o6SkpKSlpaWlpaampqempqempqempqempqalpaWlpaWlpaWlpaWlpaWlpaUgAKWlpaWlpaWlpaWlpaWl
+ paSkpaKio6SkpaWlpaWlpaWlpaSkpKOjpKOjpKOjpKOjpKKio6KioqKio6Kio6OjpKOjpKSkpKKipZiY
+ rYuLvoaGwoSExYODx4ODxoKCxYaGwouLvYyMuo+PtpaWrpycp6GhoaGhoaGhoaGhoaGhoZ+fo52dpZiY
+ rJSUroyMtoKCwoGBxoKCxoaGxI6OvZSUtpSUtpaWtaGhqqamp6amp6amp6WlpqWlpaOjo6Kiop6eo5WV
+ rYuLuoaGwIiIvoiIvYmJu4mJvImJvIqKu4qKu4uLuJiYqaCgoaGhoKGhoaKioqKio6Kio5+fppaWsI6O
+ uY2NuoiIvoeHwYiIwIeHwomJwJGRuJiYsJubrKGhpaKioKCgoKCgoJ+fn6CgoJ+fopubqJeXrpSUspCQ
+ t4mJvoiIwImJwIqKvoyMvIuLvIuLvJeXr6KipKWlo6SkpaSkpaSkpaOjpKSkopycqpaWspeXr5GRtoSE
+ w4KCxoKCxYODxIaGv4mJu42NuZOTtJ6eqqWlo6OjpKKio6OjoZ2dp5aWsZKStZOTs5KStJCQs5CQs4yM
+ uImJvIqKu4qKu42Nt5KSsZ2dpqKin6KioaOjo6OjpKOjpKKipJubq4+PuYaGxIeHwoiIwYSEw4GBxYOD
+ w4iIv4yMvZqar6OjpaSko6OjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKSkpaWlpaampaampqam
+ p6amp6amp6amp6WlpqOjpKOjpKSkpaWlpaWlpqWlpqWlpqWlpqSkpaOjpKOjpKSko6GhppmZr5OTtZOT
+ tZGRt4yMuYiIuYeHuIaGtoeHuIqKt46Oto+Pt4+PuI6OuI+Pup2drqWlpqWlp6Ghq5iYsJCQtYiIvYKC
+ xICAxYGBw4CAwoGBwoCAxISEw4iIwI2NupWVsZycqaSkoqGhpZmZrZSUs5OTtZCQt4iIvoGBxH9/w39/
+ wYCAwoCAw4ODv4aGvZGRtJ2dq5+fqp6eq6SkpaCgqJmZrpSUs4+PuIeHwIODxYGBxYGBwYaGu4qKuImJ
+ uoyMu4eHwIuLvYyMvI+Pu5ubsKWlpaCgqpSUtoyMvoqKv4qKvYqKu4eHvoKCwH9/wYCAwoKCwoeHwI+P
+ t5aWsJubqp6ep6GhpqOjpKCgpJ+fopaWro2NuouLvIuLu4mJuYiIuIWFuIaGt4uLso+PsJGRspOTs5OT
+ tJKStZiYrqGhoqKioqOjopiYr5KStpOTtJOTspOTsI6OsYiIuYGBwX5+woGBwoODxYSEx4WFxo6OvJqa
+ sKGhqKGhpaOjoZiYroyMvYaGxIWFxYWFxYaGwIWFwIaGuIeHtoODv4CAx4ODxoKCx4aGxI6OvZmZsaKi
+ p6SkpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKSkpaWlpaampqamp6amp6amp6amp6Wl
+ pqWlpaWlpaWlpaWlpaWlpSAApaWlpaWlpaWlpaWlpaWlpaWlpKSkpKSlpaWlpaWlpaWlpaWlpKSko6Ok
+ o6Oko6Oko6OkoqKjoqKioqKioaGioaGioaGjnp6mmZmtjY28hYXEgoLFhITEhYXDhYXBioq6iYm8jo63
+ l5etnZ2moKCioaGhoaGhoaGhoaGhoKCinZ2mm5uol5etkZG0hoa+f3/FgYHEhYXCiYm+kZG3lZW1lZW2
+ mZmypaWkpaWlpqanpqanpqanpaWmpaWloKCnlpauioq7hYXBiIi+iIi9iYm7iYm7iIi8iIi9iYm9ioq8
+ kpKxn5+ioaGeoKChoaGhoaGhoqKinp6nmJivkpK1jY26iIi/g4PDg4PGg4PGg4PHiYm/lpaxmpqtm5uu
+ oaGno6OioaGhoKCgoKCgoKCem5uklZWukpK0j4+3iIjAg4PGgoLGgoLHhobCjIy8i4u9jIy8lpauoKCk
+ o6Ojo6OkpKSlpKSlpKSlpKSjoKCmmpqrlZWxiIi/g4PFgoLGg4PFh4fAi4u6ioq6j4+1l5etn5+mpKSj
+ o6Oko6OkpKSinp6nl5evk5O0kJC3ioq9ioq9h4e9h4e7ioq6ioq8i4u6k5OvmpqooKCioaGgoaGhoqKi
+ o6Oko6Oknp6omJivkZG3jY29jY28i4u9hITCgYHGhITGh4fEjIy/mpqwpKSnpaWko6OkpKSlpKSlpaWl
+ paWlpaWlpaWlpaWlpaWlpKSko6Oko6OlpKSlpaWlpqampqanpqanpqanpqanpqanpKSlo6OkpKSlpaWl
+ paWlpaWmpaWmpaWmpKSlo6Oko6OkoqKln5+omZmuk5O1jo68jIy9i4u5iYm3hoa3hoa3iIi4ioq7ioq9
+ i4u9i4u9ioq+lpayoaGopqalo6OqmZmzjY2+g4PFgIDFgYHDgYHDgIDCf3/BgYHBh4e8jIy5j4+3lJSy
+ mZmsnp6mn5+mm5urlpaykJC5iIjAg4PGgYHFgIDCf3/BgYHCg4PAiIi6ioq2k5Otm5upm5uum5uuo6Om
+ pKSknp6pkpK2hobDg4PGhITFhITDh4e7iIi3iYm5ioq7ioq/hITGgoLIgYHJh4fDl5ezpaWlpKSmoKCq
+ lJS3jIzAjY29i4u8hITCgIDDgIDBgIDCgoLBiYm9h4fAkpKznZ2ooqKkpKSjo6OkpaWknJyoj4+2iYm+
+ ioq8ioq8iYm6h4e5h4e3i4uxj4+tj4+xkpK0lJS0lJS1mJiynJyrn5+loqKio6OhmpqrlZWxlpawlZWx
+ kJC1h4e7gYHCf3/Df3/BgIDDgYHFhobFjIy+mJiyoKCqn5+rnZ2soqKknJypjY26hYXDh4fAiIjAi4u7
+ i4u3h4e4goK+gIDDgYHEgYHFhYXDj4+6mJiznJytoaGopKSlpKSlpaWlpaWlpaWlpKSlpKSlpKSkpKSk
+ pKSkpKSko6Oko6OkpKSlpaWlpqalpqampqanpqanpqanpaWmpaWlpaWlpaWlpaWlIAClpaWlpaWlpaWl
+ paWlpaWlpaWlpaWjo6SkpKWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6SioqKhoaGgoKChoZ+enqOW
+ lq6QkLeFhcKEhMOFhcKIiL+Li7qKirmJibuJibyRkbObm6ifn6OhoaGhoaGhoaGhoaGhoaGgoKKbm6iV
+ la+RkbOFhcJ/f8eCgsSDg8KLi7qLi7uQkLaUlLSZmbKhoamlpaWkpKWlpaampqempqempqelpaaamrGM
+ jL2Hh8CIiL2Hh7uJibqJibmKirmIiLyHh7+Hh7+KiryVla6fn6OhoaCgoKCgoKChoaGhoaCamqySkrWN
+ jbuIiMCCgsSDg8WEhMWEhMWJicGPj7mRkbWSkraamq6hoaakpKSioqOhoaGgoKCgoKCcnKOWlqyOjreG
+ hsCCgsWBgcSBgcSCgsWHh8GMjLyLi72MjLyXl66fn6OioqGjo6Sjo6SkpKWkpKWlpaWfn6iTk7SHh8GD
+ g8aEhMWDg8aIiMKLi72MjLyRkbSVla6bm6WhoaGjo6Ojo6Sjo6Sjo6ScnKiVlbCPj7iJib6Dg8aCgsWA
+ gMWEhL+JibuIiL2Li7qXl6qgoKGioqChoaGhoaGhoaGioqKdnaiXl7CQkLeMjLyMjL2Li76Dg8WCgsaD
+ g8WIiMKPj72Pj7ybm6+kpKampqSkpKWjo6SkpKWkpKWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6SkpKSl
+ paWlpaWmpqempqempqempqempqempqejo6Sjo6SkpKWlpaWlpaWlpaalpaalpaakpKWjo6Sjo6SioqWd
+ naqPj7qNjbyOjrqOjreMjLSIiLiGhraIiLiKirqLi7uMjLyMjLyNjbqXl6+goKakpKSkpKecnK+QkL2F
+ hcSCgsaCgsWBgcOAgMKAgMCHh7mJibmNjbeSkrWQkLaPj7eSkrOamqqfn6aYmK+JicCDg8eCgsaBgcSA
+ gMKAgMGDg7+IiLiKireUlKqYmKWYmKmamquenqyjo6ampqOdnayNjb6Dg8eFhcSFhcWJibyJibmHh7mI
+ iLmJib2Dg8eEhMeEhMaDg8eIiMGUlLKkpKampqSioqiXl7SOjr6Njb6Li7yFhcKCgsGBgcCAgMGDg8OF
+ hcaEhMaOjrudnaukpKOioqWjo6SkpKOamq6RkbaMjLiJibmKirmKirmIiLmMjLGOjqyOjq+QkLGTk7WU
+ lLaYmLOenqyhoaifn6eioqKjo6GdnaiZma2Zma2WlrCLi76BgcSAgMOAgMF/f8F/f8GCgsGLi72SkreW
+ lrOYmLKYmLKamrCjo6ajo6SVlbCMjLiNjbWMjLaJibmIiLiCgr5/f8OBgcKBgcOCgsOLi7mRkbaSkriU
+ lLacnK2kpKWkpKWkpKWkpKWkpKWjo6Sjo6SlpaWlpaWlpaWkpKWjo6Sjo6Sjo6SkpKWlpaWlpaampqem
+ pqempqempqelpaalpaWlpaWlpaUgAKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpKSkpKWlpaWlpaWl
+ paWlpaSkpKOjpKOjpKOjpKOjpKGhoaGhoaKin5ycpI+PtIWFwoWFwoSEw4iIv4uLu4qKvIqKu4qKu4+P
+ tZSUr5mZqqCgo6GhoaGhoaGhoaGhoaCgopubp5WVrpKSsYWFwYCAxYGBxYWFwouLu4uLvJGRtZKStZWV
+ sJ6eqKampKWlpaWlpaSkpaWlpqamp6amp6OjqZSUt46OvYyMvoqKvImJuomJuYmJuYeHvYaGvoaGv4qK
+ upaWq5ycpqCgoqGhoaGhoaCgoKCgoKKioJeXro6OuIiIwIODxIKCxIKCxIKCxoiIwIyMvIuLvYyMvJKS
+ tKCgp6SkpKOjpKOjpKOjpKGhoaGhn52dpZGRsYWFvoGBxIGBxIGBw4CAxIWFv4uLu4uLvI2Nu5KStp6e
+ qKOjoqKioaGhoqOjpKOjpKWlpKGhqJSUtYiIwoODxoSExYODxYODxYODxoaGw42Nu5WVspqaqp+foqGh
+ oKGhoaKioqOjpJycq5aWspGRtomJvoODxoSExYKCw4KCw4ODxIODxYSEwoyMuJeXq6CgoqKioKGhoaGh
+ oaGhoaGhoJiYrZCQt4yMu4uLvIqKvoSExYSExYODxoiIwY2NvpCQvZ2dr6WlqKampaWlpaWlpaWlpaOj
+ pKSkpaSkpaWlpaWlpaWlpaWlpaWlpaWlpaSkpKOjpKOjpKWlpaWlpaamp6amp6amp6amp6amp6amp6Sk
+ paOjpKSkpKWlpaWlpaWlpqWlpqWlpqSkpaOjo6KipZmZrpKStpGRt5KSt4+PuIqKu4mJuYaGtoeHt4mJ
+ uYmJuoqKvI2NupmZraCgpKGho6KipKSkpp+frZKSuoeHxoODx4KCxIGBxIGBwYaGt4iIuImJuIaGvoOD
+ xoSExYSExYuLvZmZq52dp5KStIeHw4SExoSExoODxYGBw4KCvYaGt4eHuJOTqZaWppiYqJmZqpycqqKi
+ o6SkpaWlpKGhqJWVtIuLv42NvYuLvYuLvYqKu4iIuIWFvIKCxYSExoSExoSExoODx4aGxI6Ou5mZrKSk
+ paKiqJubsJOTuIyMv42NvoyMvYqKuYSEvICAwYKCw4WFxYqKv5eXsZycrJqarp2dq6OjpKOjpJ+fqJ6e
+ qJiYrZCQs5CQsY+PsY2NsI2Nro2Nro6Or5CQsZKSs5OTtZqasJ6erJ2drZ6erKOjpKOjoqGho5ycqZeX
+ r5OTtIuLvIKCwoCAw39/wX9/wYKCwImJuYuLvIuLvYuLv5CQu5eXs56eq6Skpaeno5qarpCQtI+Ps4mJ
+ uYmJuYODv39/wYCAwYGBw4ODxIyMvYaGw4ODxoODxoiIwpSUtKGhpqSkpaSkpKOjpKOjpKOjpKOjpKOj
+ pKSkpaWlpaWlpaWlpaOjpKOjpKOjpKSkpaWlpaWlpaamp6amp6amp6WlpqWlpaWlpaWlpSAApaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6OkpaWlpaWlpaWlpaWlpKSlo6Oko6OkoqKioaGhoaGhoqKf
+ nZ2kj4+ziYm7iIi8iYm9i4u9i4u8i4u8ioq9j4+1kJCzk5OunJymoqKhoaGhoaGhoaGhoqKgnZ2mlpat
+ lpatk5Owi4u6iIi8iIi8ioq9ioq8iIjAiYm/h4fCjo65nJyppKSipaWlpaWlpaWlpKSlpaWmpqano6Op
+ lZW3jo69jY2/jY29i4u6iYm6hYW8hYW9hYW/h4e9kJCynJyloaGhoaGhoaGhoaGhoaGgoKCgnJylj4+z
+ hoa+goLCgYHEgoLEgoLEgoLEg4PEhITEhYXEioq/lZWxoKCko6Ojo6Oko6Oko6Oko6OjnZ2lkpKxh4e/
+ goLEgYHDgYHDgIDDhYW9iYm6iYm7i4u8kJC3lZWxoKCmo6OioqKjoqKioaGho6OkpaWinJysjIy+g4PI
+ hYXGhITFg4PFgYHGhYXCjIy7kpK0lJSzmpqroKCjoaGgoKCgoaGin5+nmJivkpK1ioq+hITFhITFg4PE
+ g4PEg4PEgoLDgYHFhobBkpKxnp6ioaGgoaGhoaGhoaGhoaGhn5+jlparkpKyj4+4iYm/hITFhITFgoLH
+ h4fBi4u9jIy+kJC7n5+tpaWopqanpqampaWlpaWlpaWlo6OkpKSlpKSlpKSlpaWlpaWlpaWlpaWlpaWl
+ pKSlo6Oko6OkpaWlpaWlpqampqanpqanpqanpqanpqanpKSlo6OkpKSkpaWlpaWlpaWmpaWmpaWmpaWl
+ oqKknp6pmZmvlZWzkJC5jIy9i4u7ioq6iIi2g4O8goLAg4PBhobAjo66lJSylZWxmZmsn5+loqKjnZ2s
+ kZG7hobGg4PJg4PIhITDiIi6h4e2g4O+goLBg4PCgoLFg4PEiYm9iYm/lpawn5+mmJiuiYm+g4PGg4PG
+ gYHGg4O/hoa5hoa2jIyukJCvkZGwkpKwkZGylpavpKShoqKjpKSkpaWloKCplpazjIy/i4u+i4u+i4u6
+ h4e9gYHCgYHCgoLEhITGg4PIh4fDi4u+jo67mpquoaGjpKSkpqaln5+sk5O4lZW3j4+7hoa/gYHAgIDB
+ goLBiYm8jIy9kpK2lZWzk5O1lZWznZ2ro6Olo6Okn5+omJiwkZG0kJCxkJCxjo6wjo6tjIyyiYm4ioq4
+ i4u6kZG1mZmtnp6rnp6tnp6spaWlpKSko6Oinp6mmJiuk5O0jIy7hITDgYHEf3/DgYG+hYW4goLBhITD
+ hYXEhITFiIjCkpK5nJyuoKCppqaknJytj4+5jIy8ioq7ioq6goLBf3/Cf3/BgYHBhITAhYXDhITFg4PH
+ hYXEjo66mZmuoaGmpKSlpKSlpKSlo6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6OkpKSk
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlIACjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Wj
+ o6SlpaWlpaWlpaWlpaWkpKWjo6Sjo6OioqKioqChoaGXl6yKirqJibmKirmFhcCDg8OEhMSHh8CRkbOR
+ kbOPj7WYmKqgoJ+goKChoaGhoaGhoaGgoKKamqiVla6Tk7GMjLiKiruKirqKirqJibyIiL+IiMGGhsOO
+ jruYmLCfn6ajo6Kjo6SlpaWlpaWlpaWlpaWjo6agoK2YmLaSkryLi8CIiMCIiL6Hh72Fhb6EhL+Hh7qJ
+ ibiQkLOdnaSgoKChoaGhoaGhoaGhoaCdnaKSkrCGhr6BgcWBgcWCgsWDg8WDg8WDg8WCgsSBgcaFhcSQ
+ kLmcnKqhoaSioqKjo6Ojo6Sjo6Sfn6eTk7OIiMCCgsWBgcSBgcOAgMSGhr6KirqJibuKirqPj7WWlq6b
+ m6qhoaSioqOioqOioqOioqKioqGgoKaZma+OjruGhsWEhMaEhMWBgcSEhMCLi7iRkbKUlLGamqyfn6ai
+ oqSioqGhoZ+enqKWlq2RkbSKir+FhcWFhcaFhcWEhMWEhMWDg8SCgsSCgsOIiLuWlqyfn6GgoJ+hoaGh
+ oaGhoaGhoaGdnaWcnKWWlq2JibyCgsWEhMWEhMWKir+MjL2Njb2MjL6Pj7ydna6lpaimpqempqempqal
+ paWlpaWkpKWlpaWlpaWkpKWkpKWlpaWlpaWlpaWlpaWlpaWkpKWkpKWjo6SlpaWlpaalpaempqempqem
+ pqempqempqekpKWjo6SlpaWlpaWlpaWlpaalpaalpaakpKWioqWWlrGPj7mMjL2Li76MjLyLi7mEhL2A
+ gL+AgMGBgcOCgsOFhcOGhsGKir6VlbGfn6Sjo6GgoKaZmbCMjL6IiMOJicKKir6JibmCgr6AgMCAgMKB
+ gcSEhMOJib2KiryIiL6Ojribm6mfn6STk7KIiMCIiMCIiMCIiL6JibeNja6Nja2NjbCOjrGQkLCRkbGU
+ lLCenqWjo6Kjo6KlpaOjo6eamq+RkbmSkriOjryHh8GCgsKAgMKAgMGBgcOCgsWIiMGNjbyMjL2Njbya
+ mq6ioqSjo6KkpKCfn6eSkraQkLmHh7+CgsGAgMKBgb+GhriJibePj7WSkraTk7aTk7WUlLSamq6hoaek
+ pKOfn6mWlrKSkraSkrSQkLGOjq6KirGGhriEhL2Ghr2Ghr6Li7qSkrKWlrCYmLGfn6umpqSmpqWkpKSj
+ o6KdnaiQkLaGhsOEhMSDg8WFhb+FhbqAgL+BgcKBgcOCgsSEhMaEhMaHh8OOjr2YmLKkpKahoamTk7eK
+ ir+Li72KirqIiLqEhL2Bgb6Cgr6CgsCDg8SCgsaFhcOPj7mamqygoKWjo6SkpKWkpKWkpKWkpKWjo6Sj
+ o6SkpKSlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWkpKSkpKSkpKSkpKQgAKSk
+ pKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpKSkpKWlpaWlpaWlpaWlpaSkpaOjpKOjo6Gh
+ opmZqo+Pt4mJvIqKuoWFv4GBxIGBxoGBx4SExI6OuJGRtZOTsZycpqKinqCgoKCgoKGhoaKioZ+fo5qa
+ p5OTsI2NuYqKvYqKu4qKuYmJu4eHvoeHwYeHwoiIwZaWsqGhpqOjpKOjo6KioqOjpKSkpaampaSkpp+f
+ q5mZspKSuY2Nv4iIwYeHwYeHwYeHv4eHvoqKu4uLt42Ns5SUq5+foaCgoKCgoKGhoaKioZ+fopiYqY+P
+ tYiIvYeHvoeHvoaGwYSExYSExYSExYODxYGBxYWFwJSUsqGhpKKio6KioqKioqOjo6OjpZeXr4qKv4SE
+ xoKCxoCAxYGBxIWFvoqKuomJuouLuY2NuI+PtJaWrJ+fo6KioqKio6Kio6Kio6OjoqCgo5iYrJGRtoqK
+ wIWFxoSExoSExYGBxYaGvo6OtJSUrpeXrJ+fpKOjo6Kio6Kio6OjoJ+fopCQsoeHv4ODxoSExoWFxYWF
+ xYSExYSExYODxYODxIeHv46OtJmZpZ+foKCgoKCgoKGhoKGhop+fo52dpZ2dpZeXrIyMuYWFw4SExoSE
+ xoeHw4yMvo2NvY2NvZKStqCgqKWlpqamp6amp6amp6ampqWlpaWlpaWlpaWlpaSkpaOjpKSkpKWlpaam
+ pqampqampqampqWlpaSkpKSkpKWlpKWlpaWlpqamp6amp6amp6amp6WlpaOjpKSkpKWlpaWlpaWlpaWl
+ pqWlpqWlpqSkpZeXsY2Nu4yMvI6Ou4uLvIaGv4KCwn9/wX9/wYCAwoGBxIGBxoGByIuLvZmZrKCgpKGh
+ o6KioqGhpZeXsJWVs5SUsoyMt4ODwIGBwoCAwX9/w4ODwomJvYuLu4mJvYyMupGRs52dp6SkoJ6ep5WV
+ sZWVsZKStY6Oto2Nso6OrYyMrY2Nro6OrY6Oso2Nto2NtpGRspubqZ+fpaOjop+fqZWVspSUs5WVso+P
+ u4WFw4GBxYGBwoCAwYGBwoKCxYaGw4iIwoiIwo6Ou5ubraOjpKOjo6OjoZ+fppGRtYaGwYKCw4CAw4KC
+ wIaGuYiItIuLso6OsJGRsZKStJKStZKStZSUs5qarKKipaOjpJqarpGRt5OTtZOTso6OtIaGuYODvIOD
+ vYWFvYODwoSEwoaGv4qKvZGRt5qasKGhqqWlpqWlpaWlop6epo6Ot4iIwYmJwImJvYeHvIKCv35+woGB
+ wYGBwoKCw4SExIWFxIeHwouLvpiYsqOjp6ampJubr5GRuZKSt42Nu4iIvIWFvIKCvoCAwICAwYGBw4WF
+ wYyMupaWr56ep56epp+fpqOjpKSkpaSkpaSkpaSkpaOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaSkpaOj
+ pKOjpKOjpKSkpKSkpKSkpKOjpKOjpKOjpKOjpCAApaWlpKSkpKSkpKSkpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpKSkpKSkpaWlpaWlpaWlpaWlpKSkpKSkoKCklZWwi4u7ioq8hobAgIDFgYHEgoLFhITFiIjB
+ jo66lJSynJypoaGioaGgoKCgoKCgoaGhoKCioKCimpqokJC0ioq9i4u7i4u6iIi6hoa8hoa/iIjAioq/
+ jo65mJiuoaGmpKSjo6OkoqKjoqKio6Ojpqako6OpmJizkZG5i4u+h4fBh4fBiYnAi4vAh4fDhobCiIi/
+ i4u6k5OtnZ2fnp6doKCgoKCgoaGhoqKgn5+jl5eslpaukZGyioq6iIi+h4fBhITFhITFhITFhITGhITE
+ ioq5mJipoqKioqKjoqKjoqKioqKioKCmlpayjIy8iIjBhobDhYXChoa/ioq7iYm7iYm7i4u5jY24j4+0
+ mZmooKChoqKgoqKioqKjoqKjn5+lm5uqkZG1iIjBg4PGg4PGhITGgoLFhITBh4e8ioq5kJCzmZmon5+h
+ oqKioqKjoqKjoqKjnp6mkZGxh4e+hYXChITDg4PEg4PEhITFhITFhobEiYm/jo63lZWsn5+gn5+foKCg
+ oKCgoaGgoKCinJymnZ2lmJirkpKyi4u7hobDhITHhITHhobGi4vBiorAjY29mZmwo6OjpKSjpaWlpqan
+ pqanpqanpaWmpaWlpaWlpaWlpaWlpKSko6OkpaWlpqampqanpqanpqanpaWmpaWlpKSkpKSkpKSkpaWl
+ pqampqampaWmpKSlpKSkpKSlpKSkpaWlpaWlpaWlpaWmpaWmpaWmpaWmnZ2slZWzkpKzjY22hIS/gYHC
+ gYHBf3/Bf3/BgIDCgYHEg4PFh4fCjY26lZWwmZmsnJypo6Oho6Oinp6nm5uqlJSxiIi9gIDEgYHCf3/C
+ gYHAh4e8ioq6iYm8jY24lJSvmZmpnZ2moaGjoaGinJyompqslZWwkpKwkJCvjIyvjIytjo6sjY2viIi5
+ hITAhYXAhYXAjY23lpatoaGknp6nlpavmZmtmJisjo64hITCgIDFgIDDgIDBgYHCg4PEhITGg4PIhYXG
+ jo67mZmxn5+oo6OlpKSinp6nkZG1h4fBhobAhIS/hoa7iYm1ioqxjY2ujY2sjY2yjY24j4+6j4+7j4+6
+ mZmwoaGmpqahn5+plJS0k5O0kZG4iYm9hYW/g4O9g4O8goLAgYHEgoLGgYHHhYXCjY25lJSznJytpaWm
+ pqalpqakoKCok5O0j4+4jY26ioq8hITAf3/Df3/Bf3/BgYHBgYHCg4PCh4fAjIy9kpK3oaGppqakqKii
+ oKCqlJS2kpK5i4u+hobChITBgoLCgIDDgIDCg4O/i4u3kZGylZWxlZWxlJSyk5OynZ2oo6OlpKSlpKSl
+ pKSlpKSlo6Oko6Oko6OlpKSlpaWlpaWlpaWlpaWlpaWkpKSko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Ok
+ IAClpaWlpaWkpKSjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6WlpaWlpaWlpaWlpaWl
+ paShoaWUlLCJibyGhsCBgcaBgcSBgcWDg8WJicCQkLeWlrCcnKqioqOioqChoaGhoaGgoKCgoKCenqKf
+ n6OZmaqPj7aLi7yKiruKiruGhr+EhMGFhcGGhsCNjbqVlbGbm6mhoaSkpKOjo6Sjo6SioqKioqKkpKKe
+ nquQkLqLi7+IiMGIiMGJicCLi76Li8GFhceEhMaBgciLi7qamqahoZydnZ2enp6goKCgoKChoZ+goKKb
+ m6ebm6eRkbKGhsCCgsaDg8aEhMWEhMWEhMWFhcSLi76VlbCdnaKgoKCioqOioqOjo6OgoKSbm6qWlrGS
+ kreOjruMjLyMjLyLi7uKiryKir2KiryKiryMjLmUlK+fn6KhoaGhoaGioqGjo6KhoaSamquSkrWJicCE
+ hMWDg8WDg8WCgsWEhMKJibuJibuIiLuPj7OamqaenqGhoaGioqKjo6KgoKaYmK+SkrOMjLmJib2FhcKC
+ gsWDg8SDg8SEhMWGhsKLi7yTk7Obm6ehoZ+fn5+goKCgoKCgoKCgoKGenqOenqSSkrGKiruEhMOCgseE
+ hMWFhcSJicCJicKKisGRkbienqqjo6Sjo6Sjo6SlpaampqempqempqelpaalpaWlpaWlpaWlpaWkpKSk
+ pKWlpaWmpqWmpqempqempqelpaalpaWkpKSkpKSlpaWlpaWlpaWjo6Sjo6SkpKSlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaalpaakpKebm6+SkrSJibqBgcOBgcGAgMF/f8F/f8GAgMOCgsWEhMWKir6IiL+Jib+O
+ jrmZmayjo6Gjo6Gbm6iTk7KHh8CAgMeCgsOAgMJ/f7+FhbqJibiKirqNjbiSkrKXl6yYmKuVla6amqmh
+ oaKYmK6Tk7OTk7SSkrKPj7CNja6MjKyLi66JibiDg8KAgMWBgcSDg8OEhMKPj7WenqaioqOenqidnaiZ
+ mauPj7WGhr6CgsGCgsCAgMGBgcODg8WFhcaGhsaIiMKNjb2RkbiYmLChoaalpaKfn6iRkbWNjbuLi7qK
+ irmKireLi7KMjKyNja6Li7CJibiJib2Kir6Njb6UlLihoaykpKWkpKOhoaaZma+QkLeKir6Hh8GFhb+D
+ g7yAgL5/f8GBgcKCgsSCgsWGhsGOjreUlLCbm6yjo6elpaWmpqSkpKadnauTk7OKiryDg8SBgcSBgcGA
+ gMF/f8CBgcCCgsCGhr6Kir2OjryXl7Ohoamjo6empqSgoKqRkbmJicKGhsOHh8OGhsOEhMGCgsCEhL6K
+ irWQkLCRkbCOjraLi7uMjLuPj7iZmayhoaWkpKSjo6Sjo6Sjo6Wjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWl
+ paWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6QgAKWlpaWlpaWlpaSkpKOjpKWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaOjpKSkpKWlpaWlpaWlpaampZ6eqJCQtISEwoGBx4KCxYKCxYODxYiIwI6O
+ uZSUspubq6Kio6OjoqKio6KioaGhoaGhoaCgoJ6eoZqapZWVrZCQtouLvIqKvIeHv4ODw4KCxoODxoWF
+ xIyMupqaq6Gho6KioaKio6OjpKOjpKOjpKOjoqCgo5eXrouLvYiIwYiIwYeHwYmJvYiIwISEyIWFxoaG
+ xoqKv5SUsJ6eo6Cgn5+fn52dnZ6enqCgoKCgoJ6eo5iYqpGRs4WFwYGBxYKCxIODxYSExYSExYWFxIuL
+ vpaWsaCgpaOjoZ+fn6GhoaKio6Ojop6ep5SUso+PuI2NvY2NvY2NvYyMvYuLvYuLvYuLvYqKvI2NuZOT
+ s5qaqaKioKGhoaGhoaGhoaKioKCgpZSUsomJwIWFw4SExIODxYODxYSEwoqKuomJuoiIupCQsZmZpZyc
+ n6CgoKCgoKGhoKOjoZ6eqJGRt4yMvIeHwIiIwoaGxISExYSExYODxIODxIKCxomJv5eXr6Cgo6GhoaCg
+ oJ+fn6CgoKCgoKCgoJ+foZiYqoyMuIODw4KCxoODxYaGw4mJv4mJwImJwZOTt5+fqqOjpaSkpaOjpKOj
+ pKSkpKampqamp6amp6amp6WlpqWlpaWlpaWlpaWlpaOjpKSkpaWlpaWlpqamp6amp6amp6WlpaWlpaWl
+ paWlpaWlpaWlpaOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpJqar4uLv4KCxoSE
+ w4GBw4CAwn9/wX9/wYGBw4KCxIODxYSEx4SEx4KCyImJwJmZrqOjoqOjoZaWr4eHwYKCx4KCxIGBw4GB
+ wYSEuIWFt4eHuY2Nt5KSsZGRtJGRtZGRtJCQtpaWrqCgo5OTs5OTs5KStJKSs5CQsI+Pr42NroaGt4KC
+ wYKCxIKCw4ODw4WFwYWFwY+PtpycpqOjn6CgpJiYrZGRtJOTs46OtomJuYeHvICAwYGBwoKCxIKCxYiI
+ wY2NvYyMvoyMvpiYsaCgpqSkoqCgp5SUs42NuY6Ouo2Nuo+Pto+PsI2NroyMr4eHuYiIuomJu4uLvJGR
+ t56eq6Ojp6Wlp6WlpKCgppaWsoqKv4eHwYeHwYaGv4ODwH9/wn9/wYCAwYGBw4GBxIaGwI6OuZKStJOT
+ sZubrKOjpqampaampKSkppOTtYaGw4SExYODwoCAwoCAwYCAv4CAwIWFvYqKu4uLvI2NvJOTtpOTt5ub
+ r6SkpqKiqJSUtoiIw4mJwoiIwouLvoyMuYmJt4mJtI2Nro+PsIyMtoyMuY2NuI6Ot5WVsJubq6GhpaKi
+ oqKio6Kio6Kio6OjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpCAApaWlpaWlpaWlpKSlo6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6OkpKSkpaWl
+ paWloaGqlpauiIi8gIDHgoLFgYHEgYHFh4e+i4u7jIy9jY27lJSzoaGko6OioqKjoqKjoqKioaGhoaGh
+ nJyllJStjY22iYm7ioq8ioq8hITDgoLFg4PGh4fEjo68j4+5mZmqoaGjo6OioqKioqKio6Oko6OkpKSj
+ n5+nkJC1hobCh4fAh4fAhITEg4PFg4PFhITFhYXGjIy/mJiyoaGmoqKgoaGhoKCgn5+fnZ2dn5+dnZ2i
+ l5eqkZGzhYXCg4PFg4PFg4PFgoLFgoLFg4PFiIjAlZWyn5+mo6OioqKioqKin5+foKCgo6OinJyqkJC4
+ jIy8jIy8i4u8i4u9i4u9i4u9i4u9jIy8jo66kpKzmZmrn5+koaGhoaGhoaGhoaGhoaGgnJylkZG1hobB
+ hITFhITFg4PGhYXCiYm6iYm6iIi7kJCxmpqlnZ2hnJyhnp6eoKCgoKCgoKChmJisjIy8iIjBiIjBhYXE
+ hITFhITFhITFhITFg4PEhITCj4+2nZ2no6OhoqKioaGhoKCgn5+foKCfn5+il5eri4u5g4PCgoLFg4PG
+ hYXEiYnAiYnAiIjCkpK1np6qo6OmpKSlpKSlpKSlo6Oko6OkpKSkpaWlpqanpqanpqanpaWmpaWlpaWl
+ paWlpaWlo6OkpKSkpaWlpaWlpqanpqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpKSkpKSkpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpqakoaGplZW1h4fBgoLGgoLFgYHDgIDCgIDBgIDCgoLFhITGhYXIhobH
+ hYXIiYnDlJS1np6mo6OhmJitiYm/g4PHhITFg4PDh4e6hoa3hIS4iYm0kJCvkJCyioq6i4u8i4u8i4u8
+ kpKznZ2mmpqplZWxkpK0kpK0kpKzkJCyiIi5gYHAgYHDgoLEhITDhobCh4fBk5O0mJisnp6ko6Ofnp6l
+ kZG1kpK0k5O0jo64hobAgYHEgYHCgIDBgIDDhoa9i4u6jIy+jIy+jIy+lJS2m5usoqKloaGmmJivkpK1
+ kpK1kpK1kZGzj4+vi4uwhYW3h4e5iIi6iYm9j4+5lpawlZWylpa1nJyvpaWnoaGpkpK2h4fCiIjBiIjB
+ hYXEgoLFgYHCgIDBf3/Bf3/Choa8iIi8hobBh4fBh4fBkZGzn5+mpaWjpqako6OnlZW1jY28jY28iIjA
+ gYHDgYHBgYHAhIS8iYm6i4u8jY29jo68jo68jY29mZmxpKSmpKSlnp6rl5ezlJS2lJS2lJS2kpKzj4+w
+ jIywh4e4iIi5iYm6iIi7i4u4kpKxk5OymZmtoKClo6OjpKSkpaWlpaWlpaWlpKSko6Oko6Oko6Oko6Ok
+ paWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6OkIAClpaWjo6Sjo6Sjo6Sjo6Sjo6SioqOj
+ o6SkpKWlpaWlpaWlpaWlpaWlpaWjo6OioqKioqKjo6Wfn6iamq6MjLuEhMSCgsaCgsaCgsaHh7yKirqJ
+ ibuMjLqTk7SamquhoaSioqOioqOioqOioqOioqKdnaaWlqyOjraKirqKirqJibuDg8KCgsWBgceGhsKN
+ jbuQkLiWlrKgoKaioqGhoaGioqKioqKioqKjo6SioqWenqmUlLSKir2KiruEhMODg8WDg8WCgsWEhMSM
+ jL2ZmbCioqikpKSjo6OioqKhoaGgoKCgoJ+cnKCXl6aPj7OEhMGCgsSDg8WCgsWCgsWCgsWCgsWDg8WC
+ gseNjbucnKmkpKGioqOioqKioqKgoJ+dnaOYmK6Tk7WSkrWMjLyKir2KiruLi7qLi7qMjLyPj7iOjrmS
+ krSbm6mhoaChoaGhoaGhoaGioqCfn6KWlqyLi7qDg8SDg8WCgsaGhsCIiL2CgsSCgsOAgMWKirmXl6ie
+ np+fn5+fn5+enp6goJ6dnaSRkbOHh8KIiMKIiMGLi72Hh8CCgsWEhMWEhMWHh8KIiL2UlK6goKKjo6Ki
+ oqKioqKhoaGhoZ+enqCWlqqKirqCgsOCgsaCgseGhsSKisGLi8GLi8GMjMCUlLWdnaqioqakpKWkpKWk
+ pKWkpKWkpKWjo6Sjo6SlpaWmpqempqempqempqalpaWlpaWlpaWlpaWkpKSkpKSlpaWlpaWmpqempqem
+ pqempqalpaWlpaWlpaWlpaWlpaWkpKSjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWgoKmU
+ lLWHh8KCgsaCgsaCgsSAgMF/f8GBgcSCgsWFhcaGhseGhseGhseOjr6bm62ioqOcnKiTk7OQkLeRkbWQ
+ kLWPj7KNjbGLi66Li7CIiLmCgsGDg8ODg8ODg8aHh8GSkrOenqWfn6OZmauYmKuWlq6RkbSKirqDg8GB
+ gcGBgcKBgcSCgsWFhcWNjbyVlbSWlrOamq6hoaWfn6KWlq2Tk7SPj7mIiMGDg8WDg8WCgsSAgMOFhbyJ
+ ibqKiryKir2Li72MjL6OjryTk7aenqqjo6Ofn6eenqifn6ednamWlq6OjrSIiLeFhbeBgcGBgcSCgsaJ
+ ib+VlbGVlbGUlLOcnK+kpKekpKecnK2Tk7SMjL2FhcSDg8aDg8WBgcOAgMF+fsKEhLqFhbmDg7+Dg8OD
+ g8OEhMSPj7adnaWjo6GlpaSjo6eVlbWOjryKisCHh8CEhL+EhL6GhriIiLiJibmMjLuNjbuNjbuNjb2S
+ kriZmbCioqimpqSlpaWjo6eTk7ORkbWSkrSRkbCNjbCHh7iFhbeGhriHh7mJibqJibqKirqLi7qYmKyh
+ oaOkpKKjo6Sjo6SlpaWlpaWlpaWkpKWjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sj
+ o6Sjo6Sjo6QgAKampqWlpKOjpKOjpKOjpKOjpKOjpKKio6Ojo6WlpaWlpaWlpaWlpaWlpaSkpKKioqOj
+ oaKio5eXrYqKvISEw4ODxIWFwoeHvYiIvImJuYiIuoyMtpKSsJaWrJ+fpaKioqKio6Kio6Kio6Kio6Gh
+ pJaWr4+Pt4uLu4qKuoiIvIODwoKCxICAxYaGwYyMvoyMvZGRuJ2dq6KipaOjo6GhoqGhoaKioqKioqKi
+ o6KipJ+fqJWVsouLvYaGwoSExYSExYSExYSExYSExYWFw5OTtKKiqKampKSkpaSko6KioaGhoaKinpmZ
+ pYyMtIODwIGBw4ODxYSExoODxoODxoODxoODxYODxIaGwZKSs5+fpqOjoqKio6Kio6KioqKioZ2dopeX
+ qpOTs4yMuYqKu4uLuYeHv4ODxISEwoSEw4uLvZKStJmZq5+fpaKioaGhoaGhoaGhoaGhn5ubpo+PtYWF
+ woSEw4SExIeHv4aGvoKCwoGBxICAxoODwo6OspqapJ+fnp+fn5+fn5+fn56enpWVqoqKuYiIvYqKvIqK
+ vIeHwYWFxYODxYODxYaGwoyMvJCQtpubqKKioKGhoaKioqKioqOjoqCgoZeXq4yMt4iIu4eHvYmJvYmJ
+ wYqKwouLwYqKw4qKw4iIxJKSup6eq6Ojo6OjpKSkpaSkpaSkpaSkpaSkpaOjpKOjpKWlpqamp6amp6am
+ p6amp6WlpaWlpaWlpaWlpaOjpaOjpKWlpaWlpqamp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpaOjpaOj
+ pKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampKKip5mZsJCQu4mJwImJvISEwX9/woCAwYGBwoGBxISE
+ xIWFxYaGx4WFyYqKw5mZsqOjpaKio5ycp5aWr5KStJOTs5KSspGRr4yMr4WFuIGBwoCAw4KCxYGBxoWF
+ wYyMuZOTsJycpqGhoZubqJeXrZGRtImJvYODxIKCwoCAwYGBwoGBwoGBxISExYeHw4iIwouLv5aWs6Gh
+ p6Ojop6eo5OTs4eHwoKCx4KCx4ODxoKCxYaGvIiIuYmJu4qKvYuLvYyMvI2NvI2NvZGRuZ2drKWlo6Ki
+ pKOjpJ+fqJmZrpGRtoqKuoeHvIGBwH9/w4CAxYKCxoeHwpCQuJeXsJmZrZqarKGhqKampaOjqJubro+P
+ uoaGw4SExoODxYGBxICAwoSEuYSEuYKCvoGBwoKCxIODxYKCxoyMu5ubqqKioqSkoqOjppaWs4qKwIeH
+ w4eHwoeHv4iIuYmJuIaGt4iIt4yMuY2Nu46OupOTtJubr5ycraKip6amo6Skpp+fq5WVtJOTtJOTsY+P
+ s4iIuIeHuYaGt4aGuIaGuIeHuIiIuYmJuoqKu5KSsZqaqKGhpKSkpKOjpKSkpKWlpaWlpaWlpaSkpaOj
+ pKOjpKWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOjpCAApqanpqampaWlo6Oko6Oko6Ok
+ o6OkoqKjoqKjo6OkpaWlpaWlpaWlpaWlpKSlo6OjoqKinZ2ojo63h4e/hobAh4e+iYm8ioq4iYm4iYm5
+ iYm5ioq4kJCxmJion5+joqKioqKioqKjoqKjo6OioqKjlJSyj4+5jIy6h4e+goLEgIDFgYHFhYXAioq8
+ jIy8j4+5mJivoaGlo6Oko6Oko6OkoqKioaGhoqKio6OhoaGkmZmujY27hYXEhITGhITFhYXFhYXFhITG
+ hYXFjY28lZWxoKClpaWjpKSlpKSlo6OkoaGhoKChlZWsh4e9f3/FgYHDg4PEhITGhITGhITGhITGhITG
+ g4PEjIy4m5uooqKioqKjoqKjoqKjoqKjpKShoKCjmJiqkJCyiYm8i4u7iIi/hITEgYHHgYHGgYHGiIjA
+ k5Oznp6noqKhoqKioqKioaGhoaGhoqKfmpqnjY23hoa/h4e/iIi+h4e/goLCf3/FgYHEhoa/jo60l5eo
+ nZ2goKCen5+fn5+fn5+fnZ2glpaoj4+yjIy3ioq7h4fAhITFg4PGhYXFh4fDjIy7kpK1mZmtoKCkoqKg
+ oaGhoaGhoqKipKSgnp6mkZGziYm7ioq5hoa/iIjBh4fDiIjDiorCiYnEiIjFi4vCl5e1oqKppKSko6Ok
+ o6OkpKSlpKSlpKSlpKSlpKSlo6OkpKSkpaWlpqampqampqampaWlpaWlpaWlpaWlpaWlpKSkpKSkpaWl
+ paWmpqanpqanpqanpqampaWlpaWlpaWlpaWlpaWlpKSkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqak
+ oaGpnJyumpqxkpK4iIjAgoLEf3/Df3/BgIDBgYHCgoLDg4PEhYXGhITJh4fGlZW4oaGrpKSjn5+mlZWw
+ j4+3kZG1kpKyj4+zh4e5gIDAf3/DgYHDg4PGiIjCi4u9j4+4lZWymZmsn5+jl5etkJC1jIy5ioq8h4e/
+ g4PEgIDCgIDBgIDBgYHCgoLEg4PGhobEjIy+l5eyoaGopaWjoqKkl5esjY24i4u7ioq+hobBh4e+iYm5
+ iIi6iIi7ioq6ioq9h4fCh4fBhobDjo67np6rp6eipKSko6OkmJivkZG4jY27iYm+hITCgIDEf3/Df3/D
+ hIS/iIi9jIy8kZG3k5O0kZG2mZmupKSlpKSolpa1h4fDhITGgoLFgIDFgoLChIS6hIS5goK9gYHBgYHD
+ gYHEg4PGh4fAjIy9mJiuoaGko6OioaGkmpqrkZG1i4u9ioq/ioq9ioq6iYm5h4e2iYm1i4u2jY23kZG0
+ lJSxmJivmJixnZ2so6OlpKSmm5uvlJS2lpa0kZG1ioq5h4e7h4e5hoa3hoa3hoa4hoa4iIi5iYm6iYm5
+ jY24kZGynZ2npaWho6Oko6OkpKSkpaWlpaWlpaWlpKSlpKSkpKSkpaWlpaWlpaWlpaWlpaWlpKSlo6Ok
+ o6Oko6Oko6Oko6OkIACmpqempqempqelpaWkpKSjo6Sjo6Sjo6SioqOioqOjo6SkpKWkpKWkpKWjo6Wj
+ o6KhoaObm6uQkLeOjreOjreMjLmJibqIiLiJibmJibmJibmGhryMjLWamqaenqGhoaGioqKioqOioqOi
+ oqOfn6eSkrWPj7mMjLuHh7+EhMKFhcGFhcCKirqKirmNjbeXl66goKaioqKjo6Sjo6Sjo6Sjo6OioqKi
+ oqGhoaKZmauNjbqEhMaDg8eEhMaEhMWFhcWEhMaEhMaLi76Zma+dnaihoaOjo6OkpKWkpKWkpKWkpKOc
+ nKiOjreEhMOBgcSBgcOCgsSEhMaEhMaEhMaEhMeFhcaMjL6VlbCfn6Ojo5+ioqKioqOioqOioqOhoaSd
+ namVlbCMjLaKirqHh76Dg8SCgsaDg8WCgsaFhcKKiryWlq6hoaSjo6GioqKioqKhoaGioqChoaCYmKyM
+ jLmKiruKiryIiL+Dg8SAgMWBgcOCgsGKirmUlK2amqSenqCfn5+fn5+fn5+fn5+bm6OWlqqPj7GLi7iJ
+ ibyDg8KEhMOFhcSIiMOOjryUlLSZma2fn6aioqKioqGhoaGhoaGioqKioqKXl6+NjbqKiryGhsCCgsWD
+ g8aDg8eFhcSJicKJicSMjMGTk7qgoK2np6empqakpKWjo6Sjo6SkpKWkpKWkpKWkpKWjo6Sjo6SkpKSk
+ pKSkpKSkpKSkpKWlpaWlpaWlpaWlpaWlpaWkpKSkpKWlpaWmpqWmpqempqempqelpaalpaWlpaalpaal
+ paampqakpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWmpqSioqienqycnK6Tk7eJicOEhMaCgsSAgMGAgMGB
+ gcGBgcKCgsSCgsaEhMaKisOSkryfn6+lpaeioqebm6uYmK6Vla+QkLOIiL2CgsN/f8J/f8GCgsOHh8GN
+ jb2Njb2RkbiXl7KZmbCbm6qXl66RkbSQkLWOjreHh7+Dg8WBgcOAgMGBgcGAgMGAgMKFhcCOjrmVlbKZ
+ ma6fn6qlpaSkpKWenqiWlq2Vla2SkrKMjLmKirqIiLqGhriHh7iIiLuFhcGDg8aDg8aDg8WNjbubm62j
+ o6akpKSjo6SVlbONjbyJicCGhsSBgceBgcWAgMSCgr6GhriJibeKiruIiL+IiMCGhsKQkLafn6ejo6eV
+ lbaKisKHh8SFhcGEhL+FhbyGhriBgb6AgMGBgcOBgcOBgcKFhb6MjLiNjbmamqqjo6KioqOioqOgoKSb
+ m6mPj7eLi72MjLuLi7uKirqKiraIiLWIiLaMjLaPj7WNjbuMjLuMjL6SkridnaukpKSfn6uZmbGTk7iN
+ jb2Kir2JibqIiLmGhriGhreGhriGhriHh7mIiLqJibmIiLuMjLiZmaujo6Gjo6Sjo6Sjo6SkpKWlpaWl
+ paWlpaWlpaWkpKSkpKWlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6QgAKampqamp6amp6amp6Sk
+ paOjpKOjpKOjpKOjpKKio6Kio6OjpKOjpKOjpKOjpKOjo6CgpJubq5WVsZOTtJKStI6OtoqKuImJuIqK
+ uYqKuYqKuoqKuZGRrp2doKCgn6CgoKGhoaKioaOjop+fp5WVso+PuouLvouLvouLvIqKuoqKuouLuYuL
+ uY2NtZSUrJ2dpKOjoaKio6Kio6OjpKOjpKOjpKOjpKGhopqaqo+PuIeHwoWFxIaGwoSExYSExYSExYSE
+ xYiIwpCQuJqaq6GhpaKio6KioqKio6OjpKSkpaWlpZqaroyMuoODwoGBxYKCxIKCxYSExoSExoSEx4aG
+ xY2NvpqasJ+fqKGhoqGhoKGhoaKioqKio6Ojop2dqJWVso6OuouLvYeHvYCAxIKCxYODxYODxYWFwoyM
+ upKSs5ycpaKioKKioqKioqKioqKioqKiopqaqY+PtomJvomJvYeHv4KCxYGBxoKCxIGBw4KCwYiIu5GR
+ rZubo5+fn5+fn5+fn5+fn5qapJWVrI6OtImJuYiIuomJu4eHvYiIvomJv4yMvJKStZiYr52dqaKipKOj
+ oqKioqKioqGhoaKin5ubp5CQt4mJv4eHwYKCxYODxYODxYSExYaGw4iIwYyMv5WVuJubsaSkqaiopqam
+ p6WlpqOjpKSkpaWlpqWlpqWlpqSkpaSkpaOjpKOjpKOjpKOjpKOjpKOjpKSkpaSkpaSkpaSkpaSkpaWl
+ paOjpKSkpaWlpaampaampqamp6amp6Wlpqamp6amp6amp6amp6WlpqOjpKOjpaWlpaWlpaWlpaWlpaWl
+ paWlpaSkpZ2drJSUtZCQuo2NvoeHxIODxYGBwoGBwYCAwYGBwoGBxISExYmJwI6Ou5OTuqGhrKamqKen
+ pqWlo5+fpZWVsImJvYODxYGBxICAwYCAwYODvoqKu4yMvYyMvpGRuJaWspaWtJeXsp6eqJiYrZGRtImJ
+ vYGBx4KCxIGBwoCAwYCAwYCAwYWFvo2Nt5KStJiYr5ubraCgqaampKSkpaKiqJmZrpSUrpOTsI6Ot4mJ
+ vIiIuoaGuIaGuYODv4GBxYODxIODxYyMvJOTs5iYrp6eqqWlpKSkpZaWsoyMvoSExoKCyYODx4KCxISE
+ wIaGuIaGuIaGu4eHvYSEw4WFxIODx4yMvJubqaOjoqCgqpycr5OTuY2NvouLu4iIu4KCv4CAwYGBwoGB
+ w4GBxISEwIqKt4+PtJGRtJycqaKioqGho6Kio6Ojo5ycqY6OuIqKvoyMvIyMuo+Pt4uLuIaGuIaGuYeH
+ u4aGwYSEx4ODx4ODx4mJwZWVs6KipqWlpJ+fqpGRuY6Ovo6OvYqKvImJuoeHuYaGt4aGt4aGt4eHuIiI
+ uYmJuoiIuouLuZiYrqOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaOjpKOjpKSkpaWlpaWlpaOj
+ pKOjpKOjpKOjpKOjpKOjpCAApaWlpqanpqanpqanpqanpaWlo6Oko6OkoqKjoqKioqKioqKjo6Oko6Ok
+ o6Oko6OjoKCll5eukpK0kZG2kJC2j4+0jIy2ioq8i4u8i4u8i4u+k5OwnJygnp6cnp6eoKCgoKCgoqKh
+ oqKimpqrjY27i4u9i4u9i4u9i4u9ioq8iYm7iYm7i4u3lJStmZmnnJykoaGgoqKjoqKjoqKjo6Oko6Ok
+ o6Okn5+nkpKzjY25jIy7i4u8ioq+hITFhITFhITFiYm/jIy7j4+5m5uroKClo6Oko6OjoqKio6OjpKSm
+ oKCpmpqwk5O2iYm/goLGhITFg4PFg4PFg4PGhYXGjIy+mZmvn5+ppKSmo6OjoaGhoaGhoaGhoqKioqKj
+ np6okpK2iYnAiYm/goLGgoLFgoLFgoLFhobCjIy7lJSympqooKCioaGgoaGhoqKioqKio6OhnZ2oj4+2
+ iIi+iYm9iIi+goLFgoLEgoLEgoLEgoLDgoLBh4e7kpKsnZ2hoKCen5+fn5+fnp6glparj4+zioq4iYm6
+ iYm6iYm7iYm7iYm8jY26kZG2k5Ozl5ewnZ2poqKlo6OjoqKioqKioqKioKChlZWujIy5hYXAgYHFg4PF
+ g4PFg4PFhobCh4fBiYm+kZG2mpqvoaGqpqanpqanpqanpqanpaWmpqanpqanpqanpaWmpKSlpKSlpKSl
+ o6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWmpqanpqanpqanpaWm
+ paWmpqanpqanpqanpaWlo6OkpKSkpaWlpaWlpaWlpaWlpqalpKSlmZmtjY26i4u+hYXFhYXGhITFgoLD
+ gIDCf3/BgYHCgoLEiYnAjY26j4+4lpazpaWopqanpqampKSomJixioq/g4PFg4PEgoLCgYHBgoK9h4e3
+ iYm8ioq+ioq/i4u/i4u/jIy+lJS2oqKlmpqsiYm+gIDIg4PFg4PFgYHDgYHCgYHBhIS+jY23lJS1lJS2
+ lJS5mJi0oKCrpaWmpKSloaGom5uvlZWyjo62iYm7ioq6iYm6iIi5g4O/gYHDgoLDg4PEhITDkJC3mpqr
+ nJyonp6opaWkpKSlmJixh4fDgYHJg4PGg4PFhITAiYm5h4e3goK+gYHFgoLFg4PFg4PFg4PGjIy8mpqs
+ o6OioqKipqakmpqxkJC8jY2+iIi/gYHDgIDBgYHCgYHEhITDh4e+i4u6kZGzkpK0lJSympqroKCko6Oj
+ oqKjl5ewkJC2jY23jY23jo62kJCxioq4hoa6hYW8hYXBhITHhYXGhYXGiorBiorAj4+5nZ2rpKSlnp6r
+ l5eylpazk5O4jIy+ioq7iIi5hoa3hoa3h4e4iYm6ioq7ioq7ioq7jY25mZmuo6OkpKSlpKSlpKSlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpKSkpKSkpaWlpaWlpaWlpKSko6Oko6Oko6Oko6OkIAClpaWlpaWmpqam
+ pqempqempqelpaWjo6Sjo6Sjo6OioqKioqKioqKhoaGhoaGgoKKcnKeVla+RkbaRkbaSkrWOjriHh7+D
+ g8aEhMWDg8aMjLucnKmiop6enp6enp6enp6fn5+goKCgoKGbm6uOjrmLi72Li72Li72Li72Li72KiruK
+ irqJibuPj7OXl6qdnaOgoKCgoKCioqOioqOioqOjo6OioqWZma6SkrWQkLaNjbeHh7+Dg8eEhMaDg8eJ
+ ib+Li7yMjLuVlbKioqWjo6Sjo6Sjo6Sjo6OioqGhoaOZma+Tk7aJicKDg8eEhMWEhMaEhMaEhMaFhcWI
+ iMGQkLmbm66goKmjo6akpKWjo6ShoaGhoaGhoaGcnKeYmK+QkLiHh8GCgsaDg8WDg8WDg8aGhsKMjLqT
+ k7Kbm6ihoaKhoaGhoaGhoaGhoaGioqKioqKVlbCMjLuJib6Jib2Jib6EhMWDg8SDg8SDg8WEhMOKiruU
+ lKuZmaKcnJ6enp6goJ+enqCZmaWUlKySkq+NjbaJibyLi72Li72Li72Kir6Pj7iSkrOTk7Obm6uioqWj
+ o6Sjo6Sjo6SioqKhoaOcnKmOjreFhcGBgcSBgcSDg8WDg8WEhMWEhMWDg8aGhsKQkLacnKekpKWmpqam
+ pqempqempqempqempqempqempqempqempqelpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqempqempqempqakpKSjo6SlpaWl
+ paWlpaWlpaWnp6SgoKmPj7mEhMWEhMWEhMWEhMSDg8SBgcOAgMGAgMOHh76MjLuQkLeTk7OUlLKenqmg
+ oKqlpaikpKmbm7CUlLaLi72Li72KiruHh7mFhbiFhbiHh7mEhMKDg8WEhMaEhMeGhsWRkbmgoKmfn6mT
+ k7WGhsGDg8aDg8SDg8SBgcSDg72Li7WTk7OUlLaVlbiVlbiUlLiYmLSgoKulpaWlpaWfn6qXl7OTk7WS
+ krGQkLKKiriCgsGAgMKCgsKDg8WFhcSLi7uKiryUlLKfn6ajo6KioqOkpKWYmLCKisCEhMeFhcWGhsOK
+ iryKirqCgr+AgMKBgcOCgsSCgsSCgsSJib6MjLuUlLKgoKWioqOcnKmWlrOVlbeSkrqKisKDg8WBgcOB
+ gcKCgsKIiL+MjLyLi7yLi72Li76JicCSkreenqijo6GioqOdnamcnKqbm6qZmaiWlquJibmFhbuFhbqD
+ g76CgsSFhcaGhseJicWJicWGhsaLi76amq6kpKWenqudnayenqyamrCRkbmMjL6KiruIiLiHh7iIiLmK
+ iruLi72Li7yQkLeRkbWbm6ulpaKjo6SkpKWkpKWkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sl
+ paWlpaWlpaWlpaWlpaWlpaWjo6QgAKOjpKWlpaWlpaWlpqamp6amp6amp6WlpaSkpKOjpKOjo6KioqKi
+ oqKioqGhopycppWVr5GRtZGRtIeHwIWFw4SEwoODxIODxYKCxoeHwZOTs5+fpqOjoaCgoJ6enp6enp6e
+ nZ2doZ2dpJycppWVsZCQt4yMvIuLvYuLvYuLvYqKvIqKvI6Ot5SUrpubpaCgoKCgoKCgoKCgoKGhoqKi
+ o6Gho56eppmZr5KSto+PuYiIwIODxYSExoODx4qKv4yMvYuLvoyMvJSUsqGhpKOjpKOjpKOjpKOjpKOj
+ o6GhopWVsYiIwYODxoODx4SEx4SEyIWFx4eHxYiIw4aGw4uLvZqar6SkpqSkpaSkpaSkpaSkpKGhopub
+ ppaWrZGRtIiIv4ODxoSExoSExoSExoSExoiIwY+Pt5WVr5ycqKGhoqGhoaGhoaGhoaGhoaGhopubqY2N
+ uYmJvoqKvIiIvoSExISExYSExYODxoWFwomJvI6OtZqapZ2dnp2dnZ2dnZ6enZ6eoJiYppOTrIyMtoqK
+ uYiIvYWFxoWFxYWFx5CQvJWVtpWVs5ubqaGho6Kio6OjpKOjpKOjpKOjo6GhpJaWsIiIwIODxoKCxIGB
+ w4ODxYSExYSExYSExYODxoeHwpGRtZ2dp6Gho6SkpKampqamp6amp6amp6amp6amp6amp6amp6amp6am
+ p6WlpaWlpaWlpaSkpaOjpKOjpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaamp6amp6amp6ampqSkpKOjpKWlpaWlpaWlpaampKGhqZKSuYWFxISEwoSEwoOD
+ xIGBxoCAxYCAwoeHu4uLvIuLvIyMu42Nu46OupaWsJ2dqqSkp6WlqJ+frZiYtI6OvYuLvYuLvImJuoaG
+ uISEuIGBwIGBwoGBw4ODxYSExoWFxZGRuZ+fqaSkpKCgqZOTtYiIv4mJvomJvYeHvomJtY6OrpGRspOT
+ tY6OvI+Pvo+Pvo+PvpWVt6CgqqWlppqar5SUtJWVs5WVsZGRsoODwIGBwoCAwYCAw4SEwouLuouLu4+P
+ tZKSspWVsZmZrp6ep6Kio5ycqI6OuIiIv4mJvYqKvYuLu4ODwYGBwoGBwoGBwoGBxIGBxIiIvIyMuIyM
+ uZOTsqCgpaKio5mZq5OTs5OTtZKSt4uLv4SEw4SEwYGBwYaGvYuLvIyMvIuLvYaGw4aGw4SExoyMvZub
+ rKSko6KioqGhpKKio6CgpZaWroqKuoeHvYaGu4ODvoGBwYKCw4WFxYmJxYmJxYmJxomJxZKSuZ6eqaOj
+ pKOjpZ+fqpmZsJGRuIyMvYyMvYqKu4iIuYeHuYiIuYqKvI2NvpGRt5SUtJOTtp2drKamoqOjpKOjpKSk
+ paSkpaSkpaSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKWlpaWlpaWlpaWlpaWlpaWlpSAApKSlo6Ok
+ pKSkpaWlpaWmpqanpqanpqanpaWmo6Oko6Oko6OjoqKio6OhnZ2nlJSwkZG0kJC2hobAg4PFg4PFgoLE
+ gIDFgoLEh4e/j4+3nJypoqKhoqKioqKioKCgnp6enp6dnZ2fmZmllJSrjo6zi4u5i4u9i4u9i4u9ioq+
+ ioq+j4+4l5evnp6moaGhoaGgoKCgoKCgoKCgoaGgo6Ohn5+mlpavkpK2jo68h4fDg4PGg4PGhYXEioq+
+ jIy9jIy9jIy9j4+5l5euoqKioqKjo6Oko6Oko6Oko6OknZ2qj4+4iIi/iIjAiorAi4vCi4vAhYXGhobF
+ hYXHh4fDkZG3nZ2qpKSkpKSlpKSlpKSlpaWkoqKll5eukJC0iIi+hITFg4PGhITFhITGhITGhITGhITG
+ h4fBkJC1m5uooaGioaGhoaGhoaGhoqKgoaGhmpqokpKzjY27iYnAhYXEg4PFhITFhITGhobCioq9jIy6
+ jo60m5uln5+fnp6dnZ2dnZ2dnp6enp6gmpqmjo6zhYW/g4PEhITGhITGg4PKj4+8mpqynJyvnZ2poqKh
+ oqKioqKjo6OkpKSkoqKlm5usjo66hITEgoLHg4PFgoLEgoLEhITFhITGg4PHhITGjo68mpqsoaGjoqKi
+ oqKjpaWlpqanpqanpqanpqanpqanpqanpqanpqanpqanpqampaWlpaWlpaWlpKSlo6OkpKSkpaWlpaWl
+ paWlpKSlo6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpaWm
+ o6OkpKSkpaWlpaWlpqako6OnmJiyi4u/iYm/iIi9h4e9hoa+hYW9hIS6iYm5jIy5iIi/hYXDhITEhobD
+ kZG1np6npKSjpKSnn5+vl5e2jY3AjIy/ioq9iYm5hoa6gIDAf3/BgYHCgoLDgoLFhYXEjIy9k5O1nJyt
+ pKSmo6OmmJivkJC3kJC0j4+zjo60jY2wj4+skZGxjY25jY29jY2/jY3Ajo7AkpK8m5uxpaWmn5+sm5ut
+ nJyrmJiwjY27hITFgYHEf3/DgoK+iYm5i4u5jY27j4+4jo64jY27kpK1np6ooqKjoaGjlJSwi4u7ioq8
+ ioq8hobDgYHDgYHCgYHCgIDDgYHCh4e7ioq4jIy4ioq6kZGznp6moqKjoKCmlZWykJC4i4u9hobChYXD
+ hYXChoa9h4e5iYm5iYm9h4fDhYXEgoLHiYm/lJSznZ2qpaWjo6Ojo6OioKCkl5ewjIy8iIi/iIi+g4PC
+ gIDCgIDBgoLBhobCh4fEiYnGiorDkJC9l5e2nZ2uoqKmo6Okn5+ql5eyj4+7iorAi4u9iYm6h4e3hoa3
+ hoa5iYm4jo63jo68j4+7jo69lJS2nZ2roaGno6Oko6OkpKSlpKSlpKSlpKSlpaWlpaWlpaWlpaWlpaWl
+ paWlpKSlo6OkpKSlpaWlpaWlpaWlpaWlIAClpaWkpKSkpKSkpKSlpaWlpaampqempqempqelpaWjo6Sj
+ o6Sjo6Ojo6GdnaiWlq+Pj7eHh8CCgsWCgsSCgsWBgcWBgcOHh72Pj7WRkbOdnaajo6CioqKioqKioqKg
+ oKCdnZ+ZmaKTk6uMjLWJibqIiLuJibyLi72Kir6Li7yRkbaYmK6amqugoKWkpKGhoaGgoKCgoKCgoKCg
+ oKCiop+goKSWlrCRkbaRkbaLi76FhcWDg8aEhMWHh8KKir6NjbyRkbiWlrGcnKiioqKioqKioqOjo6Sk
+ pKOgoKeUlLSLi72Kir2KiryMjLyMjL2IiMOFhcaEhMeGhsWMjL6Xl7KioqSioqOkpKWkpKWkpKWkpKWf
+ n6qRkbiJib+CgsOBgcSCgsOCgsSEhMaEhMaDg8eEhMaJicCSkrSfn6OhoaGhoaGhoaGhoaGhoaKdnaaX
+ l6uRkbONjbmHh8GBgceDg8aEhMWFhcWHh8GIiMGKir2Tk7Gfn6KgoKCfn5+dnZ2dnZyenpycnKGTk66J
+ ibyDg8SDg8eFhcaEhMeHh8SRkbuYmLWamrKenqykpKOioqKioqKioqOkpKOhoaaUlLSLi72IiMCJicCH
+ h8KCgsWCgsSEhMWDg8aFhcWOjryamq+hoaWjo6OioqKioqKioqOkpKWmpqampqempqempqempqempqem
+ pqempqempqempqalpaWlpaWlpaWkpKWjo6SkpKSlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6SkpKSl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqempqempqelpaajo6SkpKSkpKSlpaSlpaWhoamYmLKQkLmO
+ jriNjbWOjrONjbOHh7eIiLeGhr2EhMSCgsaDg8WIiMCRkbWfn6Wjo6KioqWioqienqyRkbmLi72KiruH
+ h7uBgb9+fsJ/f8GBgcOCgsSGhsKMjL6Pj7qVlbSamq6ioqaenquVlbSUlLSTk7ORkbGQkLGQkK2MjLGG
+ hryEhMCFhcKKir+Njb6Njb6Pj72Xl7akpKilpaelpaagoKmTk7eGhsWEhMeBgcaEhL+GhrmHh7qIiLyJ
+ ib6MjL2MjL2Kir6Pj7ednaejo6Ojo6Kbm6uOjriFhcGDg8OBgceAgMSAgMN/f8OCgsCIiLuLi7iFhb6G
+ hr+EhMKKiruZmaqioqGjo6OYmK6Li7yEhMSEhMSFhcKHh72IiLmHh7aFhbqFhcCEhMOEhMSKir6VlbGc
+ nKifn6aioqajo6SkpKKdnamPj7mHh8OJicCIiL+Hh76EhMGBgcGCgsCFhcCGhsGLi8CQkL2Tk7qUlLmW
+ lredna+kpKWioqWfn6mZma+SkrSOjraIiLqGhrmFhbiHh7WKirOLi7iKiryKir+NjbySkraZma+goKik
+ pKWjo6SkpKWkpKWkpKWkpKWkpKWlpaWlpaWlpaWlpaWlpaWlpaWkpKSkpKSlpaWlpaWlpaWlpaUgAKWl
+ paWlpaSkpKSkpKSkpaWlpaampqamp6amp6amp6WlpaOjpKOjpKCgppubqpKSs4eHv4CAxoKCxIKCxIKC
+ xIKCw4eHvI+Ps5KSsJOTr52dpaOjoKKioqKioqKioqKioZ6eoZOTqoyMs4qKuImJu4qKu4uLu4uLvYuL
+ vI+PuJSUtJeXsJiYr5+fp6OjoqKioqKioaCgoKCgoKCgoJ+foZycpZqaq5SUs5KStYyMvIaGw4ODxoOD
+ xoaGw4uLvY6OupOTtpubraKipKKio6KioqKioqOjoqKipJqaroyMvIuLvoqKvYqKvImJvYeHwYSEx4SE
+ x4eHxI6OvZWVtZycraWlpKOjpKKio6OjpKWlpKKip5aWs4mJwYWFxoKCxYGBw4GBwoGBw4KCxISExoaG
+ xIyMvpOTtpqaraOjoaGhoaGhoaGhoaKioJ+fo5aWrpCQtIyMuYuLuoiIvYaGwYeHwYWFxIaGw4aGxIWF
+ xI2NvJubq6KioaGhoKCgoJ+fnp2dnZmZopCQroaGvIKCxYODxoSExYSExoeHxI+PupSUt5SUuZiYtaOj
+ qqampqOjo6KioqKioqOjop2dqo+PuY2NvI2Nu4uLvYeHwoODxoODxYODxYWFw4yMvJeXsaCgp6Ojo6Oj
+ pKKio6KioqKioqKioqSkpKampqamp6amp6amp6amp6amp6amp6amp6amp6Wlp6WlpqWlpaWlpaSkpKOj
+ pKOjpaWlpaWlpaWlpaSkpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpqWlpqWlpqWlpqWlpaWlpaampqam
+ p6amp6amp6SkpaOjpKOjpKOjpaWlpKWlpZ6eq5iYsZaWsZSUsJGRsIyMs4eHuIODuYGBwYGBxYODxIiI
+ vpCQtZKSs5qarJ2dqKCgpaSkoqOjo5eXsIuLuoaGvYKCwH9/wn9/wX9/wYCAwoKCxYeHw4qKwIqKwJWV
+ tZubraCgp5ycrJSUtZSUtpOTtpKStJKSsI6OsoSEvH5+xICAw4ODwYqKvY2NvI6OvZCQvJSUuZ6erqWl
+ p6enpZ6erY+Pu4WFxIiIwoaGwYiIu4WFuYKCvIaGv4iIvoqKvIuLvYqKv46OuZmZq6CgpaKio6GhpZeX
+ r4yMu4aGv4eHvYSEv4ODv4KCvoaGuoqKuIeHv4KCxIKCxYKCxIiIvJaWrKKin6OjoZubqoyMvIWFxIeH
+ wYaGvoiIuYiIt4WFuIGBvYGBwYODwIeHwI+PuJSUs5eXsJiYrZubq6OjpKSko5+fp5OTtIqKv4qKvouL
+ voqKvYaGwISEwIKCv4KCwYODwoiIv4uLwI+PvpCQvZGRvJmZtKWlp6Wlo6WloaGhpJmZrJKSsouLuImJ
+ t4iItoiIs4iItIiIuoiIuoyMuZOTtJiYsJqarZ+fqaSkpaWlpqSkpaSkpaSkpaSkpaSkpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaSkpKSkpKSkpaWlpaWlpSAApaWlpaWlpaWlpKSko6OkpKSlpaWlpqampqampqan
+ paWmo6Oko6Okm5utkZG1hobBgIDHgoLDgYHDgoLEgYHFhoa+j4+zkpKvkZGwmZmln5+hoqKhoaGhoqKi
+ oqKioqKjoKCklJSvi4u2ioq4h4e9iYm+iYnAioq+jY26j4+4jo67jo67l5exoKCmo6OioqKjoqKioaGh
+ oKCgoaGfnJyll5erlparkZG1ioq+hITFgoLGg4PEhobBjIy7jY27jIy8kJC4nJyspaWjo6OkoqKjoqKi
+ o6Ohn5+llZWyioq/i4u+jIy+jIy9h4fCgoLHg4PFh4fDjIy/kpK4m5uuo6OnpaWlpKSloqKjoqKjpaWj
+ oKCpkZG6hITHhYXGhYXFgoLFgYHEgYHDgYHEgoLEh4fCj4+6mZmwoaGno6OkoqKjoaGhoaGhoqKgnJyn
+ j4+3i4u7jIy6i4u5i4u5i4u6ioq+hobDhobDhYXEiYm/lZWyoKCloqKioaGhoKCgoKCfnJyikZGthYW+
+ gIDDgoLFhITFhITFhobCjo67lJS1lJS0k5O3nJywqamlpqanpqampKSko6OhoaGjmJiui4u9jY27i4u9
+ hobEg4PHhITGhITGg4PFiYm+kpK0mZmtnp6oo6OkpKSkpKSko6OjoqKioqKio6OkpKSlpaWmpqanpqan
+ pqanpqanpqanpqanpqanpqanpqanpaWmpaWlpaWlpKSko6Oko6OkpKSlpaWmpaWmpKSlo6Oko6Oko6Ok
+ o6Oko6OkpKSlpaWmpqanpqanpqanpaWmpaWlpaWlpqalpqampqanpqanpKSlo6Oko6OkpKSko6OmnJyt
+ nZ2snp6rl5exjY25iIi8hoa8f3/BgIDCgYHDh4e9j4+2j4+2jo63jY25k5OynZ2no6OioqKjnp6nkZG1
+ hITBgIDEgYHCgIDBf3/BgYHBgoLDgoLHg4PHiIjDlJS1nJyrnJypnp6pnJytlZW0l5ezlZW1kZG2hoa/
+ f3/EgYHAgoK+iIi5i4u4jIy7j4+6lJS3lpa4mpqypKSoo6OpnJyxlZW3jo65jY26i4u6h4e8g4O8g4O8
+ h4e9ioq6ioq6i4u7ioq9jo65l5evnJyooaGjpKShoaGlnJyql5eslJSsi4u3h4e3h4e1h4e2hoa9goLE
+ g4PDhITDiYm7jo60lZWtoKChoaGhnp6lkpK0jIy8jY26i4u5iIi5hIS5gYG9gIC/gYHAg4PBiYm/iIjB
+ iIjAioq+j4+5mJiuo6Oko6OkpKSjm5utj4+5jIy8i4u+h4fDhYXChITAgYHAf3/BgYHDgoLFgYHHhobE
+ i4vCjY3Al5e1paWopqampqakoKColpaxkZG1kJC2j4+1jY2zh4e1hIS4iIi4i4u3kZGxlZWxmJiwmpqu
+ m5uupKSlpaWmpaWmpaWmpaWmpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6OkpKSlpaWl
+ IAClpaWlpaWlpaWlpaWkpKWjo6SlpaWlpaWlpaWlpaWkpKWjo6SioqWYmLCJicCDg8aDg8SCgsOCgsSB
+ gcOBgcWKirmTk66RkbGRka+dnZ+fn52goKChoaGhoaGioqKgoKWamquUlLGNjbeGhr6CgsWDg8aDg8aI
+ iMCMjLyLi72Li72Rkbienqmjo6Sjo6OioqOioqOioqKhoaGhoZ+dnaSWlqyOjrSIiLuCgsOCgsWDg8WG
+ hsGLi7uKiryLi72MjLyWlq+hoaSkpKSjo6Sjo6SioqKhoaOenqaWlq+MjL2MjL2MjL2Hh8ODg8aDg8SF
+ hcKMjLuNjb2RkbqenqyoqKKlpaWlpaWkpKWioqSkpKKgoKiSkriGhsWFhcaEhMWCgsWCgsWCgsWCgsWD
+ g8KDg8SMjL2cnKylpaGjo6Sjo6SioqOioqGgoKKYmKyMjLqNjbiNjbmPj7WNjbWHh72FhcKFhcKGhsOF
+ hcSNjbubm6qjo6KioqKioqKioqKfn6KYmKiMjLaAgMSAgMOCgsSEhMWHh8KOjrqSkrSUlLWUlLWYmK+h
+ oamnp6empqempqempqakpKOhoaKZmayNjbuMjL2EhMWEhMeFhcaFhceFhceFhcaKisCRkbaZmayfn6ak
+ pKSlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaampqempqempqempqempqempqempqelpaWl
+ paWlpaWlpaWkpKSjo6WmpqempqempqempqakpKSjo6Sjo6Sjo6Sjo6SlpaampqempqempqempqelpaWl
+ paWlpaWlpaampqempqempqekpKWjo6Sjo6SioqWdnaydnayenquUlLaKir+IiL+CgsSAgMGBgcGGhruO
+ jrONjbWDg8SEhMOCgsWMjLqcnKmjo6GhoaOioqKXl6+Jib+BgcSAgMKAgMGAgMCAgMGAgMKBgcSFhcKO
+ jruUlLWcnKyenqmioqSioqWcnK2cnK2VlbWIiMKCgsaCgsKDg76GhraIiLmIiLqIiLyLi7uQkLeVlbSd
+ na+lpailpamdnbCXl7WUlLeOjryJicGGhr+Dg7yEhLqHh7iJibqJibyJibyJib6NjbqWlrCdnaihoaKi
+ oqGjo6Kjo6ChoaKXl6uNjbeIiLmGhreDg7yAgMSCgsODg8OJibyPj7WRkbORkbKYmKqgoKOhoaCXl6yR
+ kbWSkrKQkLKKireCgr2AgL6Bgb2BgcGBgcWCgseBgcmIiMGMjL2Pj7uWlrGioqOjo6SlpaKcnKyQkLmJ
+ ib+GhsKGhsKGhsGDg8KAgMJ/f8GBgcKBgcOCgsSDg8aDg8iIiMWWlrekpKmmpqeoqKSdnayQkLiRkbiQ
+ kLeQkLaLi7mGhriFhbaJibaQkLCRkbWRkbaSkraRkbeUlLSjo6akpKWlpaalpaalpaalpaakpKWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6SlpaUgAKOjpKWlpaWlpaWlpaWlpaWlpaOjpKWlpaWl
+ paWlpaWlpaSkpZ2dqZiYr4+PuYqKwIaGw4KCxYKCxIKCxoeHv4+PtZOTsJKSsJWVq52dn56enZ6enqCg
+ oKGhoaGhopqarJWVsY+PuIiIwIODxYODxISExYmJv4yMvIuLvYyMvJGRt5WVsqGhpqSko6OjpKOjpKKi
+ o6Kio6KioqKioJ6eo5OTroeHvYKCxIGBw4GBxIeHwImJv4ODxYSExIODxY2NupycqKSkoKKioqOjpKOj
+ pKSko56ep5iYrZOTtIyMu4uLuoSEwoODxYODxoaGw4yMvYyMvZKStpaWs5+fq6ampKWlpaWlpaWlpaWl
+ paSko6CgpZmZsIyMvYWFxYODxoWFx4WFx4WFx4aGxYSExY2Nt5WVrJ2dp6Sko6OjpKOjpKOjpKOjoqCg
+ o5mZqZSUsZGRtI6OuIyMuoiIvoSEwoWFwoWFwoSEw4iIv5WVsqCgpaKio6Kio6KioqCgpJqaqZKSr4uL
+ uIKCxIODxYODxoeHwo6OupOTtJKStZGRtZiYsKGhqKWlpKSkpaamp6amp6amp6ampqSko56eppCQtoWF
+ xISExYSExoSExoWFxoWFx4WFx4uLwZeXsaCgp6OjpKOjpKOjpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOj
+ pKOjpKSkpKWlpaamp6amp6amp6amp6amp6amp6amp6WlpaWlpaWlpaWlpaWlpaWlpaamp6amp6amp6am
+ pqSkpKOjpKWlpaWlpaWlpaWlpqamp6amp6amp6amp6WlpqWlpaWlpaWlpaamp6amp6amp6WlpqOjpKOj
+ pKOjpKWlpKGhqZWVtomJw4SExYKCw4CAwoWFuo6OsYyMtoODw4ODxISExYODx4qKvZmZq6OjoaGho5ub
+ qo+PuIaGw4ODxoKCw4GBwoCAwX9/wYCAw4WFvYmJuYuLu5OTtZycq6OjpqWlpKKip5mZrpKStoaGw4WF
+ xoODxYODv4eHuIeHuYiIuIODwYCAxYGBxYSExI6OvJmZsKOjqaiopaCgrJSUuI6OvoqKwoiIwoaGwIaG
+ vIeHuIaGt4eHuYODwoKCxYKCxoWFxI6Oupqaq6Cgo6GhoaKioaCgpJeXrY2NuoqKu4qKuYSEvX9/woGB
+ wYGBwoiIu4qKuYuLvIuLvouLvY+Pt5ycqaKioJmZqZOTsJSUr5OTsJGRsYmJuIaGuIKCvH9/w4CAw4KC
+ xYKCxomJwJCQupGRuJOTtp+fpqKio6Skop2dqo+PuYaGxIaGwoaGwYODw4GBw4CAwX9/wYGBwoGBwoGB
+ w4GBxYeHwo2NvY6OvpubsaWlqKenppubsI+PupGRuJGRuIyMvIqKu4eHuYiItI6OrY+PsYuLuoqKvYuL
+ vYuLvo+Pup2dqqOjpaSkpaWlpqWlpqWlpqWlpqSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOj
+ pKOjpCAAo6Oko6OkpKSlpaWlpaWlpaWlpaWlo6OkpKSlpaWlpaWlpKSlnZ2ompqtjo67hobEhITGhITG
+ g4PFh4fBj4+3lJSylJSxlZWsnJymn5+gnp6enp6enp6eoKCfoKChlZWvkJC3iIjAhITFhITFhYXEioq/
+ jIy9ioq9jIy7kJC3lZWxm5uroaGko6Ojo6Oko6Oko6OkoqKjo6OioKCjlJSviIi9goLEgoLEgIDFh4e+
+ h4e/hITEhITEg4PFhYXBkZG0np6mo6OhoqKioqKio6OkpaWjnJyrkZG1jY26ioq7hYXCg4PEgoLGhobD
+ jIy+jY28kpK3lpazmpqsoaGmpqalpaWlpaWlpaWlp6eko6OnmZmukZG2i4u9jIy9hYXDg4PFhITGhYXH
+ hYXGkZG5l5evm5ukoKCfoqKjo6Oko6Oko6Oko6Oknp6nlpaukJC1j4+3iYm+hobBhYXChYXChYXChITD
+ iIi+j4+3m5urpKSioqKjoqKjo6OinJyplJSxjo63iYm7iIi8ioq+jIy+jY29jo67jo67jY27kJC2nZ2o
+ pKSjpKSlpKSlpKSlpqanpqanp6enpKSnmpqui4u8hYXEhITFhITFhITFhITHhITIiorBkpK5mpqwoaGn
+ pKSjo6Oko6Oko6OkpKSlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6OkpaWlpqanpqanpqanpqanpqan
+ pqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpqanpqanpqanpqanpaWlo6OkpaWlpaWlpaWlpaWmpqanpqan
+ pqanpqanpqampKSko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OknZ2ql5exlJS1kJC6i4u/iYm8h4e5iYm0
+ h4e5g4PBgoLEg4PEg4PEgoLHh4fAlZWwoaGioaGjmJitkZG2i4u8ioq7h4e8gIDDgIDBfn7Dg4O9hoa5
+ ioq3kpKykpKylZWyl5exnJyrnZ2rkpK4hobEhITGg4PHh4fBiYm6iIi4iIi4g4PCgYHFgYHFgYHFgYHF
+ g4PEjIy9mZmwpaWno6Oqk5O4iIjEiYnDiYnDiYm+iYm6iIi3hYW3gIDAgYHCgIDFg4PDioq7k5Ozmpqq
+ oKCio6OhoKCjl5etjIy7i4u8jIy8hobBgYHEf3/DgYHAhoa6iYm5iYm5ioq8jIy8jY26j4+5lZWxoKCj
+ np6jlpaskpKxkZGzioq6ioq5g4O+fn7Cfn7Bf3/CgYHFh4e/jo65kZG4kJC5k5O2oKCmoqKjo6OioKCl
+ l5exjIy+jIy9hYXDgoLEgYHEgIDCf3/BgYHCgoLEgoLGh4fBjIy9i4u+jIy9m5uxpaWop6emnJyxkJC8
+ kJC5kJC3kJC1jY2yjIyvi4uviIi1iYm4ioq6i4u9i4u9jo66lZWynZ2qoqKlpKSkpKSlpKSlpaWmpaWm
+ paWmpKSlpKSlpaWlpaWlpaWlpaWlpaWlpKSko6Oko6Oko6OkIACioqOjo6SkpKSkpKSkpKSkpKSkpKSj
+ o6Sjo6WlpaWlpaWhoaibm66QkLmHh8OEhMaEhMeFhceKisCSkriVlbSUlLWUlLOZmaqgoKKgoKCfn56e
+ np6enp6enp+ZmaaOjraHh8CEhMWDg8eGhsWMjL+Njb2Njb6Pj7uRkbeTk7OZma2hoaWioqOioqOioqOj
+ o6Sjo6Sjo6ShoaSXl6+KiryEhMOEhMODg8OHh72EhL2CgsKCgsWEhMSIiL+NjbiZmaugoKKioqGioqKi
+ oqKioqOioqWbm6ySkraLi76FhcKDg8SCgsaHh8KMjL+QkL6UlLiYmLSVlbSdnaqkpKOlpaSlpaWlpaWl
+ paWjo6ebm6+WlrWTk7WMjLyGhsCCgsOCgsWDg8aGhsWQkLuXl7OdnayhoaOgoJ6fn5+ioqKjo6Sjo6Sk
+ pKOcnKuRkbaNjbmIiL2EhMKDg8SEhMSEhMSFhcKJib2QkLWWlq+enqajo6CioqOioqOkpKGZmayOjrmK
+ ir2Li7uLi7mGhsGGhsOIiMOIiMOGhsSGhsSRkbeenqakpKGjo6WkpKWkpKWlpaanp6ejo6qamrOOjr2F
+ hcSEhMWEhMaEhMaDg8aFhcWMjMCSkriZmbGhoaqkpKWkpKWkpKWjo6Sjo6SkpKSlpaWlpaWlpaWkpKSk
+ pKWkpKWkpKWjo6Sjo6SkpKSmpqampqempqempqempqempqempqelpaalpaWlpaWlpaWlpaWlpaWlpaam
+ pqempqempqempqakpKSjo6SkpKWlpaWlpaWlpaampqempqempqempqelpaWkpKSjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sbm6uUlLSTk7WTk7SQkLWPj7KLi7SFhbmCgsCCgsWDg8WEhMWDg8aGhsCMjLuSkrObm6ih
+ oaGcnKiXl6+Pj7iIiMCDg8SBgcWAgMSDg72FhbuMjLSOjrSHh8CHh8CGhsKJib+WlrKdnayVlbeMjL6N
+ jbuKir6Kir2Li7mIiLqBgcCBgcWCgsWCgsaBgceCgsWJicCKir6Xl7CkpKakpKiamrOSkruTk7qNjb+L
+ i7+Li7qHh7mAgL9/f8F/f8ODg8GLi7mSkrSWlrSWlrGcnKqioqKgoKSXl66Pj7eLi7yLi7yJib+Hh7+G
+ hryFhbqGhreJibmJibqKirqNjbmQkLiVlbGZma2hoaSioqCZmaiOjrWLi7qKiruFhcCAgMJ/f8J+fsJ/
+ f8KGhr2MjLePj7WQkLeQkLmUlLWdnauioqSjo6Kjo6KdnamPj7qHh8OEhMaDg8aCgsSAgMKAgMGBgcKB
+ gcWHh8KLi76Li72MjLyTk7Wamq6jo6mnp6afn66UlLmVlbeUlLaTk7OVlamRkauHh7WFhbeIiLiKirmK
+ iruPj7iWlrGamqybm6uioqWjo6SkpKWkpKWkpKWlpaalpaalpaakpKWkpKWlpaWlpaWlpaWkpKSjo6Sj
+ o6Sjo6Sjo6QgAKKioqKio6OjpKOjpKOjpKOjpKOjpKOjpKKio6OjoqGhpZiYr4+Pu4WFxYKCx4KCx4WF
+ xYqKwI6OvpGRuo+PvJCQu5iYsqKipaKioaGhoaCgoZ+fn56enZuboZGRsIWFv4KCxoKCxoWFxIuLv46O
+ vI6OvY6OvY6OvI+PuZaWsaCgpaKio6Kio6Kio6Kio6Kio6OjpKOjpJubq4yMvISExoSExYaGwoiIvYeH
+ vYKCwYCAxIODw4aGwIiIvpSUsZ6epKKioKGhoaGhoaKioqOjoJycqZaWsY6OuoWFxIODxYSExYeHwo2N
+ vY2Nvo6OvZeXtpqatJubsKGhp6Sko6OjpKSkpKWlpaampJ2drpaWtpSUt5CQuoiIwoODxYKCxIKCxoWF
+ w46Ot5aWsZeXs52draOjpqOjop+fn5+fn6KioqSko6OjpZmZr42NvImJwISExIODxISExIODxoSExIqK
+ voyMvJGRtZubqaGhoaGhoaGhoqKio6GhpZaWsZGRtpCQt4uLvIeHwYKCxIGBxYODxoODx4SExoqKwJSU
+ tZ+fp6OjoqKio6OjpKSkpaSkpaWlpKKiqZiYtoqKw4SEx4WFxoWFxoWFxoSExoeHw4+Pu5WVtZubr6Oj
+ p6ampKWlpaWlpaSkpaOjpKOjpKWlpaampqampqampqWlpaWlpaWlpaSkpaOjpKOjpKSkpKWlpaamp6am
+ p6amp6amp6ampqSkpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlp6amp6amp6ampqSkpKSkpKSkpKWlpaWl
+ paWlpqamp6amp6amp6amp6ampqSkpKSkpaSkpaSkpaOjpKOjpKOjpKGhppycrZWVs5KSs5GRsY2NtYeH
+ uoGBv4CAwYKCw4ODxYODxoeHwYqKu4uLuo2Nt5eXrKKioKGhopeXrY2NuYeHv4aGwIaGvoWFvYWFuouL
+ souLtIaGv4CAx4GByISExI+PuJycqqGhp5ycrpaWs5CQuYyMvIuLu4mJvIODwX5+w4CAw4GBxIKCxoWF
+ w4uLvo2NvIyMvZqar6OjpaSkpaCgq5qasZiYtI+PvY2NvYmJvYKCwH9/wn9/woKCwImJt5CQsJOTsZSU
+ tZSUtZmZrqGhpaKio56eppaWroqKu4qKu4uLu4uLu4qKuoiIt4aGt4mJuYuLuYyMt46OtZKSs5WVspiY
+ rZ6ep6OjoZ2dpo+Ps4aGvYSEwIGBw4CAxH9/w39/wYODu4qKtI2NtY+PtpCQtpOTs5eXsJmZr6GhpaOj
+ pKSkoZ6epo+PuYKCyIODx4KCxoGBxoGBxICAw4CAwoWFvoqKu4yMvIqKvYuLvI6Ouo6OupmZr6Wlp6Oj
+ q5qas5ubspqasJubrZWVroyMtIeHuIaGt4SEv4WFwISEw4yMu5iYrpubqZqaqqKipKOjo6OjpKSkpKWl
+ paWlpaWlpqWlpqSkpqSkpqSkpaWlpaWlpaSkpKOjpKOjpKOjpKOjpCAAoqKjoqKio6Oio6Oko6Oko6Ok
+ o6Oko6OkoqKko6OhoKCjlpaviIjAhYXChYXBhYXCiIjAjo67jY29jY2+jo6+kpK5nZ2tp6eio6OjoaGh
+ oaGhoaGhoKCenJygkZGvhYW/hITBhITBiIi9i4u7iYnAiorBiorBiorBj4+7m5utpKShoqKioqKjoqKj
+ oqKjoqKjo6OkpKSjmJiwioq/hYXEh4fBiIjAiIi/hITDg4PFhITChoa/iYm7jY21mpqpoKCioaGgoaGh
+ oaGhoqKioaGjl5evjIy7hobDgoLGg4PEhITFiIjAiIjAioq9kZG4lpa2l5e2oqKspqanpKSlo6Oko6Ok
+ pKSlp6ejmpqxk5O5kJC8h4fDg4PHg4PFg4PGg4PGioq8lZWvlpaumZmuoKCqpKSmpaWlo6OjoKCgoKCg
+ oqKim5uskJC4iYnBhYXEhITFhITFg4PGhITFiYnAjIy8j4+5lJSynp6lo6OfoaGhoaGhoqKinZ2pmpqt
+ lpaxj4+5h4fCg4PGgYHDgYHDgoLEhITFioq/lJS1mpqvoqKopKSjoqKjoqKjo6OkpKSkoaGlm5uukpK7
+ iYnFhobIhYXIhYXGhYXGhYXGhobFi4vBlJS3n5+tpKSnpaWmpaWmpaWmpaWlpKSko6OkpKSlpqanpqan
+ pqanpaWmpaWlpaWlpaWlpKSko6Oko6Oko6OkpaWlpqampqampqampKSko6Oko6OlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpqampqanpqanpqampaWlpKSkpKSlpaWlpaWlpqanpqanpqanpqanpqanpqampaWlpaWl
+ paWlpKSko6Oko6OkpaWinJyslZW0kZG2jo63i4u7goLBgIDCgIDBgYHCgoLEh4fAjIy7jIy8jIy7kJC2
+ mpqso6OhoqKflpaujIy5iYm7iYm6iYm6iYm5i4u2i4uyhIS9fn7HgoLEhobBkZG2mJiroKCkpKSjoKCo
+ lpazjY2+i4u/iYm+g4PBf3/Ff3/CgIDDgYHDgoLFhobDiorAiYnCiIjDlJS3n5+ppKSioqKmm5uulZW0
+ jY27iYnAg4PEf3/Gf3/CgYG+iIi2jo6wkZGwkZGzlJS0mJixn5+po6OlpaWioKCllJSyiYm9iYm8iIi8
+ iIi8iYm6iYm5h4e4iYm5jIy5jY25jIy3j4+1kpK0lZWxnJyooqKjoqKjmZmqi4u6gYHFgIDEf3/DgIDC
+ hIS7iYmzi4uxjY20j4+1kpKyl5etmZmrmpqtnZ2qoqKlpKSin5+mk5Ozioq/hYXChYXChYXAhYXAhIS/
+ g4O+iYm5ioq6ioq8ioq9iYm+iIi/jY28lpawoqKnpKSonp6sn5+rnp6rmZmwj4+6iYm8h4e5g4O8gIDE
+ f3/FgoLEjIy6lpawmJitmJitn5+mo6Oko6Oko6OkpKSlpaWlpaWmpaWmpaWmpaWmpKSlpaWlpaWlpaWl
+ paWko6Oko6Oko6OkIACjo6SioqOioqKioqKjo6Ojo6Sjo6Sjo6Sjo6Sjo6Ofn6WXl62MjLuLi7uLi7uL
+ i7qKiruJib+Kir+JicKRkbuamq+ioqempqWlpaWjo6OhoaGhoaGgoKGcnKKVlamLi7eKirqKiriIiLmG
+ hr+CgseEhMaDg8iJicKXl7Ojo6ekpKOioqKioqOioqOioqOioqOioqOhoaaUlLSNjbyMjL2MjLyJib+D
+ g8aCgsaEhMSIiL+Li7qOjrSYmKaenqGhoaGhoaGhoaGhoaGhoaGdnaaUlLGJib+Dg8aEhMWEhMWDg8WC
+ gsaAgMiJib+UlLSVlbSXl7WkpKqnp6ampqekpKWjo6Sjo6SkpKSbm6+Pj7yHh8SCgseDg8WCgsSEhMSJ
+ ib+OjreSkrOTk7Kbm6ajo6SmpqSlpaWlpaWjo6OhoZ+cnKSRkbSGhsCDg8ODg8SEhMWEhMWFhcWJicCN
+ jbuQkLmVlbGcnKmgoKOhoaChoaGhoaGhoaCdnaeamquQkLeFhcSDg8aDg8WBgcOAgMOCgsOJibySkrOX
+ l7CgoKikpKWkpKSjo6SioqOioqOhoaaamq+OjruGhsWFhcmFhciFhciFhcaFhcaFhceEhMiFhceUlLik
+ pKmnp6ampqempqempqelpaalpaWkpKSkpKSlpaWmpqempqempqelpaalpaWlpaWlpaWkpKSjo6Sjo6Sk
+ pKWkpKWkpKSkpKSjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWmpqampqempqempqekpKWj
+ o6SkpKWlpaWmpqempqempqempqempqempqelpaalpaWlpaWlpaWkpKSjo6SkpKOXl7CQkLeQkLmNjbyL
+ i7qCgsKBgcN/f8GAgMGFhb+KirqLi7uLi72Skreamq6fn6mioqWioqKamqqSkrSMjLmLi7mLi7iLi7eN
+ jbSDg759fcR/f8KFhb6RkbObm6qbm6udnaiioqOfn6iUlLWOjruQkLqIiMKAgMmBgcWAgMSAgMOBgcOC
+ gsWDg8eCgsiDg8mDg8mJicKXl7OioqaioqScnKqWlrGNjbuFhcOEhMWDg8OCgr+IiLSOjq+RkbCTk7ST
+ k7aWlrScnK6hoamjo6elpaSenqmRkbaPj7mOjraOjrWLi7aKiriKiriIiLiGhruHh7+IiMGJib6OjreT
+ k7CXl66cnKmgoKSkpKGgoKaRkbWEhMKCgsOBgcOFhbyKirOKirCKirCNjbKQkLGTk6+Vla+VlbCWlq+X
+ l7CgoKelpaOioqWdnaiYmKyPj7SNjbaMjLiKirmJibiIiLiHh7iIiLqJibyJib2Kir2NjbmVlbKbm6yh
+ oaajo6Sioqafn6mamrCOjryLi76JibyEhL6AgMKAgMKCgsGHh7qNjbeOjriOjrmOjrmWlq+fn6Wjo6Oj
+ o6Sjo6SkpKWlpaWlpaalpaalpaalpaakpKWlpaWlpaWlpaWlpaWkpKSjo6QgAKOjpKOjpKKio6KioqKi
+ o6OjpKOjpKOjpKSko6Cgp5aWsY+PuIyMu4yMu4uLvIqKvIeHv4KCx4ODxoODxo+PvJ6eraampKWlpaWl
+ paWlpaOjo6GhoZ6epJeXq4+Ps4mJuYmJuYiIuIODvoCAxoGBxYODxoODx42NvJ6eq6ioo6WlpaOjpKKi
+ oqKio6Kio6Kio6GhpJubq46Ou4uLvoyMvYiIwYKCxoODxYKCxYeHvoiIvY2NtpmZpp6eoJ+fn6CgoKGh
+ oaGhoaGhoaGhopycp5eXrY+Pt4eHwYODxoODxYODxYODxYSExYeHwoyMu5SUtJubraSkqKenp6amp6Wl
+ pqSkpaOjpZ6eqJaWsYmJv4KCx4SExYSExYODxomJwI2Nuo6Ot46OuI6OuJqapqGhoaSko6WlpaWlpaWl
+ paOjopiYq4mJu4KCxYODxIODxYODxYSExYmJv42NvI6Ou5OTtJmZraKipKOjoaGhoqGhoaGhoaCgopqa
+ qY6OuYWFxIODxoSExYSExYKCxIGBxIiIvJGRsZOTrpWVsKKipaWlpKSkpaSkpaOjo6Kio5qaqpCQuYaG
+ xISEx4WFxoSExoSExoWFxoWFx4WFyIaGxoyMwZmZs6Ojp6ampaamp6amp6amp6amp6WlpaWlpaSkpKOj
+ pKWlpaamp6amp6amp6ampqWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaamp6amp6amp6ampqSkpKOjpKWlpaamp6amp6amp6amp6amp6amp6am
+ p6WlpqWlpaWlpaWlpaOjpKSko5ubrJCQt4yMvI2Nu4yMvYWFw4KCwoCAwYKCvIiIt4mJuoqKu4mJvZSU
+ tJycrJubrZycq6OjpKCgpJmZrJSUsZGRsY+PsI6OsoKCwH9/xH9/woKCvY2NspmZqpmZrZmZrpmZrpqa
+ rJqarJeXsJeXsZeXsoyMv4ODyIODxYGBxYCAwoCAw4CAw4KCxYODxoSExoWFx4aGx5CQu56eq6Wlo6Cg
+ pZubq4+PuIyMu42NuoyMuoqKt46OrY+Pr5GRspOTtpSUuZSUuZOTuZKSuZiYsqKiqKKippqarJycqZqa
+ qJmZqJOTrI6OsYuLt4aGvICAwYCAxICAx4iIv5WVsJeXrJmZqZmZqp+fpqSkoZ6ep5KStIyMuouLuYuL
+ uYyMtYyMsIqKsYiIsoyMso6OsouLt4qKu4uLu4yMupOTs5+fp6Sko6OjpKSko6OjoZycp5WVroyMt4iI
+ u4iIuYeHuYaGt4aGuYiIvImJvouLu5KStJGRtZaWr6CgpqWlo6KipZqarY2NvIyMvYyMvYaGwoGBxYGB
+ woGBwIeHuImJt4WFv4KCxoODxoSExpCQt56ep6OjoaKio6OjpKOjpKWlpaWlpaWlpqWlpqWlpqWlpqSk
+ paWlpaWlpaWlpaWlpaOjpCAAo6Oko6Oko6Oko6OjoqKioqKio6Oko6Oko6OkmZmtjo66jY29jIy7jIy7
+ hobCgoLGg4PFg4PFg4PFj4+5l5ewn5+ppaWlpaWlpaWlpaWlpqaloaGml5eskJC0ioq7iYm6iYm5hITA
+ gIDFgYHEgYHEgYHEiIi/j4+5nJytp6ejpaWlpaWlo6OkoqKjoqKioaGjnp6mmZmsjo66i4u+h4fCg4PH
+ hITGg4PFiIi9iYm8iYm8kZG0nJyloKCgn5+fn5+foKCgoqKhoKCim5uolpavkJC2h4fAgoLGhITGhITG
+ hITGhITGiYm/jIy8jY28k5OzoKCmo6OjpaWmpqanpqanpaWnnp6qmZmui4u+g4PGg4PEg4PEg4PFg4PF
+ goLGh4fBjIy7jo63lZWvoKCioaGgoaGho6OjpaWlpaWloKCqk5O1hobAgYHEgoLEg4PFg4PFiIi/jIy7
+ jo66jo65j4+4lZWyoKCmo6OioqKjoqKhoKCimZmpj4+3hYXDg4PGhITFhITFhITFg4PEh4e+jo61kpKv
+ k5OsmpqmoaGipKSkpKSlpKSlpKSloaGlm5uqkZG2h4fChITGhITEg4PFhITFhITFhITGhobHjY3Ampqy
+ oKCspKSnpaWlpaWmpqanpqanpqanpqanpaWmpaWlpKSlo6OkpaWlpqanpqanpqanpqampaWlpaWlpaWl
+ pKSko6OkpKSkpaWlpaWlpaWlpKSko6Oko6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqanpqan
+ pqanpqampaWlo6OkpaWlpqampqanpqanpqanpqanpqanpqanpqampaWlpaWlpaWlpKSkoKCmlJSyi4u9
+ i4u9i4u9ioq6iYm5hoa3hoa3iYm6iYm6iYm6iYm7jIy6jY27j4+7lpayoqKlpKSjnZ2nlJSvkJCzjY2z
+ gYHDgIDCf3/ChIS8jIyzkJCwkpK0jY27jIy8jIy9jo66lJSxnZ2omJivj4+6i4u/i4u+iYm/goLEgIDD
+ f3/Cf3/CgYHEg4PFhITFhITGg4PIjY29np6spqakoqKmoaGlm5uqmpqrm5upmJiskJCxjY2vjY2vkJCv
+ jo62iYnAh4fGh4fFhobGkZG7oKCspqajo6OloqKkm5uqk5OwkJCxjY20hoa9gYHDgIDBgYHCgYHFhYXC
+ j4+3mpqpmZmqmJiqnp6lo6OhoKClmpqtmpqsmZmqmZmolJStj4+wjIyvgYG9gYHBgoLEg4PFg4PGhITE
+ jIy7l5etn5+ko6Ojo6Oko6Oko6OkoKCkl5eujIy4h4e6hoa4hoa3hYW5h4e7iYm9i4u9jIy9jIy9jIy+
+ kJC3nJyopaWhoqKlmpqtjo68jY29h4fDg4PHgoLFgYHChoa3iIi3g4O+gYHCgoLDhITDi4u9l5euoKCk
+ o6OioqKjoqKjo6Oko6OkpKSlpaWlpaWlpaWmpaWmpaWmo6OkpKSkpaWlpaWlpaWlIACjo6Sjo6Sjo6Sj
+ o6Sjo6OioqKioqKkpKOfn6eWlrGRkbiRkbiNjbyFhcODg8WDg8WCgsaFhcSRkbaYmK2cnKmgoKakpKSl
+ paWlpaWlpaWnp6OdnayQkLiLi7uKiruKiruEhMGBgcWBgcWBgcWBgcWGhr+OjreSkrObm6ulpaOlpaWl
+ paWlpaWkpKWjo6OhoaKenqaZmayPj7mGhsKDg8WDg8aEhMWIiL2IiL2IiL6GhsCLi7qZmamhoaGgoKCf
+ n5+fn5+goJ+fn6SVlbCQkLaIiMGDg8WEhMaFhceFhceEhMiKisCNjb2NjbuRkbSZmayhoaOjo6Sjo6Sk
+ pKWnp6elpaiZmbOKisCEhMaFhcaEhMWCgsWCgsWBgceHh8GMjL2Li72OjriamqigoKKhoaGhoaGhoaGj
+ o6Kmpqabm6+MjL6EhMWCgsWBgcaDg8WIiL+KiryKiryKir2Li72Ojrmbm6qhoaSioqOioqOjo6KgoKST
+ k7KFhcKBgceCgseFhcOKiruJibyKiruJibyNjbeTk6+ZmaeenqCgoKChoaKjo6SlpaWjo6adnauXl6+R
+ kbWIiMCDg8eCgsSBgcODg8WEhMWDg8eGhsSSkrigoKylpaelpaalpaalpaWlpaWmpqempqempqempqem
+ pqalpaWlpaWjo6SlpaWmpqampqempqempqelpaWlpaWlpaWkpKSjo6Sjo6SlpaWlpaWlpaWkpKSjo6Sj
+ o6Sjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqampqempqempqelpaWjo6SkpKSmpqampqempqem
+ pqempqempqekpKWjo6SlpaWlpaWlpaWlpaKZma2Pj7eRkbWRkbSRkbOLi7iHh7iHh7iHh7mJibqJibmE
+ hMGDg8SDg8WHh8GVlbOioqWlpaKZma6RkbWQkLKNjbKLi7WKirWMjLGLi7GJibWJibmMjLuHh8WGhsaF
+ hciHh8OSkrSenqabm6qOjrmJibyIiL2CgsSAgMN/f8J+fsF/f8GBgcOCgsSDg8WDg8aIiMGPj7ubm7Cl
+ paWlpaWkpKWhoaWbm6eWlq2SkrKPj7GNja+OjqyNjbKHh76Dg8aEhMeEhMiKisOXl7WioqmmpqSkpKad
+ nayVlbOTk7OOjraHh76CgsSBgcOAgMF/f8OEhL+IiLqLi7iVlbCXl66Xl6+Zmamfn6KioqOenqienqee
+ nqecnKeXl6yNjbWCgrx/f8GAgMOCgsSEhMWDg8aGhsOSkrSbm6mcnKifn6Wjo6Kjo6WhoaaioqSbm6uS
+ krCLi7SGhrmFhbmFhbmGhrqJibqMjLyNjb+Ojr2Tk7iTk7eamrGhoaejo6KhoaaUlLWHh8OCgsiCgsiF
+ hcSJibuHh7eDg76BgcGAgMODg8KMjLqSkrWUlLOamq6hoaejo6OioqOioqOjo6Sjo6SkpKWlpaWlpaWl
+ paWlpaWkpKSjo6Sjo6Sjo6Sjo6QgAKKio6Kio6OjpKOjpKOjpKOjo6KioqKio5iYrpGRtZCQt42Nu4aG
+ w4KCxYKCxYODxoaGxIuLvo6OuZWVsZubqKCgpKOjo6SkpKWlpaWlpaSkpZ2drZaWtZGRuIqKvIWFwYKC
+ xYKCxoKCx4ODxYeHvo6Ot5KSsZeXq5+fpaOjo6SkpaWlpaWlpaSkpaSko6KiopubqZGRt4eHwYODxYKC
+ xoSExImJvYmJvYiIvoaGwIqKupSUrpycpqGhoaGhoaCgoJ+fn6Cgnp6eopOTs4eHwIKCxYKCxoSExYSE
+ x4SEx4mJwo2NvouLwJCQuZycqqGho6Kio6Kio6OjpKOjpKampaamqJycsIyMwIqKwIiIwoODx4ODxoGB
+ xYeHv4uLvIyMvI6OupWVsqCgpKGhoaGhoaGhoaGhoaGhoZ+fp5SUto2NvoqKwYmJwYmJwImJwIyMvYuL
+ vYqKvYqKvI6OuJeXrqCgpKKio6Kio6Kio6OjoqKio5mZrIqKvIiIwImJvoiIv4aGwoWFwYWFwoaGwJCQ
+ tJubp6CgoqCgn5+fn6CgoKKioqWlo6Ojp5iYspOTt4qKv4SExIKCxYGBw4GBw4KCxIKCxoaGwomJvpGR
+ t6CgqqWlpqWlpqWlpqWlpqWlpqWlpaamp6amp6amp6amp6ampqWlpaSkpaOjpKWlpaamp6amp6amp6am
+ pqWlpaWlpaWlpaOjpaOjpKSkpKWlpaWlpaWlpaOjpaOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWl
+ paWlpqWlpqampqampqSkpKOjpKOjpKWlpaamp6amp6amp6amp6amp6WlpqOjpKOjpKWlpaWlpaamo5+f
+ qZeXr5iYrZmZq5OTr4uLuIiIuoeHuYiIuYuLu4aGwYKCxIKCxoGBx4WFwpOTs6KipaWlopubrJKSto+P
+ t46OtYyMspKSqY6OrYiItIeHt4mJu4WFw4ODxoODyYaGxoyMv5OTuJmZrqCgpZaWr4iIvoKCxYGBxYCA
+ xH9/wn9/wYCAwYGBw4KCxYWFxYmJv4yMvI2NvZWVtaKiqKWlpaOjp6Kipp2dqJWVrpCQspCQsY6OroqK
+ sYWFvIGBw4GBxYSExomJwZCQu5+frKampaampaSkp5ycrpSUtJCQuImJv4ODxYKCxYKCxICAw4SEvomJ
+ uouLu4uLvIqKvYuLvIiIv5CQtZycpqGhoZ6ep5+fpp2dqZmZrY+PtoWFwICAwn9/wYCAwoKCxIODxYOD
+ xoWFw46OuZGRtZSUsZycp6OjoKKiop6epZubqpmZq5WVrYyMtIWFuoaGuYaGt4iIuIqKuYyMu46Ovo6O
+ vZSUt5qasZycrqGhqqamo6GhpJWVtIqKv4iIwomJwYuLvouLuoODv4CAwX9/w4SEvoeHvISEwYiIwIWF
+ w46Ou5ycrKSko6OjpKKio6Kio6OjpKSkpKSkpKWlpaWlpaWlpaSkpaOjpaKio6KioqKioyAAoqKjoqKj
+ oqKjoqKjo6Oko6Oko6OjoaGjlZWwjo65i4u8hITDgoLGgYHFgoLFhITFhobDiIjAhobDkZG1nZ2noqKi
+ oaGioqKkpKSlpaWlo6Omnp6rl5e0jo6+hobEgoLGg4PHhITHhobFioq+j4+2kpKwl5eqnp6koaGhoaGh
+ oqKjpKSlpaWlpqalo6Omm5utkJC4hITEgoLGgYHHhYXDiYm+ioq9iYm+h4e/jY24lZWtnJykoaGhoaGh
+ oaGhoaGhoKCgnp6fmJini4u5g4PFgYHGg4PGhITGhYXEiorBjY2/i4vBjo69l5eyoaGopKSioqKioqKj
+ oqKjoqKjo6Olo6Oonp6tkZG7iorChobFg4PHhYXFiYnAi4u8i4u7ioq8kJC2nZ2po6OjoqKioaGhoaGh
+ oqKgn5+jl5eskJC3jIy7jIy8jIy9jY29jY29jIy+jIy+ioq9i4u7lJSxoKCjo6OioqKioqKjo6OioqKj
+ nZ2ol5evjo65jIy6iYm8hYXCg4PGgoLFhYXBioq6k5OwnZ2lo6OfoaGhn5+fn5+foKCgoqKinZ2qkZG5
+ iorAhYXGg4PHgoLFgoLEg4PFgoLFhobCiYm+jo64mJiuoaGlpaWmpaWmpaWmpaWmpaWmpaWlpaWmpqan
+ pqanpqanpqanpqampaWlpKSkpKSkpaWlpqanpqanpqanpqampaWlpaWlpaWlpKSlo6OkpKSkpaWlpaWl
+ paWlpKSlo6OkpKSlpKSkpaWlpaWlpKSkpKSkpaWlpaWlpaWlpaWlpKSkpKSko6Oko6Oko6Oko6OkpaWl
+ pqampqanpqanpqanpqanpaWlpKSkpKSkpaWlpaWlo6OnoKConZ2olZWwjo63ioq6iYm6iYm5iIi5hobB
+ g4PGg4PFgoLGg4PGi4u8mZmroqKipKSjoaGnmZmvlJS0lZWwlJStkZGtiYm0hoa3hYW4g4PAgYHFgYHG
+ hobDi4u/j4+9kJC7lpa0o6Ojnp6njo65goLGgYHGgoLEgIDDgIDBgYHBgYHCgYHEg4PFh4fBhobChYXD
+ jo66nZ2rpqaloqKpoqKonp6qlpawkJCzkJCwi4u0hIS7gIDBgIDFg4PFi4u/k5O3lZW1n5+spqalpqal
+ paWmoqKpl5ezi4u/hITGg4PGhITFgoLFhYW+h4e5ioq4ioq8h4fBhobChYXEiIi/kpKznZ2moqKfoKCk
+ nJyomJiukJC4hobCgYHFgYHDf3/BgIDDgoLEg4PFg4PFhITFhobCiIjAkpK0nZ2moqKfoaGhoKCimZmr
+ lpauk5Oxj4+zi4u0i4uyh4e2h4e6hoa+hobBiIjDiYnDlZW2nJyvnJyvn5+spaWmo6Oml5eukZG3kJC5
+ j4+6ioq/hYXCgIDDfn7DhIS+hoa8g4PAgYHGgIDHg4PFj4+4nJypo6Oio6Oko6OkoqKjo6Oko6Oko6Ok
+ pKSkpaWlpaWlpaWlpaWlo6OkoqKjoqKiIACioqOioqOioqOioqOjo6Sjo6SioqSioqGXl66Kir2Dg8SA
+ gMaBgcWEhMCEhMOFhcSFhcSEhMWHh8KVlbKhoaWjo6GhoaKhoaKioqSjo6Whoaibm66Tk7iJicKEhMiE
+ hMaFhcaEhMeIiMOQkLmVlbOWlq2dnaShoaGhoaGhoaGhoaGioqOkpKWmpqSjo6eXl7OKisKGhsOGhsKF
+ hcKJib+Li72Jib+Jib+Jib6Pj7eXl6ufn6KhoaChoaGhoaGhoaGioqCfn6KVlauKireGhr6EhMKEhMWF
+ hceHh8ONjb2MjL+Ojr2UlLabm6+goKmkpKWjo6OioqKioqKioqShoaWfn6eZmbCNjcCFhciDg8mEhMeF
+ hcWKisGLi7+KiryLi7qVlbCioqOioqOioqOhoaKhoaGiop+goKOTk7GNjbaJibqIiLqLi7uNjb6MjL6M
+ jL6MjL6Kir+OjrmZmaqjo5+ioqKioqKioqKhoaScnKiVlbGOjrmNjbuKir6FhcOCgsWDg8SHh8GLi7yR
+ kbGYmKmenqSioqGhoaGhoaGgoKCfn56fn6CZmaqNjbyEhMWEhMaFhcaEhMaEhMaDg8aGhsSKir6Pj7iY
+ mKygoKKjo6Kjo6SlpaalpaalpaalpaalpaalpaWmpqampqempqempqempqelpaalpaWkpKSkpKSlpaWm
+ pqampqempqelpaalpaWlpaWlpaWkpKSjo6SkpKWlpaWlpaWlpaWkpKSkpKWlpaWlpaWlpaWkpKSjo6Sk
+ pKWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSmpqampqempqempqempqempqakpKSkpKWl
+ paWlpaalpaWgoKiQkLeKir6Kir2Li7qIiLqDg7+BgcSDg8WCgsaDg8SKir2SkrOZmaufn6WioqOkpKOh
+ oaadnaqbm6yVlbGMjLiJibmGhrmBgb1/f8OAgMSEhMKKir2NjbyLi7+Ojr2YmLKhoaafn6eVlbKLi76E
+ hMSCgsWBgcSAgMKAgMKBgcKBgcOCgsWCgsaDg8aBgceJib6Zma2lpaSjo6elpaagoKuXl7KRkbaOjreF
+ hb6BgcGAgMSDg8OIiMCOjryTk7iSkriTk7ebm6+lpaanp6SmpqWYmLSHh8SCgsmEhMeEhMWGhsGJibmI
+ iLeHh7qGhr6FhcKGhsGLi7yVlbCcnKifn6ShoaCgoKGYmK2OjriFhcKBgcaAgMSBgcOAgMGBgcGCgsOC
+ gsWCgsWCgsWDg8eLi7ybm6ujo6Kjo6GhoaGhoaGenqSVlbCRkbWRkbKQkLGMjLKIiLmEhL2BgcOBgcaE
+ hMaIiMKQkLuSkrqRkbuXl7WhoaulpaagoKiXl6+Xl6+UlLOKir2Dg8KDg76CgryFhbuDg8CAgMaCgsaF
+ hcKQkLeZma2dnaihoaajo6Sjo6SioqOjo6Ojo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWjo6WioqMgAKSk
+ pKKio6Kio6Kio6Kio6Kio6GhpKGhopeXq4mJvYGBxYODwoSEwoiIvYaGwIWFw4WFw4eHwZGRtp2dqaKi
+ o6Kio6KioqGhoaKioqKipJubrZSUto6OvYiIw4WFxoWFxoWFxYSExoeHxI2NvZWVtZubq6Gho6KioKGh
+ oaGhoaGhoaKioqOjoqOjpaGhqJiYsY6OvI2NvIyMvIuLu4mJvYiIv4mJv4mJvouLvIyMu5WVr6CgoaCg
+ oKGhoaGhoaGhoaGhoZ6eppaWrY6Os4mJuoWFwYSExYWFxoaGxIqKwIuLv5OTt5iYspycrqKiqKSkpaSk
+ paKio6Kio6GhpJ+fpp2dqpKStoaGxoSEyYWFyIWFx4SExoODx4uLwI6OvJGRtZqaqaOjoKKio6Kio6Ki
+ o6KioqGhoJycppCQtYqKuomJuomJuoqKu4yMvoyMvoyMvoyMvouLwJSUtaCgpaGhoaGhoaKioqOjoZ2d
+ p5SUso+PuIuLvoqKvoWFxIODxoSExYWFxIqKvoiIwZGRtJycpaGhn6GhoaGhoaGhoaCgoKCgn56eoJmZ
+ p46OtoSEw4ODxYSExoSExoSExoeHw4yMvo6OvJiYsqGhpqKioKKioqKio6OjpKSkpaWlpqWlpqWlpqWl
+ pqWlpaampqamp6amp6amp6amp6WlpaWlpaSkpKOjo6Skpqamp6amp6amp6Wlp6WlpqWlpaWlpaOjpKOj
+ pKSkpaWlpaWlpaWlpaOjpKSkpaWlpaWlpaSkpaOjpKOjpKWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKSkpaamp6amp6amp6amp6amp6WlpqOjpKSkpKSkpqSkp5+fqpOTto6Ou42NvYqKvISEv39/
+ xIGBwoGBxIODxIiIvo6Ot5GRtZGRtpeXrp+fpaOjoqSko6Cgp5aWsY2NvIuLvIiIu4KCwH19w39/wYKC
+ wYmJvIuLvIuLvYuLvpCQu5iYsp6eq52dq5eXsJCQt4qKvoWFw4ODwYKCv4GBwIGBwoGBxIODxYODxYSE
+ xYSExYqKvpaWsKGhpaWlpaWlpKCgqJmZsJCQuoeHwYGBxoGBw4GBwIaGu4qKuYqKvYyMv4yMv4uLwJOT
+ uJ6eraSkp6WlppqasoyMwIaGxYaGxYeHw4yMvImJuYaGt4SEvIODwISEwYiIv5KStJeXr5ubq52dqp+f
+ pqCgoZaWrYiIvYKCxYGBxYGBxIGBw4GBwoCAwYGBw4GBxIGBxIKCxYaGwo+Pt5ycqaKipKGhpKKio6Gh
+ oaOjn5eXrJKSspOTsJCQs4eHvYSEv4GBwYGBw4ODxYaGw4qKvoaGw4eHxIaGxY6OvZ2drqampaampZ2d
+ q5mZq5aWro+PtIqKt4mJtYWFtoCAv39/xYKCxYaGwo6OuZiYrpmZrJeXsJycrKSko6OjpKOjpKKioqKi
+ oqOjo6OjpKOjpKWlpaWlpaWlpaWlpaWlpaSkpCAApaWlpKSkoqKjoqKjoqKjoqKjoKClm5uqlZWwjo64
+ ioq9ioq7ioq9hITFg4PGg4PGhobDj4+4nJyooaGioqKioqKjoqKjoqKjoaGhoKCklZWyjY29iYnCg4PH
+ hYXGhITGhITGhITGhITGh4fDk5O3n5+qoqKkoqKhoaGhoaGhoaGhoaGho6Ohnp6mm5uqmZmtkpK2jIy9
+ jIy9ioq+iIi/iIi+iYm/i4u8jIy6kpKznJynoqKgoaGhoKCgoaGhoqKgnZ2llZWujo63h4e+g4PDg4PD
+ hYXEhYXGhYXHhITHiorAkpK4mpqwoqKopqakpaWlpKSlpKSlo6OjoaGjnJypk5OzjIy+hobEhITGhITG
+ hITGg4PFhobFi4u/k5O3mpqun5+loqKgoqKioqKjoqKjo6Ojn5+mlJSviYm9i4u8ioq7iYm6ioq7i4u9
+ jIy9jIy+i4u/jo68mZmwo6OkoqKioaGhoaGho6Ogm5upjo64iYm/ioq+hITFg4PGhYXFhYXFhYXFhITG
+ hYXGjo67mpqqoaGfoKCgoaGhoaGhoaGhoaGhnp6il5eokZGvhoa/hITFhITFg4PGhobEjo67jo66kpK3
+ mJixoaGppKSjoaGhoqKioqKjo6OkpaWmpaWmpaWmpaWmpaWmpaWlpqampqanpqanpqanpqanpqamo6Oj
+ oqKio6OkpaWlpqanpqanpqanpqampaWlo6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlo6OkpKSlpaWlpaWl
+ paWlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpaWlpqampqanpqanpqanpqan
+ paWlo6OkpaWko6OmnJysl5ezlJSzjo67hITCf3/EgYHCgIDBgYHCiYm8i4u6ioq7ioq9jIy8lJSym5ur
+ oaGjoqKjmJivjIy9jIy9jY28hobDgoLEgYHBgYG/iIi4ioq8i4u+jIy+jo68kZG5kJC6l5eznZ2smZmv
+ j4+5ioq+jIy8ioq4iIi4g4O+f3/DgoLDg4PFhITFg4PGiYnAjIy8kJC3nJypo6OkoqKnoqKnnZ2tkJC8
+ hITHhITEgoLChIS5h4e2iIi5iYm6i4u9jIy/lJS4lpa1l5eznp6rpaWmn5+smpqykpK6jY2+jY29i4u9
+ ioq7hIS9goK+g4O+h4e9jIy7jIy9i4u/jo69lJS3nJytoqKhnp6mkZG0hobBgoLGg4PFgoLEgYHDgIDC
+ gIDCgIDDgYHEg4PCiYm7iYm9jY27lZWznp6qpKSjoqKioqKhnJynmpqpl5esj4+1hYXBgoLFgIDCgIDB
+ goLDg4PFg4PGhITFh4fCjIy+kJC6mpqxpqalpaWmoKCslpazkJC0kZGxkZGwjIywgIC/f3/EgYHEhobC
+ j4+6k5O1kJC4kJC3j4+4lpaxo6Ojo6Oko6Oko6OkoqKjoqKjo6Oko6Oko6OkpKSlpaWlpaWlpaWlpaWl
+ IAClpaWlpaWkpKWioqOioqOhoaOamqmSkrGRkbGOjrWJibuIiL2CgsSDg8WDg8WCgseHh8GVlbCioqKi
+ oqKioqOioqOioqOioqOhoaSbm6mPj7aFhcKDg8aEhMWDg8WEhMaEhMaDg8eIiMKTk7eamrCfn6mkpKaj
+ o6ShoaKhoaGhoaGhoaGhoaCdnaSXl62Tk7KSkrWMjL2Li72KiryKiruKiruKiruLi7yLi7uYmK6hoaOh
+ oaChoaGhoaGgoKCiop+ZmamNjbeIiL2EhMODg8KCgsOCgsSEhMSFhcWFhcaEhMeQkLufn6qmpqOlpaWl
+ paWlpaWkpKWlpaShoaaVla+Kir2EhMWDg8WDg8WDg8WDg8WEhMOLi72MjL6YmLKioqekpKSioqKhoaGi
+ oqKjo6KgoKaamqySkrSLi7yKirqJibqJibqJibqJibuLi72MjL2MjL6OjruZmbCjo6WkpKWioqKhoaGi
+ oqCfn6SVlbCJib6EhMWEhMWDg8SEhMSFhcSFhcWFhcWPj7mamq6hoaaioqKhoaGgoKChoaGioqCfn6Oa
+ mqiQkLGEhMCEhMaEhMaEhMaEhMaHh8OPj7qRkbeQkLiVlbOfn6qlpaSkpKWioqKioqKioqKjo6Slpaal
+ paalpaalpaalpaalpaWlpaWmpqempqempqempqelpaaioqOioqKjo6SlpaWlpaWlpaWkpKWjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6SlpaWlpaWlpaWkpKSkpKSlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6SioqKjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSmpqampqempqempqempqempqakpKShoaWbm6uVlbKNjbyGhsSCgsWC
+ gsSAgMN/f8CGhrmJibqLi7yLi7yLi7yMjLuUlLKbm6uhoaShoaOYmK6NjbyMjL2MjL2MjL2Li7yJibqH
+ h7mIiLqJibyLi72Njb2Njb2Njb2Njb2Tk7egoKqbm6+OjryLi76MjL2Li7uDg8F/f8J/f8GAgMOCgsSE
+ hMWHh8KIiMGHh8KLi72YmK2ioqKhoaWhoaegoKmXl7OMjL+KiryIiLqGhreGhriHh7mIiLmJibqKir2R
+ kbiamrCdna2enqylpaampqWioqmUlLeLi8CNjb6MjL6Hh8GDg7+Dg76GhryLi7qNjb2Njb6Pj72Ojr6R
+ kbubm7CmpqSioqKVla+Hh8CCgseDg8WDg8WBgcSAgMJ/f8GAgMGBgcKBgcSBgcSCgsWCgseLi7+amq6j
+ o6Kjo6Sjo6KenqWYmKuPj7aGhsODg8WCgsSAgMKAgMGAgMKCgsSEhMWHh8KLi72Pj7qQkLqVlbWjo6il
+ paafn6uYmLWTk7eSkrKOjrOBgcN/f8J/f8OEhL6KiriOjriRkbeRkbeQkLiUlLOcnKqioqSjo6Sjo6Sj
+ o6Sjo6Sjo6OioqKjo6Sjo6Sjo6SkpKWlpaWlpaWlpaUgAKWlpaWlpaWlpaSkpaOjo6KiopubqZSUsI2N
+ uIuLuomJvoSExYODxYODxYGBx4iIv5OTspqaqqKioqKioqKioqKio6Kio6Kio6Kio5aWsImJwIODxYOD
+ xIODxYWFx4WFx4SEyIuLwZOTtpmZrp+fp6SkpaSkpaSkpaOjpKKioqGhoaGhoZ2dpZaWrJOTsJGRtIuL
+ u4qKvIqKvIqKu4qKu4qKu4qKu4yMupaWsJ+fpaKioqKioqGhoaGhoaGhoZ+fopOTsIeHvoSEw4SEw4OD
+ xISExYSExYSExYSExYSExoqKwZeXs6Kip6WlpKSkpaWlpaWlpaampKOjppiYsYqKv4SExYKCxYKCxYKC
+ xYODxoaGw4qKvIuLvImJwJSUtKGhqKWlpKSkpaKio6GhoaKioaCgppycqpeXr42NuouLvImJuomJuYmJ
+ uomJuomJuouLvYmJwJOTt6CgqaWlpKSkpaSkpaOjoZ6epJiYqpKSs4uLvIqKvYuLvYaGwISEw4SExIWF
+ w5GRt5mZr6Cgp6OjpKOjpKKio6GhoaCgoJ6eo5ubp5GRs4WFwYODxYSExoSExoODx4mJwZGRtpGRt5GR
+ t5WVs5ycq6OjpaSkpaSkpaSkpaKio6KioqKioqOjpKSkpaWlpqWlpqWlpqWlpqWlpaWlpaWlpaWlpaWl
+ paSkpaKio6KioqOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaSk
+ pKOjpKWlpaWlpaWlpaSkpKOjpKOjpKOjpKOjpKKioqOjo6OjpKOjpKOjpKOjpKOjpKOjpKSkpKampqam
+ p6amp6amp6WlpqWlpaWlpJ+fqJOTtYyMu4mJvoiIvYeHu4iIuoaGuYeHtoSEv4ODxIWFxIWFxIaGw4yM
+ vJiYr6GhpaOjop+fppaWroyMvYyMvYyMvYyMvYqKvIiIuoiIuomJu4yMvI2Nvo2Nvo2Nvo2NvY+Pu5+f
+ q5ubr5CQupGRuJCQuIWFw4KCxoGBw4CAwYCAwoSExImJwomJwYiIw42NvpWVs5qaqqKioqKio6OjoqCg
+ pJaWr4yMu4qKvImJu4mJuISEvH9/woGBwoKCw4GBxYmJvpKSt5iYspycrqKiqKampZycsJGRu4yMwIyM
+ wIyMv4qKvoiIu4aGuYiIuYyMvI2Nvo+PvY6OvpOTuZWVt5qasaenpKampJiYroeHv4GBx4ODxYKCxYGB
+ xIGBw4CAwYCAwYCAwoGBw4GBxICAxYWFwI6Ot5iYraCgp6OjpKSko52dqY+Pt4WFw4KCxoKCxoKCxIGB
+ woCAwX9/woKCw4eHwYqKvo+PuZCQuZOTt5ubsKKiqKWlpqSkqJycr5eXtJKSuIuLu4iIu4eHuoWFuYaG
+ uImJt4qKuIyMupCQuJOTtZWVtJiYsqCgqqWlpaWlpaSkpKOjpKOjpKOjpKKioqOjpKOjpKOjpKSkpKWl
+ paWlpSAApaWlpaWlpaWlpaWlo6OlnZ2plpawjo63i4u5iIi+hITEhITGhITGgYHJiorAlZWynJynoKCi
+ oqKioqKioqKioqKio6OioqKinZ2okJC3hobDg4PGg4PFg4PFhITGhYXHg4PIiIjCk5O3m5utoKClo6Ok
+ pKSlpKSlpKSloqKkoaGioaGgnZ2llpasj4+0i4u6ioq7ioq7ioq7i4u8i4u8ioq8jIy4lZWtn5+koqKi
+ oqKioqKioqKioaGhoqKgmZmqioq7goLEgoLCg4PEhITFhITFhITFg4PGhITFi4u9kZG2n5+qpKSlpKSl
+ pKSlpKSlpaWlpaWknJyujY29hITGhITGg4PFgoLFgoLFhITFhobEh4fChYXEi4u8mZmto6OlpaWlpKSl
+ o6OloaGioqKfoKCjmJiukJC3jIy7ioq7iYm6iYm7iYm7iYm6iYm6h4e9kpK1np6qpKSkpKSlpKSlpKSl
+ oaGnmpqskpK0jIy6i4u8ioq6hoa+g4PAgoLDh4fAj4+3kpK1l5evoKCmpKSjo6Oko6OkoqKioqKfmpqm
+ j4+0hobBgoLGg4PFhITGg4PHh4fCjIy9jo67jY28j4+5mpqsoqKko6Oko6OkpKSlpKSlo6OkoqKjoqKi
+ oqKio6OjpKSlpKSlpKSlpKSkpKSkpaWlpaWlpaWlpaWlpKSloqKjoqKio6OkpaWlpKSlpKSlpKSlo6Ok
+ o6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpKSkpaWlpaWlpKSlo6Olo6Oko6Oko6Ok
+ o6OjoqKioqKjo6Oko6Oko6Oko6Oko6Oko6OkpaWlpqampqampaWmpaWlpaWlpqako6Oll5eukZGzkJC0
+ kJCyjIy1iYm5iYm3goK9gIDDgoLGhITGhITGhITFhITFjIy6mZmsoqKjoaGkmZmsioq9i4u+ioq9iYm9
+ iYm9iIi7h4e5iYm5i4u6jY28jo6+jY29kJC6kJC6mJixm5uvmZmxmpqwlJS1g4PGgoLHgYHFgIDCgIDB
+ goLDhYXEhYXGiIjDk5O3oKCpo6OkoqKioqKioqKjmJitjY25jIy9i4u9jIy6hoa/gIDDf3/DgIDEgYHG
+ gYHFgoLEiIjAkJC6lpa1nJyupaWlnp6rlZW0kpK4kpK3kZG3kZGzioq2h4e4iIi5i4u8jo6+j4+9kJC9
+ kZG8kJC8lZW3o6OppaWmnp6sj4+5g4PDgIDGgIDFgYHEgYHCgIDBf3/BgIDDgYHEgYHFhobAi4u5lJSu
+ nJymnp6mo6OkpKSjn5+olZWxi4u8h4fAiYm9goLDgYHCf3/CgIDBhYW+ioq8jo64kJC3kpKzl5eunJys
+ n5+rpaWlpKSnnp6tlJS3jY2/jIy/i4u7iYm6iIi2h4e1h4e3iYm5i4u6lJS2lpa1lJS2lpa0n5+spqak
+ paWlpKSlo6Oko6Oko6Oko6OjoqKio6Ojo6OkpKSkpaWlpaWlIACmpqalpaWlpaWnp6Sjo6iVlbOOjrqJ
+ ibuGhr2Dg8OCgseDg8aDg8iKisCUlLWYmLCbm6mjo5+hoaGioqKioqKioqKioqKdnaiRkbWHh8GDg8aD
+ g8aEhMaDg8aEhMaEhMeHh8SMjL6UlLadnaykpKSjo6Sjo6SkpKWkpKWkpKWjo6SgoKWZmamSkrGLi7mJ
+ ibyKiruKiruKiruKiryLi7yNjbqSkrScnKihoaGhoaChoaKioqKioqKioqKdnaaUlLKJib2Dg8KCgsOC
+ gsOEhMWEhMWDg8aFhcSLi72QkLWVlbChoaalpaSkpKWkpKWkpKWkpKWgoKmYmLSOjr6GhsSCgsaCgsWC
+ gsSDg8WFhcWEhMaEhMaKir+VlbOfn6Wjo6KkpKWkpKWkpKWkpKShoaOYmKqPj7aKir2KiryKiruKiruK
+ iruKiruIiLuIiLqPj7KamqehoaKkpKOkpKWkpKWkpKWbm66Tk7eNjbuKiryJibuFhb+CgsKCgsOEhMCI
+ iLuPj7WVlbCcnKqioqWkpKSjo6Sjo6Sjo6Sjo6GYmKqJibyBgcaDg8WDg8WDg8aHh8OMjL6NjbyMjL6O
+ jrqUlLWdnaijo6Ojo6Sjo6Sjo6SkpKWkpKWjo6WioqOioqKioqKioqKioqOioqOioqSjo6SkpKSlpaWl
+ paWlpaWkpKWioqOioqKioqOkpKWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSk
+ pKSkpKWkpKWjo6SkpKSlpaWlpaWlpaWkpKWjo6Sjo6Sjo6SioqOioqOjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6SkpKSkpKSlpaWlpaWlpaWlpaWlpaWgoKeTk7GSkrCPj7OMjLeJibqEhL9/f8KAgMOCgsSEhMaFhcaE
+ hMaIiMKPj7qZmayhoaOgoKWXl66OjriPj7iOjriOjriMjLeKiraIiLeFhb2Fhb+Hh8GKisGPj7yTk7eT
+ k7aYmLGgoKqjo6ecnK6QkLuKisKJicKIiL6Dg75/f8KBgcKCgsWCgsaFhcWNjb2amrCjo6akpKOjo6Gf
+ n6WWlrCNjbqKir2Li7yHh7+CgsSAgMaAgMN/f8OBgcSBgcSDg8KJib2Pj7iVlbSbm6+kpKakpKSamq6T
+ k7WVlbOTk7KOjrWIiLeGhriIiLiLi7qNjbuQkLyQkL2QkL6Pj7+Rkbubm7ClpaakpKeZmbGLi7yGhr+G
+ hr2Dg8CBgcF/f8GAgMKCgsSEhMWJib+OjriWlrCbm6icnKWdnaWjo6Kjo6SioqWhoaaZma2MjLmGhsGB
+ gcSAgMSBgb+EhLqHh7mLi7mNjbiNjbuXl7GenqmcnKucnKylpaWlpaahoaqUlLiLi8KNjb+MjL+Li7yK
+ iriIiLaHh7eJibmKirmQkLmUlLaZmbGdna2goKqioqilpaWlpaWlpaWkpKWjo6Sjo6SioqOioqOioqSj
+ o6SkpKSlpaUgAKampqSkpaWlpKWlpJ+fqpaWs46OuIqKuYODwICAxYKCxoODxYqKvpWVs5eXsZaWspyc
+ rKSkoqGhoaKioqKioqOjoaGho5mZrYyMvYaGw4eHwYWFxISEx4WFxoSExoeHwouLvpSUtp2draOjp6am
+ paSkpKOjpKSkpaSkpaSkpaSkpZ6eqpKStIuLuoqKu4qKu4qKu4qKu4qKvIqKvIyMuZKSs5mZrZycqqCg
+ oqGhoKKioqKioqKioqKiopmZq5aWr5KSs4uLu4SEw4KCxIODxYODxYaGxIuLvo+PuJGRtZiYq6CgpKSk
+ pKSkpaSkpaSkpaSko5ubrpOTuJCQvIyMv4aGwoWFv4KCwoKCw4ODxYSExYuLvpaWsZ+fqaOjo6OjoaKi
+ o6OjpKSkpaSkpZqar4+Pt4uLuouLuYqKuoqKu4qKu4qKu4mJvImJu4+PsZqao52doJ+foKKioqOjpKSk
+ paamo5mZsY6OvIuLv4uLvIqKvIaGwYeHwIeHwYmJvYmJu4qKupiYq6Gho6OjoqOjpKOjpKOjpKOjpKSk
+ opiYrYeHv4CAx4KCxYKCxISEwIqKvI2NvIuLvo6Ou5aWspubrKCgpqOjpKOjpKOjpKOjpKSkpaSkpaSk
+ paSkpKOjo6KioqGhoaGhoaKioqKio6Kio6OjpKSkpaSkpaSkpaSkpaOjo6KioqKioqKio6OjpKWlpaWl
+ paWlpaSkpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaSk
+ pKOjpKOjpKOjpKSkpKSkpKSkpKSkpKOjpKSkpKSkpKSkpKSkpKOjpKSkpaWlpaWlpaWlpaampaWlppWV
+ tY+PtoyMuYmJvIWFwIGBxIGBwYGBwYGBwoODxIWFxImJwI2NvZaWs5ubq6CgpKGho5ycqZeXr5SUspOT
+ s5SUspGRsouLtoWFvICAwoCAw4KCxYWFxYqKwI2NvpKSupqar6SkpaOjp5aWtIuLvo6OvI6Ou4qKvIOD
+ v35+wYCAwYKCw4ODxIODxYSEx4qKwJaWs6CgqaOjpKGhpJycqJSUsoqKvYeHv4KCxYGBxoGBxYCAw39/
+ wYGBwoODwImJuY+Ps5KSspaWsJ2drKOjp6eno56eqpWVs5OTtJCQtYuLuoiIuIeHtoeHtoiIt4qKuY2N
+ vI+Pvo+PvpGRvJWVt5ubsaSkp6ioo52dr5CQuYuLvImJvIODwICAw4CAwoCAwoKCxIWFxImJv5GRuJaW
+ s5WVsZSUsZiYrqGhpKOjpKSko6Wlop6eqY6OuYaGw4aGwYSEwYeHuYmJs4eHt4aGvoaGwIeHw5GRupqa
+ sJubrp2dqqSkpKampKCgqpSUuI2NwI+Pvo6Ovo2NvYuLu4iIuIeHt4mJuYmJuYqKvJCQuZaWtZubsJ6e
+ rJ+fq6SkpqWlpaWlpaWlpaSkpKOjpKOjpKKioqKio6OjpKOjpKSkpSAApKSko6OkoqKkn5+nnJyrm5us
+ kJCxiYm5g4PCgYHGgoLFh4fAkpKzlJSzlJSzm5utoqKmpKSlo6OjoaGhoqKhoqKin5+ll5eujY26jIy8
+ i4u9h4fChITGhYXFhobEjIy9iYm/k5O1oqKop6ejpaWlpaWlo6Oko6OkpKSkpKSlo6Olnp6qkZG4ioq8
+ ioq7i4u7i4u8jIy8jY27jY25kJCzl5esnZ2nnZ2noaGjoqKhoaGhoaGhoqKioqKim5upmZmqlZWvj4+2
+ iYm7hYXBhYXChITEiYm+jIy8jIy8kpKznp6koaGhoqKio6OkpKSlpKSlo6Oml5exjo68jIy/jY29jIy8
+ iIi7g4PCgYHEg4PDioq8l5evn5+ppKSkpKSkoqKjoqKioqKipKSkn5+pkpK4jY28jo64jIy4ioq6iYm7
+ iYm8iYm8iYm9j4+1nJyjnp6fnZ2fnZ2en5+foqKio6Oko6Ollpazjo68jIy+jIy+i4u9jIy8jIy8jIy8
+ jIy9ioq9jY23mpqnoKCgoqKho6Ojo6Oko6Oko6OkoqKlmZmtjIy6hYXChITBhITBioq5ioq6i4u8i4u+
+ j4+6m5usoKCmo6Oko6Oko6Oko6Oko6Oko6OkpKSlpKSlpKSlo6OkoqKjoqKjoqKio6Ojo6Oio6Oio6Ok
+ o6Oko6Oko6Oko6Oko6OjoqKioqKioqKioqKio6OkpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6Oko6Ok
+ o6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlo6Oko6Oko6OkpKSlpaWlpaWlpaWlo6OkpKSl
+ paWlpaWlpaWlo6Oko6OkpKSlpaWlpaWlpaWlpKSmmZmyjo68ioq9hobAgYHGgoLEgYHCgIDBgIDBgYHD
+ hITDi4u+ioq/jo66lZWznp6ppKShoqKjmZmtk5OzkpK0kpK0jo64hYW9gIDDgYHBgYHBgoLEg4PGgoLH
+ g4PIiIjDlZW1pKSmoKCpkZG4jY27jIy8i4u9hITCf3/Df3/Bf3/BgYHCgoLDgoLFg4PGh4fEjY29mpqw
+ o6OopaWin5+mk5Ozh4fBgYHGgoLFgYHEgIDEgIDCgIDBgoK/iYm3jY21j4+0j4+zkJC0lZWwn5+ppaWl
+ pKSnmpqwkJC4jY26jY23jIy1ioq1iIi1hoa3h4e6iIi8ioq/j4+9lZW3mpqynp6upKSnp6eknZ2vkJC8
+ iYnChYXDgoLEg4PBgYHAgIDBgYHDgoLFgoLGiIjBioq/iorAiorAkJC5nJyqoqKlpKSjoqKlmJiwjY28
+ jY27jIy6i4u5jIy2iYm2goK8gIDEgYHFg4PHhobFjIy+lJS1nJytoaGlpaWjnZ2rlZW1kpK7kZG8jo69
+ jY29i4u7iYm5iIi3iIi3iYm4iYm6ioq9iYnBjY2+mJiyn5+rpKSmpaWlpaWlpaWlpaWmpKSlo6OkpKSl
+ pKSlpKSlpKSlo6OkIACjo6SkpKOfn6idnaqdnauXl7CJib2Dg8SDg8aEhMWIiMGPj7iNjbuLi72QkLad
+ naqmpqSkpKWkpKWioqKioqCgoKOamquTk7WMjLyLi7yFhcODg8aEhMWFhcSHh8KHh8KFhcOPj7menqum
+ pqSlpaWlpaWlpaWkpKSjo6Sjo6ShoaecnK2WlrONjbmJib2Kir2Kir2Li72SkrWUlLGXl62Zmambm6ai
+ oqGioqKioqKioqKhoaGhoaGhoaKamqmTk7KOjreKirmJibuJibqJibuIiL6GhsGGhsKLi7yamquhoaOi
+ oqGhoaGioqKkpKSkpKaenqyYmLGRkbmMjL2Kir2IiL6Dg8SDg8OCgsSIiLyTk6+cnKaioqGjo6Ojo6Sj
+ o6Sjo6OioqKhoaOYmLGQkLmPj7qOjruKir2IiLyIiL2IiL2IiL2MjLmWlq2goKGenqGenp+enp6enp6g
+ oJ+ioqKbm6yPj7uLi7+MjL6Li72KiryLi72Li72Li72Kir6NjbuXl6+hoaCgoKChoaGioqGioqOjo6Si
+ oqWbm6ybm62Xl7CRkbeNjbmLi7mJibqJibuLi7yMjL6QkLidnamjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6SkpKWkpKWkpKWkpKWjo6SlpaWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6OioqKioqKioqKioqKi
+ oqOkpKWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSl
+ paWlpaWlpaWjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6SkpKWlpaWlpaWl
+ paWfn6qTk7iHh8SDg8eDg8WCgsSBgcKAgMGAgMGAgMKBgcSCgsWEhMaEhMeLi76Zma6jo6KgoKSSkrSS
+ krSSkrSPj7mIiMGBgcSBgcKBgcGBgcODg8WEhMWDg8WDg8WEhMiOjr6fn6yioqeVlbOPj7uLi72EhMSB
+ gcaBgcOAgMJ/f8GAgMKBgcSBgcWGhsGPj7iVlbOYmLKdnaulpaSenquLi7uBgcaBgcWBgcWBgcWBgcOB
+ gcKCgr+Hh7aNjbKLi7mKir2Kir2Kir2Li7uYmKyjo6WlpaaamrCOjrqPj7iPj7iRkbKNjbSHh7mEhLiF
+ hbiIiLqIiLuQkLiVlbaVlbaamrKfn6ylpaagoKuRkbuIiMSKisGJib+KiryEhMB/f8J/f8KBgcSDg8WE
+ hMWHh8OIiMKHh8OKir+YmLCioqWkpKOioqWYmK+Pj7mQkLiOjrmOjriLi7qEhL9/f8KAgMGBgcODg8WE
+ hMeHh8OOjruVlbSbm66hoaSgoKScnKqUlLWMjL6Njb2Njb2Li7yJibmHh7iGhriHh7iDg8CCgsSDg8WH
+ h8SPj7ycnK2kpKampqampqempqempqempqelpaWmpqampqempqelpaajo6QgAKWlpqSkpJ+fp52dq5eX
+ sYqKvYKCw4KCxIODxoiIwY2Nu4yMvIyMvIyMvJaWsKCgpaSkpKSkpaSkpaSkpaOjop+fo5qaqpOTtIuL
+ vIWFxIODxYODxYWFxIeHwoeHwoeHw4uLvZiYsKGhpaSkpKWlpaWlpaWlpaWlpaWlpKGhppqarZSUtI2N
+ vIyMvIeHwIGBxoODxYODxY+Pt5iYrpmZrZqaqaCgoqGhoaKioqKioqKioqKioaCgopubppWVro+PtouL
+ uYaGvoCAxYGBxIGBxIKCxIKCxYaGwJKSsp6epqKioqKioqGhoaGhoaKioaOjpZ2drJ2drJiYsZCQuIiI
+ v4ODxYSExIODxYiIvomJvI2NtpubpqGhoaKioqOjo6OjpKOjpKOjpJ6eppGRto+PuI2NuouLvImJv4OD
+ xYODxYKCxoaGwI2NtpSUr5qaqKCgoqGhoJ+fn56enp+fnZ2doZOTs42NvIyMvoyMvYyMvYuLvYqKvYuL
+ vYuLvYuLvI+Pt5eXrqKioqCgoKCgoKCgoKKioaGhpJubrJubrJiYr5GRt42NvYuLvYqKu4iIuYmJuomJ
+ u42NupiYsKSko6OjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaOjpKSkpaWlpaWl
+ paWlpaOjpKOjpKOjpKOjpKOjo6KioqKioqKioqSkpKWlpaWlpaWlpaWlpaWlpaWlpaSkpKSkpKWlpaWl
+ paWlpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaSkpKOjpKOjpKOjpKWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaSkpKOjpKSkpKWlpaWlpaampJubsIuLwYODyISExYODxYKCw4GBwoGB
+ woGBwoGBw4GBw4KCxYmJwJSUtZ2dqqKipKKipJqaqpWVso+PuoeHwoODxoSExYGBw4CAwYGBw4ODxYOD
+ xYODxYODxYqKvouLv5aWtaGhqZycro6OvIWFxYODxoKCxICAwn9/wX9/wYGBwoGBxIeHwY+PuZKStZGR
+ tpKSt5eXsaKip6OjppeXsomJv4ODxYKCxIGBw4CAw4ODwIiIt4yMsYiIuIqKvYuLvYuLvo6OvJaWs52d
+ q6Kio6CgpJqarJSUsZWVsJWVsYyMt4eHuoaGuYWFuIWFuIeHuYmJuomJuoqKvZCQvJqasqCgrKWlpqSk
+ p52dr5iYtZmZs5SUtoaGw4GBxYCAw4CAwoGBwoKCxIiIwYeHw4aGxIWFxYiIwpWVs6KipqSko6OjpJ+f
+ p5iYr5OTto+PuY2Nu4aGwoGBxYCAwX9/wYCAwYGBxIeHwI2NvI2NvY6OvJSUtaKiqKWlop+fpZWVsYuL
+ vYyMvIuLu4qKuoiIt4SEun9/woCAwYCAwoCAxIWFv4qKvIyMvpaWt6Skqaenpqamp6amp6amp6amp6am
+ p6WlpaWlpqamp6amp6ampyAApaWmpqaloqKnlpayioq/hITFg4PEg4PEg4PEhITDhobChobChobDj4+4
+ nJyooqKhoqKjo6OkpKSlpKSlpaWkoaGlmJirkpKykpK0i4u8hYXDg4PGhITFhYXEh4fCioq+kJC4nZ2r
+ pKSjo6Oko6OkpaWlpaWlpaWlpqako6Olmpqtjo67jY28h4fBg4PGg4PGhITGg4PHi4u9jo65jo65lZWv
+ oKChoaGhoaGhoqKioqKioaGjnZ2olpaujo62jIy4h4e+goLEgoLEgYHEgoLEgoLDgYHEioq8mJisoaGh
+ oqKioqKioqKioaGioaGgoqKinZ2rl5exkJC5jIy9ioq9ioq+ioq+ioq+ioq9iIi+jY23mpqnoKCgoaGh
+ oqKio6Ojo6Oko6Okn5+nkJC2jIy7jY27ioq/hITFhITFhITFgoLIi4u8lJSvlJStl5esoKCioaGhoaGh
+ n5+enJyfl5eoi4u4ioq9i4u9i4u9i4u9jIy8i4u8i4u8jIy7j4+3lpawnZ2ooqKioqKioaGhoKCgoaGg
+ oaGim5uqmJivkZG3jY28jIy9jIy9ioq7ioq7iYm8jIy3k5OwnJyppKSko6Oko6Oko6OkpKSkpaWmpqan
+ pqanpqanpKSlpKSkpaWlpaWlpaWlpaWlo6OkpKSkpaWlpaWlpaWlo6Oko6Oko6Oko6OjoqKioqKioqKi
+ pKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSkpKSkpaWlpaWlpaWlo6Oko6Ok
+ o6OkpKSkpaWlpaWlpaWlpaWlpKSlo6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6Ok
+ o6Oko6OkpKSjmZmwjo69jIzBi4u/hobAgoLEgYHCgYHCgYHDgYHDgYHDgIDEjY23mpqtnp6qn5+oo6Ok
+ oqKllpawiIjAgoLGgoLFg4PEgYHDgYHCgYHDgYHDgoLGhITGioq/jY29ioq/lJS1o6OopKSmmZmwjIy+
+ hYXFg4PGgYHEgIDBf3/Bf3/DhYW+j4+2jo65hobCh4fBhYXDkpK2oaGppqajn5+qj4+6goLGgoLGgYHF
+ g4PAioq3jo6xiYm3g4PAhITEhITGiYnBlpaznZ2snp6so6Omo6Oinp6lmZmslJSyj4+5jIy9ioq9h4e5
+ hIS4goK+gYHBgoLCgoLEh4fBj4+5mJiynp6tpKSnpqaloqKpm5uwlpa2iIjFhYXHhITGgoLEgIDDgoLC
+ h4e/iIjDhobGhYXGhITHhobElJS0oaGmpKSjo6OkoqKlm5usj4+5jo67h4fDhITGg4PEgIDCf3/Bf3/C
+ hoa7hoa/hYXEhobFh4fEkJC6nZ2rpKSlpKSjnJypjo63ioq8iYm6ioq3hYW7f3/Af3/Bf3/BgIDBf3/C
+ hIS/jY25lJS1m5uvpaWop6enpqanpqanpqanpqanpqanpqanpaWmpaWmpqanpqanIAClpaajo6iYmLOM
+ jMCEhMWEhMWCgsODg8SEhMOFhcOFhcOEhMSHh8CUlLKgoKWioqChoaGioqOjo6SkpKWioqecnK2VlbKR
+ kbOLi7uIiMKFhcaEhMaDg8aDg8WKir6RkbeWlrCfn6ekpKOjo6Sjo6SkpKSlpaWmpqWkpKaenqyTk7aN
+ jbuHh8KEhMWDg8aDg8eEhMaKisCMjL2Kir+QkLibm6qioqGhoaGhoaGhoaGioqGioqObm6uPj7eMjLiG
+ hr+CgsSCgsWDg8WDg8WDg8SBgcaFhcGQkLOcnKSioqGhoaGioqKioqKioqGhoaKcnKebm6mPj7iKir2K
+ iryKiryLi72MjLyMjLyLi7yMjLqVla+goKGgoKCgoKChoaCioqKjo6OioqWdnaqUlLOOjrqIiMCEhMSD
+ g8WDg8WDg8aHh8GLi76RkbWYmKqbm6agoKGhoaGhoaGhoZ+dnZ+WlqeQkLGLi7qJibyKirqJib2FhcSF
+ hcODg8WIiMCTk7OenqeioqKioqKioqKhoaGhoaCfn6Gbm6aXl66QkLaNjbqLi7yLi7yLi7yLi7uMjLuK
+ irySkrKcnKahoaKioqOjo6Sjo6Sjo6Sjo6SlpaSmpqampqempqempqekpKWjo6SlpaWlpaWlpaWkpKWj
+ o6Sjo6SlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6OioqKioqKjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaam
+ pqempqampqalpaWkpKWjo6Sjo6SlpaWlpaWkpKWjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWjo6Wjo6Sl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6SkpKOZmbCQkLqNjb6KisKGhsWEhMWC
+ gsSAgMKAgMKBgcOBgcOBgcOKiriOjreRkbebm66kpKOjo6SWlrKJib6FhcCFhcGBgcWBgcOBgcOBgcKA
+ gMSDg8SKir+Njb2Njb2Li7+SkrWenqmjo6idna2QkLuFhcWCgsiBgcV/f8N+fsKDg7uIiLiKiruHh8GD
+ g8WEhMSIiMGPj7efn6mnp6OhoaeYmLGQkLqOjrqOjriOjrSOjrKKireCgr+BgcJ/f8WEhMOLi72Pj7mR
+ kbiSkrecnK2kpKWhoaSYmK2NjbuLi72Li72Li7yHh7uBgb5/f8CAgMSAgMWCgsaGhsWHh8OKisGTk7eg
+ oKunp6SgoKuSkruHh8aEhMmFhciFhceCgsaBgcKEhL2FhcCEhMSFhcaEhMeGhsaNjb6VlbOioqWkpKOk
+ pKSioqWZma2MjLyHh8KDg8aDg8aCgsSAgMJ+fsGEhLmEhL2CgsKCgsWDg8eFhcWPj7qcnKyjo6WmpqOh
+ oaaWlq6QkLSLi7eFhb2AgMJ/f8J/f8F/f8F/f8F/f8KCgsOIiMGSkridnaykpKampqampqempqempqem
+ pqempqempqempqempqWlpaWmpqcgAKampZ6erY2NvoSEyISEx4WFxYODxISEw4WFwoWFw4WFw4eHv5KS
+ tZycqKGho6KioaGhoaGhoqKipKWlo5ycrZaWs5OTtouLvYSExISEyIWFx4SEyIWFx4iIwI+Pt5aWsJ2d
+ qKGho6Ojo6OjpKOjpKOjpKSkpKWlpJ6erJOTt46OvYmJwoSExoKCxYKCxYWFxYmJwI2NvIuLvoyMvZiY
+ r6KioqKioqKioqGhoaGhoaCgop6eppeXroyMuoeHwIKCxYGBxoODxYSExYSExYODxoWFwoyMupeXrKCg
+ oKCgoKGhoaGhoaKioaGhpJ2dp5qaqpeXrZGRtYuLuomJu4qKu4uLvYiIwYiIwYWFw4yMvJqaq6Ojn6Gh
+ oaCgoKCgoKCgoKKioaGhpJeXsZGRuIqKv4SExYODxoSExYKCxYaGwYuLvo2NvJOTtJubqJ+foKCgoKGh
+ oaKioKGhoZqappOTrI2Ns4mJuYqKuomJvYWFw4ODx4KCx4WFw4yMu5aWr5+fpqSkoaKioqKioqKioqOj
+ oaCgoJiYqI+PtoyMuoqKvImJvomJvomJv4eHwYeHwYWFw46Ot5ycpqKin6GhoaOjo6OjpKOjpKOjpKOj
+ pKSkpKampqamp6amp6Wlp6SkpaSkpKWlpaWlpaWlpaWlpaSkpKSkpKWlpaWlpaSkpaOjpaOjpKOjpKOj
+ o6KioqKioqSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqamp6amp6ampqampaSkpKSkpKWlpaWlpaWl
+ paSkpaOjpaOjpKOjpKSkpKWlpaWlpaWlpaWlpaSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaSkpaOjpKSko5qarY2Nu4aGxISExoSEx4SExYKCw4CAwoCAwoGBw4GBw4GBwoaGvIiIuI+PtJub
+ rKSko6OjpJmZr5SUtJWVsJCQs4ODwYCAxICAw39/w4KCwYmJvo2NvYyMvY2NvYyMvo+PupiYr6Cgp52d
+ ro+PvYmJxIaGw4aGwYaGv4eHuoiIt4aGu4SEwYSExIaGw4mJv4+PuJGRtZubq6SkpKOjpp2drJeXs5SU
+ s5WVspGRsomJt4ODwH9/wn9/woKCv4eHu4uLu4qKvYuLvo2NvZmZr6OjpqSkpJqaq42NuouLvYyMvYqK
+ voSEwYCAw35+woCAw4GBxISExoWFyIWFxomJwo+Pu5qasaWlpqGhq5GRvIWFyISEyISEyIODyISExIWF
+ voODvIKCwYKCw4KCxoaGxYyMwI6OvJCQup2dqqOjpKSko6OjpJycqo6OuoSExYODx4KCxoCAxYGBwYOD
+ uoKCuoCAwYKCxYODxYODxYWFxI6OupycrKOjpaWlpKKippycrJWVsYmJvIGBw4CAxIGBwn9/wX9/wYCA
+ woGBxYWFxIiIwo2NvZycraSkpqWlpaamp6amp6amp6amp6amp6amp6amp6amp6WlpqWlpiAAoaGml5e0
+ iIjEg4PJhYXHhYXGhYXEhYXChYXDhYXDiIi9kZGznJynoaGjoqKioqKioqKioaGhoqKio6OjmZmvkpK3
+ jY29hobFhITHhYXIhYXIhobHjIzBlJS3lpawnJyqoaGkoqKioqKjo6Oko6Oko6Oko6Ojo6OlmZmxjIy/
+ iIjDhITIhITHgoLGgoLDiYm/jY28jIy+jY27kpK2nZ2ppKSgoqKioqKioaGhoaGhoKCimpqpj4+2h4fB
+ goLGgoLGgoLFhITFhITFg4PGhobCjY25lJSwnJyno6OgoKCgoaGhoaGhoqKhn5+lmZmrl5etkpK0kZG1
+ i4u6iIi7iYm7h4e/hITEg4PGhobDj4+4m5upoqKgoaGhoKCgoKCgoKCgoaGgnZ2oj4+6iYnBhITGg4PH
+ hITGg4PFhYW/iYm7jY25k5O0mpqroKCloqKhoKCgoaGgoKCim5unk5OvjY23iIi7iYm5iIi9hITEgoLH
+ hITFiIjAj4+4lZWwmpqpn5+koqKioqKioqKioqKioqKjnp6mlZWtioq6iYm7h4fBhobEh4fDhYXEg4PG
+ g4PGgoLIi4u9mZmqo6OfoaGhoaGho6Oio6Oko6Oko6Oko6OkpKSkpqampqanpqanpaWmpKSlpKSkpaWl
+ paWlpaWlpaWlpKSkpKSlpaWlpaWlpaWlpKSko6Oko6OkoqKjoqKio6OjpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpqampqanpqanpaWnpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSkpKSko6OkpKSlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSkpKSjnp6plJS1ioq/hYXFhITG
+ g4PFgoLEgIDCgIDBgIDBgYHDgIDEhIS9jo6xmJiln5+hpKSjo6OkoKCnnp6pnJyrlpawi4u4hIS/g4O+
+ gYG+hoa7i4u5i4u8i4u9jIy9jo69j4+8l5exo6Ojnp6pk5O1kpK3lJS1kZG4jo66jIy2hoa7goLAgoLB
+ hITBioq+kZG3lZWxl5evmZmroKCmo6OlnJyrlZW0lJS1k5O2ioq8goLBf3/Cfn7CgoK+iIi5i4u4ioq6
+ ioq7jIy8jIy8mJivoqKmpaWknp6qkZG4jIy8ioq+hobCgoLFgIDEf3/CgIDCgoLEhYXGhITJhobFj4+8
+ kJC7lJS2oaGppaWmnJywkZG7iIjFh4fEhobDhoa/g4O9gIDAgIDBgIDCg4PAh4fAiorBiIjDh4fElJS1
+ oKCmpKSio6OjoKCmlZWziYnBh4fDhobChYXBhYW8hYW6f3/BgIDCgoLDhITEhITFhITFiIjAlJS0oKCp
+ pqajoaGolpazjY29g4PFgIDGgYHEgIDCf3/Bf3/BgIDDhYXCioq/jo67lZW0n5+ppaWkpqakpaWlpqan
+ pqanpqanpqanpqanpqanpqanpqanpaWmIACXl62NjbyGhsaEhMiFhceFhceFhcOFhcKFhcKIiL2QkLSY
+ mKmdnaKhoaKioqKioqKioqKioqKgoKKenqaUlLKLi7+FhcaEhMeEhMaFhceEhMmJicORkbuVlbeZmbKg
+ oKiioqSioqOioqOioqOjo6Sjo6SkpKOhoaWZma+Li76CgsiEhMaEhMaDg8SHh76Li7qKir2NjbuTk7Wb
+ m62hoaajo6OioqKioqKioqKioqGhoaKXl6yJibyEhMSDg8WDg8WEhMWEhMWEhMWHh8KPj7iVlbKbm6mf
+ n6KhoaGhoaGgoKChoaGioqCfn6SYmKyTk7SSkrSLi7uJibyKiruHh7+EhMOFhcOEhMSQkLabm6qfn6Wi
+ oqGhoaGhoaGgoKChoZ+enqKTk6+IiMGDg8eDg8eDg8aDg8aFhcGKirmKiriOjrSVla+enqekpKGioqOh
+ oaKhoZ+bm6aSkrCNjbeJibyKiruJibyFhcODg8aDg8WEhMSMjLyQkLeXl66fn6Sjo5+hoaGioqKioqKj
+ o6GgoKSbm6uSkrSJibyFhcCFhcWFhcaFhcWEhMWEhMWEhMSEhMOPj7ednaijo6ChoaGhoaGioqKjo6Ok
+ pKSjo6Sjo6Sjo6SkpKWlpaampqempqempqejo6WkpKWlpaWlpaWlpaWlpaWjo6SkpKWlpaWlpaWkpKWj
+ o6Sjo6Sjo6SioqOioqKjo6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWkpKSlpaampqempqempqalpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWjo6SioqWenqmUlLSIiMCCgsaDg8WBgcSBgcKAgMF/f8GBgcOCgsGHh7uRka6Z
+ maKenp2goKGioqSlpaKfn6iWlrOTk7eSkrWKirqIiLmGhraHh7iIiLuJibyKir6Kir2QkLqTk7ebm6+l
+ paSjo6KenqWcnKibm6qUlLKLi7uGhr2BgcCAgL+Cgr+Ghr2MjLiSkrSUlLKcnKqcnKmfn6aioqOdnamY
+ mK6VlbOMjLyDg8N/f8SAgMCBgb6FhbqHh7uIiL2IiL2IiL2Jib6Hh8GTk7ShoaelpaSfn6qSkriKir2F
+ hcKCgsWAgMWAgMN/f8KAgMGBgcODg8aFhcaJicONjb6Njb6Tk7egoKqmpqOjo6acnK+Pj7yOjruOjriG
+ hrx/f8KAgMKAgMGBgcCGhruEhL+BgceEhMiIiMSRkbqenqukpKOkpKOioqScnKqPj7qNjbyOjrqMjLqH
+ h75/f8OAgMGBgcKBgcKDg8OEhMSFhcSFhcSKir6YmLGkpKWhoaiSkreEhMaDg8aCgsWCgsWBgcOAgMKA
+ gMKBgcGIiLyKiruRkbaenqiioqWjo6ejo6ekpKampqampqempqempqempqempqempqempqempqcgAJGR
+ toeHwoSExoWFxoWFxoaGxYWFw4SExIeHwI6Ot5SUr5iYq52do6CgoaKioqKioqKioqGho52dp5WVroqK
+ vYSExoSExoSExoSExoWFx4SEx4mJwo6Ov4+PvpWVuKGhqqOjpaOjo6Kio6Kio6Kio6OjpKKipZycqpaW
+ sY6OuoSExoWFxYWFxYiIvYmJuImJuouLuZKStJqaraKipaSko6OjpKOjpKKioqKioqOjop2dppOTsYyM
+ uouLuoSEw4ODxYSExYSExYeHwo+Pt5WVsZmZq6CgpaOjoaGhoaGhoaGhoaCgoKGhoJ6epJaWrZGRtZCQ
+ toyMu4uLvYiIwoSExoWFxISEwoiIvpWVsKCgpKSkoKKioqKioqGhoaGhoaGhn5ubpoyMtoODw4ODw4OD
+ w4KCxIaGwIuLuYqKuo2Nt4yMtpCQspubqaOjoqKio6Kio6OjoJiYqYyMt4mJvIqKu4mJvIODxIODxoSE
+ xYSExYSExYKCxoiIv5aWr6CgpKKioaGhoaGhoaKioqOjoaCgpZmZrJGRtoiIwoWFxIWFxYWFxYWFxYWF
+ xYSExYaGwouLvJeXrqGho6KioqKioqGhoaGhoaOjo6WlpaWlpaWlpaWlpaOjpKSkpKampqamp6amp6am
+ p6OjpKSkpKWlpaWlpaWlpaWlpaOjpKSkpaWlpaWlpaWlpaWlpaOjpKOjpKKio6KioqOjo6WlpaWlpaWl
+ paWlpaWlpaSkpKKioqOjpKWlpqamp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKSk
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSko6Ghp5WVs4eH
+ wIGBxIKCxIGBwoCAwn9/wn9/wYGBwIiIuY+PsZCQspOTr5eXp5mZopyco6Ojo5+fqZeXsZWVtJSUtYuL
+ vImJuoeHuIWFuoWFvoWFvoeHwIqKvpCQt5OTtZaWs56erKSkpaOjo52dqJGRtIqKu4eHvYODwYGBvYCA
+ vYWFuomJuImJu4qKvJCQtpiYrpmZrJ6eqKOjoqKio6GhoZaWroeHwYGBxYGBwoKCvoWFt4CAwH9/w4GB
+ xIKCxoKCxoKCxoODxY2Nup2dqaamoqKip5aWs4eHw4KCxoGBxYCAw39/wn9/wYCAwYGBw4ODxYmJwY+P
+ vI2Nvo2NvpSUtpycrqKipqCgpJmZrJSUspSUsZSUromJuICAwoGBwIGBv4WFuIKCwIGBxYKCxYeHwJWV
+ tJWVtZqasKGhp6Sko6OjpKCgpZKStJCQtpKStIyMvYKCx4GBw4CAwYCAwYCAwYKCwYSEwoWFw4mJwIeH
+ wpCQt5+fqaSkpZubrpCQu4aGxYODxoODxYKCxIGBwoKCwYaGuYmJuY+PtZaWrJubqpqarJqarZqar6Gh
+ qaampKWlpaamp6amp6amp6amp6amp6amp6ampyAAkZG1jY26iIi/hYXDhITFhITFhITFhITFg4PGhobB
+ j4+0m5unoaGhoaGhoaGhoqKio6OhoaGjlpavioq+hYXFg4PFg4PFg4PFgoLFhYXGhITHiYnCj4+8lpa3
+ n5+upqaopqalpKSkoqKjoqKjoqKjo6OinJyqlJSzkpK1kJC3jIy9jIy9jIy9ioq8iIi8i4u4kJCwkZGx
+ n5+lpKSjo6Oko6Oko6Oko6Oko6Oin5+llJSyi4u9i4u8i4u8hITDgoLEg4PGh4fCj4+4lJSymZmroKCk
+ o6OhoqKioqKioaGhoaGhoaGhoaGfnp6jlpatkJC2i4u8jIy8iIjChYXGhobFhobEiYm/h4e/kpKzn5+m
+ o6OhoqKioqKioqKioqKhnp6jlJSujIy4jY23iYm7ioq7ioq7ioq7ioq7ioq6jIy4kpKxl5eonZ2ioqKh
+ oqKjoqKjo6Oinp6mlJSvjIy3iYm7goLEgYHDgoLEg4PFg4PFg4PFg4PFjo64np6mpKSgoqKioqKioaGh
+ oaGhoKCkm5upkZG1hobDhYXEhYXEhITFhITFhYXFhYXFh4fDjo6+lJS4oKCspqako6OjoqKioqKioaGh
+ oqKjpKSlpaWlpaWlpaWlpaWlpKSkpKSkpqampqanpqanpqanpKSlpKSkpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpKSko6Oko6OjoqKio6OkpaWlpaWlpaWlpaWlpaWlpaWloqKioqKjpaWmpqanpqan
+ pqanpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlp6eknp6qjo65hITFhITFgoLEgYHDgIDCf3/CgIC/hoa3jo6wj4+w
+ kJCykJCzkJCzkJCxlZWnoKChnp6mnJyqnJyomJitjIy8ioq6hYW8g4O9hIS8hoa9iYm8ioq9jIy6jY25
+ jY26k5O3n5+poKCok5O0i4u9ioq9ioq7iYm6hoa3hoa3h4e4iYm5iYm7ioq8ioq8ioq9j4+4m5urpKSh
+ oaGkmpqrlJSwjY25iYm8iYm5h4e6gIDBgIDBgIDBgoLEg4PFg4PFg4PFj4+1lpasnp6lpKSioqKlnJyt
+ j4+7h4fFg4PGgoLEgYHCgIDBf3/BgIDDhoa+jIy7jY2+jY2+jY2+j4+8lJS2oKCqoqKmlpawl5evmJiu
+ lJSwjIy2hoa5hoa3hYW4gIDAgIDCgIDEhoa+k5OxkpKzlJS1mpqwoqKopaWko6OjoKClkpK0kZG2j4+5
+ iYnBhITFgoLDgYHBgIDAgIDAgYHAgoLBg4PChYXDhITGjY27nJyqpaWho6Onlpa0h4fEhITHhYXGg4PF
+ goLCiIi5hoa4i4uwlZWqmpqpmpqqmpqqm5usmpqtoKCopqakpaWlpaWlpqanpqanpqanpqanpqanpqan
+ IACMjLuIiL+FhcKEhMSEhMWEhMWEhMWDg8eFhcOOjreamqmhoaGhoaGhoaGhoaGhoaGioqGfn6aSkrSL
+ i7yKir2Hh8GCgsWDg8SEhMWEhMaIiMKNjb6UlLeenq2lpaimpqempqempqakpKSjo6SioqOioqKdnamW
+ lrCQkLiMjL2Li72Li72MjL2Li76OjrqTk7SSkrORkbGdnaKioqGjo6Sjo6Sjo6Sjo6Sjo6OamqyPj7iK
+ ir2Li7yKiruKir2Kir2Kir+OjruTk7OTk7OSkrSenqajo6GioqKioqKioqKhoaGioqCfn6KXl6uOjrSK
+ irqNjbyIiMKGhsWGhsWHh8SKisKKisKSkrSZmaefn6GioqGioqKioqKioqKhoaOWlq+MjLqMjLmNjbeQ
+ kLONjbeHh7+Dg8SEhMOEhMOFhcGOjrabm6agoJ6fn6ChoaKioqOenqeWlrCPj7eJibyDg8OCgsODg8WC
+ gsWCgsWCgsWDg8aGhsSSkrSenqSjo6CioqKioqKioqKioqCbm6eRkbWIiMKEhMWFhcSEhMWEhMWEhMWE
+ hMWHh8ONjbuTk7eamrGioqmmpqWlpaWjo6OioqKioqKioqKioqOkpKSlpaWlpaWlpaWlpaWkpKSjo6Sl
+ paWmpqempqempqekpKWjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6SlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWkpKSioqKioqOkpKWmpqempqempqelpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWkpKWjo6SlpaWlpaWlpaWlpaWlpaampqempqempqelpaalpaWlpaWlpaWlpaWlpaWmpqShoaeU
+ lLKIiMGEhMWDg8WCgsSAgMWAgMGGhraOjq2Pj66QkK+NjbSLi7iLi7mMjLeYmKidnZ2amqOZmaebm6WY
+ mKmMjLmHh72EhL2Dg72EhLyJibuJibuKiruHh7+GhsKGhsSKisCYmLCfn6iUlLaLi76Li72Li7yKiruI
+ iLiIiLWEhLyBgcKCgsOEhMSKiryKiryKir6Tk7Sfn6aioqOZmayamqyUlLCOjreHh72BgcKBgcKAgMGB
+ gcGCgsOCgsWDg8WJib2RkbKTk7GXl6yenqWjo6Ofn6eTk7aHh8OEhMeEhMaCgsSBgcJ/f8KFhb2JibqN
+ jbqMjL+GhsaGhsWEhMePj7yfn6ulpaWenqqcnKiamquamqqVla6NjbWGhrmAgL9/f8F/f8OEhL+KirmM
+ jLmLi7uLi7yXl7Kjo6enp6SlpaShoaWTk7OMjLuLi7yHh8CCgsWCgsOBgcGBgcCBgcCBgcCCgsGDg8KD
+ g8OHh7+Rkbabm6uioqOhoaWUlLSMjL+Li8GLi8CJib+Hh72IiLqMjK+KirOKireMjLiOjreVlbGamqqd
+ naienqihoaempqWlpaWlpaWmpqampqempqempqempqcgAIeHwYWFw4SExYSExYSExYSExYODxoaGw5CQ
+ t5ubqaGhoaGhoaGhoaGhoaGhoaGhoaGhoZycppGRto2NuomJwIODw4GBw4ODxYODxoeHwYyMvZWVtZ6e
+ rKSkpqampaamp6amp6amp6WlpqOjpaKipKOjop6epZKSsoqKvIqKvYqKu4qKvIuLvY6Ou5GRuJKSt5GR
+ t5SUsZ6eoqCgn6Kio6OjpKOjpKOjpJ+fqZKSt4uLvYqKvIqKu4yMu4eHwYaGwoWFw4mJvo+Pt5CQt5OT
+ s5+fpqOjoaKioqKioqKioqKioZ6eo5eXq4+PtYqKuomJuoaGwoSExoSEx4eHxYuLwY2Nv5KSup2drKCg
+ pKCgoKCgoKGhoaKioqKioqCgpJeXrpGRtJOTsZCQso+Pt4mJv4SExYODx4ODxoODxYiIwJOTr52doqGh
+ n6CgoJ+fn6CgpJaWsJCQuYqKvoSExIODxYKCxIKCxIKCxYKCxYKCxIaGv5GRtZqaq6GhpKKioaGhoaKi
+ oqKioqKiopeXrImJvoKCx4ODxYSExIWFw4aGxIaGxYiIwouLvo2Nu5mZsKKiqaWlpqWlpqWlpqSkpqKi
+ o6KioqKioqKio6OjpKOjpKWlpaWlpaWlpaWlpaOjpaOjpKampqamp6amp6amp6SkpaOjpKWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaSkpaSkpaSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaamp6WlpaWlpqWl
+ pqWlpaamp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKWlpaWlpaWlpaWlpaWl
+ pqamp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaSko5ubq4yMvIGBx4KCxoKCx4ODw4mJtYuLsISEvIWF
+ vIWFvIiIuYuLuYyMuJKSsZ+foaCgn52dnpuboZaWqYyMtIeHvIWFvYSEvYSEvIaGuYmJuYmJuYaGvoWF
+ wYSExIWFxIyMvJmZraGhppmZso6OvIuLvouLvYuLvIuLuYSEvYCAwX9/xIKCw4mJvYqKvIuLvYqKwJGR
+ t52dp6KioqCgpZ2dqJOTs4mJv4ODw4GBw4CAwX9/wYCAwYGBxIODw4iIvYqKuoyMuIuLupOTsp2dp6Ki
+ oqGhpJWVs4iIwoSEyIWFx4ODxoGBxIWFvIiIuIqKt4mJvIaGxYWFxoSEx4iIw46OvZqasKSkpqSkpqOj
+ pZ2dqZiYrZKStYmJvoKCxH9/xH19w4KCvYiIuYmJuYmJu4qKvIiIvZKSs5+fqaWlpqampaSkpZmZrpGR
+ to+PuIuLuoWFwYODxIGBwYGBwYGBwIGBwIKCwoODw4iIvYiIvZKSs5ubqqGhpKGhpJOTso6OuY6Ouo+P
+ uo6OuoyMt46OsImJsoaGt4eHuYmJuouLu4+PuZSUsZiYrpubqqGhpqWlpKWlpaWlpaWlpqamp6amp6am
+ p6ampyAAhITEhITFhITFhITFhITFg4PGhobCjY25l5eun5+koqKgoaGhoaGhoaGhoaGhoaGhoaGgnp6i
+ kpKziYm+g4PEgYHEgoLDhITEh4fAjY25lJSympqsoaGnp6ekpaWlpaWmpqanpqanpqanpqalpaWkoKCm
+ lpawjIy6iYm9ioq8ioq8ioq8jIy+j4+8j4+7jY29jo65mpqtoaGjoaGgoKCgoqKio6Oko6OknZ2pj4+5
+ ioq/jIy8ioq8h4fBgoLGgoLGgoLGhITFiIjAj4+5mZmsoKCjo6OhoqKioqKioqKioqKil5etjY23ioq6
+ iYm8hITBgoLGg4PGhITGh4fFiIjEiIjDlJS1oqKopaWko6OioKCgoKCgoqKioqKinZ2ompqsmJiulJSx
+ j4+2h4fBhITGhITGhITFhYXEioq+k5OznJymoKCgoKCgoKCgn5+fnp6hkpKyiYnAhITGg4PGhITFgoLF
+ gYHEgoLFgYHGhITDjY24mZmpoKCkoqKioqKhoaGhoaGhoqKinZ2olJSzioq9hYXBh4e/iIi/iYm/iorA
+ iorAi4u+jIy9jIy+mpqupKSlpqakpaWmpaWmpaWmpKSloqKkoqKioqKjo6OkpKSkpaWlpaWlpaWlpaWl
+ paWlpKSkpKSkpqampqanp6eop6eopaWmpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpqampqaopqaopqampaWmpaWmpqanpqanpqampqalpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpKSkpKSkpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpqampaWlpaWlpaWlpaWl
+ paWhnJyojo66hYXEhobDhobEjIy4jIyyhIS7f3/Ef3/Cf3/Eg4PBhYXAiIi+kJCynp6joaGfoaGdm5uh
+ j4+vhIS+hIS+hYW9hoa8hoa5hoa3h4e4hYW8hITBhITChYXAioq8k5OznJyqoqKkmpquj4+7jIy/jIy9
+ jIy8iIjAgYHEf3/EgYG/hoa7i4u5i4u6jY28jIy9kZG3mpqsn5+mo6OimZmti4u+g4PHgYHHgYHDgIDC
+ f3/Cf3/CgoLAh4e8ioq6ioq7ioq8ioq/kpK3nJysoaGmoqKimJiviorAhYXGhobEh4fDiIjAioq6iYm3
+ hoa6hITBg4PGhITGiIjCj4+7j4+7mJiypKSmpqalpqalmpqtkJC3i4u9iYm/hobBhYW+g4O8hoa4iYm5
+ iYm7ioq7i4u7i4u9j4+2lpauoKCopqakpqalo6OonZ2qnJypmZmrkJC1hobAhYW+goLAgIDBgYHBhYXB
+ ioq+jIy6iYm9j4+1mJisn5+loqKjmZmrkJC3jY26jo65kJC2kZGyjIyzh4e3h4e3hoa6hYW/hobBh4fB
+ jY26kpK1mZmsoKClpKSkpKSkpaWlpaWlpaWmpaWmpaWmpqamIACEhMWEhMWEhMWEhMaEhMaIiMGOjriT
+ k7KXl66enqajo6GhoaGhoaGhoaGhoaGioqCioqCdnaWPj7WDg8KBgcSDg8SCgsaDg8SLi7uRkbOXl62X
+ l66cnKulpaOlpaWlpaWmpqampqempqempqejo6ibm62NjbyKir6Li7uKiruMjLyMjL2Njb2Njb6MjL+O
+ jryVlbSgoKajo6OioqKgoKCgoKChoaKioqSenqmUlLWOjryLi76GhsGCgsaDg8WDg8WDg8aEhMaHh8CU
+ lLOfn6SioqKioqKioqKioqKioqKhoaOXl6+QkLaLi7uFhcKCgsaDg8WEhMSFhcSEhMaFhcaMjL+VlbWj
+ o6empqSkpKWioqOgoKCgoKCdnaaamqyYmK6VlbGOjrmHh8CCgsaDg8aEhMWFhcSJib+QkLednaiioqKh
+ oaCgoKCgoKChoaCdnaKUlK2KiruFhcSDg8aDg8WCgsWCgsWCgsWCgsWFhcKPj7abm6ehoaGioqGioqKi
+ oqKhoaGioqGcnKqWlrCTk7KRkbSOjreMjLyNjbyNjbyMjLyLi72Njb2UlLaenqmjo6WlpaWlpaWlpaal
+ paalpaakpKWjo6SioqOkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSkpKSlpaWlpaalpaalpaajo6Sk
+ pKWkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqam
+ pqempqempqelpaampqampqempqempqelpaakpKWlpaWlpaalpaalpaalpaalpaWlpaWkpKSkpKWkpKWk
+ pKWkpKWlpaWmpqampqempqempqelpaalpaWkpKWkpKWkpKKdnaeTk7SSkrWSkrSRkbaOjraGhrx/f8SA
+ gMGAgMGBgcKAgMSCgsSGhsGKiruRkbObm6ahoZ+cnKOOjrGEhL6GhryGhryHh7qGhriFhbeDg7qBgb+D
+ g8CHh8CKir2Pj7aVlbCZma2fn6acnKuUlLSOjrqLi76Hh8GEhMaBgcWCgsKGhrqHh7eGhr+Hh7+JicGI
+ iMKLi76UlLSenqmioqOXl6+IiMCDg8WFhcKEhMGEhL6Dg72Cgr6FhbqJibeJibqGhr+Hh8CIiMKLi8CT
+ k7idnayjo6Obm6iRkbaNjbyNjbyLi76NjbyLi7qHh7uBgb+AgMODg8OIiMGOjryQkLqOjryWlrSjo6em
+ pqSlpaWXl7OQkLmMjLyLi72MjLqKiriHh7eHh7eIiLmJibyHh8GHh8CHh8CHh8COjrebm6mkpKKjo6Ok
+ pKOkpKGkpJ+goKOWlq6Li7qHh76Dg8KBgcGBgcKEhMKIiL+IiMCMjLqRkbWTk7GZmaqjo6GgoKWWlrGU
+ lLOTk7KSkrOPj7aIiLqIiLiGhrqDg8CBgcWCgsWCgsWKir2OjrmSkrObm6mjo6Ojo6SkpKWlpaWlpaWl
+ paWlpaWkpKQgAIWFxYWFxYWFxYWFxYmJwY6Ou5OTtJKSs5iYrKCgpKOjoaKioqGhoaGhoaGhoaGhoJyc
+ pZOTsYmJvIODwoKCxIKCxYODxYaGwo2NupOTspOTsZKStJmZrKSkoqSkpaWlpaWlpaampqamp6WlqKCg
+ rJmZspCQuo2NvYyMu4qKvImJvomJv4qKv4uLvo+PvJeXtKGhqKSkpKOjpKKipKKioqGhoKCgoKGhopub
+ rZWVtI6Ou4eHwoGBxoKCxYODxYSExYSExYeHwJGRtZ6ep6KioqKioqKioqKioqKioqKioqCgpJubqpSU
+ soiIv4CAx4ODxYODxYWFxIWFxIWFxIyMvpiYs5ycrqSkpqampKWlpaWlpaOjo6CgoZiYqZiYrJSUsYyM
+ uoaGwYGBxYGBxIKCxISEw4mJv4+PuJSUsqCgpqKioqKioaGhoKCgoJ6eopmZp5OTrY6OtYeHv4KCxYKC
+ xYKCxIKCxYKCxYSEw4mJvZKSspycpaCgoaKioaKioqKioqKioqGhoZ2dqJubqpubqpaWr4+Pt4yMvYyM
+ vYyMvYyMvY2NvZOTt5+fqKSko6Ojo6SkpaWlpaWlpaWlpqWlpqWlpqWlpqOjo6OjoqWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOjpKOjo6OjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqamp6amp6amp6WlpaampqWlpqWlpqSkpaOj
+ pKWlpaamp6amp6amp6ampqWlpaWlpaWlpaSkpKOjpKOjpKOjpKWlpaWlpaampqamp6amp6amp6WlpaOj
+ pKOjpKOjoqCgpJycqJycqJqaqJOTsYaGwICAxYCAwX9/wYCAwYCAwYGBwYeHvYuLu4mJvIiIvpSUrp6e
+ oqCgoJaWqouLtoqKt4iIuIiIuYaGuYKCu4CAvoGBvoKCwIeHv4mJwI2Nu5SUspSUspiYrp+fppubqpCQ
+ t4aGwoODxoODxYKCxIaGu4iItoSEvYGBxoKCxoODx4ODx4iIwpOTtZ+fp6OjpJ6ep5GRtYqKvYmJvYmJ
+ u4mJuIiIt4aGtoaGt4eHuoWFvoGBxYGBxYGBxoODxo2NvZ2drqWlpKGhpJ2dp5eXr4+PuIuLvouLvYiI
+ vIGBwX9/wYCAwYODwImJvImJv4uLvYuLwJGRuZ6eq6WlpaWlpZiYspSUtpCQuYuLvYyMvImJuYeHuYWF
+ t4WFuISEv4GBxoODxoODxoKCxoqKvZmZq6Ojn6GhoaGhoaGhoZ6epZiYrJGRs42Nt4aGwIWFwYODwIGB
+ wYGBxIGBxYKCxo+PuJSUs5KSs5eXrKKin6Kiop6ep5ycqZiYrZCQtomJvYmJuYiIuoKCwICAw4KCxIOD
+ xYODxYiIvomJv4uLvZWVsaCgpaOjpKOjpKSkpaWlpaWlpaWlpaOjpCAAhITFhYXGhITHiYnCjY28i4u+
+ i4u+j4+4nJyno6OgoqKioqKioqKioaGhoqKgnp6kk5OwiIi+iIi9hITEg4PGg4PFh4fBjo65k5OzlJSz
+ lJSzmJitnp6lo6OioqKjpaWlpaWlpaWlpqalpaWooKCsmpqzlZW3j4+7jIy9iIjAg4PGg4PGg4PGiYm/
+ lZWzoaGop6elpaWlo6Oko6Oko6OjoqKioaGgn5+gk5OxjIy8hYXCgYHFgoLEgoLFg4PEg4PFiIjAj4+4
+ mJiuo6OgoqKioqKioqKioqKioqKioaGjmpqqkpKwhobAgIDHg4PEhITGhYXFhYXFhITFi4u9lZWympqu
+ oqKopaWlpaWlpaWlpaWlpaWloqKjm5umlJStjIy0hYW+gYHFgoLCgoLCg4PBh4e9jo64lJSym5urn5+m
+ oqKioqKioqKhoKCimZmnk5OvjY23hITBgIDFgoLDg4PEhITFhITFg4PGhobBkZGznZ2loaGhoaGhoaGh
+ oqKioqKioqKioKClmpqpmZmrlZWwjo65ioq/i4u9jIy9jIy9jIy+kJC5mZmuoKCno6Oko6Oko6OkpKSk
+ paWlpaWlpaWmpaWmpaWmpKSlo6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqampqanpqanpqan
+ o6OkoqKioqKjpaWmpqanpqanpqanpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWmpqanpqanpqanpaWlpKSko6Oko6Oko6Oko6OkpaWlpqampqanpqanpqanpaWlpaWlpaWl
+ pKSlo6Oko6Oko6OkpaWlpaWlpqampqanpqanpqanpaWlpKSkoqKjo6OhoKCkl5eskJCxhYXBgYHEgoLC
+ gYHCgIDBf3/Bf3/Bhoa8ioq6iYm8iYm8ioq7lZWunp6joKCfnJyjlparj4+xioq0iIi3hIS8gIC+gYG9
+ gYG9gYHBgYHEgYHGiIi/lJSylJSyk5OzoKClm5uqi4u9g4PHhITEgoLEhoa6h4e2g4O8gIDDgYHDgoLE
+ g4PFiYm/kJC4lZWzm5uso6Oko6Ojn5+nk5O0ioq9i4u8ioq6iYm5hoa3hoa4hIS9gIDDgYHDgoLEgYHE
+ hoa/k5O0oKCppaWlpaWlpaWhmZmrjIy4ioq6iYm6g4PBgYHBgIDAgIDBgIDBgIDCg4PEiYm+jIy+jIy+
+ lZW0o6OmpaWlmJixj4+8jIy+jY29ioq8iIi5h4e5hIS6goK/gYHDgoLEhITFhYXEiYnAjo65mZmto6Og
+ oaGhoaGhn5+kmJiqkJCyjIy2jY21iYm5ioq5g4O+f3/DgYHDgYHDgoLDiYm/j4+4lpavnZ2noqKhoaGh
+ np6mmZmtj4+5iYm/i4u8iYm7goLCgIDCgYHCg4PFg4PFg4PFg4PGgoLHhobCkZG1nZ2oo6Oko6Oko6Ok
+ o6Oko6Oko6Oko6OkIACGhsKGhsKFhcSFhcaFhcaFhcaEhMaQkLqdnaiioqChoaGioqKioqKioqKjo5+a
+ mqmNjbeHh76CgsSCgsSBgcWGhsGOjrmTk7OTk7STk7SYmK2fn6aioqGhoaGioqOioqOkpKSmpqWkpKaf
+ n6uZmbGUlLeQkLuJicGEhMaEhMaDg8WDg8WKir6Li7uUlLKhoaampqWlpaWlpaWkpKSjo6Sjo6OhoaKZ
+ mamMjLiDg8OBgcaCgsWCgsWDg8SDg8WHh7+Pj7aUlLKYmK6jo6GioqKioqKioqKioqKjo6GhoaOUlLKG
+ hsKBgcaCgsWCgsWDg8WEhMaEhMeNjb2RkbeRkbaZma2jo6SlpaWlpaWlpaWlpaWlpaWlpaWdnaqOjraI
+ iLuJibmJibqJibqJibqIiLqLi7aRkbCZmaqfn6WioqKioqKioqKjo6KhoaOamqmOjreFhcKCgsWCgsOC
+ gsODg8SEhMWEhMWDg8aKiryZmauioqChoaGhoaGhoaGhoaGhoaKgoKWamquamquVlbCOjrmLi76Njb6N
+ jb6Njb6MjL2MjL2MjL2SkrWgoKejo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaalpaalpaakpKWjo6Sjo6Sl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWmpqampqempqempqempqejo6Sjo6Slpaampqempqempqempqelpaal
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSkpKSlpaampqempqempqelpaalpaWl
+ paWlpaWjo6Sjo6SkpKSmpqampqempqempqelpaWlpaWlpaWkpKWjo6Sjo6Sjo6SkpKWlpaWlpaampqem
+ pqempqelpaakpKSkpKKfn6WQkLSEhMKCgsOCgsSCgsSBgcOBgcKAgMGEhLmIiLmKir2MjL6MjL2MjL2U
+ lLObm6ugoKOgoKCZmaiMjLiIiLmHh7mHh7mFhbqAgL9/f8GAgMGAgMOFhb+OjreTk7OSkrSVlbCdnaeZ
+ mayPj7iKir6Li72KiruKirmEhL+AgMKAgMGBgcOCgsSIiL2Li7yLi72MjL2QkLidnaqioqSlpaKbm6qN
+ jbaJibuJibuIiLmGhreCgrx/f8KAgMKAgMKAgMSGhr6SkrGcnKeenqegoKmlpaWioqiZma6SkrKQkLKO
+ jrGJibiHh7aCgr1/f8KAgMGBgcKDg8SIiL2Li7yOjryXl7Ojo6alpaWYmLKPj7uNjb6Ojr2Ojr2KiruG
+ hryAgMB/f8GAgMGBgcKDg8OKir6Li76Pj7ubm66lpaOioqKhoaGgoKOUlLCMjLmNjbaMjLWKiriDg8GA
+ gMKAgMKBgcOBgcKCgsOBgcSHh8CPj7mWlrCcnKihoaGfn6SYmKyQkLiLi76Li76EhMSBgcN/f8GAgMGB
+ gcOCgsSDg8WEhMWDg8aHh8GTk7OgoKaioqKjo6Sjo6Sjo6Sjo6Sjo6Sjo6QgAIeHw4WFxIWFxoWFxoWF
+ xoWFxomJwpWVs6Cgp6SkoqKioaGhoaKioqOjoqCgo5SUsIiIv4ODxYKCxISExYSExYSExIWFwoaGwoeH
+ wouLvZaWr6CgpaOjoqKio6GhoaKio6Kio6Wlo6KiqZmZsZOTt5CQu4qKwoaGx4SEx4ODxoKCxYiIvo2N
+ uYuLu5OTs6GhpqSkpKWlpaWlpaWlpaSkpKKio52dqZSUsoWFwoKCxoODxYODxYODxYODxYKCx4eHv4+P
+ tZaWrpycqaKioqKioqKioqKioqKioqGho5ubqo+PuYeHwYODxIKCxYKCxYKCxYODxYODx4iIwZCQuJiY
+ r52dqKKio6OjpKSkpaWlpaampKWlpZ+fq5iYs5OTtI2Nt4mJuomJuYmJuYmJuYuLto+Ps5OTr5iYqZ6e
+ pKKioqKioqKioqKioqGhopycp5KSsYWFwYKCxYODxIODxIODxISExYSExYODxYuLupmZqaKioKGhoaGh
+ oaGhoaKioJ+fo5mZqZmZrJqaq5eXr4uLvISExoeHxIaGxYaGxoqKwIyMvZCQt5ubraKipKOjpKOjpKOj
+ pKOjpKOjpKWlpaWlpaWlpaWlpqWlpqWlpqWlpqOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaampqam
+ p6amp6amp6amp6SkpaSkpKampqamp6amp6amp6amp6WlpqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaSkpKOjpKWlpaamp6amp6amp6ampqWlpaWlpaWlpaOjpKOjpKOjpKSkpaamp6amp6am
+ p6WlpqWlpaWlpaWlpaOjpKOjpKOjpKSkpaWlpaWlpaamp6amp6amp6ampqWlpKCgppKSsoaGwoGBxYGB
+ xYGBxYCAxYCAwoaGu4aGtoODvoSExIaGxYaGxYaGxYiIw5KSt5+fpqGhoZeXqpCQs5GRsouLtoWFu4KC
+ v4CAwH9/wX9/woSEvIiIuoqKu4qKu42NupeXrp6eppqaq5WVspWVsJWVsY2Nu4aGwoKCxIGBwoCAwoGB
+ w4eHvIyMu4mJvoeHwYaGwomJwJaWsKKipaSkpJycq5OTso6OtImJuomJuIKCvX9/wX9/wYCAwoCAw4SE
+ vZCQspeXrJiYrZiYrZmZrqSkpaCgqZ6eq5mZr5GRs4+PsIuLt4ODvYCAwYCAwYGBwYGBwoODxImJvYmJ
+ u42NuZqar6ampKWlpZ2drZaWtJWVtpSUuI6OvYmJwIODwn9/wX9/wYCAwoKCxISExYWFxYmJw5SUtqCg
+ qKamo6SkpaKioqKioZubqJOTsI+PtIqKuYODv4GBwoCAwoCAwYGBwYGBwoKCxYeHvomJu4qKvI6OuZaW
+ sKKioqGhoZ2dpZSUsYmJvoSExIKCxIGBw4CAwn9/wYCAwYGBwoKCxIKCxoiIwIqKvZCQt52dqaGhpKKi
+ oqOjo6OjpKOjpKOjpKOjpCAAhobEhYXGhYXGhITGhYXGi4vBlpa0oKCpo6Oko6Ojo6OioqKhoaGhoaGj
+ l5euioq+g4PGg4PGgoLEhITFhITFhITGg4PGhITFiYm/k5OynJyooaGjoqKjoqKjoqKioaGhoaGipKSi
+ oqKmmpqxj4+8iorChobGhYXHhITHhYXEioq9jo64jIy7kJC0m5upo6OioqKjpKSkpaWlpqalpKSmn5+p
+ mJiwjY27ioq9hYXCgoLFg4PFg4PFgoLGh4e/iIi9jY24mJisoqKhoqKioqKioqKioqKioqKinJyokJC2
+ iIi/hITEgYHEgYHEgoLFgoLFgoLFgYHHi4u/mJixoKCooqKjoqKjoqKjo6OkpaWkpKSmnZ2tl5ezl5e1
+ kpK5jIy6iYm6iYm5iYm5jIy2jo60jo61j4+zlpaqn5+goqKioqKio6OhoqKinZ2nl5eulJSxh4fAgYHF
+ goLDgoLDg4PEhITEhYXEi4u7lZWvnZ2loqKgoaGhoaGhoaGhoaGhnZ2kmJirmZmql5esi4u6hITEgoLG
+ g4PFhYXGhITHi4vAk5O2m5usoqKlo6Oko6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWmpaWm
+ pKSmo6Oko6OkpaWkpaWlpaWlpaWlpaWlo6OkpKSlpqanpqanpqanpqanpaWmpaWlpaWlpaWmpqanpqan
+ pqanpqanpqampaWlpaWlpaWlpaWlpKSkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6OkpaWmpqanpqan
+ pqanpqampaWlpaWlpKSlo6Oko6Oko6OkpKSlpqanpqanpqampqalpaWlpaWlpKSlo6Oko6Oko6OkpKSk
+ paWlpaWmpqanpqanpqanpqaloqKmmpqrkZG0iIi9hYW/hoa+hoa+h4e9iYm5g4O8gYHBg4PEhITGhITG
+ hobFiIjDlZW0oaGmo6OinZ2nlZWsjo61iIi8g4PBgYHCgYHCf3/Cg4O8h4e5iYm7iYm8ioq6i4u6j4+2
+ mpqrnZ2mnZ2mnJyok5OzhobCg4PHgoLGgIDEgYHBhoa7ioq5iIi+hobBhYXChobCioq+k5O2oaGmoqKl
+ n5+onZ2pl5euiYm6hIS/gIDCf3/Cf3/CgIDBhYW8i4u4kpKylpaul5eulpavmpqqoqKjpKSmpqalnp6s
+ kZG3jY25hYW/gYHBgIDBgIDBgoLDg4PEhYXGi4u+jIy8jIy8kpK0n5+oo6OmpKSmm5uvlJS3kJC7iorB
+ hYXFgYHEf3/Cf3/BgIDBgoLCg4PFgoLKjY2/mpqwnp6qoKCppKSlo6Oko6OioqKgmpqojo64hITDgYHE
+ gYHDgIDBgIDBgIDBgYHCh4e9ioq6ioq8jY26kZG1lZWxo6Oho6Ogn5+jk5Owhoa/gIDGgoLEgYHDgIDC
+ f3/Bf3/BgYHDgoLFiYnAjIy8i4u9jo66mJiuo6OjoqKioqKjo6Oko6Oko6Oko6OkIACFhcWFhcWEhMaF
+ hcWLi7+WlrSfn6qkpKWlpaWjo6Wjo6Sjo6OioqGcnKiRkbSKir2GhsKBgcSCgsSCgsWDg8WEhMWFhcWK
+ ir6WlrCenqWioqKioqKioqOioqOioqOhoaKioqKioqOenqiVlbSIiMKFhceEhMiEhMeDg8WDg8KGhr+H
+ h8CMjLuZmauhoaGioqGioqKioqOkpKWlpaWkpKacnK6RkbmMjL2Kir+FhcODg8WDg8WEhMSHh7+JibyM
+ jLmRkbOamqiiop+hoaGioqKioqKjo6GgoKWVlbGIiL+Dg8OCgsWBgcSBgcSBgcWCgsWCgsaFhcKNjbqb
+ m6ykpKOjo6Sjo6SioqOioqOkpKOjo6ebm7CVlbaSkrmOjr6Kir6IiLuJibmMjLeOjrSNjbWOjrSTk66Z
+ maWfn5+goKCioqGhoaOcnKiWlq6SkrOQkLeGhsKCgsWDg8SDg8SEhMSGhsKIiL+UlLGenqWhoaKhoaGh
+ oaGhoaGhoaGgoKGcnKWYmKqWlqyLi7mDg8OCgsWDg8SCgsSEhMWEhMeOjr6dna+lpaWlpaSjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaakpKWjo6Sjo6SkpKSlpaWlpaWlpaWkpKSk
+ pKSlpaWmpqampqempqempqempqempqalpaWlpaampqempqempqempqempqalpaWlpaWlpaWkpKSjo6Sk
+ pKSlpaWlpaWlpaWlpaWlpaWlpaWkpKSlpaWlpaampqempqempqempqalpaWlpaWlpaWjo6SioqOjo6Sk
+ pKampqempqempqempqalpaWlpaWioqOioqOioqSjo6SkpKSlpaWlpaampqempqempqelpaahoaWfn6aR
+ kbOMjLaOjrONjbSJibmEhL6BgcGBgcOCgsWDg8WGhsOLi7+QkLmYmLGgoKmjo6ShoaWVla6Hh72CgsSB
+ gcWAgMWBgcKEhL2FhbeHh7mKirqJibyGhr+Ghr+FhcGRkbWdnaehoaOamquNjbyHh8CGhsCGhr6Fhb6F
+ hbuHh7eHh72FhcCFhcKHh8GLi72RkbeVlbOfn6ijo6ShoaWenqmXl7CLi7yBgcSAgMV/f8OAgMCEhLqK
+ iraMjLqMjLmOjriTk7Kbm6igoKOioqGjo6Knp6OgoKuQkLqHh8OCgsWBgcOAgMGAgMGBgcOCgsSEhMaI
+ iMSJicOGhsSJib+VlbGhoaampqOdna2QkLuJicKHh8KFhcOFhb2BgcB+fsGAgMGBgcOCgseMjL6UlLaZ
+ mbGYmLKamrCmpqSkpKWjo6WkpKCcnKaMjLuBgciDg8SCgsOCgsKAgMKAgMGFhbyKirmLi7uLi72NjbqO
+ jriQkLaenqiioqKhoaKZmaqOjraEhMGCgsSBgcOAgMJ/f8F/f8KBgcKGhr+Li7yMjL2MjL2Li76QkLef
+ n6WioqKioqKioqKioqSjo6Sjo6QgAISExYSExYWFxIqKv5OTtpubraGhp6SkpaWlpaWlpaSkpKOjpKGh
+ pZWVsI6Ot4uLvIeHwIGBxYKCxIKCxIKCxYSExImJv5KStZubp6GhoaKioaKio6Kio6Kio6Kio6Kio6Ki
+ oZ2dppOTsomJv4SExoSExoeHw4SEw4GBxIGBxIGBxoKCxZCQtZ+fpKOjn6GhoaKioqKio6KipKSkpKSk
+ ppubsY2Nv4mJwIWFxYSExoSExYODxYSExImJv42NuZKSspmZqZ+fo6GhoaGhoaKioqKioqOjoJ6ep4+P
+ t4ODxIODxYKCxYGBxIGBw4GBxIKCxYWFw4uLuY+PtZqaq6WloqOjpKOjpKKio6KioqCgpZycqpiYspKS
+ uIyMvYyMv4uLvYiIu4mJuYyMtoyMt4qKuI6OtJeXqJ6enp+fn5+fn6Cgn5+fo5mZq5KSs46OuYmJwIWF
+ xISExYWFxYWFxYaGw4qKvouLvJWVr5+fo6Kin6GhoaGhoaGhoaGhoaCgopubppWVrYuLuYKCxYGBxYKC
+ xIKCxIGBxIKCxYGBx46OvKCgqqioo6WlpaSkpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWl
+ paWlpaWlpaWlpaSkpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaSkpKSkpKampqamp6amp6amp6amp6WlpqWl
+ paampqamp6amp6amp6amp6WlpqWlpaWlpaWlpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paampqamp6amp6amp6WlpqWlpaWlpaSkpKKio6Kio6Kio6Skpaamp6amp6amp6WlpqSkpKKioqKioqKi
+ pKKipKOjpKSkpaWlpaampqampqamp6ampqSkpKamopubrJSUr5KSsIyMtoSEvYCAwoGBwoGBw4ODxYWF
+ womJvouLvZCQuZGRuJeXsqGhqKOjpZeXr4mJvYSEwYSEwYWFwoWFwIiIuIWFuIeHt4iIuoSEwIKCxYKC
+ xIODw4iIvZeXrZ2dp5OTs4mJv4uLuouLuYuLuImJuIeHuISEuoSEwIWFwYeHwIqKvpCQuJeXr5qaq52d
+ qaKipKGhppiYrpCQuIyMvYeHwoSEwYODwISEu4mJs4uLtomJuomJvIiIvo6Ot5qaqZ6epqCgpaGhoqWl
+ op+fq4+PvIODyIWFxoSExYKCw4GBwYGBwYGBw4ODxYSEx4SEx4SEx4uLv5eXr6KipKSko56eqZCQuIiI
+ woqKv4mJvoeHvIKCv39/wX5+woCAwoiIvZGRt5KSt5CQupCQupiYs6ampKSkpaSkpaWlo56ep4+PtoWF
+ xIODxYODxYKCxYCAwoODu4eHt4iIuYqKu4uLvIuLvYmJvouLu5iYraGho6OjoqCgpJaWrYiIvYKCxoGB
+ xYCAwn9/wn9/wYSEvIqKuIuLu4yMvYyMvoyMvpGRuJycqaKioqKioaKioqKioqOjo6OjpCAAh4fDhobE
+ i4u/kZG4lpa0mpqwoaGnpaWlpaWlpaWlpaWko6Okn5+pkJC3ioq+hYXDgYHHgoLFgoLEgoLDgoLDiIi9
+ kJC1l5eunJynoaGioqKioqKioqKioqKjoqKjoqKjoqKkl5eviYm9hITEhobBhobBioq+hYXBgYHFgoLE
+ hYXBjIy2mJiqoKCioqKgoaGhoaGhoqKioqKjpKSioaGnlpa1iYnChITHhITGhITFhITFhITGhITHg4PH
+ kJC4mJisoKCioqKfoaGhoaGhoaGhoqKipKSgnZ2ojY26goLGg4PFgoLFgYHEgYHDgYHDhITBi4u5kZGy
+ lJSvnJynpKSho6Oko6Oko6OkpKSin5+mlpawjo64i4u8i4u9i4u9ioq8iIi6iIi5iYm4iYm5ioq5jo6z
+ l5eooKCdn5+fn5+fn5+dnZ2hmZmpkZG0iYm/hITFhYXEhYXEhYXEhobDiIjBioq+jIy8l5euoKCioqKg
+ oaGhoaGhoaGhoqKgnZ2llJSwi4u6gYHFgYHDgYHDgYHDgYHDgYHDgYHEg4PEjY27nZ2rpqajpaWlpaWl
+ o6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6OkpaWlpaWl
+ paWlpaWlpKSlo6OkpKSlpqanpqanpqanpqanpqanpaWlpaWlpqampqanpqanpqanpqanpaWlpaWlpaWl
+ pKSlo6Oko6OkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpaWlpaWlpaWlpKSk
+ o6OioqKioqKipKSlpqanpqanpqano6Olo6Ojo6Ojo6Ojo6Ojo6Oko6OkpaWlpKSlpKSlpKSlpKSlo6Ok
+ o6OkoKCplpavjY24hYXAgIDDgIDBgYHCgoLDhYXBiIi+iYm+hobBhobDhITGjY29nZ2tpaWkn5+nkZG1
+ i4u6ioq6ioq6ioq7iIi6hoa4hYW3gYG+gIDEgoLDhITCiYm8h4e+kJC0mJitlJSyj4+5jo65j4+4jIy6
+ h4e7hIS8gYG+g4O9g4PAh4e+iIi/jIy8l5evnp6nn5+moqKkoqKkmZmujIy9jIy9jY28i4u6ioq4iYm1
+ iIi0iIi5iYm7ioq7iYm8jIy5kZG1kpK0mpqqoaGjpKSgnJyrjY29hITHhYXGhITFhITFgoLCgYHBgYHD
+ g4PFhITGhITHiIjDk5O3np6roaGloqKjoaGkl5evjY27ioq9iYm+g4PEgYHEgIDDgIDBhIS5j4+xioq7
+ ioq/iorAjo69mZmypqakpaWlpKSlpaWloqKlmZmrjY24hobChITDhITDhYW9h4e2hoa3h4e4iYm5i4u7
+ i4u9ioq+jIy7mJiuoKCloqKin5+llpavi4u7hobBg4PCg4PBgoLAhIS8h4e2h4e8iIi9iIi/i4u9kZG3
+ mZmvnZ2qoKCloqKjoqKioqKioqKio6OkIACNjb6Njb6Pj7yQkLqSkreZma+jo6akpKWlpaWlpaWlpaWk
+ pKWenqqSkraHh8KDg8aEhMSEhMSEhMOEhMSJib2QkLSVla6bm6ihoaKioqKioqKioqKioqKioqKioqOj
+ o6KdnamQkLiKir+Li7yKiryKiruEhMKBgcWCgsSEhMGKireXl6ienp+hoZ+hoaGhoaGhoaGhoaGioqKj
+ o6Gbm6uNjb2EhMeFhcaFhceDg8aDg8WEhMaEhMaGhsSPj7uamqyhoaKhoaChoaGhoaGhoaGhoaGjo6Cc
+ nKiMjLqCgsaDg8WDg8WCgsWCgsSFhcGLi7iQkLGSkq+amqmgoKKioqGioqKjo6Sjo6SkpKSfn6iUlLOL
+ i76Li72Kir2Kir2KiryJibmJibmJibiIiLmOjrOWlqmdnaKgoJ6fn5+fn5+fn5+amqSUlK2QkLWLi7yG
+ hsKFhcOFhcSFhcSFhcSFhcSFhcSQkLeenqejo6ChoaGhoaGhoaGhoaGioqCamqqMjLuCgsWDg8SDg8SD
+ g8WDg8WDg8WDg8WEhMSMjL2SkrednaqlpaOlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sk
+ pKSlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6SlpaWlpaWlpaWlpaWlpaWjo6SlpaWmpqampqempqem
+ pqempqelpaWlpaWmpqampqempqempqempqelpaalpaWlpaWlpaWjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWjo6SkpKWlpaWlpaWlpaWjo6Sjo6Sjo6SlpaampqempqempqelpaWl
+ paWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SdnaqSkriHh8OCgsWBgcOAgMF/f8CDg8CI
+ iL2Hh7+CgseDg8WDg8WDg8eMjL6bm66mpqSkpKWWlrKNjbyJib2JibyJibuIiLqIiLiCgr+AgMOBgcOD
+ g8KJib2Jib2Li7qPj7SXl6qdnaeVlbGSkrSTk7SPj7eHh72Dg7+CgryCgr2BgcCBgcKCgsSGhsSNjb2Y
+ mK2hoaSioqKkpKKfn6iRkbeMjL2MjL2KiryLi7mKiraGhreHh7mJibqJibuKiryKiryJibyNjbqZmaqh
+ oaOkpKGbm6qNjbuEhMeFhcaFhcaFhcaDg8SBgcKBgcKBgcODg8WDg8eHh8SNjbyTk7abm6+hoaWjo6Kf
+ n6aVlbCJib+EhMaDg8WCgsWBgcSGhrmMjK2Hh7mJibqKiruKir6OjruYmLGmpqSlpaWlpaWkpKWlpaWj
+ o6WZmauMjLmKirqJibiHh7eGhreGhreHh7iJibqKirqKiruLi72MjLyUlLKbm6uioqOgoKSZmauUlLCS
+ kq6Li7aJibiJibiIiLeFhbmBgcGBgcSBgcaLi7yYmK6dnaqenqqdnauioqejo6OioqKjo6Sjo6QgAIWF
+ xoWFx4SEyImJwpaWs6Cgp6SkpaSkpaSkpaWlpaSkpqCgqpmZsZGRt42NvIuLvYuLvYyMvYyMvYyMvpKS
+ t5WVspSUspeXrqGhoaKioqKioqKioqKioqKioqKiop6eppqarJKStouLvYuLvYmJvYSExIODxYKCxoaG
+ wYqKu4uLupiYqp6eoJ+fnqCgoKGhoaGhoaGhoaKioJ2dppWVsY2Nu4iIwYmJwIWFxYODxoODxYODxoeH
+ w5GRuZiYsp2dq6GhpKKioaGhoaGhoaGhoaKioJ+fo5OTsIeHv4SExIKCxIKCxIGBxYWFwI2Nt5GRsZCQ
+ sZWVqp6eo6KioKGhoaGhoaKioqSko5+fqZaWso6OuYqKvouLvYuLvYqKvIqKu4qKu4qKu4mJuYiIuI2N
+ spmZpaGhnZ+fn5+fn5+fnpubpZOTro+PsY+Ps4yMu4yMvIyMvIeHwoSExYSExYaGw5GRtpiYraCgpaOj
+ oaKioqGhoaGhoaKioJycppWVr5CQtomJvYODw4GBxIKCxYODxYODxoWFxY2NvZSUtpqasKKiqKWlpKOj
+ pKWlpaWlpaWlpaSkpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaOj
+ pKOjpKSkpaWlpaWlpaWlpaWlpaOjpKSkpKampqamp6amp6amp6amp6WlpqWlpaWlpqamp6amp6amp6am
+ p6WlpqWlpaWlpaWlpaWlpaOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKSk
+ paWlpaWlpaWlpaOjpKOjpKOjpKSkpaamp6amp6amp6WlpqWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpJiYsIqKwIODx4SExoODxYGBxIWFuISEvIGBw4GBxYKCxYKCxYKCxoeHwpKStJ+fp6WlpKSk
+ pZiYso+PvIyMvYuLu4qKuYmJuYKCwICAwYCAwoODwIiIvYmJvYiIvY+PtpaWrZ2dpJ+foZiYq5KSs5KS
+ tJOTs46OtoeHuYWFuICAwIGBwYGBw4ODxYSExoWFw5GRtaCgpaOjoqOjop+fp5SUs46Ouo6Ouo6OuYyM
+ uomJu4aGuIaGt4mJuYaGwoSExoSExoWFxIyMu5iYr5+fpqOjoJ2dqI2NuoODxoSExYSExYSExYKCxICA
+ woCAwYGBwoGBxIKCxYKCxoODyIaGxY+Pu52drKKipKSkoZ6ep4+PuISExYSExYKCx4mJuYuLr4SEuIaG
+ uIiIuYiIu42NtpKStJeXsqWlpKWlpaWlpaampaOjpp2dq5aWso+PuY2Nt4uLuYiIuoaGt4WFtoaGt4iI
+ uYqKuouLu4uLvIuLvI2NuZqarKGhpKOjoqGhoaCgoJ+fn5mZpY2NtIiIuoaGvICAwoGBwYGBw4mJv4yM
+ vpCQuZmZsJiYsZeXsqGhqKWlpKSkpaOjpKOjpCAAhITFhYXHhITIjIy/m5uupaWko6OkpKSlpKSlpaWk
+ oqKnmZmxkpK5kZG6jo68i4u9i4u8i4u9jIy+kpK3lZWzlJS0lZWynJypoqKioaGhoqKioqKioqKioqKi
+ oqKinp6mm5uplpawj4+4iYnAhITEg4PFg4PGiIjBi4u8ioq9ioq7l5eroKCioKCfn5+foKCgoaGhoaGh
+ nZ2llZWvjY26ioq/iYm/hITEg4PFgoLFgYHGhobCkZG4mJiynp6roqKno6Olo6OjoqKioaGhoaGhnp6k
+ k5OviYm9g4PDgoLDgoLDgYHEhoa+iYm7iYm8ioq6iYm9k5OunJyhoaGfoaGhoaGhoaGho6OhmJiujo67
+ i4u+i4u+i4u9i4u9ioq8ioq7ioq7ioq7i4u5jo6yk5Oqmpqhnp6dn5+fn5+fnZ2hlpapkZGwkJCykpKy
+ lJS2j4+7iIjChYXFhITHhobDkJC2l5eunp6moqKioqKioqKioqKioaGhnp6ll5etk5OxkJC0ioq9g4PF
+ goLFhITGhYXIh4fFjo69lJS2mpqwoqKopaWlpaWlpaWlo6OkpaWlpaWlpaWlpKSlo6Oko6OkoqKioqKi
+ o6Ojo6Oko6Oko6OkpaWlpqanpqanpqanpqampaWlpaWlo6Oko6Oko6OkpKSkpaWlpaWlpaWlo6OkpKSk
+ pqampqanpqanpqanpqanpaWmpaWlpaWlpqanpqanpqanpqanpqanpqanpqanpqanpaWmpKSko6OkpKSk
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpKSko6Oko6Oko6Oko6Ok
+ paWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6Oko6Oilpavh4fBgoLIg4PGg4PFiIi7hIS9
+ gIDBgIDDgYHDgoLEgoLFhobAk5OxnJynnp6moKCopKSlnJytm5uvnJytlZWyiIi+g4PCgIDCf3/DgoK/
+ hoa8iIi9ioq+kJC1k5OzlJSxmJirm5ummZmomZmplZWvjo63ioq6iIi6gIC/gIDAgIDCg4PEg4PHh4fD
+ k5O2m5uunp6onp6noaGkoKClmZmtmZmukpK0jY25i4u9ioq8h4e4hoa2goLAg4PEhITHh4fEjIy+jY2+
+ kpK2nZ2npKSfnp6nkpK1i4u9i4u+hYXDg4PGg4PFgoLDgYHCf3/CgIDDgIDEgoLGhITGhobGiorBl5ez
+ oqKnpKSjn5+ml5eukJC2kJC2kJC1jIy2h4e3hoa3hoa3iYm4ioq6ioq6i4u6j4+4mpqvnp6rpKSmpqak
+ pKSlm5utkJC6kJC6jIy7ioq7ioq6iIi4hoa3hoa3iIi5ioq7i4u8i4u8jY25kpK0mZmtoKClo6OioqKi
+ oaGhnZ2jl5epjo61hYW+gYHBgYHBgIDCh4e8jIy7jY29jo6+j4+8kZG6lZW1oaGppqakpaWmpqanpqan
+ IACEhMWDg8aLi7+Xl7OgoKqlpaWkpKWjo6SkpKSlpaSenquSkriRkbmPj7uNjb6MjL2KiryMjLuRkbaU
+ lLWTk7WWlrGdnaqioqSioqOioqKhoaGhoaGioqKioqKjo6GdnaeXl6yRkbaNjbuKir+CgseDg8WCgsaI
+ iL+Li7yLi7yQkLWdnaShoaGhoaCfn5+fn5+goKCgoKKVla6MjLqJib+IiMCEhMSDg8WDg8WBgceFhcKO
+ jraWlq6Xl7CgoKqkpKakpKWkpKSjo6KioqGjo5+ZmamLi7qDg8SDg8SDg8SDg8SDg8SEhMKHh72IiLyI
+ iL6RkbGamqaenqCgoJ+goKChoaGhoaGiop+Wlq2NjbuKir+Li76KiryMjL2Li7yLi7yLi7yLi7yMjLmS
+ krGamqSenp2dnZ2fn56fn6CYmKmUlK2UlK2Tk66RkbOPj7qJicGGhsSCgsiHh8OSkreZma6enqehoaOi
+ oqKioqKioqKioqKioqKWlq6Tk7GTk7CNjbeEhMWCgsaCgsSEhMaFhciFhceKisGWlrSioqilpaWlpaWl
+ paWlpaWkpKWjo6SkpKWlpaWlpaWkpKWkpKSkpKSkpKSjo6Sjo6Sjo6Sjo6SkpKSmpqampqempqempqem
+ pqalpaWioqKioqOjo6Sjo6SkpKSkpKSkpKSjo6Sjo6SlpaWmpqampqempqempqelpaalpaWlpaWlpaam
+ pqempqempqempqempqampqempqempqalpaWjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sj
+ o6SioqOioqOkpKWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sj
+ o6Sjo6Sjo6SkpKOamquMjLuHh8OJicCJib+Hh8CCgsOAgMOAgMKAgMKBgcODg8SMjLuSkrOTk7KUlLGZ
+ mayjo6Sjo6agoKmYmLKPj7uKir+Hh8CEhL6EhL6FhbuHh7qLi7qSkraPj7qPj7qOjruRkbaWlqyYmKmU
+ lK6Pj7WLi7mIiL2Dg8GAgMKAgMGBgcKCgsaFhcWOjryYmLKYmLGXl7GVlbKcnKmioqOenqefn6aUlLKM
+ jLyJib6KirqIiLmDg76BgcKDg8WDg8eIiMOPj72Njb6NjbyZma2ioqKgoKSYmKyTk7ONjbuGhsODg8aD
+ g8WBgcSAgMN+fsF/f8KBgcSDg8WDg8WEhMWGhsSSkrihoamlpaOfn6aXl62Tk7OTk7GOjrWJibmGhrmG
+ hraGhraDg7+EhMKEhMKFhcOGhsOKir+VlbOhoaempqSmpqSfn6qRkbqNjb2Li76Li72KiruIiLiGhreG
+ hreIiLiKiryMjLyPj7iUlLSVlbKamquhoaSjo6KhoaSenqeYmKyPj7OGhr2CgsOAgMSAgMKEhLqKiriI
+ iL+Hh8SIiMWHh8WJicOUlLiioqqnp6WmpqampqempqcgAIWFw4uLvJaWsJ+fqaSkpqWlpaWlpaSkpKWl
+ o6KippmZsJCQuo+Pu42NvY2NvoyMvYmJvIqKu46OuJGRtpaWsZycq6GhpqSkpKOjpKKio6GhoqGhoaKi
+ oaKiop6eppeXrpCQt4yMu4mJvoaGwoODxYODxYGBx4aGwYyMu5CQt5eXraGhoqKioaGhoaGhoaCgn56e
+ n5mZpo2NuIiIwImJv4iIwIGBx4ODxYODxoWFxY6OuZaWrZiYrJqaqaGhpaSkpaSkpaSkpaSkpaOjo5+f
+ o5OTsYaGwYGBxoODxIODxIODxYODxYGBx4ODw4qKuZGRsJubpqCgoaCgoJ+fn5+fn6CgoKKioZ+fo5GR
+ soqKvIqKvIqKvImJu4yMu42NvI2NvIyMvYyMvJGRtZaWrp+fo6Cgnp2dnZ2dnZ2doZaWqpaWqpWVrJOT
+ ro6OtISEw4SEx4ODx4mJwZOTtpmZr5ubraGhpqKioqKioqKioqKioqKioqKiopeXrJKSsZKSso6Ot4aG
+ wYiIv4ODw4KCxYSExoSEx4eHxZaWtKSkpqampKWlpaWlpaWlpaWlpaSkpKSkpKSkpKSkpKWlpaampqam
+ pqampqWlpaOjpKOjpKOjpKOjpKSkpKWlpaamp6amp6amp6ampqOjo6Kio6OjpKOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKSkpKampqWlpqWlpqWlpaWlpaWlpaWlpaWlpqWlpqWlpqSkpaSkpKampqamp6amp6amp6Wl
+ paOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKKio6Kio6Kio6SkpaSkpaSkpaOjpKKio6Oj
+ pKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaSkpaOjpaOjpaOjpaOjpaOjpKKipJeXsI2Nu4uLvYiIwYSE
+ xYKCxYCAw39/wn9/w4GBwoiIvIeHvoeHwYaGw4qKvZaWr6KioqWlop+fqZOTto6OvZGRuJCQt4mJu4eH
+ uYSEu4KCv4aGv4qKvYyMvY2NvY2Nvo6Ou5WVsJycpZWVrIuLuYaGv4WFwoKCxIGBw4CAwX9/woODwYmJ
+ vYyMu5CQuZSUtZSUtZaWs52dqKOjoaGho56ep5WVspCQuI2NuomJu4SEv4CAwoCAwYCAw4SEwomJv42N
+ vo2NvouLv5OTt56eqaOjoZ6eppKSs4iIwISExYSExYODxYGBxX9/w35+woCAwoKCw4ODxYODxYODxYOD
+ xpCQuaCgqaamo6Kip5iYr5GRtZKStIuLuoeHvIeHt4aGt4KCvICAwoCAxYKCxoODxoODxoiIwZKStaGh
+ qKampKampKOjqJeXs5GRupCQuoyMvImJvIiIuIeHuIaGt4eHuIuLuo2Nu46OupGRuJGRuJeXsJ2dqKKi
+ o6GhpJqaq5CQt4eHwYKCxICAxIKCwYWFu4eHtYWFvISExISEx4SEx4SEyYWFyI+PvZ6eraampqamp6am
+ p6ampyAAhobCjo64mZmsoaGlpaWkpaWlpaWlpaWlpaWjnZ2rkpK2j4+7jIy9jIy9jIy9i4u7iYm6iYm7
+ jIy5kpKym5uqn5+ooKCno6Oko6OkoqKjoqKioaGhoqKgoKCjlpavkJC3jIy7iYm9hITCgYHHgoLFgoLF
+ g4PEiYm+kZG2mZmsn5+loqKioaGhoaGhoaGhoaGgnp6hlZWpioq7iYm+iYm/hYXDg4PGhITHh4fEjo69
+ lZWzmZmtmpqqoKCjoqKho6OjpKSlpKSlpKSloaGmmpqrkJC3iIi/hITDg4PEg4PEg4PFg4PGg4PEh4e/
+ kZGznJyknJyjn5+hoKCgoKCgn5+fn5+fn5+imJiokJC0i4u7ioq7ioq7ioq6h4e9iIjAiYnBiYnBjo66
+ mZmtnJymoKCioaGgn5+fnZ2em5uglpamlZWqk5OvkJCyi4u3hYXBh4fBh4fDjo68lpazmJiwmpquoqKn
+ oqKjoqKioqKioqKioqKio6OhnZ2olJSxj4+2jIy6iYm+iYm+hITDgoLEhITEhobFjIzAmpqxpKSmpqak
+ paWlpaWlpaWlpaWlpaWlpKSko6Oko6OkpaWmpqanpqanpqanpqanpaWlpKSko6Oko6Oko6OkpKSlpqal
+ pqampqanpqanpKSlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpKSlo6OkpKSkpqampqanpqanpqanpqalpKSko6OkpKSlpKSlpKSlpaWlpaWlpaWl
+ paWlpKSkpKSko6OkoqKjoqKjoqKjoqKjoqKioqKio6Ojo6Oko6Oko6Oko6OlpKSlpaWlpaWlpaWlpaWl
+ pKSlpKSlpKSlpKSlo6OkpaWhnJysjo67hobDhITFg4PFgoLEgYHDf3/CgIDAhIS9h4e8goLEgYHGgYHI
+ hobClZWwoqKio6OhoKCnnJyrl5ewkpK1j4+3i4u6h4e7gYG/f3/DgIDDgoLCh4e/iYnAiYnBiorAkpK2
+ np6mnp6kk5OviIi9goLEgYHEgIDEgIDCgYG/hoa5ioq4i4u7jo65lZWzlpazmJiwnZ2poqKjoaGkmpqs
+ lJSzkZG2jY27hobCgYHFgYHCf3/BgYG/h4e6i4u4i4u8jY28j4+7lJS3np6rpaWhoKClj4+3hITFg4PH
+ g4PGgoLFf3/Df3/CgIDCgYHCgoLDg4PFg4PGg4PGhYXDjo65n5+ppqaio6OmnZ2rlpaxl5exkJC2ioq4
+ hoa5g4O8fn7CgYHCgYHDg4PEhobDiYnAjY28kJC3nZ2qpKSkpaWlpKSmn5+qnJyumpqwkpK1i4u5iIi5
+ h4e4hoa4h4e3i4u3jY26i4u/iYnBiYnBi4u+lJSznp6no6OinZ2okpK1h4fDhobChYXAhYW8iIi3g4O7
+ gIDCgoLFhITGhYXHhYXHhYXHiIjElJS3oqKpp6elpqanpqanIACFhcSKir2Xl62hoaKjo6Kjo6WlpaWl
+ paWlpaWbm66OjrmMjL+MjL2Li72Li72KiryKirqNjbiUlK+Zmamdnaafn6ehoaajo6Sjo6Sjo6SioqOi
+ oqKioqGdnaeOjreKiruJib2EhMKAgMWBgcSBgcSDg8OKiryQkLWWlq+enqejo6GioqKioqKhoaGhoaGg
+ oKKcnKaVlauMjLaJibyFhcKBgceEhMWHh8WMjL+RkbmSkrmUlLWcnKmioqKhoaGhoaGjo6OlpaSioqaZ
+ ma6UlLSPj7mLi7uHh8CDg8aEhMWEhMWEhMSIiMCOjriXl66dnaScnKKfn6CgoKCgoKCgoJ+enqCXl6eT
+ k62SkrGNjbeJibyKiruJib2Dg8SBgcaDg8WJicCTk7WenqmioqOhoaGhoaGhoaCenp+amqKVlaiRkbCQ
+ kLKNjbaIiLyIiLyIiL2Jib6KisCPj7uYmLGfn6qkpKWjo6SioqOioqKioqKioqKhoaSamquSkrSLi7yF
+ hcODg8eDg8aEhMWEhMWEhMSJib+Tk7afn6ulpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6Sk
+ pKWmpqempqempqempqekpKWjo6Sjo6Sjo6SkpKWlpaWlpaampqempqempqelpaajo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6SioqKkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6SkpKWmpqem
+ pqempqempqelpaajo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6SioqKioqKioqKioqKi
+ oqKioqKjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWkpKOdnauPj7uEhMWE
+ hMWDg8WDg8WCgsSBgcCDg7qFhbmAgMSCgsWDg8WCgsaIiL+Xl66ioqKioqKioqGkpJ6enqSQkLOKirqI
+ iLyCgsJ/f8KAgMKCgsGFhbyBgcSBgcaDg8eGhsSNjbuamq6ioqKenqOTk7CHh72CgsODg8GDg8CGhriH
+ h7aHh7mLi7mRkbSSkrWSkraQkLiVlbSfn6mioqOamqySkrWLi72FhcSDg8aEhMWCgsOBgcCFhbiHh7iI
+ iLyJib2Li76UlLWbm6+goKqkpKWhoaaTk7OHh8KEhMWEhMOCgsN/f8N/f8KAgMGBgcGCgsSCgsWEhMWH
+ h8KOjrqQkLacnKqkpKSlpaSkpKWdna2amqyVlbKNjbmEhL9/f8N/f8GAgMGBgcKDg8OHh8GLi76Kir+J
+ icCUlLKgoKalpaSkpKWlpaSnp6Kfn6uVlbKNjbeIiLuHh7mIiLWJibWJibiKiryIiMKEhMeEhMaEhMeN
+ jbycnKqkpJ+hoaObm6qQkLiNjbyMjLqKirmEhLx+fsKBgcKCgsSDg8aFhceFhceFhcaFhceOjr2enq2n
+ p6WmpqempqcgAIeHwJKStJ6epaKin6GhoaKio6SkpaWlpaSkpqCgqpaWtIyMvYyMvYuLvIqKu4mJvIyM
+ uJOTr5mZqZiYqpubp6Cgo6Ojo6OjpKOjpKOjpKOjpKOjo6CgpZeXr4mJvYmJu4KCwoCAxYGBxIKCxISE
+ w4qKu5CQs5GRspWVr56epqKioqKioqKioqKioqKioZ6epJaWrZGRsouLuIKCwYCAxoKCxYWFw42NvoiI
+ w4eHxIaGxY2NvpubrqKio6KioqGhoaGhoaSkoqKiqJSUtI6OvIyMvYeHw4ODxoSExYSExYWFxImJv4qK
+ vY2NupWVr56epKGhoZ+fn6CgoKCgoKGhn5+fopOTr5GRsYqKt4iIvImJvIeHvoODxYODxIODxYiIvZGR
+ tJiYr52dqaOjpaOjoqKioaGhoZ2do5WVq5CQsJCQsIyMuIqKvomJwIODxoODxoGBxYWFwZOTtaGhqKSk
+ paSkpaSkpaOjpKOjo6KioqCgpJmZrJKStYuLvIWFw4SExoSExYSExYSExYWFxIiIwJGRtp2dqqOjpqWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKWlpaamp6amp6amp6ampqWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaamp6amp6amp6WlpqOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKKioqKioqSkpKWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKSkpaampqamp6amp6amp6WlpaOjpKOjpKOjpKSkpKWl
+ paWlpaWlpaWlpaWlpaSkpaOjpKOjpKKioqKioqKioqKioqKioqKioqOjpKOjpKOjpKOjpKOjpKWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpKGhppeXsoqKwIODxoSExYODxYKCwoWFu4WFuoCAw4GBxIODxYOD
+ xYeHwpGRt5ycqaGho6KioqGhoqKioZ+fpJaWq4+PtIODwoGBxICAwoCAwYCAwYCAwoKCxYKCxYaGwYuL
+ vo+Pu5eXsqOjpZ2dqJSUsI2NtoiIuomJuYmJuIeHuIaGuIeHuYqKu4mJvYWFw4WFxISEx42NvpycrqWl
+ pJ+fppOTtIeHw4ODx4SExYSExYSEwoaGuIeHtoSEv4KCx4ODx4WFxY+Pt5qar52drqGhqqWlpZubrI+P
+ uY2Nu42NuoeHvoGBxIGBwn9/wYGBwoGBw4GBxYWFwoyMu5KStJKStpaWsJ+fp6Sko6KipZycrJSUtI2N
+ u4aGw4KCxoGBw4CAwoCAwYKCwYSEw4SExoWFx4WFxoWFx4+Pup2dqKSkoqSkpaSkpaSkpJeXsY2Nu4qK
+ vIuLuYqKt42Nr4iIt4iIuoaGv4SExYWFxIWFxIqKv5CQuZycrKWloaGho5qaq5SUso2Nu4uLvYeHvoCA
+ w4CAwYCAwYCAwoKCxISExoWFxoeHxo6Ov4+Pvpqas6Skp6ampqampyAAlJSympqsoKCkoqKhoaGhoaGh
+ oqKjoqKlo6OloaGpmpqwlJS3jIy9ioq7iYm6iIi7i4u4kpKxkpKxkJCznJymoqKfoaGioqKjo6Oko6Ok
+ o6OkpKSjoaGlmJivi4u9g4PDgYHEgYHFgoLGhITDi4u6i4u6i4u6iYm8kZGznp6loqKioqKioqKioqKi
+ o6Ohnp6mkJCyjIy5hITCgYHFgYHFhYXBioq8hYXFhYXHhITIiIjDlJS2oaGppaWloqKjoqKioqKhoaGi
+ np6ol5eyjY29hobEhITHhITGhITFhYXEioq+i4u9ioq+jY27l5euo6OhoaGhoaGhoKCgn5+foaGfn5+i
+ kpKwioq3iYm6ioq7h4e+goLFg4PEgoLFiIi9j4+0lparnZ2mo6Oko6Oko6Oko6Oin5+kl5erkpKykZGx
+ kJCvjIy2hobBgoLGg4PFg4PFgoLHioq7mZmqpKSjpKSlpKSlpKSlpKSlpKSkoaGlmpqrkpK1jIy7hYXD
+ g4PGhITFhITFhITFhITDiorAkJC7mZmvpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlo6Oko6OkpKSlpqampqanpqanpqanpqanpqanpqanpqampaWlpaWlpaWlpqanpqanpqanpaWmo6Ok
+ o6Oko6Oko6Oko6Oko6Oko6OkoqKioqKioqKipKSkpaWlpaWlpaWlpaWlpaWlpqampqanpqanpqanpaWl
+ o6OkpKSkpqampqanpqanpqanpaWlpKSko6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6OkoqKj
+ oqKioqKioqKioqKio6Oko6Oko6Oko6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqajnp6r
+ jY27g4PHhITFhITFiYm9hoa8f3/Cf3/BgYHDgYHFh4fBj4+4k5OzlJSympqroaGjoqKhn5+lmJisj4+1
+ g4PDgYHCgYHCgYHBf3/Bf3/BgIDCgIDEh4e/ioq7ioq8jY28lpazo6OkmJivjY25ioq8ioq7iYm6iYm5
+ iIi3g4O9gYHBhITBhYXCg4PFhITFgoLHi4u/m5uvpqajpKSllZWxh4fBg4PHhITGhYXDioq7iIi4goK+
+ gIDDg4PFg4PGhITGjIy9kpK2mJixnp6rpKSlpKSmm5utmpqslpavi4u8gYHHgYHEgIDCgIDBgIDDhYXA
+ i4u7jIy8jIy8jIy9jo67mZmuo6Ojo6Oko6Oklpaxh4fBgYHHgoLGgYHEgYHDgYG/gYHBg4PEhYXGhYXG
+ hYXFhITHjIy+mZmuoaGko6OioqKinZ2olZWxkZGzkJCxkJCxj4+yiIi4h4e2goK+gYHFg4PGhYXEi4u8
+ i4u9kJC6nJyspaWioqKlmpqqlJSyj4+6iIjCg4PGgoLEgIDCf3/Bf3/BgYHCgoLEhobEj4/AkZG8j4++
+ mpqzpKSnpaWlpaWmIACcnKqgoKWioqKioqKioqKhoaGhoaGioqOhoaecnK6UlLeOjr6Ojr2GhsKFhcOE
+ hMOHh8CPj7mOjriRkbSdnaaiop+hoaGhoaGioqOjo6Sjo6SkpKOioqaYmLCJib+CgsWBgcaBgceFhcOK
+ ir6MjLyMjLyKiryMjLiYmKuioqChoaGioqKioqKioqGioqOamqyMjLuCgsSBgcaAgMeFhcCHh7yDg8OD
+ g8WEhMaFhceNjb6cnK6lpaWlpaWlpaWjo6Sjo6GenqaUlLGQkLiNjb2GhsWEhMeEhMaDg8SDg8OEhMSK
+ ir+Pj7iUlLKbm6mjo6GioqKhoaGhoaGgoJ+enqCZmaiLi7eJibyKirqHh76Dg8SDg8SCgsWIiLyPj7SQ
+ kLKWlquhoaCioqGjo6Sjo6SlpaOhoaaZmauYmKqTk7CNjbWGhr+CgsaCgsWDg8WEhMWCgseMjLyamqmi
+ op+jo6SkpKWkpKWkpKWkpKSenqqRkbaKir2GhsOEhMWDg8aDg8aEhMSEhMSJib+KiryQkLmdna+mpqSl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6SkpKSmpqampqempqempqem
+ pqempqempqempqalpaWlpaWlpaWmpqampqempqempqelpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaampqempqempqelpaakpKSkpKSlpaampqempqempqempqakpKSj
+ o6Sjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6OioqKioqKioqKjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWmpqShoaiYmLGSkreSkraNjbqGhsCBgcOAgMJ/f8GAgMOG
+ hryKirqMjLqMjLuOjrmamquhoaOkpKCcnKmNjbqEhMWCgsaCgsSBgcOAgMF/f8F/f8GBgcOCgsOCgsOG
+ hr+NjbiRkbOVlbKenqmXl7KOjruLi72Li7yKiruJibiDg76Bgb+BgcCCgsKCgsSDg8WBgceGhsKOjruZ
+ ma+mpqSkpKWdnayNjbyHh8GJib+Jib2Li7qDg8CAgMGAgMGAgMOBgcWDg8aDg8eKir+SkraamrChoaml
+ paWenquamqyWlq+KiryAgMiBgcaAgMV/f8OCgr2Hh7mKirmKiruNjb6Njb6QkL2YmLWgoKujo6OgoKSZ
+ ma6QkLeOjrmOjrqJib2IiLuCgsCBgcKBgcODg8WEhMaFhcaOjryUlLWdnayioqWjo6KhoaOYmKiRka+P
+ j7KQkLCOjrKKiriJibmDg76BgcKCgsSFhcaFhcaFhcWLi8CRkbiZma+goKikpKOioqWbm6mQkLeFhcOB
+ gcaBgcOAgMJ/f8GAgMF/f8OEhMKNjb2QkLuRkbyUlLmbm7KkpKmmpqWlpaYgAJ2dqaGhpKKioaKioqKi
+ oqKioqGhoJ6epZqarJOTto6OvI2NvoiIxIWFxoSExoODxoODxYaGw4yMu5iYrqCgpKKioaGhoaGhoaGh
+ oqKipKOjpKSkoqKippmZsJCQuIyMvIuLvIuLu4uLu4yMu4yMvIuLvY+PuZWVr52dpaKioKGhoaGhoaKi
+ oqOjoZ6ep5SUs4yMvIiIwIeHv4iIvYeHv4SEw4KCxYODxYGBx4eHwZWVtaKiqaampKWlpaWlpaWlpKOj
+ o52dp5OTs4qKvYuLvYqKvYaGwoODxYKCxIKCxIKCxYODxoyMvZmZraKio6Kio6KioqKioqGhoaKioJyc
+ pJCQsYmJu4qKu4eHv4ODxIODxoSExIiIvo+PtpGRsJCQspaWrKGhnqCgoKKioqOjo6Ghp52dq5qarZSU
+ sI2Nt4aGv4KCxYGBxYKCxYODxISExIiIwI+PuJubqqKin6CgoaOjpKSkpaWlpKKip5eXsYqKv4aGxISE
+ xYODxoaGw4qKv4qKv4qKv4yMvZCQuJWVsZ6eqqampKWlpaWlpaWlpaWlpaWlpaWlpaWlpaamp6ampqam
+ pqampqampqWlpaWlpaOjpKOjpKSkpaWlpqamp6amp6amp6amp6amp6amp6ampqWlpaWlpaWlpqamp6am
+ p6amp6ampqWlpaSkpaOjpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpKWlpKWlpaWlpqam
+ p6amp6ampqWlpaOjpKSkpKampqamp6amp6amp6WlpaOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaSkpKOj
+ pKOjpKOjo6KioqKioqKioqKio6OjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaGhqZqar5GRuImJwIODxYGBxICAw39/wYWFu4SEvoWFwIWFw4eHwo2NuJubqqGho6SkoJ2dqI+P
+ uYWFxIiIwISExIGBxIGBwoCAwX9/wYGBwoGBw4GBxYaGv46OtZaWrpmZq5ubqpaWsY+Puo2NvY2NvIuL
+ u4aGv4KCwYGBwIGBwIGBw4GBw4KCxYaGwI6OuJGRt5eXsaWlo6SkpaKippmZr5GRtpCQtY+PtoWFwoCA
+ w4GBwYCAwoCAw4GBxYKCxoSExIeHw4iIwo+Pup2drKWlpZycrpubr5iYsY6OuYeHwYiIwIeHvoWFvYWF
+ uYeHt4mJuYqKvIyMvpGRvJmZtZ2dsKGhq6WlpZ+fpZ2dp52dp5ubqJSUsImJvISEwIGBwoCAwYGBwoKC
+ xISEw4uLvpSUtZaWspubraKip6Sko6Kio5+fppOTr5CQsZCQsY2NtYiIu4SEwYGBw4CAw4KCxISExoWF
+ xYuLwI2Nvo+PvJGRuJiYrqSkpKSkpJ2dqZOTsouLu4WFwoCAxICAw39/wn5+w4KCv4mJu46Ou46OvY+P
+ vZCQvZOTupycsKWlp6ampyAAoKCmoqKkoqKjoqKjoqKioqKin5+lmZmqkpKzjY27i4u/h4fChITGhITF
+ hITFg4PGg4PFiYm+lJSynp6noqKjoqKioqKioaGhoaGhoaGio6OhoaGknJypmJivk5O2kZG3kpK2kJC3
+ jY25i4u8i4u8kJC4mJivnZ2noKCioaGhoaGhoaGhoaGhpKSfnJypj4+3i4u8jIy7jIy6iYm9hITDg4PG
+ hITFg4PGhobAjIy4mpqspaWkpaWlpaWlpaWlpqalo6Olnp6nl5eujo64ioq6iIi9hITCgYHDgoLDgoLE
+ gYHFhYXCjo66nJyrpKSgoqKjoqKjoqKio6OhoaGjlpauioq7iYm6hoa9g4PDg4PFg4PGhITGjIy9kpK1
+ kpKzkpKxmJiooaGfoKCgoKCgoqKgnp6omJiwlZWzjo66hobBgoLGgYHFgoLEg4PFhITEh4fBjo63lpaw
+ np6oo6OhoaGhoaGho6OjpaWjn5+qkJC5hYXFhITGhITHhobDioq+jIy8jIy9jY28kJC4lpaxnJypoKCk
+ paWkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqampqanpqanpqanpqanpqampKSkpKSlpKSkpKSkpaWlpaWm
+ pqanpqanpqanpqanpqanpqanpqampaWlpaWlpaWlpaWmpqanpqanpqampaWlpaWlpKSlo6Oko6Oko6Ok
+ o6Oko6Oko6OkpKSlpKSlpKSlo6Oko6OkpaWkpaWlpaWmpqanpqanpqanpaWlpKSkpKSkpqampqanpqan
+ pqanpaWmpKSlo6Oko6OkpKSkpaWlpaWlpaWlpKSlo6Oko6Oko6OjoqKioqKioqKioqKioqKjo6Oko6Ok
+ o6Oko6Oko6OkpKSkpaWlpaWlpaWlpKSkpKSkpaWlpaWlpqakpKSlmpqvjY2+hITGgoLGgYHFgYHBg4O6
+ hYW8goLCgYHEgoLFg4PFiIjBlZWxoKCko6OhoaGjmJiuioq9hobCg4PFgoLFgoLDgYHBf3/BgYHCgYHC
+ gYHEg4PCiYm7k5OxnJyln5+jnJyqkZG3i4u9jIy9h4fBhITDg4PCgYHAgIDBgYHEgYHEhobAiIi9j4+3
+ lZWym5uspKSjo6OkpKSko6OlnJyskZG3iYm/g4PGgoLEgYHDgIDDf3/DgYHEhITDhITDhYXEgoLIh4fB
+ mJivpaWkn5+rnZ2tlZW2jY28jIy9jIy9ioq5iYm4hoa3hoa3iYm5jIy7kpK4lpa2mpqznZ2voqKqpqan
+ o6OnoqKjoqKhnZ2mj4+0goLDgIDEgYHCgIDBgIDCgYHEg4PEh4fBjIy9i4vAkJC6m5uuo6Olo6Oko6Oi
+ l5eukJCzjY20iYm4hITAgYHEgYHCgYHBgIDDg4PDiYm/iYnBiYnDh4fFjIzAl5exoqKjo6OknJyrlpay
+ j4+4iIi+hYW/hYW+hIS8g4O8hoa5i4u5jY29jY29i4vAi4vBiorCk5O6oaGrp6enIACjo6KioqOioqOi
+ oqOioqKioqKenqeXl66OjreJib6GhsKDg8aDg8WEhMWDg8aEhMWMjL2WlrCfn6eioqKioqKioqOioqOh
+ oaKhoaGhoaGgoKKamqeVla6SkrOPj7iPj7iPj7mNjbqMjLuNjbmQkLaVlbKamquhoaWjo6KhoaKhoaGh
+ oaGhoaGhoaGYmK6MjLyKir2Li7uKir+EhMSCgsaEhMWEhMaHh8GPj7eVla6dnaWkpKKkpKSlpaWlpaWm
+ pqSkpKednayXl7CQkLeJib2Dg8SCgsSCgsSCgsWCgsWFhcGNjbWVla2dnaejo6KioqOioqOioqKkpKGg
+ oKSWlq+MjLuHh76CgsGCgsSCgsaDg8aHh8KPj7qSkraVlbOZmayenqOgoJ+goKCgoKCenqKcnKeYmK+R
+ kbiIiMKDg8aDg8WEhMWEhMWEhMWGhsOLi76Tk7KcnKihoaOioqKioqKhoaChoaGkpKGdnauPj7yGhsSH
+ h8KHh8OLi76Li7uKiryNjb2QkLmWlrGcnKqgoKWjo6Ojo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWm
+ pqampqempqempqempqekpKWlpaWlpaWlpaWlpaWlpaWmpqampqempqempqempqempqempqelpaalpaWl
+ paWlpaWmpqampqalpaalpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWkpKSkpKSkpKSl
+ paWlpaWmpqampqempqempqelpaWjo6SkpKSmpqampqampqempqelpaWkpKSjo6Sjo6SkpKWkpKWkpKWk
+ pKWjo6Sjo6Sjo6OioqKioqKioqOioqOioqOjo6Ojo6Ojo6Sjo6Sjo6SlpaWmpqalpaalpaakpKWjo6Sk
+ pKWlpaWmpqWkpKafn6uRkbmIiMGGhsKFhcCEhL2EhLqAgMKBgcKCgsKCgsWDg8SKir2VlbGhoaOjo6Gj
+ o6GenqWRkbSGhsOHh8KFhcODg8SBgcOAgMGBgcKBgcKCgsOCgsWDg8OJibyVla6enqOioqKXl7CMjL2H
+ h8SEhMeEhMWDg8SBgcN/f8KBgcGEhL6JibuLi7qPj7eWlrCenqikpKKjo6Sjo6Wjo6Wamq6Kir+BgciD
+ g8WCgsWBgcWAgMN/f8GCgsGEhMGCgsWCgsaDg8aMjL2bm62kpKOkpKWdnauTk7eOjryQkLmOjriJibmH
+ h7iGhreIiLeLi7mMjLyPj7yPj7yNjb6SkrqcnLClpainp6ekpKeenqiVla+KiruCgsOBgcOBgcKAgMGA
+ gMKBgcOCgsSCgsaCgseBgcmHh8OWlrSioqakpKWkpKOcnKqQkLaHh7yDg8CAgMSAgMF/f8F/f8GBgcCF
+ hb2Hh76Dg8aEhMeCgsqLi8Gbm6+kpKKjo6SgoKeYmLGPj7uKir6Li7qKirmIiLeHh7eHh7iJibqLi72L
+ i76Hh8SHh8SFhceMjMGdnbCnp6YgAKKio6Kio6Kio6Kio6Kio6Gho5ycqZaWsI2NuoWFw4KCx4ODxYKC
+ xIODxYWFxIyMvZaWsp+fqaSko6KioqKio6Kio6Kio6Kio6GhoaGhoZqap5WVrZCQso2NuI+Pt5CQtoyM
+ vIqKvoqKvYuLvJGRtZSUspubqqGhpKOjo6KioqGhoaGhoaKioJ2dpZKSsouLvI2NuomJvoSExYODxYOD
+ xYSExYeHwo6OuJWVsJubp6CgoaGhoaGho6SkpaWlpaWlpZ+fqpiYs5CQu4iIwYODxoODxYKCxIKCxYKC
+ xYeHwZGRtpaWrZqapaCgoaOjoqKio6Kio6Kio6Kiop6epZeXrY+Pt4ODxYGBxYCAxIKCxIiIwZCQuJSU
+ s5aWs5ubrqCgp6KioaCgoKCgoKGhn5qap5eXqpaWrY+PuoODx4WFxYSExYSExYSExYSExYWFxIuLvZiY
+ rqGho6OjoaKioqKioqKioqCgoKGhoJmZq46OuYuLvYyMvIyMvIuLvYuLvY2Nu5CQuJOTtZqarqGhpqOj
+ o6OjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampaamp6amp6amp6amp6WlpaWlpaWlpaWl
+ paWlpaWlpaamp6amp6amp6amp6amp6amp6amp6WlpqWlpaWlpaWlpaWlpaOjpKOjpaWlpaWlpaWlpaOj
+ pKOjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaamp6amp6amp6amp6WlpqOjpKSk
+ paSkpaSkpaSkpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjo6KioqKioqOjpKOjpKOjpKKi
+ o6KioqOjo6OjpKOjpKSkpqamp6amp6amp6amp6SkpaOjpKSkpaWlpaampKSkppaWtI+Pu42NvIuLuoWF
+ vX5+woCAwYGBwYCAw4KCw4qKu5SUrZmZq56epqGho6KioqGho5mZrI2Nu4uLvYaGw4ODxoKCxIGBwYCA
+ wYGBwoKCw4ODxIODxIWFwYuLuJaWrZ+fopycqI6OuoWFxYeHwoeHwoWFw4ODwYGBwIODvYmJt4qKt5GR
+ sZGRsZSUsZubqqKio6OjpKSko56eqJKStoaGwoGBxYKCxIGBxYGBxYCAw4GBwIKCwIGBw4KCxIODxIaG
+ wZKStZ+fp6OjpKOjpJ+fp5iYrZSUspKSso6Os4iIuIaGt4eHtoeHuIiIvImJwIODyIODyYKCyoeHxZWV
+ uKOjqqamp6Ojq5iYso+PuIuLu4qKvISEwIGBwYCAwoCAwoKCxIODxYSExYSExoODxouLv5eXsqGhp6Sk
+ paSkpaCgpZWVsoiIwIGBxYGBxICAwX9/wYCAwISEu4WFvICAxYODxYSExYODyIuLwZmZsaSkpaOjpKWl
+ opmZr5CQuoyMvIuLvIuLu4mJuoiIuYiIuYiIuomJvYiIwoWFxYSEx4WFxo2Nv5ycsaenpiAAoqKjoqKj
+ oqKjoqKioaGkm5urlZWxjo64hobCgoLGg4PFg4PFg4PEg4PGioq9kZG3lpaznp6qo6Oko6OkoqKioqKi
+ oqKjoqKjoqKjnZ2ll5erj4+zjY23jo62jo62kpK0h4fCg4PHhITGhITGhobDk5Ozn5+loqKioqKjoqKj
+ oqKjoaGhoqKgnZ2llZWtkZG0jo66hITGhITGg4PEgoLEhYXBjIy6jY26mpqsoaGjoqKhoaGhoaGhoqKj
+ paWkoKCqmJizkZG6i4vAhYXGhITFhITFg4PFgYHFhobAkZG0lZWum5uqnp6ioKCeoaGhoqKjoqKjo6Oi
+ n5+nl5evjIy7g4PGg4PFg4PFgYHEhYW+jY23k5O0kpK0mZmvoKCmo6Ojo6OjoqKhoKCgoKCgnJynlJSu
+ jY22h4e9g4PDg4PEhITFhITFhITFhITFhobDkpK1n5+mo6OioaGioaGhoqKioqKioqKjnZ2klpasjo63
+ ioq9i4u9jIy9jIy9jY28kJC4kpK0lJS0mZmvoaGmpKSjo6OkpKSlpKSlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWmpqanpqanpqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpqampqanpqanpqanpqanpqan
+ pqanpqanpqampaWlpaWlpaWlo6OkpKSkpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6OkpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpqampqanpqanpqanpaWlo6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpKSlo6Ok
+ o6Oko6Oko6Oko6Oko6Oko6OjoqKioqKio6Oko6Oko6Oko6OjoqKio6Oko6Oko6OkpaWmpqanpqanpqan
+ pqanpKSlo6OkpKSkpaWloKCqkpK4jY29jo6+iYnBgYHEgIDBf3/BgIDBgIDDioq4k5OvkZGykJCzk5O0
+ mZmtoKCkoqKhm5upjo65hYXEg4PGhITFg4PEgIDCgIDBgYHBgYHCg4PFiIjCjo65kpK0kZG0l5esmJip
+ k5Oxj4+3kJC2j4+2ioq5iIi7hoa4hYW4h4e5jo6yj4+ykJCzj4+0kpKympqroaGjo6OjoKCnlZWziIjB
+ goLGg4PEgoLEgYHFgoLBgYG/gIDCgYHDgYHEiIi9iYm8j4+2nZ2po6Oko6OkpKSjn5+nlpaujo61iIi5
+ h4e1hoa1h4e1g4O9gIDGgYHFg4PGhITIg4PKiIjDlZW1o6Oqpqano6Oql5e4jo6/i4u9ioq8ioq8goLC
+ gYHDgYHCgYHDg4PFhYXGhobHi4vAkJC5l5eyn5+qpKSlpKSlo6Oln5+olZWyiYm+g4PDgoLAgYHBhIS5
+ g4O7gIDCgYHCg4PFhITGhITGiIjDkZG5np6rpaWlpaWjmJiwk5O2kZG3i4u8jIy7iYm7iYm6iYm5h4e7
+ hobChYXFhYXFhITGj4+8mZmynJyupKSpIACjo6SioqOioqOjo6Kfn6aVlbGPj7iFhcKCgsWCgsSCgsSC
+ gsOCgsSCgsSEhMWGhsOOjrqcnKujo6Sjo6Sjo6Sjo6OioqKioqOioqOZma2QkLWNjbaNjbWNjbWLi7qE
+ hMKDg8WEhMWEhMWFhcOKir2Xl7ChoaSjo6GioqKioqOioqOioqOfn6KZmaiUlK+MjLmDg8SFhcWFhcWE
+ hMaHh8CLi7mLi7mNjbuamqyhoaOjo6GioqKhoaGhoaGjo6GamrCQkLyMjL+Njb6Njb6GhsaEhMeCgseF
+ hcCPj7OVla2bm6ibm6mfn6ShoZ+fn5+goKCioqOjo6KamquMjLyEhMaDg8WDg8WCgsaJib+Li7qJibmK
+ irqMjLyRkbafn6ilpaOjo6Sjo6SioqKamqaVla2OjrWJibuJibuJibuEhMSEhMWEhMWDg8aFhcSMjLuX
+ l62goKSjo6KioqOioqKhoaGioqKenqienqmYmKyOjrSKiruLi7yMjL2MjL6QkLmTk7WUlLSbm62amq6h
+ oaekpKOjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqempqempqempqalpaWmpqempqempqempqem
+ pqalpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqempqempqempqempqelpaWlpaWlpaWjo6Ojo6Ol
+ paWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqempqem
+ pqelpaWkpKSjo6Sjo6Sjo6SlpaWlpaWlpaWlpaWkpKWjo6SioqKjo6Sjo6Sjo6Sjo6OioqKioqKioqKj
+ o6Ojo6Sjo6Sjo6SioqKjo6Sjo6Sjo6SkpKWmpqempqempqempqekpKWjo6Ojo6WgoKqZmbGQkLuHh8SD
+ g8aCgsOBgcF/f8F+fsOJibaRka+QkLSOjrqOjrmNjbqSkrOdnaejo6Gbm6mOjrmFhcSDg8aEhMWDg8SB
+ gcKBgcGBgcGBgcOJicCOjryNjb2NjbyNjb2RkbaZmamamqiUlLCQkLOKiruJibyJibyHh7mDg7qBgcGC
+ gsCCgsKIiLyLi7mLi7uOjrebm6qhoaSkpKKgoKiUlLWIiMCJibyJibuEhL6AgMCAgMGAgMGBgcOCgsWJ
+ ib+Li7yLi72QkLednaijo6SkpKOfn6iWlrCRkbSRkbKOjrGMjK+Dg7p+fsKAgMOBgcSCgsWDg8aEhMiH
+ h8WRkbmgoKumpqenp6ahoayUlLmLi7+Kir2Dg8SBgcOAgMGAgMGBgcKBgcSEhMWKisCSkreUlLWWlrKe
+ nqqlpaWkpKWkpKWlpaShoaaUlLCIiL2JibqIiLiDg71/f8F/f8GBgcKDg8WDg8aIiMGPj7uXl7Senqul
+ paWmpqSbm6+QkLqMjL6Njb2Li72KiryKiruHh7uDg7+CgsSFhcWEhMaPj7mUlLSTk7aXl7Odna0gAKOj
+ pKOjpKOjo6Kio5ubq42NuoaGw4ODxYKCxoKCxIKCwoGBw4GBw4GBxICAxoaGwZSUs6CgpaOjpKOjpKOj
+ pKOjpKOjo6KioqGhpJqarJOTs5GRs4+Ps4mJuoODw4KCxIODxYODxoaGw4qKvZCQtZ2dqKKio6KioqKi
+ oqKioqKio6CgpZubq5WVr4uLuoODxYSExoSEx4qKwIuLv4yMvY2Nu4yMupCQtZ6epaKioaKioqKioqKi
+ oqGhoaKioJ2dqJaWs5GRu4+Pvo+PvY2NwI2NuouLuIyMtZKSrZiYp5iYp56eo6GhoaGhoaCgoJ+fn6Gh
+ oZ+fpZSUs4aGwoGBx4KCxoKCxomJwIuLvIqKuoiIuYmJuZCQs5aWr5+fpqOjo6OjpKOjpKOjo52dpo+P
+ s4mJuoiIuoaGvYWFw4WFxoWFxoSEx4WFxoyMu5mZq6CgpKKioqKio6Kio6Kio6Kio6GhoZ6eppqarJKS
+ tYuLu4qKu4yMvIuLvZGRuJOTtpWVs5ubrZubraGhpqOjpKOjpKOjpKOjpKOjpKWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaampqamp6amp6ampqWlpaamp6amp6amp6amp6ampqWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaampqamp6amp6amp6amp6WlpaSkpKOjpKKio6KioqWlpaWlpaWlpaSkpKOjpKOjpKOjpKOjpKOj
+ pKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqamp6amp6amp6ampqOjo6KioqOjpKOjpKWlpaWlpaWl
+ paWlpaWlpaOjpKGhoaKioqKioqKioqKioqKioqKioqKioqOjo6OjpKOjpKOjpKKioqOjo6OjpKOjpKSk
+ paamp6amp6amp6amp6WlpqOjpKOjpZ2dqpGRt4aGw4KCx4GBxICAw39/w4iIs4+PrY+Ps46OuY+Puo6O
+ upOTt5GRtpmZq6SkoJ+fppCQtoSExIGBx4KCxoODxIODw4KCwoCAwoWFvIuLuo2NvY6OvY2Nvo2Nv5GR
+ uJ6ep6CgopOTr4mJvIiIvYiIvYqKu4eHvIGBwIGBwIGBwoODwIiIu4mJuYmJu4yMuZiYqqGhpKOjoqSk
+ op2dqpCQuYyMvYuLuoSEwICAw4GBwoCAwYGBw4KCxImJvoyMu4uLvo6OvJeXsKKipaSko6Cgp5ubq5eX
+ r5GRtI+Ps4WFvYCAwn5+wn5+wX9/woGBxIGBxoeHwouLv5CQvJqasaampaenpqKiqpaWt4qKw4WFx4SE
+ xoODxYKCw4CAwYCAwoKCw4aGwJGRtpWVtJWVtJWVtJmZsJ+fqKSkpaSkpaSkpZ+fqZaWsY+Pt4qKuoSE
+ wYKCw4CAwn9/wYCAwYKCxIiIwJCQuJmZsJ6erJ6eq5+fqqWlpaCgqpKSuImJwIuLvouLvouLvYmJvYSE
+ v4GBwYKCxIWFxouLwI6OvI6OvY2NvZCQuZiYsyAAo6Oko6OkpKSioKCmk5O0hobChITFhITFiIjAh4fB
+ goLEgYHDgYHEgIDFgoLDjIy3m5upo6OioqKjo6Oko6Oko6Oko6OjoqKknJyomJivlJSykZG2ioq8goLC
+ gYHEgoLEgoLFhYXCi4u8kZG2lpavoKCkoqKioqKioqKioqKio6Oin5+llpaxi4u9goLFgYHHhITFiYnA
+ jY2+jY2+jIy/jY29kZG2lpauoKCioqKhoqKioqKioqKioqKhnp6kmZmqkpKzjo66jY27jY27kpK1j4+3
+ jY24jIy5j4+0mJiom5ujn5+foaGgoaGhoaGhoKCgnp6emJiqkJC3ioq+h4e+iIi+iIi+i4u7i4u7iYm7
+ ioq4jo6ykJCwnZ2loqKioqKio6Ojo6OkoKCmmpqukZG1i4u5h4e+g4PDhITGhYXGhITHhYXGj4+8nJyu
+ oqKkoqKhoqKioqKioqKioqKjoqKjoqKhn5+jkpKyioq7ioq8jIy8i4u9i4u9jIy8j4+5lpaym5utmpqu
+ oqKko6Ojo6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpqampaWlpqan
+ pqanpqanpqanpqampqampaWlpaWlpaWlpaWlpaWlo6OkpKSkpaWlpqanpqanpqanpqanpqampaWlo6Ok
+ o6OkoqKjo6OjpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6OkpaWkpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWmpqanpqanpqanpaWmo6OjoqKjo6OkpKSkpaWlpaWlpaWlpaWlpKSloqKjoqKio6Oio6Ojo6Ojo6Oj
+ oqKioqKioqKioqKjo6Oko6Oko6OjoqKioqKjo6Oko6OkpKSlpqanpqanpqanpqanpaWloqKjnZ2pj4+3
+ iYnAh4fAhoa+hoa8iYmzjo6sjIyyioq4ioq7jo67k5O2lpa1l5eznZ2po6OgoKCkkpK0ioq+iYm/hobC
+ goLGgoLFgoLDhYW6hIS9hITBhYXDiYnCjo69jo69j4+9mpqvoKClmJirjo60jo61kJCyiIi6goLBgIDA
+ gIDAgoK/hoa7iYm5iYm6i4u6kpKyn5+joqKhoqKipKSin5+okZG4jIy9jY28hYXCgYHEgYHCgYHCgIDD
+ h4e9ioq7i4u9jo67kZG3lJS0oqKlpKSjn5+omJivlJS0kZG4h4e/gYHFf3/Efn7Bfn7Bf3/CgIDChYW+
+ i4u6jIy7jIy+kZG6oKCqpaWloaGrlZW5h4fGg4PKhYXHhITGg4PEgIDDgYHBhIS+iYm8jo65jo66j4+7
+ jo68kpK4np6qo6OkpKSko6OknZ2rl5eylZWwkJC1hITCgYHFgYHCf3/BgIDBh4e8ioq5jY25kZG4k5O3
+ lZW1mZmxpKSmpaWlnp6slJS1kZG3kZG2i4u7hITBf3/Cf3/DgoLCiYm+jY29jY2+jY2/jIy/j4+8lJSz
+ IACjo6Sjo6Sjo6Oamq2MjLuHh8KJicCKir+JicCGhsOCgsWBgcOBgcWDg8ONjbiYmKmfn6CioqGioqOi
+ oqOjo6Sjo6SkpKOhoaaXl7CVlbKQkLaKir+EhMWCgsaCgsWDg8SGhsCJib6OjriXl62dnaeioqKioqKi
+ oqKioqKioqKfn6Sbm6mSkrSJicCGhsKHh8CJicGMjLyLi72Kir+MjL6Skreamq6goKahoaKhoaGioqGi
+ oqKioqKgoKWamqyRkbOLi7eKirmMjLePj7WPj7aKir6IiMKHh8OJib+Tk6+cnKKfn5+goJ+hoaGhoaGh
+ oaGhoZ6UlKyMjLeKirqKirqLi7mLi7mLi7qJibyLi7qQkLSRkbGOjrKdnaChoZ+ioqKjo6OioqWZma6U
+ lLSPj7mJib+EhMSDg8WEhMWEhMaGhsWOjryYmLGenqqjo6SioqOioqKioqKioqKioqKioqOhoaWWlrGL
+ i7qIiLyKirqLi7yLi72Kir6MjLuQkLeWlrKdnaufn6ijo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaempqempqelpaalpaampqempqempqempqempqempqalpaWlpaWlpaWl
+ paWkpKSjo6Sjo6SlpaWmpqampqampqempqempqelpaWkpKSjo6SioqOjo6OkpKSlpaWlpaWkpKWjo6Sj
+ o6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaalpaampqampqakpKSioqKioqOjo6Sk
+ pKSlpaWlpaWlpaWlpaWkpKWjo6SioqOioqOjo6Sjo6Sjo6Ojo6OioqOioqOjo6Sjo6Sjo6SioqOioqOj
+ o6Sjo6Sjo6SkpKWmpqempqempqempqelpaahoaWTk7WOjrmPj7eNjbaNjbOPj6uKirGGhreGhrmJibqM
+ jLyQkLmUlLWbm62goKihoaShoaOYmK2Tk7SOjrqJib+GhsCHh7+Hh76EhLyAgMB/f8SAgMWEhMSIiMKI
+ iMOMjMGYmLOfn6mbm6qUlK2Skq6MjLaEhMCAgMKBgb+Bgb6FhbuIiLmJibqIiL2Li7qVla+fn6SenqSg
+ oKKjo6GdnaiQkLeNjbyIiMKFhcaDg8WBgcOBgcGEhLyJibiJibqMjLiSkrSUlLSVlbOjo6SlpaOgoKaX
+ l6+NjbqIiMGCgseCgseBgcR/f8J+fsJ/f8GAgMGEhL2EhL6Ghr+MjLyTk7acnK2kpKWjo6ecnLCRkb2I
+ iMWFhcmEhMiDg8aDg8OEhL6Hh7qJibqLi76Li72Li72OjryVlbWenqqjo6Sjo6SioqOgoKafn6mdnaqU
+ lLOGhsOCgseAgMSAgMCEhLqJibeGhr2FhcGGhsOGhsOJicGTk7ehoamnp6Ojo6abm6+UlLePj7mLi7yG
+ hr+Dg76CgruEhLqKirmLi7yNjb6Njb6Njb6Ojr2RkbggAKOjpKSkpKGhpZmZr5CQuY6OuoyMvIqKvoWF
+ xIKCxoKCxIKCxYaGw42NvJmZr6Cgo6Ghnp+fn6GhoqKio6OjpKOjpKSko6Cgp5OTtZCQt4yMvIeHwYaG
+ w4aGwoaGw4aGxIiIv4iIwI2NuZmZqqGhoqKioqKioqKioqOjoaCgpJmZq5SUso2NuYuLvIuLvIyMvIyM
+ vIuLvYqKvYyMvZOTtpqarp6eqqSkpKKipKGho6GhoqOjoaGhpJmZrZKStYyMuouLuYqKuIuLuI+PtYmJ
+ wIWFxIODxoSExYqKvZaWr52do5+fn5+fn5+fn6CgoKGhoaGhopKSsYmJuYiIuYiIuoaGvYaGvYaGvouL
+ u5CQtJKSspGRs5OTr5ycoJ+fnqCgoKKioZ+fppOTtY+PuomJwYWFxYODxoODxYSExoWFwo6OupiYsJmZ
+ r5qarqKipqOjpaKio6KioqKioqKiop+fpZaWsYyMvYqKvYuLu4qKu4mJvIqKvY2Nu5KStZOTtJSUtJqa
+ rqSko6OjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqamp6am
+ p6Wlpqampqampqamp6amp6amp6amp6WlpqWlpaWlpaWlpaWlpaSkpKOjpKOjpKSkpKSkpaWlpqamp6am
+ p6amp6WlpaSkpKOjpKKioqOjpKSkpaSkpKSkpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaSkpKKio6KioqOjo6OjpKOjpaSkpaWlpaWlpaWlpaWlpaOjo6KioqOj
+ o6OjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKSkpaamp6amp6amp6amp6am
+ o5aWspKStpOTtJOTspGRsYyMs4eHt4WFuIaGt4iIt4qKuoqKvJCQuJaWs5mZsZ2drKOjo5+fppmZq5CQ
+ to2NuY6OuIuLu4aGvYCAwn9/wX9/wYCAwoGBxYGBxYaGxIyMwJiYs6GhqJ6eqpSUs42Nt4ODwoCAw4GB
+ wIGBvYODuYaGuIiIuYiIvYuLu4+PtZSUsJeXrJaWrZ6eo6Sknp2dp4+Pt4mJwIODxoSEx4ODxoODw4aG
+ vIeHt4iIt4iIuIyMtZCQtJCQt5KStp+fqKKipKOjo5ubq4uLvICAx4KCx4KCx4GBxYGBw39/wX9/wYGB
+ woCAxIGBwoiIu5CQtJeXr52dq6SkpqWlpKOjp5qas4yMwYaGxoeHxoWFxYaGwIeHuoeHuImJuouLvIyM
+ vYyMvY+PupWVtpqasKKipqOjpKKio6Kio6Ojo6GhpZSUtIiIwIWFw4SEwYSEu4aGtYWFvIGBw4GBxoOD
+ xoKCx4SExZCQuZ+fq6ampKCgqZeXs5KSuo2NvI2Nu46Ot4uLt4eHt4eHtoiIuImJuoqKu4yMvY2Nvo+P
+ vJCQuyAAo6OkpKSjoKCmmpqslZWzkJC5jIy8hITEg4PGgoLFgoLEhYXCjo67mJixnZ2roaGmoqKin5+f
+ oKCfoqKioqKjo6OkpKSjoaGmlJS1jo67jY27jY26jIy7i4u9i4vAiIjDh4fEhYXEjIy7mpqqoqKgoqKi
+ oqKioqKio6Ohn5+lk5OzjY26ioq9ioq8ioq8i4u9i4u9i4u9jIy8kJC3l5ewnJysnp6ppKSlo6OkoqKj
+ oaGioqKgoKCllJSzjo65jo66jY25i4u6iIi7h4e/g4PFhITGg4PGh4fCk5O0np6loaGhoKCgn5+fn5+f
+ oKCfn5+imJirjIy5iYm8ioq5hoa+gIDFgYHEgIDGi4u6kpKykZGyk5Ovm5unnp6fnp6dn5+en5+gm5uq
+ jo66iIjBhYXFhYXGhYXFhobEhYXDi4u8lpaumpqsmZmwnJyso6OmpKSlo6OkoqKjoqKhoaGjm5upkJC4
+ jY26jY27i4u8iYm8iYm8i4u6kpK0k5OzkpK1kpK2lZWzo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqanpqanpqanpaWmpaWmpqanpqanpqanpqanpqanpqam
+ paWlpaWlpaWlpaWlpKSko6Oko6Oko6Ojo6OkpaWmpqanpqanpqampaWlo6Oko6Oko6OkoqKjoqKioqKi
+ o6Oko6Oko6Oko6Oko6Oko6Oko6OjpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6OkoqKi
+ oqKio6Ojo6OkpKSkpaWlpaWlpaWlpaWlpKSloqKjoqKio6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Ok
+ o6Oko6Oko6Oko6Oko6OkpKSlpaWmpqanpqanpqanp6emmZmxlJS2lJS0k5OzkJC3iYm6iIi5hoa3hYW4
+ hYW6hoa7iYm8iYm/iYnBjY29mZmxpaWko6Ojm5uplZWxkpKzjo64h4fBgYHFgIDBf3/Bf3/BgIDCgYHD
+ g4PDioq9iorBkpK5n5+roaGqlJS3hobFg4PDgoLBg4O+hYW6hYW4hYW4h4e6ioq6j4+2kZGykJCzkJC0
+ kJC1nJyno6OenZ2mjo65g4PGhITFhITFhITEh4e+ioq3hoa3iIi3h4e6h4e8h4e9iIi+iYm9k5O0nJyr
+ o6Ojn5+okZG2h4fAh4fChobBhITBgoLCgIDCgIDBgYHCgoLChoa9i4u2jo60j4+1mZmro6OlpqajoqKo
+ lZW1iorCiYnCiYnCiYnBiYm8iIi3hoa3iIi5ioq7jIy9jIy9i4u+jY28l5eyoqKmpKSlpKSkoqKkoKCl
+ nZ2nk5Ozjo64jY25i4u4iIi4hIS7gIDDgYHDgoLEgoLFg4PFiIjBkpK4n5+qpqakoaGplpa0kpK4k5O1
+ kpK2k5O1jo64iIi7hoa4hoa4iIi5iYm6i4u9jo68kJC7kJC7IACjo6SioqScnKqUlLSOjrqMjL2Li76F
+ hcOEhMSDg8WFhcKNjbmWlrCdnamenqmhoaekpKShoaKfn5+goKChoaKioqOjo6OioqWcnKyVlbOUlLSP
+ j7mLi76Li7+JicWJicWJicaLi8CVlbGhoaOioqKhoaGioqKjo6KhoaKamquPj7iLi72Li72KiryKiryM
+ jL2MjL2MjL2SkraSkrSTk7OXl6+fn6ikpKWkpKWjo6Sjo6SioqGfn6STk7OSkrSTk7OOjrmKir2IiL2D
+ g8WEhMWEhMWDg8aLi72bm6yjo6KhoaGhoaGhoaGgoJ+enp+amqWPj7aLi7uMjLyHh8GCgseDg8WDg8WC
+ gsSGhr6NjbaUlK6cnKahoaGgoKCfn5+fn52cnKGSkrCIiMGEhMWEhMWFhcWIiMGMjLyLi7yLi7yVlbGY
+ mKybm6uioqakpKWkpKWkpKWkpKWjo6OhoaOcnKiXl66UlLKNjbqKir6Kir2Li7qRkbOQkLSQkLaQkLaT
+ k7OcnKqjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWmpqempqempqempqalpaWlpaWlpaWmpqempqempqempqalpaWlpaWlpaWlpaWkpKWioqOioqKjo6Sj
+ o6SlpaampqempqempqelpaWlpaWlpaWkpKWioqOioqKioqKjo6Sjo6Sjo6Sjo6Sjo6OioqKjo6SlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6SioqKjo6SkpKWlpaWlpaWlpaWjo6SlpaWlpaWlpaWk
+ pKWjo6SioqKjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Slpaampqem
+ pqempqehoauYmLKTk7WPj7iJibuJibmHh7mHh7eCgr1/f8SBgcSDg8aCgsWCgseHh8OTk7WhoaekpKWc
+ nKuTk7GMjLiFhcCAgMWBgcOAgMF/f8F/f8GAgMGCgsKDg8SDg8aDg8aHh8OUlLeenqyZmbGLi8GJicKH
+ h8CGhruHh7iFhbiFhbiIiLqPj7KOjraJib2KiryKiruLi7qXl6yhoaGenqSQkLaFhcSFhcSEhMWIiL+L
+ i7iJibeHh7aGhriCgsGAgMWBgcSCgsWDg8OIiL6UlLOhoaahoaaYmK+UlLSTk7OTk7ONjbeFhb5/f8N/
+ f8GBgcCIiLmEhMCAgMV/f8WDg8GRkbOgoKSmpqKhoaqSkriIiMSJicKJicKLi7+KiruHh7iGhreHh7mJ
+ ibqKiruMjL2Li76QkLmcnKujo6WkpKWkpKWjo6Wfn6iXl6+Tk7ORkbKSkrKNjbaEhL2BgcSBgcKCgsSC
+ gsSBgcWGhr+QkLSTk7Oamq6ioqekpKWfn6qbm7Cbm6+VlbSOjruLi72KiruHh7iFhbeIiLmKiruLi76L
+ i7+Li7+MjL8gAKWlpaSko5iYr42Nu4uLvoyMvYyMvYyMvYuLvYuLvYqKvYyMuZmZqpycqKKipqWlpaSk
+ paSkpaKio5+fn5+fn6GhoqOjo6GhpJubrJWVtI6Ou4yMvoqKwIeHxImJxYmJxY6OwZOTu5ycr6SkoqKi
+ oqKioqGhoaKioJ+fppaWr5CQt4qKu4qKu4mJuomJuoqKvIuLvYyMvZKSt5SUs5aWr5ycqKOjo6SkpaSk
+ paSkpaSkpaSko5+fpZGRspKSs42NuouLvYiIv4ODxYSExYSExYSExYaGwo+Pt52dqaOjoqKio6GhoaGh
+ oaGhoJ+foJqapY6OtIyMuoaGwoODxoSExYSExYSExYiIvo2NtpKSrpiYp5+foqGhoaGhoaGhoaCgnZqa
+ oo2NtYODxISExYSExomJwY2NvIyMvYuLvJGRtJKSspSUsJqaqqCgpaSkpaSkpaSkpaSkpaSkpaKipJ+f
+ pJubqo6OuYqKvoqKvoyMuZCQsYmJu4qKu4mJvIyMupaWr6Ojo6OjpKOjpKSkpKampqamp6amp6amp6Wl
+ paSkpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaamp6amp6amp6ampqWlpaWlpaWlpaam
+ pqamp6amp6amp6WlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKWlpqamp6amp6amp6WlpaWlpaWlpaSk
+ paOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKKioqKioqKioqKio6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaOjpKOjpKSkpaWlpaWlpaWlpaOjpKSkpaWlpaWlpaWlpaOjpKKioqOjo6OjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKOjpKWlpqamp6amp6enpZycsY+PvIuLvYuLu4mJuomJuIOD
+ vn9/woCAwYGBw4KCxYKCxYGBxoaGwZOTtKGhqKSkpZ6eq5CQuIWFw4KCxoKCxYGBxICAwn9/wX9/wICA
+ wIKCwoODw4KCxIqKwIyMvJCQuJqasJ2drY+PvIyMvoyMvoqKvIeHuYWFuIaGtoiIuIqKuouLvIuLvYuL
+ vY6OuY2Nt5KSsZ2dpaCgoZaWroqKvYmJvIiIvI2NtpKSsI6OsoaGuYCAwICAwoGBw4GBxISEw4qKvIuL
+ upGRtZ6eqaSko56eqJiYsJWVtI6OuYWFwIGBw4GBw4GBwIaGt4KCwIGBw4ODxYaGw4uLupKSs5+fo6Oj
+ oKOjpZycsI6OvY2NvoyMvYyMvYqKu4eHuIaGt4eHuImJuYmJuomJvI6OupWVs5ycrKKipaSkpKSkpaWl
+ pKGhp5mZrZqaq5OTr42NtYWFv4CAxIGBwoCAwYGBw4GBxYiIwI6Ouo2Nuo6OupGRtZ+fqaamo6KiqJ2d
+ rp2drZaWtZSUtY6OuIiIu4eHuIWFt4iIuYqKuoeHwoSEx4WFxoWFxiAApaWlpqaknp6ql5ewk5O1i4u+
+ jIy9jY26iIjBhITFhITFhYXDk5Oynp6ko6OipKSkpKSlpKSlpKSloqKjn5+goKCeoKCjm5urlZWyjo67
+ jIy9iorAh4fDh4fDiIjDkJC/lJS5mZmzoqKrpqako6OjoqKioqKipKSgnZ2nkZG2jIy8i4u9ioq7ioq7
+ iYm6iYm5jIy6kpK1k5O1mJiwn5+po6OjoqKioqKjpKSlpKSlpaWloqKmm5uskpKzjIy5i4u6iIjAhITF
+ hITFhITFhYXEh4fAi4u7lpawoaGkoqKjoqKjoqKjoqKioKChnJyklZWri4u3hITBgoLFg4PFhITFhYXE
+ ioq+kJC3lZWvlZWsl5eonp6goaGhoaGhoaGhoqKfnZ2hkpKsiIi7iIi8iYm+i4u+i4u+jIy9kpK2k5Oz
+ lZWvlpavm5upoaGhoqKkpKSlpKSlpKSlo6OloKCnm5urlZWwi4u8iIjAiIi/iYm7ioq4iYm6iIi7jY25
+ k5O0mpqqo6OhoqKio6Oko6OkpaWmpqanpqanpqanpqanpqampKSko6Oko6OkpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpqampqanpqanpqanpaWlpaWlpaWlpaWmpqanpqanpqanpaWlpaWlpaWlpaWlpaWl
+ o6Oko6Oko6Oko6OkpKSlpqanpqanpqanpaWmpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6Ok
+ oqKioqKioqKioqKjo6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpKSko6OkpKSkpaWlpaWlpaWlo6Ok
+ pKSkpaWlpaWlpaWlo6Oko6Oko6Oko6Oko6Oko6Oko6Oko6OkpKSlpaWlpaWlpaWlo6Oko6Oko6Oko6Ok
+ o6OkpKSlpKSlpaWjmpqvjo66ioq7iYm6iIi4g4O/gIDBgIDBgIDDgYHEg4PFgoLHhobBjY25lZWwnJyp
+ o6OlpKSlmZmxiIjAgYHHg4PFgYHEgIDEgYHCgIDAgIDAgYHCg4PDiIi9i4u6kJC2kpK0mJiwo6OpkpK5
+ jIy/i4vAi4u+iYm8iIi4hoa3h4e4iIi5ioq8jIy8jY26jo66jY26kpK0nJyno6OfnZ2mj4+2j4+2j4+2
+ kZGykJCxiYm5gIC/f3/BgIDBgIDDhITBiYm8i4u8i4u8jo64nJyppaWhoaGmmZmvjo67hobDg4PGgYHG
+ goLAhoa4gYG/gYHBf3/DhITAioq8jY28lJSzoKCko6Oio6OioKCmlpaxi4u9ioq8ioq7iYm6h4e4hoa3
+ hoa3iYm4ioq5iYm6jY23lpaxnZ2rn5+mn5+ooqKmpaWlpKSlo6OnnZ2qj4+1hITAgYHEgYHDgYHDgYHC
+ f3/Ehoa8iIi9hYXDhobDhYXEkZG2n5+lpqahoaGomZmwlpa1l5e1kZG6jIy9ioq8iIi5hoa3iIi3hYXB
+ hITFhITGhYXGhYXGIACmpqWlpaafn6qWlrOOjrqMjL2NjbyIiL+EhMSCgsiEhMWNjbuVlbKfn6KhoaCi
+ oqOkpKWkpKWkpKWkpKWjo6Kfn6GYmKeSkrKMjLmLi72Jib+GhsOFhcWFhcSGhsWHh8SRkbyfn66mpqam
+ pqelpaaioqOioqKhoaOYmK2MjLqKiryKiryJibuKirmKireJibmHh72Kir2IiMCRkbafn6mlpaKjo6Oi
+ oqKjo6SkpKWmpqOhoaiTk7aNjbuLi72Hh8CFhcSEhMaEhMaEhMaDg8aHh8KRkbWdnaejo6KioqOioqOi
+ oqOioqKhoaGbm6aQkLSFhcCCgsWDg8aDg8aDg8aEhMWLi76RkbaTk7KVla6Zmaafn56goKChoaGioqCg
+ oKOZmaiRka6JibiJibmKirqLi72NjbuSkraTk7WWlrGWlq6Zmaqfn6ShoaGhoaKjo6SkpKWjo6aioqah
+ oaeZma+MjLyJib+Jib+Jib2JibqJibqJibmIiLqNjbmXl6+goKSioqKioqKioqOioqOlpaampqempqem
+ pqempqempqelpaWjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaempqempqempqel
+ paWlpaWlpaWmpqampqempqempqalpaWlpaWlpaWlpaWkpKWjo6Sjo6SioqOjo6SkpKWkpKWkpKWlpaWl
+ paWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6OioqKioqKioqKioqKjo6Sjo6SkpKWlpaWl
+ paWlpaWlpaWlpaWkpKWjo6Wjo6SkpKSlpaWlpaWkpKWjo6Wjo6SkpKSkpKSkpKWkpKWkpKWkpKWjo6Sj
+ o6Sjo6SkpKWmpqampqempqampqakpKSjo6Sjo6Sjo6Sjo6Sjo6SkpKWmpqOamq+OjruKiryJibqDg7+B
+ gcJ/f8F/f8GAgMKBgcSCgsaIiMCLi72NjbuQkLeYmK6ioqSmpqSbm66KisGBgcqCgseBgcWHh7uCgr9/
+ f8GAgMGBgcCHh7uKirmLi7qMjLqMjLqTk7OgoKeamrCSkrmRkbmSkriOjrmJibuIiLiGhreHh7mMjLmM
+ jLyIiMOIiMKHh8OOjrqZmaqioqCfn6OWlq2Wlq2ZmauTk7CIiLuBgcGAgMJ/f8GAgMGCgsSFhcSHh8OG
+ hsSKisCRkbmamqyioqOjo6OcnKuOjruIiMGJicGLi76IiL2Dg7+AgMF/f8KDg7+JibyMjLyMjL2OjrqX
+ l6+dnamhoaOhoaKXl6uMjLqLi7qKiruKiruIiLmHh7eHh7aDg7+EhMGDg8KHh76QkLWYmK+Zma6cnKuh
+ oaakpKSkpKOioqOVlbGLi7qGhr+CgsN/f8Z/f8WAgMOFhbuFhbuDg8KCgsaDg8aDg8eLi72ZmayioqOk
+ pKSgoKqYmLGPj7uMjL6Li72KiruJibmHh7eCgr2BgcOCgsWEhMWEhMWFhcYgAKOjpp+fq5aWtY6OvYyM
+ v42NvIiIwISExIODxYaGwo6OupaWsJubqaGho6KioaGhoaKio6OjpKSkpaSkpaOjppycqZKSsIuLt4mJ
+ vIuLu4aGwYODxYSExYSExoSEx4aGxJOTt6Ojqqiopqamp6amp6WlpqOjo6CgpJaWsIqKu4qKu4qKu4qK
+ uoeHvYaGwIWFwYODw4KCxIWFwJOTtKCgqKSko6OjpKOjo6KioqOjo6OjpZ2drpKSuJCQuo2NvIaGw4SE
+ xoWFxYSExoODx4aGxI+PupqaqqGhoaKioqKio6Kio6Kio6OjoqGhpJiYrIuLu4KCxIKCxoODxoODxoKC
+ x4ODxY+PuJKStJCQtpeXrqCgoqCgn5+fn6CgoKCgoJycppOTsYuLuYmJuomJuYqKuYuLuo2NupKSt5SU
+ tJiYr5ubrJ6epaGhoaGhoaGhoaGhoqOjo6OjpaGhp5ubrpCQuomJwYmJwIqKvYqKuYiIuoeHvIeHvIWF
+ wI2Nupycq6SkoqKio6Ojo6KioqKio6Wlpaamp6amp6amp6amp6amp6amp6WlpaSkpKOjpKSkpaWlpaWl
+ paWlpaWlpaSkpKSkpaWlpaWlpaampqampqSkpaWlpqSkpaSkpaSkpKSkpKWlpqamp6amp6ampqampaWl
+ paWlpaWlpaWlpqWlpqWlpqSkpaKio6OjpKOjpKSkpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOj
+ pKOjpKOjpKOjo6Ojo6Ojo6Kio6OjpKKio6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKSkpaWl
+ paWlpaWlpaSkpKOjpKOjpKWlpaWlpaWlpaWlpaSkpaOjpKOjpKSkpaWlpqamp6amp6amp6ampqWlpKOj
+ pKOjpKOjpKOjpKSkpaWlpJ2drJCQuYmJwYaGwoGBxYGBw4CAwX9/wX9/w4GBxIiIwIiIwIiIwIaGw4eH
+ wZGRtp6epqSko5ycrJCQuouLwIyMvYiIwIeHvoKCwX5+woCAv4WFuYiIt4mJuImJuYmJuoyMuZSUsZ2d
+ qJ+fqJubr5eXtJOTuI6Ou4uLvYmJuoaGt4iIuIqKu4eHwYODx4SExoKCx4iIwZOTs56epaGhoZycp52d
+ ppqaqY2NuYGBxn9/xoCAw39/wYCAwYKCw4ODxoSEx4mJwpGRupeXtJiYsp2dqaOjoZ6ep5WVtJKSt4+P
+ uouLvoeHwoGBxYCAwoODvoeHuouLuYuLvYmJwIiIwIqKv5KStJ6ep6GhopeXq4uLuouLuoqKu4qKu4qK
+ uoiIuYODvYCAw4GBxYKCxYODxIaGwIqKvZOTtJ6eqKOjo6OjpKOjo6GhpJaWr4+Pt46OtoyMuImJu4mJ
+ uYWFvIWFu4KCwYCAxIGBxYODxYeHwYmJwJCQt5ubqaSkoaSko6GhqZGRuYyMvouLvYuLu4mJuoODvX9/
+ woCAwoKCw4ODxYSExYWFxiAAm5usmJixj4+7jIy/jIy9iIjBg4PFhITEgoLGiIi/lJSynJypoKCjoqKi
+ oaGhoaGhoaGhoaGio6OkpaWknZ2slZW1jY26iYm7i4u7iIi9hYXDhITGhITGhITGiIjBjo67nJyspKSl
+ pqampqanpqanpqanpqaloqKllZWxioq9i4u7ioq6iIi8hITDgoLHgoLGgoLFhoa/jY20mpqnoqKjo6Ok
+ o6Oko6OkoqKjo6OhoKCmmZmwlJS1lZW0jo67h4fDhITGhITFhITGh4fDkJC4nZ2ro6Ojo6OhoqKioqKj
+ oqKjoqKioKClm5urk5O0ioq9g4PFg4PGg4PGg4PGg4PFh4fAkZG2kpK0kpK0nJyppKSgoqKioKCgoKCd
+ m5uklpatj4+2iYm9i4u6ioq5iIi9h4e+hoa/iYnAkpK3mJiwnp6poqKko6OioaGhoaGhoaGhoaGioaGl
+ mpquj4+6iIjCiIjCh4fCh4fAiIi9h4e+hYXAhITBiIi+lZWzoaGopaWjpKSlo6OkoqKjoqKjo6OkpaWl
+ pqampqanpqanpqanpqanpqanpqampKSko6OkpKSlpaWlpaWlpaWlpKSko6OkpKSlpaWlpaWlpKSlo6Ok
+ o6Oko6Oko6Oko6Oko6Oko6OkpaWmpqanpqanpqanpqampaWlpaWlpqanpqanpqanpaWmpKSlo6Oko6Ok
+ o6OkpKSlpaWlpaWlpaWlpaWlpKSko6Oko6Oko6Oko6Oko6Oko6Ojo6Ojo6Ojo6Ojo6Oko6OkoqKjo6Ok
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSko6OkpKSlpaWlpaWlpaWlpKSko6OkpKSlpaWlpaWlpaWl
+ paWlpKSko6Oko6Oko6OkpaWlpqampqanpqanpqampaWlo6Oko6Oko6Oko6OkpKSko6OmmJixiYnBgoLI
+ g4PFgoLEgYHDf3/CgIDAhYW/iYm/hITFgoLHhITFh4fCjo67m5uroqKioaGmnp6rmpquk5O2iYnAhITG
+ gYHFgoLAhIS6hYW4hoa6h4e8iIi7jIy4kpKxmpqpn5+koKCjmpquk5O3jY29jIy+jIy9iYm6h4e2hYW6
+ g4PCgoLGg4PFg4PFhYXEh4fCkJC3np6noqKhnp6lnJynlZWvi4u8h4fAiIi9hYW+f3/Bf3/BgIDCgoLE
+ iYnAkpK2l5ezmJiymJiznp6ro6Ohnp6lm5uslZW0jo67iIjChITFhITDhIS/hoa4iIi4iIi6hoa9hYXD
+ hobChobDkZG2np6no6OinJypkZG0ioq6iYm7ioq7iYm7hIS+gIDDgYHDg4PEg4PFg4PGg4PGhobCj4+4
+ np6qo6Oko6Oko6Oko6OknZ2olZWxkpKzkpKwkpKvj4+zhYW6gIDBgIDDgIDEgYHEhobAi4u7jIy6jo65
+ mJivoqKko6OioqKllpaxj4+4jIy7ioq9hobAgIDDgIDBgYHCgYHCgoLDg4PFhITFIACWlrKVlbOQkLqL
+ i72Hh7+CgsWDg8WDg8WDg8WHh8CSkrOfn6WioqKioqKioqKioqKhoaGhoaGioqKkpKObm66QkLqLi7+M
+ jL2Kir6Dg8WDg8aEhMWEhMWGhsKNjbuTk7OgoKelpaOlpaampqempqempqempqigoKuTk7WLi72MjLyK
+ ir2BgcOBgcSCgsWDg8WHh7+RkbWVlaudnaGiop+jo6Ojo6Sjo6Sjo6SioqKdnaeWlq+SkrSSkraLi76F
+ hcWDg8aEhMWHh8GRkbecnKujo6SkpKOioqOioqKioqKioqOjo6KcnKmTk7ONjbqIiMCCgsWCgsWDg8aC
+ gsaFhcOLi76KisCPj7iXl6+fn6ajo6GioqKhoaGfn5+Xl6mOjrSKirqLi7qLi7qKiryFhcOCgsaCgsWF
+ hcKMjL2Xl7KenqiioqSjo6OioqKhoaGhoaGfn6SZmauOjrmHh8KJicGDg8eDg8eBgcWDg8OGhsKGhsGK
+ ir6Xl7GgoKmkpKalpaWlpaWjo6Sjo6SioqKioqKkpKSlpaampqempqempqempqempqempqelpaWjo6Sj
+ o6SkpKWlpaWlpaWlpaWjo6Sjo6SkpKWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Smpqelpaam
+ pqempqelpaWlpaWlpaWmpqampqempqempqekpKWjo6Sjo6SkpKWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sj
+ o6Sjo6Sjo6SioqKioqKioqKioqOjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWj
+ o6Sjo6SkpKWlpaWlpaWlpaWjo6Sjo6SkpKWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6SkpKSlpaampqempqem
+ pqempqakpKSjo6Sjo6Sjo6Sjo6SmpqKgoKmQkLqFhcaDg8WDg8WCgsWBgcKDg7yGhruCgsaEhMWFhcSJ
+ ib+MjLyPj7icnKmgoKWjo6KkpKCdnaePj7mDg8aFhcODg8KGhruFhbmCgr+EhMCGhsGKiryQkLaWlq6d
+ naaioqChoaOUlLKLi72Kir6Li7yLi7uJibmGhriBgcCAgMWCgsSDg8WEhMOJib+Kir6Tk7Ofn6aioqOf
+ n6WXl6ySkrKTk7KUlLGRkbWJibyBgcGAgMGBgcKGhr+Pj7iTk7OTk7aSkriZmbGioqimpqOioqKamqqO
+ jruHh8KHh8KIiMGIiL+KirmHh7iHh7mEhL2CgsGEhMGFhcOKir6Xl6+goKSjo6KioqOcnKmOjreKirqJ
+ ibqEhL9/f8SBgcKBgcKCgsSDg8WDg8aGhsOKir6IiMGRkbecnKuioqSkpKOjo6SenqmYmK6UlLKSkrON
+ jbaGhr6AgMKAgMGBgcOBgcOFhb+MjLuKiryQkLiSkraWlrKenqiioqObm6qXl6+Vla6Pj7SGhsGBgcaB
+ gcKAgMGAgMGAgMGBgcOCgsSDg8UgAJeXsZaWs4+PuYeHwYKCxoKCxIKCxIODxYiIv4uLupKSs5+fpKKi
+ oqKioqKioqKioqKioqGhoaGhoaGho5+fqZWVtYyMvouLwISExoODxYODxYODxYeHwYuLvY2Nu5mZrKGh
+ pKSkpKSkpaSkpaamp6enpp+frZeXtpSUt5GRtoqKvoSExoODxoGBxIGBw4eHvpCQs5aWrJ2dpp+foJ+f
+ n6GhoaKio6OjpKSko56eqZaWsJKStJCQt4qKvoSExIODxYSExYeHwo+Pt5ubqpqaraGhpqSko6OjpKOj
+ pKKioqKioqSkoZmZrY2NuoeHwYODx4ODxoKCxYKCxYSExIWFw4WFxIaGw5CQuJ2dqaOjoqKioqKioqKi
+ op2dpZeXqo6Os4iIuYmJuYmJvISExIODxYSExIeHwIuLu4uLuZmZrKKipaSkpKOjpKOjpKKioqKioJyc
+ qI6OuYeHwIeHwYSExoSExoSEx4WFwoWFwIaGwoiIwJOTs5+fq6SkpqWlpaWlpaWlpaWlpaWlpaWlpaOj
+ o6KioqOjpKWlpaamp6amp6amp6amp6amp6amp6WlpaOjpKOjpKSkpKWlpaWlpaWlpaOjpKOjpKSkpKWl
+ paWlpaWlpaOjpKOjpKOjpKSkpKWlpaWlpaWlpaSkpKOjpKSkpKWlpaWlpaWlpaWlpaampqamp6amp6am
+ p6OjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKKio6KioqKioqKioqOjpKOj
+ pKOjpKOjpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKSkpaWlpaWlpaWlpaOjpKOjpKSk
+ paWlpaWlpaWlpaWlpaSkpKOjpKOjpKOjpKWlpaamp6amp6amp6ampqSkpaOjpKOjpKOjpKSko6KippiY
+ sYyMvoaGxYWFxISExYeHvoeHu4CAw4KCxIODxomJv4qKvYyMu5SUsZycqZycqaGhpJ+fpZiYrZKStoyM
+ vIuLvIqKuoaGvIKCvoKCvYWFv4uLvJKStpSUtZeXsp2dqqGhoqKioJaWro6OuYuLvIyMu4uLuoqKvIKC
+ woCAw4GBwoGBxIODw4iIvomJvYqKv5GRtpqaqp+fpaKio5ubqJWVr5KSs4+Pt4iIwIKCxYGBwoCAwYWF
+ vIuLuYuLvYqKvYqKvIqKvpWVtaKiqaenpKSkppiYroqKvoaGwoeHwYiIwIuLu4mJuoiIuYSEvYGBwYGB
+ w4GBw4GBw4iIvpWVsZ6epaKioqKio6Kio5SUsoyMuoSEwYCAw4GBwoCAwYCAwYGBw4ODxYODxYODxYOD
+ xoODxYeHwpOTtaCgqKSko6OjpJ2dqZ6eqJ6ep5OTsYaGwIGBxYGBw4CAwYCAwoSEvImJuYqKv4qKvouL
+ voyMvpCQuJubrKOjpJ2dqpycqZubqJCQs4WFwYKCxoGBw4GBwn9/wX9/wYCAwoGBw4KCxCAAmZmulZWz
+ ioq+g4PFg4PFg4PFg4PFiIi9jIy7j4+4mJisoqKgoaGhoqKioqKioqKioqKioqKioKCioaGhnJypl5ew
+ j4+7hITIhYXGgoLEg4PFh4fAioq9jo66mpqroKCkoqKioqKio6OkpKSlpKSloqKqm5uyl5e2k5O6i4vA
+ g4PFhITFg4PFgoLHhoa/kJCxlpaslpatn5+joqKhoKCgn5+foKCgoqKjnp6omZmvlpazkpK2ioq+g4PF
+ goLEgoLGh4fBjY27jo65jo65lJSxoKCnpKSjo6Oko6Oko6OkoqKin5+lk5O0hobCgoLHg4PGgoLFgYHE
+ g4PDhYXChITEhYXDkJC3mZmtoKClo6OioqKioqKioaGinZ2mlZWvkZGxjo6zh4e8g4PEg4PEgoLFh4fA
+ i4u8jIy7kpKzoKCioqKio6Oko6Oko6Oko6OkoaGjm5uokJC1hobBgoLGg4PFg4PFhobBhobDhYXFhITG
+ hobDk5O1o6OnpqakpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6OkpaWlpqampqanpqanpqanpqan
+ pqanpaWmpKSko6Oko6OkpaWlpaWlpaWlpKSko6OkpKSkpaWlpaWlpaWlpKSko6OkpKSkpaWlpaWlpaWl
+ paWlpKSlo6Oko6OkpaWlpaWlpaWlpqampqanpqanpqanpqanpKSlo6Oko6Oko6OkpaWlpaWlpaWlpaWl
+ paWlpaWlo6Oko6Oko6Oko6Oko6OjoqKioqKioqKio6Oko6Oko6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpKSko6OkpKSkpaWlpaWlpaWlpKSko6OkpKSkpaWlpaWlpaWlpaWlpKSko6Oko6Oko6Ok
+ paWlpqanpqanpqanpqanpaWlo6Oko6Oko6OkpKSjn5+pkpK3jIy+jIy+jIy9h4fBgIDEgIDBgYHCg4PF
+ hITFg4PGhobCjIy7kJC4lZWyoKClnZ2olpawlpaukZGzjIy7hobAg4O/goK+g4O8iYm5kZG0lZW1lZW0
+ lZW0lZW0l5exnJypmZmpk5OxkZG2kJC4ioq+g4PFgYHDgIDBgIDBgYHCgYHDgYHEgYHGiIi/j4+5lZWy
+ m5uqoqKjo6OinZ2mkZGzhobAgoLFgYHDgYHDhYW6iYm4i4u7i4u8i4u8i4u8i4u9kJC5nZ2tp6ejpaWl
+ oKCokZG3iYm8iYm8iYm8ioq7iYm6hIS9gYHBgIDDgYHEgoLCiIi6iYm6ioq9k5Ozn5+lo6OioqKjlZWx
+ iIjBgoLGgYHDgYHCgYHCf3/BgIDBgYHDgYHFgoLFhITEiYm/jIy8kZG2nJyrpaWio6Oko6Oko6OkpKSh
+ nJypjIy7gYHFgYHCf3/ChYW8iYm3h4e9g4PGg4PFgoLGh4fCk5O2n5+opKSjo6OknZ2okpK0h4fBg4PG
+ g4PFgoLEgYHDf3/BgIDBgoLDgoLEg4PFIACTk7KKir2EhMWDg8WDg8WDg8WDg8WDg8SHh7+SkrKenqai
+ oqChoaGhoaGioqKioqKioqKioqKhoaKcnKaWlq6QkLeLi72Kir6Kir6IiL2IiL2Jib2Li7yRkbSfn6Wi
+ oqKioqKioqKioqKjo6OlpaWgoKmbm7CTk7mLi8OGhsiFhciEhMaEhMWCgsiKir+UlLCVlaqamqWgoKKh
+ oaGhoaGgoKCfn5+goKGenqeZma2Tk7WLi7+FhcWDg8SDg8WHh8GMjLqOjrmPj7mTk7KamqqgoKOjo6Oj
+ o6Sjo6Sjo6SkpKOZma2Jib6BgceCgsaDg8WDg8WCgsSCgsOCgsOHh7+RkbSamqygoKWioqOioqOioqKh
+ oaOdnaiWlq+VlbGRkbSIiLuCgsKDg8SCgsaHh8CLi7yKir2MjLqYmKugoKKhoaChoaKjo6Sjo6SioqSc
+ nKqXl6+Li72CgsWBgcWBgcWFhcGEhMKFhcSEhMeGhsSQkLqXl7KioqalpaSlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWjo6Sjo6SkpKSmpqampqempqempqempqempqempqakpKSjo6Sjo6Sjo6Sjo6Sjo6Sj
+ o6Sjo6Sjo6SlpaWlpaWlpaWkpKWjo6Sjo6SlpaWlpaWlpaWlpaWkpKWjo6Sjo6SlpaWlpaWlpaWlpaam
+ pqempqempqempqekpKWjo6Sjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6OioqKi
+ oqKjo6Sjo6Sjo6Sjo6Sjo6Sjo6SlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKWjo6Sjo6SlpaWlpaWl
+ paWkpKSjo6Sjo6SlpaWlpaWlpaWlpaWkpKWjo6Sjo6Sjo6SkpKWmpqampqempqempqelpaWjo6Sjo6Sk
+ pKOfn6mSkreMjL2MjL2Hh8KBgcWAgMOAgMGAgMGBgcKBgcaFhcOLi76MjL2MjLyYmK6hoaSfn6WZmayU
+ lLKNjbqHh8CEhMCCgsCCgr2Hh7aNjbCQkLGUlLKVlbOVlbSVlbSWlrOdnaufn6SVla6OjrmLi76FhcWE
+ hMWBgcSAgMJ/f8F/f8GAgMKBgcSHh7yKirqMjLqPj7eXl6+ioqOjo6KdnaiUlLCOjrWNjbWMjLOLi7GH
+ h7WHh7mKirmKiruLi7yLi72Pj7mUlLGenqmmpqSlpaWkpKacnK2YmK6Xl6uSkrCIiLuFhb6BgcGAgMJ/
+ f8SCgsOIiLuJibmJibqIiLyOjribm6ukpKCioqOWlrGMjLuJib+GhsGAgMSAgMOAgMGAgMKBgcKBgcSC
+ gsSJib2Li7uQkLaQkLaZma2lpaKjo6Sjo6SioqOkpJ+cnKeOjreHh76Hh7yGhruHh7eEhLuAgMKBgcWC
+ gsaIiMCJib6Tk7ShoaalpaKjo6SdnaqPj7iJicCJib6IiL+Dg8SBgcJ/f8GAgMKCgsOCgsWDg8YgAIiI
+ v4SExIKCxYODxYSExYSExYSExYKCyIqKvZmZq6KioKGhoaGhoaGhoaGhoaGhoqOjoqKiop2dp5aWr46O
+ uIqKvIqKvIuLu4qKuoqKu4mJu4qKuo+PtpWVrZ6epKKioqKioqKioqKioqGho5+fp6Cgp5qasJOTuoqK
+ xYSEyoWFyISExYODxoWFxY+PuZmZrJycpp6en6CgoKGhoaGhoaGhoaCgoKCgnp6epZSUsYqKvYWFxIWF
+ xYSExYiIwYuLvYuLvIyMu5KSs5ubqaCgpKKioqKioqKipKOjpKOjpKWlop2dq5KStYuLvIeHwYODxYOD
+ xoKCxYKCxYGBxoaGvpWVrqCgo6KioqKio6Kio6OjoqKio5ubqpWVsZCQtomJvYODxIGBxYODxoeHwIqK
+ vYqKvIuLu5OTs6Cgo6GhoaGhoaGhoaGho6Ojo6OjpJaWsomJwIKCx4CAyISExImJv4aGxIWFxoSEx4iI
+ w5CQuZeXsJ2dqqKipaWlpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKWlpaamp6am
+ p6amp6amp6amp6amp6WlpqSkpaOjpKSkpaSkpaSkpaSkpaOjpKOjpKSkpKWlpaWlpaWlpaSkpaOjpKSk
+ pKWlpaWlpaWlpaWlpaSkpaOjpKSkpKWlpaWlpaWlpaWlpqamp6amp6amp6amp6WlpaSkpKSkpaOjpKSk
+ paWlpaWlpaWlpaWlpaSkpaOjpKOjpKOjpKOjpKOjo6KioqKioqOjo6OjpKOjpKOjpKOjpKSkpKWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOjpKSkpKSkpKOjpKOjpKOjpKSkpKWlpaWlpaWlpaWlpaSk
+ paOjpKOjpKSkpKWlpaamp6amp6amp6ampqSkpKOjpKSko5+fqJKStoyMvYyMvYmJv4iIvoWFvYCAwYCA
+ wX9/xIWFwIuLvYyMvYyMvYyMvZmZrKCgpKOjop6eqJGRtoWFw4SEw4ODw4SEwIiIt4yMr46OrI+PrJGR
+ rpOTsZWVs5aWtJaWtJqarqKipJmZrYmJvYGBxYGBxoKCxYaGvIKCvn5+wYCAwYGBwoKCwYWFv4SEv4OD
+ woeHv5SUsqCgpKOjop2dqJWVsJKSs5OTsJKSr4yMtIiIt4aGuIiIuImJuYyMupGRtZeXrpycp6CgpKKi
+ paOjp6WlpaCgq52drJ2dqJaWrIiIvIKCw39/wX5+woKCwIeHvImJuomJuoiIuoqKuIyMt5WVsKKio6Ki
+ opWVsY2NuoyMvIqKvoeHv4eHvIGBwX9/wX9/w4KCwYeHvIyMuJCQs5OTspGRtZmZraSkoaOjpKOjpKSk
+ o6GhpJWVsIqKvIqKu4qKuouLuYaGvYGBwYCAxIKCxIeHv4qKvIuLvZCQt5qaraGhp6OjpKKipJaWsouL
+ vIqKvIqKvYODxYGBwn9/wYCAwYGBw4ODw4mJvSAAhYXFhITFgYHEgoLEhITFhITFg4PGhobDkpK2np6m
+ o6OgoaGhoaGhoaGhoaGhoqKhoaGinZ2olpawkpK1jIy7iYm8iYm6iYm6iYm6iYm7ioq7j4+1lpaum5un
+ n5+joqKioqKioqKioqKioaGjnJypm5urk5O0i4u/h4fGhYXHhYXHg4PGhITDi4u8lJSynZ2ooaGjoaGg
+ n5+fn5+goaGhoaGhoaGhnZ2jk5OuiIi8goLEgYHGhYXGiYnCjIy9i4u+jIy9kZG1mZmroaGio6OioqKi
+ oqKioqKio6Ojo6OkoaGnmpqulJSzjY26hobDg4PGgoLGgoLFgoLFgYHGhoa/lJSuoaGgoqKhoqKjoqKj
+ oaGknp6onJyql5eui4u8hITFg4PGg4PDiIjBjIy8i4u9ioq9jIy6lZWvo6OgoaGhoaGhoaGhoaGhoaGj
+ np6ok5O0i4u9ioq9iYm+h4fAiIi/hobGhobHh4fGjo69l5eym5usoqKlo6OkpKSlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6OkpaWlpqampqanpqanpqanpqanpqampaWlpKSlpaWlpaWl
+ paWlpaWlpKSlo6Oko6OkpKSlpaWlpaWlpaWlpKSlo6OkpKSlpaWlpaWlpaWlpaWlpKSlo6OkpKSlpaWl
+ paWlpaWlpqampqanpqanpqanpqanpqampaWlpKSkpKSkpaWlpaWlpaWlpaWlpaWlpKSlpKSlpKSlpKSl
+ o6Oko6OjoaGhoqKio6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlpKSk
+ o6Oko6Oko6Oko6Oko6Oko6OkpKSkpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6OkpaWlpqampqanpqanpqam
+ paWlpaWin5+pkZG3i4u+jIy+jY27i4u8hYXBgIDDgIDChIS/iYm6jIy6jIy9i4u+i4u+j4+5mJitoaGj
+ n5+mkpK0ioq/i4u9ioq9jIy5jo6xjo6si4uvhoa2hoa5iIi6ioq8jY29kpK5lZW0n5+qmZmti4u7hITC
+ hoa+hoa+hoa9gYHAfn7BgIDBgoLBgoLBgoLEgYHFg4PFiYm/kpK1m5uqoqKjn5+ml5ewkpK0kZG0jo63
+ iYm6iIi6iIi2hoa5hIS/hYW+iYm9k5Oym5upnJyonZ2ooaGmpaWlnp6snZ2unJytkpK1hITDgIDGf3/D
+ gIC+hYW5iIi4iYm5ioq7i4u6jY23jIy3j4+0mpqooqKimZmskZG2kJC4kZG2jo65hYXBgYHEfn7Df3/A
+ hYW6ioq2ioq3jo60jo62kJC2mpqrpaWgo6Ojo6OkpKSjm5usjo65iIi/i4u8i4u7h4e/goLCgIDEgoLC
+ hoa+i4u7i4u8i4u8jIy7kJC2mJivo6OkpaWinJyskpK3jY28iYm/g4PFgYHCf3/BgIDBgYHCgoLBh4e+
+ IACGhsaFhcWCgsOAgMOCgsWEhMaFhcONjbyZma2hoaOioqGhoaGhoaGhoaGhoaGhoaCenqSXl66RkbaP
+ j7mMjLuKirqJibmJibqKirqKirmPj7SWlq2amqicnKWhoaGhoaGioqKioqKioqKhoaOdnaeVlbCKir2D
+ g8WCgsaDg8WDg8aEhMOMjLqRkbSVlbGbm6qioqGioqKgoKCfn5+fn5+hoaCgoKKWlq2KirmEhMCEhMGH
+ h8GJicGNjb2MjL6Njb2SkriZmbCenqeioqGioqKioqKioqKioqKjo6KioqSZma+SkraMjL2FhcWCgseD
+ g8aCgsWDg8WDg8WCgsaHh76UlK2goKChoaCioqKjo6GgoKWamqyZma2QkLaGhsKDg8aEhMKGhr6MjLyL
+ i7yLi7yKir6NjbqXl62ioqGhoaGhoaGhoaGioqCgoKOZmauWlq6VlbKTk7SOjrqGhsGDg8SFhcWHh8SM
+ jL+UlLecnK+hoaijo6Ojo6Sjo6Sjo6WkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sj
+ o6SkpKSmpqampqempqempqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6SkpKWlpaWlpaWl
+ paWkpKSjo6SkpKWlpaWlpaWlpaWlpaWkpKSjo6Sjo6WkpKWlpaWlpaWmpqampqempqempqempqelpaal
+ paWkpKSkpKSkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSjo6SioqOhoaGioqKjo6Sjo6Sjo6Sjo6Sj
+ o6SkpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkpKSkpKSkpKSkpKSjo6SkpKSkpKSlpaWlpaWl
+ paWlpaWlpaWkpKSjo6Sjo6Sjo6SlpaWmpqampqempqempqempqSgoKiTk7WNjbuMjL2Li8CGhsSCgseC
+ gsSEhL+JibmJibiKirqLi72Kir6Jib+Li72UlLKgoKahoaSamqyXl7CVlbGWlrGUlK+QkK2KirCEhLl/
+ f8J/f8N/f8SAgMeFhcSOjrmTk7WYmLCamq6Xl7CSkrOOjrWGhr2BgcN/f8J/f8CAgMCCgsGBgcKDg8WE
+ hMOJib6QkLiUlLSWlrGhoaSgoKWbm6uVla+Pj7aKir2JibmKiriHh7iCgr5/f8V/f8WCgsKNjbaVla+W
+ lrCYmK6fn6Wjo6Shoaifn6uYmLKNjb6FhcWFhcKEhMCGhrmGhrWHh7iLi7qMjLyPj7mQkLiQkLiRkbSX
+ l6qhoaCfn6WamqyWlrCUlLKOjrmEhMOEhMCBgb+EhLmJibSIiLeFhb6Fhb6EhMGJibyXl62ioqGioqKj
+ o6OkpKKbm62RkbeNjbqKir2Hh8CCgsaAgMaBgcKFhb2KirmLi7yLi7yLi7yJib6Li7uXl66jo6Ojo6Oh
+ oaacnKyTk7aIiMGDg8aBgcSAgMJ/f8GAgMGBgcKAgMQgAIWFxoSExYODxIGBw4KCw4aGwo2NupKStZ+f
+ p6SkoaKio6KioqGhoaGhoaGhoKCgo5ubqZSUsY+PuIuLvIyMvIyMvIuLu4qKu4uLu42Nt5KSsZmZqJyc
+ pJ2dpKGhoaGhoaGhoaKioaGho5+fpZ2dp5OTtIWFw4KCx4ODxYODxYWFw4qKuZKSs5OTspKSs5iYraKi
+ oaKioqKioqGhoZ+fn6Cgnp+fopGRs4yMuoqKuomJvImJvoqKvomJwIyMvpKSt5SUtpaWs56eqqKio6Gh
+ oaKioqKioqKioqKiop+fpZOTtYyMvYWFxIKCyIODx4ODxoODxoSExYSExYaGwo2NuJmZqqCgoKCgoKGh
+ oKKioaCgpZiYro+PuIWFxISExoWFw4eHvoqKuomJv4mJv4iIv4iIv5GRtp6epqGhoaGhoaGhoaGhoaKi
+ oJ+fopmZqZiYqpSUso2Nu4iIwoWFxIWFwYaGwoyMvJSUtpqasaGhqqampKOjpKOjpKOjpKOjpKSkpKWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpKOjpKOjpKWlpaamp6amp6amp6ampqWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaSkpaSkpaOjpKSkpKWlpaWlpaWlpaOjpKOjpKSkpaWlpaWlpaWlpaWlpaSk
+ pKOjpKSkpKWlpaWlpaWlpaampqamp6amp6amp6amp6WlpaWlpaSkpKSkpKWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaOjpKOjpKKioqGhoaKio6OjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaSkpaOjpKWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaOjpKOjpKOjo6Ojo6Wlpaam
+ p6amp6amp6ampqOjppycq5eXsY+PuYaGwoSExoWFxIaGwYqKuImJuYmJuYqKvIqKvoqKvYyMvJSUtJmZ
+ raCgpaKio5+fpaCgpJubqpubqpaWq42NsISEu35+w4CAwYGBwoKCw4GBxoeHwJOTsZaWspSUtJycrKKi
+ ppycq5CQt4KCxIODwYCAwX9/wICAwIGBwoGBwoODw4iIvY2NuJKStpOTtZOTtKGhpZ+fpJ6epZqaqpCQ
+ tYuLuYqKuomJuoODv35+woGBwYSEwImJuI+Ps5GRs5CQtZOTs5qaq6GhoqWloqKiqJSUtouLwI6OvYyM
+ vIuLu4iIuIWFt4SEuoeHvYmJv42NvY2NvpCQu5iYsp2dqJ2doKKioJ2dppaWro+Pt4qKvYuLuoqKuIiI
+ tYiItIeHtoODvICAxoCAxYCAxYWFwY+PtpqaqqKioqKioqOjo6Cgp5mZr5GRuIqKvoODxYSExIODw4WF
+ vImJt4mJuYuLvIuLvIuLvIuLvJOTtJ+fpaKioaOjpKSko6Cgp5aWs4qKvoaGw4ODxIKCw39/wYCAwYGB
+ wYKCwCAAhITFhITFhITFg4PFhITAi4u3kZGzmZmroKClo6OioqKjoqKjoqKioaGhoqKfnJynk5OyjY24
+ i4u7ioq7ioq7i4u7jIy8i4u9i4u9ioq8jo63lpasnp6joqKgoaGhoaGhoaGhoaGhoaGinZ2nlpawi4u8
+ hITEg4PGg4PGhobDjY27kpK0kZGxkZGylpavnZ2no6OhoqKioqKioqKioaGhn5+enZ2hkZGyioq7iYm8
+ hobBgoLGg4PFg4PFkJC5kpK4kJC6k5O2nJytpKSkoqKjoaGhoaGho6OhoKCjl5etjIy6hITDg4PGg4PG
+ goLFgoLFhITFhITFhobDj4+4mZmqnp6koaGhoKCgoaGfnp6kmJitkJC2hITFhYXEhYXFh4fAioq5iIi9
+ g4PFhITFgoLHioq9mJisoqKioqKioaGhoaGhoaGhoqKgn5+jmJiskpKykZGyjY24iYm9ioq8ioq7ioq7
+ kJC2mJiunZ2soaGqpaWmpaWmo6Oko6Oko6Oko6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpKSlo6Oko6OkpaWlpqanpqanpqanpqanpaWlpaWlpaWlpaWlpaWlpaWmpqanpqanpqanpqampKSk
+ o6OkpaWlpaWlpaWlpKSko6OkpKSkpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6OkpKSkpqampqanpqan
+ pqanpqanpaWmpaWlpKSlo6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6Oko6Oko6OjoqKioqKio6Ok
+ paWlpqampqanpqanpqanpqanpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlo6OkpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlo6Oko6OkoqKjoqKio6OkpaWlpaWlpaWlpKSlo6Oko6Oko6OklpayjY26jIy8
+ jIy6ioq5iIi4iYm5iIi7iYm+iorAjIy+k5O2kZG3lpaxn5+no6OioqKjoqKim5uplpasj4+yhYW8gIDE
+ gIDBgIDBgYHCgYHDgIDFhobAk5Oyk5Oyk5O2oKCqo6OnmZmxkpK2jIy7ioq6hIS/gIDCgIDBgYHCgYHC
+ iIi7ioq6i4u8i4u9jIy8k5OzoKClpKSin5+lmJirkpKzj4+2jY25hITBgIDDf3/BgoK+ioq5iYm5iYm7
+ iYm7iYm8jIy7lJSyoKCko6Ohn5+mk5O1ioq/jIy9jIy9i4u8ioq6hIS9f3/CgYHDgoLFgoLHgoLKi4vA
+ mZmxoKCqnZ2poKCfl5eojo60i4u4ioq4ioq4iYm4jY2uiYmxgoK9fn7Df3/CgIDEhoa7iYm5ioq7kZGz
+ np6loqKioqKipKShnJyrkJC5jIy9jIy8ioq7iYm6iIi5h4e4iIi5ioq8i4u9ioq/k5O2n5+ppKSkoqKj
+ oqKioaGknJyrlpaykZG3i4u+hobDg4PDgYHCgIDBg4O/iIi6IACEhMWEhMWDg8aHh8KNjbiQkLGPj7Ke
+ nqSjo6CioqOioqOioqOioqOioqKhoaGXl6uNjbiLi7yLi7uMjLqFhcGCgsSDg8WFhcSLi72QkLeVla6e
+ nqSioqCgoKChoaGhoaGhoaGhoaKdnaaVlbCLi76FhcSEhMWDg8aGhsKOjrqSkrSSkrSSkrKVla2bm6eg
+ oKKhoaGioqKioqKioqKjo6KgoKKVlaqJibuJibuDg8GBgcWDg8aFhcOPj7iQkLeQkLiPj7uWlrOhoaek
+ pKWkpKWjo6SioqGgoKKcnKmVlbGMjLyEhMSCgseDg8aDg8WCgsSCgsSCgsaMjLyYmK+fn6WhoaChoaGh
+ oaGiop+bm6aOjraFhcWFhcSFhcSIiMGJib2Ghr+BgcWCgsSCgseLi7yVlbCdnaejo6GioqKioqKhoaGi
+ oqCfn6OXl6yQkLSRkbOSkrKMjLeIiLuJibqKiruKiruPj7WZmaydnamfn6mmpqalpaalpaakpKWjo6Sj
+ o6Sjo6Sjo6SmpqempqempqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6SlpaWmpqempqempqempqem
+ pqelpaWlpaWlpaWlpaWlpaampqempqempqempqempqakpKSjo6SlpaWlpaWlpaWkpKWjo6Sjo6SlpaWl
+ paWlpaWlpaWkpKWjo6Sjo6Sjo6Sjo6SkpKSmpqampqempqempqelpaalpaWlpaWkpKWjo6SlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWkpKSjo6Sjo6OioqKlpaWmpqempqempqempqempqempqempqelpaalpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6SkpKWlpaWlpaWlpaWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Oi
+ oqKjo6Sjo6Sjo6Sjo6Sjo6SioqWbm6yVlbSSkrWTk7OPj7WIiLmJibmGhrqHh7uKiryIiMCDg8iEhMaD
+ g8eJicCXl7ChoaSioqOenqeYmK2RkbOHh76AgMSBgcOBgcKAgMGAgMGBgcGAgMODg8GKirqQkLSXl62i
+ oqWenqySkreUlLWSkraHh8KCgsSBgcKBgcGBgcGBgcOCgsOCgsWHh8CMjLyNjbuUlLOhoaWkpKGdnamT
+ k7OOjreNjbmEhMOCgsWBgcSDg72Hh7aJibqCgsGCgsODg8OCgsSFhcKPj7ebm6qioqKhoaSWlrCMjLuO
+ jrmOjrmMjLyFhcGAgMKAgMOBgcSBgcWAgMeMjLyYmLGenqyfn6ufn6uioqOcnKSTk6uQkK+QkK+Ojq6N
+ ja2JibKBgb19fcJ+fsF/f8KAgMGHh7yLi7mQkLaYmK+fn6ijo6SioqKjo6Gfn6ebm66amq+UlLWNjbuK
+ irqIiLiFhbyBgcOCgsSCgsaIiMCQkLiVlbOVlbOcnKyioqOhoaObm6qXl7GRkbiFhcWFhcWDg8SBgcOC
+ gr2GhreHh7kgAISEx4ODyIiIwoyMvo+Pu5WVtJaWrp6eoqGhoKKioaKioqKio6Kio6Kio6KiopiYq4yM
+ uIqKu4uLuoaGwIKCwoGBw4KCxIWFwpGRtZeXr56epqGhoaGhoaGhoaCgoKGhoaKioJ+fpJeXq4+PtIiI
+ vYiIvYeHvoeHvomJvIqKvIuLvouLvomJwZGRtZycpaGhn6GhoaGhoaKioqOjoaKiopycqZGRs4mJuYSE
+ wYGBxIGBxYaGw42Nu5CQt4+Pt42NuZCQuJubrqamo6SkpaSkpaSkpaSkop6eppOTso6OuIyMu4qKvoeH
+ woODxYGBxIGBw4GBw4CAxouLvJqaqqOjoaKioqGhoaGhoaGhoZaWrYqKuomJvYiIvoODxIODxYODxIKC
+ xIKCxYGBxoqKupOTsJ2dpqKioqKioqKioqKioqKioqOjoJubqJCQtJGRs5KSso2NuIqKu4qKu4qKvIuL
+ vYuLvYyMu5WVrp6epKGhpKOjpaWlpqWlpqWlpqSkpaOjpKOjpKOjpKSkpaWlpqamp6amp6amp6WlpaWl
+ paWlpaWlpaWlpaWlpaWlpaWlpaampqamp6amp6amp6amp6amp6WlpaWlpaWlpaWlpaWlpaamp6amp6am
+ p6amp6WlpqSkpaOjpKWlpaWlpaWlpaSkpaOjpKOjpKWlpaWlpaWlpaWlpaWlpaOjpKKioqKio6SkpaWl
+ paWlpaamp6amp6amp6WlpqWlpaWlpaWlpaOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaSkpaOjpKOj
+ pKWlpaWlpaampqamp6amp6amp6amp6amp6amp6amp6amp6amp6amp6WlpaWlpaWlpaWlpaWlpaWlpaWl
+ paOjpKSkpKWlpaWlpaWlpaOjpKOjpKOjpKOjpKOjpKOjpKKioqKioqKioqKioqKioqGho5mZq5mZrJqa
+ qpWVrI2Ns4eHuoaGuoWFuYeHuYWFvoODxYODyIKCyIWFxYSExo6OuZ2dqKOjopycqZGRtoiIwYODxIKC
+ xIKCxIGBw4CAwYCAwX9/w4ODwIiIu4qKuZCQspiYqpycp5qarJeXspiYsJiYr4yMvIqKv4iIvoODv39/
+ wYCAwoKCxIKCxoiIwIyMuoyMupOTs6CgpaSkoZ+fppWVsYqKvoSExYKCx4GByIaGwImJt4aGt4ODwYGB
+ woODxISExoWFw4yMu5SUsJubqKKioqGhpJaWsYyMuo6OuIyMu4eHwoKCxICAxICAw4GBxYCAxoqKuJaW
+ rZycqZ+fqaGhqaWlpaWlpKOjoZiYqY+PsZCQr5CQroqKtIKCvX5+wX5+wX9/wYGBwYKCwomJvo+Pt5aW
+ sZ+fqqSkpaSkpaOjpKKioZ6epZmZrpWVspSUspOTs42Nt4WFvYCAwYCAwoGBxIKCxIODxYmJwIyMvI2N
+ vJWVs6KipaSkoJycqI+PuYWFxYWFxoWFxoKCxoWFv4eHuYWFuYaGuSAAioq+iorAjY2/jY2+jo69lpa0
+ oaGooqKioKCgoKCgoaGhoqKioqKjo6OioaGjlpawjIy7ioq7hYXBg4PEgoLDgYHDgIDFg4PEkpKznp6n
+ o6Oio6OioqKioaGhoaGhoKCgoaGgmpqpkJC1ioq5iYm6iYm6j4+zjY21ioq7ioq+iIjAh4fDjo66l5eu
+ n5+koaGfoKCgoaGhoaGhoKCjnZ2olpawjIy7hYXBgIDEgIDEgoLEhYXDhobCh4fBh4fBioq+lJSxoKCm
+ paWkpKSlpKSlpKSlpaWkoaGmlJSwiYm8jIy8jY26iIjBg4PGgoLFgoLEgYHEgIDFioq6nJyppaWgoqKi
+ oqKioqKhn5+jmZmpkJCziIi9g4PCgYHEgYHFgYHFgIDGgoLDi4u4k5OvmZmmoKCio6OhoqKioqKioqKi
+ oqKio6OgnZ2llJSvkpKyjo63ioq6ioq8i4u9i4u9jIy9jIy8ioq/lJSxn5+jo6OgoqKipKSlpaWmpaWm
+ paWmpKSlo6Oko6Oko6Oko6OkpaWmpqanpqanpqampaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqanpqan
+ pqanpqanpqanpqampaWlpaWlpaWlpaWlpaWmpqanpqanpqanpqanpqampKSko6OkpKSlpaWlpaWlpKSl
+ o6OkpKSkpaWlpaWlpaWlpaWlo6OkoqKjoqKio6OjpaWlpaWlpaWmpqanpqanpqanpqampaWlpaWlpKSl
+ o6OkpKSlpaWlpaWlpaWlpKSkpaWlpaWlpaWlpKSlpKSlpaWlpaWlpaWmpqanpqanpqanpqanpqanpqan
+ pqanpqanpqanpqanpqampaWlpaWlpaWlpaWlpaWlpaWlpKSlo6OkpKSkpaWlpaWlpKSlo6Oko6Oko6Ok
+ oqKjoqKjoqKioqKioqKioqKioqKioqKin5+km5upl5etkJC0iYm5iYm5h4e5h4e2goK8gYHDgYHGgYHG
+ hITEhobFh4fEjY27mpqspKShoKClkZG1hYXEgoLHg4PEgoLEgoLEgYHCf3/Cg4O/iYm7iYm6ioq6kJCy
+ mZmpmZmonJyonZ2pmpqvmJiykJC6i4u+hobBgYHCgIDCgIDCgoLEg4PFhYXEh4fBjIy6mJisoqKjpKSh
+ o6OimpqrjY27iIjAh4e9h4e+ioq5h4e4gIC/gYHCgYHDgoLFg4PGh4fCkJC3lpaumpqooaGio6OhmZms
+ j4+5jIy8hobDg4PFgYHFgYHEf3/EgIDEioq3kZGvlJStlpatl5eumpqwn5+ro6OopqajnJyrkpKxkpKs
+ j4+wg4O/f3/Efn7Dfn7BgIDBgYHCgoLDhITEiYm/kpK3m5uvoaGopKSlpKSlpKSim5upkpKylJSylZWx
+ kZG2iIi+gYHDf3/Df3/BgYHCgIDFhobBiYm+jIy7kZG2lZWzn5+ppKSinp6nk5O0i4u9iIi/iIi/h4e+
+ hoa7hoa4hYW5goK/IACIiMCMjL6Njb2MjL+Njb2WlrSlpaWlpaSioqKgoKCgoKCioqKioqOhoaWXl6+P
+ j7mLi76GhsGCgsWCgsSCgsSAgMWCgsOLi7iVla2hoaKjo6GioqKioqKioqKhoaGhoaCenqKSkrGJib2J
+ ib2JibqKirmLi7qJib6GhsKGhsOJicCPj7mYmKyfn6WioqOioqGgoKCgoKChoaCgoKSYmK2NjbqEhMOC
+ gsaCgsWDg8OEhMODg8WCgsaCgsaCgseLi72amquioqKjo6OkpKWkpKWkpKWkpKaenquUlLONjbmMjLuJ
+ ib6FhcODg8aDg8WCgsWDg8SDg8KNjbObm6Sjo6CioqKioqKioqKfn6SXl62MjLqDg8OAgMaBgcWAgMSA
+ gMSCgsOIiL2OjrWWlqybm6Ofn5+hoaGioqKioqKioqKjo6GioqKcnKeVla+OjreKiryKiruKiruKir2L
+ i72MjL2MjL2RkbmdnaykpKSkpKOioqOioqOkpKWlpaalpaalpaakpKWjo6Sjo6Sjo6SkpKWmpqempqem
+ pqempqalpaWlpaWlpaWlpaWlpaWlpaWlpaWmpqWmpqempqempqempqempqempqempqWlpaWlpaWlpaWm
+ pqampqempqempqempqempqakpKSkpKSlpaWlpaWlpaWkpKWjo6SkpKWlpaWlpaWlpaWkpKWkpKWjo6Oj
+ o6Ojo6SkpKWlpaWmpqampqampqampqalpaWlpaWlpaWkpKSkpKSkpKSkpKWkpKWjo6SkpKWlpaWlpaWl
+ paWlpaWlpaWlpaWlpaWmpqWmpqampqempqempqempqempqempqempqempqempqempqalpaWlpaWlpaWl
+ paWlpaWlpaWkpKSkpKSkpKSlpaWlpaWkpKWjo6WioqOioqKioqKioqKioqKioqKioqKioqKioqKjo6Gc
+ nKmQkLaJib6Jib6JibqJibiEhLx/f8F+fsSBgcSDg8OFhcOIiMKOjruUlLWbm6yjo6KhoaSYmK6Li76E
+ hMWDg8WDg8WCgsSAgMOCgr6Hh7mJibqKiruPj7WUlK+Xl6yXl6ybm6ednaeUlLOQkLmLi72GhsGCgsWA
+ gMSAgMKAgMGCgsSEhMWCgsiFhcSSkrSdnaahoaOgoKSioqOenqiRkbWOjrqMjLmMjLiHh7qBgcB/f8KB
+ gcGBgcOCgsWDg8aGhsSJicCMjLuSkrOdnaajo5+cnKiNjbqFhcSCgseBgceAgMd/f8eAgMGIiLWSkq6K
+ irmJib2Kir2Jib6Li7+QkLqbm6+lpaahoaqXl7CRkbCLi7aBgcKAgMOAgMF/f8F/f8GBgcKBgcSBgcmJ
+ icCRkbaUlLWYmLKjo6akpKWmpqSenqmUlLCSkrGPj7WHh7+CgsSBgcOAgMF/f8GAgMOEhMCJibuMjLuN
+ jbmQkLaRkbeWlrKhoaehoaSamqqUlLCNjbWKirmIiLqGhrmEhLqBgb+BgcMgAIWFw4qKv42NvY2NvZGR
+ uZmZsaSkpqampaSkpKGhoaCgoKCgoKKiop2dp5CQt4qKwIeHwoKCxoODxIODxIKCxYSEwoyMuZaWrpmZ
+ qKCgoqKioaKioqKioqKioqGhoaKioJycppCQs4uLuY2NuYuLu4mJvYSExYKCx4ODxoaGwo2NupmZrZ+f
+ paKio6Kio6Kio6GhoqCgoKGhn6CgopaWr4iIwIKCx4SExYSExYSExISExIODxYODxYODxYWFwpKStJ+f
+ paSkoKKioqOjo6SkpaSkpJ6eq5WVtZKSt5KStYqKvoSExYODxoODxYODxYODxYaGwoyMuZaWqZ2dn6Cg
+ n6GhoaKioqCgpZiYrouLu4KCxYGBxoGBxYGBxYODwYODwYSEv4iIuoiIvJOTrpycpKCgn6GhoKGhoaKi
+ oqKioqGho5ycqJWVsI+PuIqKvIuLvIuLvIqKu4qKu4qKvYyMvZGRuJ2dq6WlpaampaWlpaSkpaKioqKi
+ o6OjpKWlpqWlpqWlpqSkpaOjpKOjpKOjpKSkpaWlpqamp6amp6WlpqWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaampqamp6amp6amp6amp6amp6WlpqWlpaWlpaWlpaampqamp6amp6amp6amp6ampqSkpKOjpKSk
+ paWlpaWlpaSkpKOjpKOjpaSkpaWlpaWlpaWlpaWlpaWlpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWl
+ paWlpaWlpaWlpKOjpKOjpKOjpKOjpKOjpKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaampqamp6am
+ p6amp6amp6amp6amp6amp6amp6amp6Wlp6WlpqWlpaWlpaWlpaWlpaWlpaSkpaOjpKSkpaWlpaWlpaWl
+ paOjpKKio6KioqKioqKioqKioqKioqKioqKioqKiop+fppOTso+PuI+Pt4uLuoaGvYCAxH5+w4CAwoKC
+ woWFwYeHwo6Ou5OTtpaWspmZrZ+fp6Kio56eppOTs4eHwYODx4ODxoKCxYSEwYaGuYeHt4mJuI+PtZOT
+ sI+PtY+Pto2Nt5KSsJiYq5GRtIiIv4WFwoGBxICAxIGBxIGBw4CAwYGBwoKCxoWFxIyMu5SUs5mZrZiY
+ rpiYrZ+fpaCgppaWsJCQt42NvIqKvYODwn9/w4CAwYCAwYGBwoKCw4ODxYSExYKCx4ODxoyMvJmZq6Ki
+ oJ2dppCQtoaGwYeHv4iIwIeHwISEwIiIt4+Pq4qKt4GBxYKCyYODyIKCyIODyIWFxZOTtqKiqKSkppqa
+ r4+PuYaGwIGBwoGBwYGBwYCAwX9/wYGBwoGBxYWFwZCQtpSUspKStZeXsqOjpqSkpaSkpaOjppycq5CQ
+ tIWFvoCAxICAxIGBwoCAwn9/woSEv4qKuoyMu42NvI2Nu4yMvIuLvZSUtKCgp6Wlop6eqJWVsY+PtIuL
+ uYiIvIWFvIKCv4CAw4CAwiAAi4u7i4u9jY29kpK3mpqvoKCqpaWlpaWlpaWlpKSkoqKioKCgoaGhnZ2m
+ kpK0h4fCgoLHhITFhITFhITFg4PHioq+kpK2k5O0mZmon5+hoaGgoqKioqKioqKioqKin5+jm5unlpas
+ kpKwjo62iIi/g4PGg4PGhITFh4fDjIy8k5O0mJiuoKClo6OioqKjoqKjoqKjoaGhoKChm5unkJC0h4fA
+ hYXFhYXEhYXEg4PFg4PFhITFhITFh4fBjo64m5uroqKjoqKhoqKioqKio6Oko6OkmZmvkpK3k5O2kZG4
+ hITFgoLGg4PFg4PFg4PFh4fCjY26mJisn5+in5+enp6en5+foqKimpqri4u8goLGgoLGgoLFgoLFg4PD
+ iIi8iIi7hYW9hYW9h4e9lJSunp6ioaGfoKCgoKCgoaGhoqKhnJyolZWxjo65ioq+i4u8jIy9jIy9jIy9
+ i4u8i4u6kJC2m5uso6OkpaWkpaWlpaWlpaWlo6OkoqKioqKjpKSlpaWmpaWmpaWmo6Oko6Oko6Oko6Oj
+ o6OjpaWmpqanpqanpaWmpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqanpqanpqanpqanpqanpqampaWl
+ paWlpaWlpaWlpaWmpqanpqanpqanpqanpqampKSko6OkpaWlpaWlpaWlpKSko6OkpKSkpaWlpaWlpaWl
+ paWlpaWlpKSlo6Oko6OkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpKSlo6Oko6Oko6Oko6Oko6Ok
+ pKSkpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpqanpqanpqanpqanpqanpqanpqanpqanpqanpqanpqam
+ paWlpaWlpaWlpaWlpaWlpaWlpKSlo6OkpaWlpaWlpaWlpKSlo6OjoqKioqKioqKioqKioqKioqKioqKi
+ oqKio6OhoKClnp6nnJypkZG1g4PFgoLFgYHEgYHCg4PAh4e+jY27j4+5jo65jY28kZG4m5uto6OjpKSh
+ mpqtioq9g4PFhYXDhYXCioq7iYm5hoa4iYm0j4+xjY22hITCgoLDg4PFi4u5lpaqlpauiIi/hITGgoLF
+ gYHEgYHEgoLEgYHCgYHDgoLFjIy7kpK1jY28jY29jIy+kJC4nZ2po6OhnJyplZWxjY28hYXFgoLFgoLC
+ gYHCgIDBgIDBgIDCg4PEhITFhITGhYXEjo65m5uqoqKhn5+imZmplJSvk5OxkpKxk5Oxk5Owj4+viIi2
+ fn7EgIDEg4PFhITGhITGhYXFiIjCk5O2oaGopqajnZ2tjo69g4PGg4PDgYHCgYHCgYHCgIDBgIDBg4O/
+ j4+ylJSxk5OzlpavnJyppKSlpKSlpKSlpqajoaGokJC4goLGgYHFgYHDgYHDgYHBgoK+iYm4iYm8ioq/
+ i4vAi4vAjIy9j4+6mZmuoKCnpKSjn5+pkpK3ioq9iYm+iIi+g4PCgIDEgYHBgYG/IACNjb2MjL6RkbmZ
+ mbGgoKmkpKWlpaWlpaWlpaWlpaWkpKSioqGgoKCbm6eRkbaHh8KDg8aEhMWEhMWEhMaFhcaEhMeHh8SQ
+ kLmamqqgoKKhoaCgoKChoaGioqKioqKcnKmamqmWlq2Pj7WHh72CgsWEhMWEhMaHh8KKir6Li72MjLyS
+ krWfn6ajo6KioqOioqOioqOioqOdnaeQkLOGhsCCgsSDg8ODg8ODg8WEhMWEhMWEhMWGhsKNjbmUlLGe
+ nqSioqCioqKioqKioqKioqKioqOdnaqYmLGTk7eMjL6FhcWDg8aDg8WDg8WGhsOMjLyWlrCdnaegoKKh
+ oaCfn5+enp6goKCWlq+Hh8GCgsiDg8aCgsWDg8WJibyIiL2Ghr6Fhb6GhryOjrSZmaWfn6CgoKCgoKCg
+ oKCgoKCioqCYmK2OjrmLi72Li7yLi72Njb6Njb6Njb6MjL+QkLeamqibm6qhoaWjo6OkpKSlpaWlpaWl
+ paWjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6OioqKjo6SmpqempqempqempqalpaWlpaWjo6Sj
+ o6SkpKWlpaWlpaWlpaWmpqempqempqempqempqempqelpaWlpaWlpaWlpaWlpaampqempqempqempqem
+ pqakpKSjo6SlpaWlpaWlpaWkpKWjo6Sjo6SlpaWmpqempqempqempqalpaWjo6Sjo6SkpKWlpaWlpaWl
+ paWlpaWlpaWlpaWkpKSjo6Sjo6Sjo6Sjo6Sjo6Sjo6Sjo6SkpKSlpaWlpaWlpaWlpaWlpaWlpaWlpaWl
+ paWmpqempqempqempqempqempqempqempqempqempqempqelpaWlpaWlpaWlpaWlpaWlpaWlpaWjo6Sk
+ pKWlpaWlpaWlpaWjo6SioqOioqOioqOioqOioqKioqKioqKioqKioqKjo6GgoKSXl66Li72GhsKDg8KC
+ gsCEhL2Li7ePj7SGhsKEhMaDg8eKisCZma+kpKOkpKOXl6+NjbqKir6Li72KiryJibqJibmGhriGhreG
+ hruEhL+FhcGFhcKHh7+RkbKcnKWbm6aPj7eFhcOCgsaDg8WCgsSCgsSBgcOAgMOHh72MjLuNjb6MjL6M
+ jL6Li7+QkLqcnKukpKCgoKSYmK6MjLuFhcSEhMaDg8WCgsOBgcKAgMGBgcKCgsOEhMWEhMaFhcSRkbef
+ n6ajo6GioqGfn6OYmKuSkrKRkbGRkbGRka+KirZ/f8N/f8GAgMODg8aFhcaEhMeHh8SVlbWamq2hoaam
+ pqKgoKqRkbqFhcaFhcSDg8SBgcSBgcOAgMKBgcCPj7CRkbCRkbOWlq+bm6ubm6qioqOkpKSkpKWlpaSg
+ oKmSkriFhcWDg8WCgsWBgcSDg7+IiLeHh7mDg8KDg8WEhMaHh8SQkLucnK6enqydnauhoaahoaaVlbKJ
+ icCJib6FhcOCgsWBgcSCgsCGhrYgAA==
+
+
+
+
+ AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAADAAADAAAAAwMAAwAAAAMAAwADAwAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
+ AAD///8AiIiIiIiIiIiIiIiIiIiIiPF3F3F3F3F3F3d3d3d3d3jxdxdxdxdxdxd3d3d3d3d49xdxdxdx
+ dxdxd3d3d3d3ePcXcXcXcXcXcXd3d3d3d3jxcXcXcXcXcXcXd3d3d3d48XF3F3F3F3F3F3d3d3d3ePdx
+ F3F3F3F3F3F3d3d3d3j3cRdxdxdxdxdxd3d3d3d49xdxdxdxdxdxdxd3d3d3ePcXcXcXcXcXcXcXd3d3
+ d3jxdxcXcXcXcXcXcXd3d3d48XcXF3F3F3F3F3F3d3d3ePdxdxF3F3F3F3F3F3d3d3j3cXcRdxdxdxdx
+ dxd3d3d49xdxdxdxdxdxdxdxd3d3ePcXcXcXcXcXcXcXcXd3d3jxdxdxcXcXcXcXcXcXd3d48XcXcXF3
+ F3F3F3F3F3d3ePdxdxd3F3F3F3F3F3F3d3j3cXcXdxdxdxdxdxdxd3d49xdxd3dxdxdxdxdxdxd3ePcX
+ cXd3cXcXcXcXcXcXd3jxdxd3d3cXcXcXcXcXcXd48XcXd3d3F3F3F3F3F3F3ePdxd3d3d3F3F3F3F3F3
+ F3j3cXd3d3dxdxdxdxdxdxd49xd3d3d3dxdxdxdxdxdxePcXd3d3d3cXcXcXcXcXcXjxd3d3d3d3cXcX
+ cXcXcXcY8Xd3d3d3d3F3F3F3F3F3GP////////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/AboutBckgnd_370x209.bmp b/PROMS/ReferencedObjects/LibSource/Utils/AboutBckgnd_370x209.bmp
new file mode 100644
index 00000000..21c5ce49
Binary files /dev/null and b/PROMS/ReferencedObjects/LibSource/Utils/AboutBckgnd_370x209.bmp differ
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/Utils/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/CurSet.cs b/PROMS/ReferencedObjects/LibSource/Utils/CurSet.cs
new file mode 100644
index 00000000..801663ac
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/CurSet.cs
@@ -0,0 +1,185 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: CurSet.cs $ $Revision: 2 $
+ * $Author: Jsj $ $Date: 5/17/05 11:51a $
+ *
+ * $History: CurSet.cs $
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 5/17/05 Time: 11:51a
+ * Updated in $/LibSource/Utils
+ * cleanup
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Text;
+using System.Windows.Forms;
+
+namespace Utils
+{
+ ///
+ /// Summary description for CurSet.
+ ///
+ public class CurSet
+ {
+ public string PathName;
+ public string DefaultDestFName; //[MAXPATH]
+ public string DefaultPlantFmt; //[10];
+ public string DefaultPrinter; //[4];
+ public ArrayList DefaultUserCBMsg; //[2][10];
+ public string DefaultUserFmt; //[3];
+ public ArrayList DefPenColors; //[8]
+ public short DefaultChangeBars;
+ public short DefaultDestination;
+ public short DefaultOriginals;
+ public short DefaultPagination;
+ public short DefaultPaperMacro;
+ public short DefaultPlotterType,DefaultPlotterPort,DefaultCIEType;
+ public short DontPrintStatusTree;
+ public short DisableDuplexPrinting;
+
+ private string[] SettingFiles={"..\\procs\\curset.dat", "~curset.dat"};
+
+ public CurSet(string pname)
+ {
+ PathName = pname;
+
+ }
+
+ public bool Create(UserRunTime usrRT)
+ {
+ // find file to copy from procs or system.
+ bool found = false;
+ int i=0;
+ while(found==false)
+ {
+ if (File.Exists(usrRT.ExeAdjust(SettingFiles[i])) == true)
+ found=true;
+ else
+ i++;
+ }
+ if (found==false) return false;
+ File.Copy(usrRT.ExeAdjust(SettingFiles[i]),"curset.dat");
+ PathName = "curset.dat";
+ return true;
+ }
+
+ private string ReadTheString(BinaryReader bw, int maxlen)
+ {
+ StringBuilder retStr = new StringBuilder(maxlen+1);
+ // read a series of characters until a null is found.
+ char ac;
+ bool done = false;
+ while(done==false)
+ {
+ ac = bw.ReadChar();
+ if (ac=='\0')
+ done=true;
+ else
+ retStr.Append(ac);
+ }
+ return retStr.ToString();
+ }
+
+ public bool Read()
+ {
+ BinaryReader br;
+ ArrayList DefaultUserCBMsg = new ArrayList(2);
+ ArrayList DefPenColors = new ArrayList(8);
+ FileStream fs;
+ FileInfo fi = new FileInfo(PathName);
+ try
+ {
+ fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite );
+ br = new BinaryReader(fs,System.Text.ASCIIEncoding.ASCII);
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.ToString(),"CURSET.DAT Error");
+ return false;
+ }
+
+ try
+ {
+ DefaultDestination=br.ReadSByte();
+ DefaultChangeBars= br.ReadSByte();
+ DefaultOriginals=br.ReadSByte();
+ DefaultPagination=br.ReadSByte();
+ DefaultPrinter = ReadTheString(br,4);
+ DefaultPlantFmt = ReadTheString(br,10);
+ DefaultDestFName = ReadTheString(br,128);
+ DefaultPlotterType = br.ReadSByte();
+ DefaultPlotterPort = br.ReadSByte();
+ DefaultCIEType = br.ReadSByte();
+ short tmp;
+ for (int i=0;i<8;i++)
+ {
+ tmp = br.ReadSByte();
+ DefPenColors.Add(tmp);
+ }
+
+ DefaultPaperMacro = br.ReadSByte();
+ string stmp;
+ stmp = ReadTheString(br,10);
+ DefaultUserCBMsg.Add(stmp);
+ stmp = ReadTheString(br,10);
+ DefaultUserCBMsg.Add(stmp);
+ DontPrintStatusTree = br.ReadSByte();
+ DefaultUserFmt = ReadTheString(br,10);
+ DisableDuplexPrinting = br.ReadSByte();
+ br.Close();
+ }
+ catch(Exception e)
+ {
+ if(br!=null) br.Close();
+ }
+ fs.Close();
+ return true;
+ }
+
+ public bool Save(string filename)
+ {
+ // may be a different pathname, if so, change it.
+ if (filename.ToUpper() != PathName.ToUpper()) PathName = filename;
+
+ FileStream fs = new FileStream(PathName, FileMode.Create);
+ BinaryWriter w = new BinaryWriter(fs);
+
+ w.Write(DefaultDestination);
+ w.Write(DefaultChangeBars);
+ w.Write(DefaultOriginals);
+ w.Write(DefaultPagination);
+ w.Write(DefaultPrinter);
+ w.Write(DefaultPlantFmt);
+ w.Write(DefaultDestFName);
+ w.Write(DefaultPlotterType);
+ w.Write(DefaultPlotterPort);
+ w.Write(DefaultCIEType);
+ w.Write((short)DefPenColors[0]);
+ w.Write((short)DefPenColors[1]);
+ w.Write((short)DefPenColors[2]);
+ w.Write((short)DefPenColors[3]);
+ w.Write((short)DefPenColors[4]);
+ w.Write((short)DefPenColors[5]);
+ w.Write((short)DefPenColors[6]);
+ w.Write((short)DefPenColors[7]);
+ w.Write(DefaultPaperMacro);
+ w.Write((string)DefaultUserCBMsg[0]);
+ w.Write((string)DefaultUserCBMsg[1]);
+ w.Write(DontPrintStatusTree);
+ w.Write(DefaultUserFmt);
+ w.Write(DisableDuplexPrinting);
+ w.Close();
+ fs.Close();
+ return true;
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/DTI.cs b/PROMS/ReferencedObjects/LibSource/Utils/DTI.cs
new file mode 100644
index 00000000..c979ef93
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/DTI.cs
@@ -0,0 +1,139 @@
+/*********************************************************************************************
+ * Copyright 2005 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: DTI.cs $ $Revision: 1 $
+ * $Author: Kathy $ $Date: 3/08/05 1:46p $
+ *
+ * $History: DTI.cs $
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 3/08/05 Time: 1:46p
+ * Created in $/LibSource/Utils
+ * Approval
+ *********************************************************************************************/
+using System;
+using System.Text;
+
+
+namespace Utils
+{
+ ///
+ /// Summary description for DTI.
+ ///
+ public class DTI
+ {
+ public static string DateTimeInit;
+ public static string SetDateTimeInit;
+ public static string Initials; // set from the user's run time.
+
+ public static string CurDate(string delim)
+ {
+ DateTime dt = DateTime.Today;
+
+ StringBuilder sdt = new StringBuilder(11);
+ if (delim == null || delim == "") delim = "-";
+ sdt.Append(dt.Month.ToString("D2"));
+ sdt.Append(delim);
+ sdt.Append(dt.Day.ToString("D2"));
+ sdt.Append(delim);
+ sdt.Append(dt.Year.ToString("D2"));
+ return sdt.ToString();
+ }
+
+ public static string CurTime()
+ {
+ DateTime dt = DateTime.Now;
+ StringBuilder sdt = new StringBuilder(11);
+ sdt.Append(dt.Hour.ToString("D2"));
+ sdt.Append(":");
+ sdt.Append(dt.Minute.ToString("D2"));
+ sdt.Append(":");
+ sdt.Append(dt.Second.ToString("D2"));
+ return sdt.ToString();
+ }
+
+ // ovrride == 0 default, don't do anything different
+ // ovrride == 1 means simply override "super"
+ // ovrride == 2 means force a reset of the DTI
+ public static void UpdateDateTimeInit(int ovrride)
+ {
+ StringBuilder ldti = new StringBuilder(19);
+ if (ovrride != 2 && (ovrride!=0 || Initials!="super"))
+ {
+ string tptr = CurDate(null);
+ ldti = new StringBuilder(12);
+ ldti.Insert(0,tptr.Substring(6,4));
+ ldti.Insert(4,tptr.Substring(0,2));
+ ldti.Insert(6,tptr.Substring(3,2));
+ ldti.Insert(8,CurTime().Substring(0,5));
+ ldti.Insert(13,Initials.PadRight(5,' ').Substring(0,5));
+ }
+ else
+ ldti.Insert(0,DTI.SetDateTimeInit);
+
+ // for dbase, replace spaces with '0' in date/time part & shift any non-number
+ // in first time field back to end of time field (?not sure why - this was
+ // done in 16-bit code.
+ for (int i=0;i<13&&ldti[i]!=0;i++) if (ldti[i]==' ') ldti[i]='0';
+ char c = ldti[10];
+ if (!Char.IsDigit(c))
+ {
+ ldti[10]=ldti[11];
+ ldti[11]=ldti[12];
+ ldti[12]=c;
+ }
+
+ if (ldti.ToString().Substring(0,8).Equals("19800101"))
+ {
+ ldti.Insert(0,SetDateTimeInit.Substring(0,13));
+ }
+ DateTimeInit = ldti.ToString();
+ }
+
+ // MakeDate is passed a date in the form of YYYYMMDD and translates it
+ // into MM/DD/YY (if ShortYear is true) or MM/DD/YYYY. condense
+ // removes any leading ' ' or 0 in month or day.
+ public static string MakeDate(string src, bool condense, bool ShortYear)
+ {
+ int[] DateOffset={4,5,47,6,7,47,2,3}; // 47 = '/'
+ StringBuilder datebuff = new StringBuilder(12);
+ for (int i=0; i
+ /// Summary description for DirSpace.
+ ///
+ public class DirSpace
+ {
+ static DirSpace()
+ {
+ }
+
+ [DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
+ public static extern bool GetDiskFreeSpaceEx(
+ [MarshalAs(UnmanagedType.LPTStr)] string lpDirectoryName,
+ ref long lpFreeBytesAvailable,
+ ref long lpTotalNumberOfBytes,
+ ref long lpTotalNumberOfFreeBytes);
+
+ public static long Free()
+ {
+ string curdir = Environment.CurrentDirectory;
+ long freeBytes = new long();
+ long totalFreeBytes = new long();
+ long totalBytes = new long();
+
+ bool x = GetDiskFreeSpaceEx(curdir, ref freeBytes, ref totalFreeBytes, ref
+ totalBytes);
+ return totalFreeBytes;
+ }
+
+ private static long DirSize(DirectoryInfo d)
+ {
+ long Size = 0;
+ // Add file sizes.
+ FileInfo[] fis = d.GetFiles();
+ foreach (FileInfo fi in fis)
+ {
+ Size += fi.Length;
+ }
+ // Add subdirectory sizes.
+ DirectoryInfo[] dis = d.GetDirectories();
+ foreach (DirectoryInfo di in dis)
+ {
+ Size += DirSize(di);
+ }
+ return(Size);
+ }
+
+ public static long Get(string TheDirectory)
+ {
+ DirectoryInfo d = new DirectoryInfo(TheDirectory);
+ return DirSize(d);
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/FmtFiles.cs b/PROMS/ReferencedObjects/LibSource/Utils/FmtFiles.cs
new file mode 100644
index 00000000..3a19b53a
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/FmtFiles.cs
@@ -0,0 +1,75 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: FmtFiles.cs $ $Revision: 2 $
+ * $Author: Jsj $ $Date: 5/17/05 11:51a $
+ *
+ * $History: FmtFiles.cs $
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 5/17/05 Time: 11:51a
+ * Updated in $/LibSource/Utils
+ * cleanup
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.IO;
+using System.Windows.Forms;
+
+namespace Utils
+{
+ ///
+ /// Summary description for FmtFiles.
+ ///
+ public class FmtFile
+ {
+ public string FmtFileName;
+ public FmtFile(string fname)
+ {
+ if (fname.IndexOf(".fmt",0) > -1)
+ FmtFileName = fname;
+ else
+ FmtFileName = fname + ".fmt";
+ }
+
+ public string GetFormatTitle(UserRunTime usrRT)
+ {
+ string fmtpath = usrRT.syspath + "\\format\\" + FmtFileName;
+ FileStream fs;
+ FileInfo fi = new FileInfo(fmtpath);
+ try
+ {
+ fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite );
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.ToString(),"Format File Read Error");
+ return null;
+ }
+
+ BinaryReader bw = new BinaryReader(fs,System.Text.ASCIIEncoding.ASCII);
+
+ ushort len;
+ len = bw.ReadUInt16();
+ string retTitle = null;
+ if (len > 1)
+ retTitle = new string(bw.ReadChars(len-1)); // -1: remove the null
+ else
+ retTitle = "Format not found";
+
+ return retTitle;
+ }
+ }
+
+ public class DocFile
+ {
+ public DocFile()
+ {
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/MenuXML.cs b/PROMS/ReferencedObjects/LibSource/Utils/MenuXML.cs
new file mode 100644
index 00000000..f2e8ca95
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/MenuXML.cs
@@ -0,0 +1,58 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: MenuXML.cs $ $Revision: 2 $
+ * $Author: Jsj $ $Date: 5/17/05 11:52a $
+ *
+ * $History: MenuXML.cs $
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 5/17/05 Time: 11:52a
+ * Updated in $/LibSource/Utils
+ * cleanup
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.Xml;
+using System.IO;
+using System.Windows.Forms;
+
+namespace Utils
+{
+ ///
+ /// This class reads in an xml menu file, as input and creates an XmlDocument from it.
+ ///
+ public class MenuXML
+ {
+ private string menuFileName;
+ private XmlDocument xmlDoc;
+ public MenuXML(string fn)
+ {
+ menuFileName = fn;
+ try
+ {
+ xmlDoc = new XmlDocument();
+ XmlTextReader reader = new XmlTextReader(fn);
+ xmlDoc.Load(reader);
+ reader.Close();
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message.ToString(),"XML Menu Error");
+
+ }
+
+ }
+
+ public XmlDocument GetXmlDoc()
+ {
+ return xmlDoc;
+ }
+
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/PrivateProfile.cs b/PROMS/ReferencedObjects/LibSource/Utils/PrivateProfile.cs
new file mode 100644
index 00000000..a6994172
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/PrivateProfile.cs
@@ -0,0 +1,256 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: PrivateProfile.cs $ $Revision: 1 $
+ * $Author: Kathy $ $Date: 7/27/04 8:34a $
+ *
+ * $History: PrivateProfile.cs $
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.IO;
+using System.Xml;
+namespace Utils
+{
+ ///
+ /// PrivateProfile opens a private profile string and stores it's contents in an xml document.
+ ///
+ public class PrivateProfile
+ {
+ private string ppName;
+ private XmlDocument ppXml;
+ private XmlNode AddNode(XmlNode xParent, string sName, string sValue )
+ {
+ XmlNode nd;
+ // Add a node
+ nd=xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Element,sName,"");
+ xParent.AppendChild(nd);
+ nd.Value=sValue;
+ return nd;
+ }
+ private XmlNode AddNode(XmlNode xParent, string sName)
+ {
+ XmlNode nd;
+ // Add a node
+ nd=xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Element,sName,"");
+ xParent.AppendChild(nd);
+ return nd;
+ }
+ private void AddAttribute(XmlNode xParent, string sName, string sValue )
+ {
+ XmlNode xa=xParent.Attributes.GetNamedItem(sName);
+ // bug fix. 09/15/03
+ // If there was a space after an equal sign, that space character
+ // was becomming part of the value string (reading the user.CFG file).
+ // This was giving us a "Must have semi-colon" error message.
+ // We now strip spaces before and after any Attribute that is written.
+ sValue = sValue.Trim(' ');
+
+ // Add an attribute
+ if(sValue=="")
+ {
+ if(xa != null)
+ {
+ xParent.Attributes.RemoveNamedItem(sName);
+ }
+ }
+ else
+ {
+ if(xa == null)
+ {
+ xa = xParent.OwnerDocument.CreateNode(System.Xml.XmlNodeType.Attribute ,sName,"");
+ xParent.Attributes.SetNamedItem(xa);
+ }
+ xa.Value=sValue;
+ }
+
+ }
+ private XmlNode AddSection(XmlNode xParent, string sSection )
+ {
+ // Add a section [name]
+ XmlNode nd =AddNode(xParent,"section");
+ AddAttribute(nd,"name",sSection.Substring(1,sSection.IndexOf("]")-1));
+ return nd;
+ }
+ private XmlNode AddSection_UC(XmlNode xParent, string sSection )
+ {
+ // Add a section [name]
+ string name_uc = sSection.Substring(1,sSection.IndexOf("]")-1).ToUpper() + "__UC";
+ XmlNode nd =AddNode(xParent,"sectionUC");
+ AddAttribute(nd,"name",name_uc);
+ return nd;
+ }
+ private void AddComment(XmlNode xParent, string sComment)
+ {
+
+ if(xParent.ChildNodes.Count > 0)
+ {
+ XmlNode ndlast=xParent.ChildNodes.Item(xParent.ChildNodes.Count-1);
+ if(ndlast.Name=="comment")
+ {
+ XmlNode xa = ndlast.Attributes.GetNamedItem("text");
+ xa.Value=xa.Value + "\r\n" + sComment;
+ return;
+ }
+ }
+ // Add a comment text
+ XmlNode nd =AddNode(xParent,"comment");
+ AddAttribute(nd,"text",sComment);
+ }
+ private void AddLine(XmlNode xParent, string sLine)
+ {
+ // Add a comment text
+ XmlNode nd =AddNode(xParent,"line");
+ AddAttribute(nd,"text",sLine);
+ }
+ private void AddParam(XmlNode xParent, string sParam)
+ {
+ int i = sParam.IndexOf("=");
+ // add a param name=value
+ string sName=sParam.Substring(0,i);
+ string sValue=sParam.Substring(i+1);
+ XmlNode nd =AddNode(xParent,"param");
+ sName = sName.Trim(' ');
+ AddAttribute(nd,"name",sName);
+ AddAttribute(nd,"value",sValue);
+// AddAttribute(nd,"srchname",sName.ToUpper()+"__UC");
+// AddAttribute(nd,"value",sValue);
+ }
+ private void AddParam_UC(XmlNode xParent, string sParam)
+ {
+ int i = sParam.IndexOf("=");
+ // add a param name=value
+ string sName=sParam.Substring(0,i);
+ string sValue=sParam.Substring(i+1);
+ XmlNode nd =AddNode(xParent,"paramUC");
+ sName = sName.Trim(' ');
+ AddAttribute(nd,"name",sName.ToUpper()+"__UC");
+ AddAttribute(nd,"value",sValue);
+ }
+ private void LoadXML()
+ {
+ string sLine;
+ ppXml.LoadXml("");// initialize ppXml
+ XmlNode xmlTop=ppXml.DocumentElement;
+ XmlNode xmlNd=ppXml.DocumentElement;
+ XmlNode xmlNd_UC=ppXml.DocumentElement;
+ StreamReader myReader = new StreamReader(ppName);// Open file
+ while( (sLine = myReader.ReadLine())!= null)// read line-by-line
+ {
+ // add structure
+ if(sLine.Length > 0)
+ {
+ switch (sLine.Substring(0,1))
+ {
+ case "[":
+ xmlNd=AddSection(xmlTop, sLine);
+ xmlNd_UC=AddSection_UC(xmlTop, sLine);
+ break;
+ case ";":
+ AddComment(xmlNd, sLine);
+ break;
+ default:
+ if(sLine.IndexOf("=") >= 0)
+ {
+ AddParam(xmlNd, sLine);
+ AddParam_UC(xmlNd_UC, sLine);
+ }
+ else
+ {
+ AddLine(xmlNd, sLine);
+ }
+ break;
+ }
+ }
+ }
+ myReader.Close();
+ // close file
+ }
+ public PrivateProfile(string sFileName)
+ {
+ ppName=sFileName; // Store file name
+ ppXml= new XmlDocument();// Allocate XML
+ LoadXML();// Load XML
+ }
+ ~PrivateProfile()
+ {
+ // Clean-up
+ //
+ }
+ public string PrettyNode(XmlNode nd,int level)
+ {
+ string retval="";
+ string prefix=new string(' ',level*2);
+ if(nd.ChildNodes.Count > 0)
+ {
+ retval = prefix + "<" + nd.Name;
+ for(int i=0;i";
+ for(int i=0;i";
+ }
+ else
+ {
+ retval = prefix + "<" + nd.Name;
+ for(int i=0;i";
+ }
+ return retval;
+ }
+ public string PrettyXML()
+ {
+ return PrettyNode(ppXml.DocumentElement,0);
+ }
+ public XmlDocument XML()
+ {
+ // return XML Document
+ return ppXml;
+ }
+ public override string ToString()
+ {
+ // return string
+ return "";
+ }
+ public void Save()
+ {
+ SaveAs(ppName);
+ }
+ public void SaveAs(string sName)
+ {
+ }
+ public string Attr(string sPath)
+ {
+ string retval="";
+ XmlNode xn = ppXml.SelectSingleNode(sPath);
+ if(xn != null)
+ {
+ string quots = xn.Value;
+ if (quots.Substring(0,1)=="\"" && quots.Substring(quots.Length-1,1)=="\"")
+ retval = quots.Substring(1,quots.Length-2);
+ else
+ retval=xn.Value;
+ }
+ return retval;
+ }
+
+ public string Attr(string sSection, string sParameter)
+ {
+ string findstr = "/ini/sectionUC[@name='" + sSection.ToUpper() + "__UC']/paramUC[@name='" + sParameter.ToUpper() + "__UC']/@value";
+ return Attr(findstr);
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/Security.cs b/PROMS/ReferencedObjects/LibSource/Utils/Security.cs
new file mode 100644
index 00000000..30942424
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/Security.cs
@@ -0,0 +1,622 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: Security.cs $ $Revision: 4 $
+ * $Author: Jsj $ $Date: 5/17/05 11:52a $
+ *
+ * $History: Security.cs $
+ *
+ * ***************** Version 4 *****************
+ * User: Jsj Date: 5/17/05 Time: 11:52a
+ * Updated in $/LibSource/Utils
+ * cleanup
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 1/24/05 Time: 2:44p
+ * Updated in $/LibSource/Utils
+ * B2005-004 fixes
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 1/14/05 Time: 10:38a
+ * Updated in $/LibSource/Utils
+ * B2004-061: fix security options
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.IO;
+using System.Collections;
+using System.Windows.Forms;
+using System.Text;
+
+namespace Utils
+{
+ ///
+ /// Summary description for Security.
+ ///
+ public class Security
+ {
+ public const long VIEW =0x00000001L;
+ public const long PRINT =0x00000002L;
+ public const long PRINTDRAFT =0x00000004L;
+ public const long PRINTCHANGES =0x00000008L;
+ public const long EDIT =0x00000010L;
+ public const long SEARCH =0x00000020L;
+ public const long STANDARDSTEPS =0x00000040L;
+ public const long APPROVE =0x00000080L;
+ public const long APPROVESINGLE =0x00000100L;
+ public const long LIBRARYDOCS =0x00000200L;
+ public const long ADDMODDEL =0x00000400L;
+ public const long CLEAN =0x00000800L;
+ public const long LOCKPROC =0x00001000L;
+ public const long LOCKSET =0x00000001L;
+ public const long UCF =0x00000002L;
+ public const long LOCKSYSTEM =0x00000001L;
+ public const long DOCMAINT =0x00000002L;
+ public const long ROEDITOR =0x00000004L;
+ public const long SYSADMIN =0x00000008L;
+
+ public const int SUPERUSER =1000;
+ public const long SUPERACCESS =0xFFFFFFFFL;
+
+ // the following four flags are system security options,
+ // read in for the user from the security file (vesam.opt)
+ private bool BlockAccessFlag=false;
+ public bool PermissionToManageFlag=false;
+ public bool SystemAdminFlag=false;
+ public bool PermissionToLockFlag=false;
+
+// private string optFileName;
+ private int numsets = 0;
+ private long uoptions; // user options
+ private Int16 blockAccess = 0;
+ private long oldpos;
+ public int userid = -1;
+// private int plantid = -1;
+// private int procid = -1;
+ private string ident;
+ public string initials;
+ private const string samoptname = "vesam.opt";
+ public string optfilename;
+ private ArrayList psets; //
+ public FileStream fs;
+ public BinaryReader bw;
+ public bool isDemoMode=false;
+
+ public Security(string pathname)
+ {
+ if (File.Exists(pathname + "\\" + samoptname) == false)
+ {
+ MessageBox.Show("Could not locate the Security Options file:\n\n" + pathname+"\\"+samoptname,"Security Access Error");
+ optfilename = null;
+ return;
+ }
+ optfilename = pathname + "\\" + samoptname;
+ psets = new ArrayList();
+ }
+
+ public bool OpenFile()
+ {
+ try
+ {
+ fs = new FileStream(optfilename,FileMode.Open,FileAccess.Read,FileShare.Read,1,false);
+ bw = new BinaryReader(fs);
+ return true;
+ }
+ catch (Exception e)
+ {
+ MessageBox.Show(e.Message,"Security File");
+ return false;
+ }
+ }
+
+ public void CloseFile()
+ {
+ bw.Close();
+ fs.Close();
+ bw=null;
+ fs=null;
+ }
+
+ public int CheckUserId(string Name, string Pass)
+ {
+ // check for default superuser username/password.
+ if ((Name=="vlnmsp") && (Pass=="575"))
+ {
+ userid = SUPERUSER;
+ ident = "vlnmsp";
+ initials = Name;
+ return userid;
+ }
+
+ if (bw==null)
+ {
+ bool op;
+ if ((op = OpenFile()) == false) return -1;
+ }
+ byte x;
+ // read past some header stuff.
+ for (int jj=0;jj<16;jj++)
+ x=bw.ReadByte();
+ long nxtUs;
+ uint nmUser;
+ nxtUs=bw.ReadUInt32();
+ nmUser=bw.ReadUInt16();
+
+ int uid, tmp;
+ string fName, fPass;
+ for (int i = 0; i < nmUser; i++)
+ {
+ fs.Seek((long)nxtUs,SeekOrigin.Begin);
+ nxtUs=bw.ReadUInt32();
+ uid = bw.ReadUInt16();
+ tmp = bw.ReadUInt16();
+ byte [] test = new byte[10];
+ test = bw.ReadBytes(10);
+ fName = Encoding.ASCII.GetString(test,0,10);
+ int indx = fName.IndexOf("\0");
+ string fNameTrim = fName.Substring(0,indx);
+ if (fNameTrim == Name)
+ {
+ test = bw.ReadBytes(10);
+ fPass = Encoding.ASCII.GetString(test,0,10);
+ indx = fPass.IndexOf("\0");
+ string fPassTrim = fPass.Substring(0,indx);
+ if (fPassTrim == Pass)
+ {
+ userid = uid;
+ ident = Name;
+ initials = Name;
+ break;
+ }
+ }
+ }
+ CloseFile();
+
+ return userid;
+ }
+
+ public void SetUserSystemRights()
+ {
+ BlockAccessFlag=BlockAccess();
+ long userAccessFlags=GetUserSecurity();
+ PermissionToManageFlag=(userAccessFlags&Security.DOCMAINT)==0?false:true;
+ PermissionToLockFlag=(userAccessFlags&Security.LOCKSYSTEM)==0?false:true;
+ SystemAdminFlag=(userAccessFlags&Security.SYSADMIN)==0?false:true;
+ }
+
+ public void LoadUserSecurity()
+ {
+ //
+ // get the system level security options for this user here
+ //
+ bool op = OpenFile();
+ if (op==false) return;
+
+ if( userid == 1000 )
+ { // super user priviledge
+ uoptions = 0xFFFFFFFFL;
+ SetUserSystemRights();
+ CloseFile();
+ return;
+ }
+
+ fs.Seek(32,SeekOrigin.Begin);
+ blockAccess=bw.ReadInt16();
+
+ fs.Seek(0,SeekOrigin.Begin);
+ byte x;
+ // read past some header stuff.
+ for (int jj=0;jj<16;jj++)
+ x=bw.ReadByte();
+
+ long nxtUs;
+ uint nmUser;
+ nxtUs=bw.ReadUInt32();
+ nmUser=bw.ReadUInt16();
+
+ int uid;
+ for (int i = 0; i < nmUser; i++)
+ {
+ oldpos = nxtUs;
+ fs.Seek((long)nxtUs,SeekOrigin.Begin);
+ nxtUs=bw.ReadUInt32();
+ uid = bw.ReadUInt16();
+ if (uid == userid)
+ {
+ string junk = new string (bw.ReadChars(22));
+ uoptions=bw.ReadUInt16();
+ break;
+ }
+ }
+ SetUserSystemRights();
+ CloseFile();
+ }
+
+ public void SetUpDemoMode()
+ {
+ userid=Security.SUPERUSER; // super user so that demo data can be anywhere (doesn't check vesamp.opt)
+ ident="demo";
+ initials="demo";
+ isDemoMode = true;
+ }
+ public int GetPlantSecurityIndex(string Location)
+ {
+ for (int i=0;ipsets.Count-1)return false;
+ SecurityPlantSets sps = (SecurityPlantSets) psets[idx];
+ return sps.HasSecurity;
+ }
+
+ public bool ProcSetHasSecurity(int idx, string procset)
+ {
+ if (userid == SUPERUSER) return true;
+ if (idx<0 || idx>psets.Count-1)return false;
+ SecurityPlantSets sps = (SecurityPlantSets) psets[idx];
+ return sps.ProcSetHasSecurity(procset);
+ }
+
+ public long GetPlantSecurity(int idx)
+ {
+ if(userid == SUPERUSER ) return SUPERACCESS;
+ if (idx<0 || idx>psets.Count-1) return 0L;
+ SecurityPlantSets sps = (SecurityPlantSets) psets[idx];
+ return (sps.GetSecurity());
+ }
+
+ public bool AnyOptionsSet(int idx)
+ {
+ if(userid==SUPERUSER) return true;
+ if (idx<0 || idx>psets.Count-1) return false;
+ SecurityPlantSets sps = (SecurityPlantSets) psets[idx];
+ return sps.AnyOptionsSet();
+ }
+
+ public long GetUserSecurity()
+ {
+ if(userid == SUPERUSER) return SUPERACCESS;
+ return(uoptions);
+ }
+
+ public bool BlockAccess()
+ {
+ if (userid == SUPERUSER) return false;
+ if(blockAccess!=0) return true;
+ return false;
+ }
+
+ public bool IsAllowed(long mask)
+ {
+ if(userid == SUPERUSER) return true;
+ return (uoptions&mask) != 0;
+ }
+
+ public bool IsAllowed(string plantpath, string procpath, long mask)
+ {
+ bool retval = false;
+ if(userid == SUPERUSER) return true;
+ for(int i=0; i0)
+ procs = new ArrayList(numopts);
+ else
+ procs = null;
+ for(int i=0;i
+ /// Summary description for SerialNo.
+ ///
+ public class SerialNo
+ {
+ private string sernofile;
+ public int SerialNum;
+ private string SerialNumTitle;
+ private static byte sum =0xcf;// used in serial number code (nextchar)
+
+ public enum SN_Flags
+ {
+ SN_NETWORK_ON =0x0001,
+ SN_BACKGROUND_ON =0x0002,
+ SN_DEVIATION_ON =0x0004,
+ SN_CHECKLISTEXPORT_ON =0x0008,
+ SN_REVISIONFUNCTION_ON =0x0010,
+ SN_ONLYAPPROVEONCE_ON =0x0020,
+ SN_BGEPLANTWIDEOPT_ON =0x0040,
+ SN_REVISESTRIPPC_ON =0x0080,
+ SN_PROCCOMMENT_ON =0x0400,
+ SN_REMOVECHGID_ON =0x0800,
+ SN_OPTIONALACCEDIT_ON =0x1000,
+ SN_TEMPCHANGE_ON =0X2000,
+ SN_VOLIANONLY_ON =0x8000
+ };
+
+ public SN_Flags[] SerialNumberOptionsByPlant=
+ {
+ /* 0 Volian Enterprises, Inc. */ (SN_Flags)0xFFFF,
+ /* 1 Entergy Nuclear Northeast - Indian Point Unit 2 */ SN_Flags.SN_BACKGROUND_ON|SN_Flags.SN_NETWORK_ON,
+ /* 2 Virginia Power - Surry (1A) */ SN_Flags.SN_NETWORK_ON,
+ /* 3 Virginia Power - North Anna */ SN_Flags.SN_DEVIATION_ON|SN_Flags.SN_NETWORK_ON,
+ /* 4 Northern States Power - Prairie Island */ SN_Flags.SN_DEVIATION_ON,
+ /* 5 American Electric Power - D. C. Cook - AOPs */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON,
+ /* 6 Wisconsin Electric Power - Point Beach */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON,
+ /* 7 Rochester Gas and Electric Corp. - Ginna */ SN_Flags.SN_BACKGROUND_ON,
+ /* 8 TUEC - Comanche Peak */ 0,
+ /* 9 Entergy Nuclear Northeast - Indian Point Unit 3 */ SN_Flags.SN_BACKGROUND_ON|SN_Flags.SN_NETWORK_ON,
+ /*10 Maine Yankee Atomic Power Company - Maine Yankee */ 0,
+ /*11 Yankee Atomic Electric - Yankee Rowe */ 0,
+ /*12 Wisconsin Public Service Corp.- Kewaunee */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON,
+ /*13 Wisconsin Public Service Corp.- Kewaunee Operating Procedures*/ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON,
+ /*14 South Carolina Gas and Electric - V.C. Summer */ 0,
+ /*15 Louisiana Power and Light - Waterford */ 0,
+ /*16 Pacific Gas and Electric - Diablo Canyon */ SN_Flags.SN_OPTIONALACCEDIT_ON,
+ /*17 Southern California Edison - San Onofre */ 0,
+ /*18 Carolina Power and Light - Robinson */ SN_Flags.SN_NETWORK_ON,/*|SN_BACKGROUND_ON|SN_DEVIATION_ON, */
+ /*19 Arkansas Nuclear One - Unit 1 */ 0,
+ /*20 Arkansas Nuclear One - Unit 2 */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_ONLYAPPROVEONCE_ON|SN_Flags.SN_REVISIONFUNCTION_ON|SN_Flags.SN_REVISESTRIPPC_ON|SN_Flags.SN_PROCCOMMENT_ON,
+ /*21 Southern Nuclear Operating Company - Vogtle */ SN_Flags.SN_BACKGROUND_ON|SN_Flags.SN_DEVIATION_ON,
+ /*22 Florida Power and Light - Turkey Point (Unit 3) */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_DEVIATION_ON|SN_Flags.SN_BACKGROUND_ON,
+ /*23 Houston Lighting & Power Company - South Texas */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON,
+ /*24 Carolina Power & Light - Shearon Harris */ 0,
+ /*25 Virginia Power - EPIP */ SN_Flags.SN_NETWORK_ON,
+ /*26 Wolf Creek Nuclear Operating Corp. - Wolf Creek */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON|SN_Flags.SN_OPTIONALACCEDIT_ON|SN_Flags.SN_TEMPCHANGE_ON|SN_Flags.SN_CHECKLISTEXPORT_ON,
+ /*27 Duke Power - Catawba */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON|SN_Flags.SN_DEVIATION_ON,
+ /*28 Duke Power - McGuire */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON|SN_Flags.SN_DEVIATION_ON,
+ /*29 Exelon Nuclear - Braidwood */ SN_Flags.SN_NETWORK_ON | SN_Flags.SN_BACKGROUND_ON | SN_Flags.SN_DEVIATION_ON,
+ /*30 Exelon Nuclear - Byron */ SN_Flags.SN_NETWORK_ON | SN_Flags.SN_BACKGROUND_ON | SN_Flags.SN_DEVIATION_ON,
+ /*31 Virginia Power - Innsbrook */ SN_Flags.SN_NETWORK_ON,
+ /*32 Constellation Energy Group - Calvert Cliffs */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_REVISIONFUNCTION_ON|SN_Flags.SN_ONLYAPPROVEONCE_ON|SN_Flags.SN_BGEPLANTWIDEOPT_ON|SN_Flags.SN_OPTIONALACCEDIT_ON|SN_Flags.SN_REMOVECHGID_ON,
+ /*33 American Electric Power - D. C. Cook - EOPs */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON,
+ /*34 American Electric Power - D. C. Cook - Training */ 0,
+ /*35 North Atlantic Energy Service Corp. - Seabrook Nuclear Plant */ SN_Flags.SN_TEMPCHANGE_ON,
+ /*36 Entergy - River Bend Nuclear Station */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_REVISIONFUNCTION_ON,
+ /*37 Southern Nuclear Operating Company - Farley Nuclear Plant */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON|SN_Flags.SN_DEVIATION_ON,
+ /*38 AmerenUE - Callaway Plant */ SN_Flags.SN_NETWORK_ON|SN_Flags.SN_BACKGROUND_ON
+ };
+
+ public SerialNo(string isernofile,string ucfgpath, UserRunTime usrRT, bool DemoMode)
+ {
+ sernofile = isernofile;
+ PrivateProfile ppCfg;
+ string sn;
+// byte xor=0xCF;
+ ppCfg = new PrivateProfile(ucfgpath);
+ // sn=ppCfg.Attr("/ini/section[@name='override']/param[@name='SN']/@value");
+ sn=ppCfg.Attr("override","SN");
+ if (sn!=null && sn!="")
+ {
+ int indx = 0;
+ if ((indx = sn.IndexOf(";",0,sn.Length))>0)
+ SerialNum=System.Convert.ToInt32(sn.Substring(0,indx));
+ else
+ SerialNum=System.Convert.ToInt32(sn);
+ if (SerialNum>SerialNumberOptionsByPlant.Length)
+ {
+ MessageBox.Show("Serial number in " + ucfgpath + " is invalid. Demo mode will be used","VE-PROMS");
+ SerialNum=-1;
+ }
+ SerialNumTitle="Override";
+ return;
+ }
+
+ ppCfg=null;
+ SerialNum = -1;
+ if (DemoMode || !File.Exists(usrRT.ExeAdjust(sernofile)))
+ {
+ // no serial number file, put into demo mode.
+ SerialNumTitle = "Demo Mode";
+ // MessageBox.Show("No Serial Number. Defaulting to Working Demo Mode.\n\nTo purchase VE-PROMS, contact Volian Enterorices Inc.\n\nPhone: (724) 335-3744\n\nEmail: VEPROMS@VOLIAN.COM\n\nSerial Number Warning");
+ if (DemoMode)
+ {
+ MessageBox.Show("Thank you for trying our VE-PROMS Working Demo.\n\n"+
+ "To purchase VE-PROMS, contact Volian Enterprises, Inc.\n\n"+
+ "Phone: (724) 335-3744\n\n"+
+ "Email: VolianEnterprises@volian.com",
+ "VE-PROMS Working Demo");
+ }
+ else
+ {
+ MessageBox.Show("No Serial Number. Defaulting to Working Demo Mode.\n\n"+
+ "To purchase VE-PROMS, contact Volian Enterprises, Inc.\n\n"+
+ "Phone: (724) 335-3744\n\n"+
+ "Email: VolianEnterprises@volian.com",
+ "Serial Number Warning");
+ }
+ return;
+ }
+
+ // open file & read in serial number
+ int i;
+ byte j;
+ FileStream fssn = null;
+ BinaryReader brsn = null;
+ byte xor=0xCF;
+// sum=0xcf;
+ try
+ {
+ fssn = new FileStream(usrRT.ExeAdjust(sernofile),FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
+ brsn = new BinaryReader(fssn);
+ int length = (int)fssn.Length-1024;
+ for (i=0;i<1024;i++)
+ {
+ j = nextchar(brsn);
+ xor ^= (byte)j;
+ if (j==0xCF)
+ {
+ if (SerialNum != -1) return;
+ SerialNum=i;
+ }
+ }
+ if (SerialNum == -1)
+ {
+ SerialNumTitle = "Demo Mode";
+// MessageBox.Show("No Serial Number. Defaulting to Working Demo Mode.\n\nTo purchase VE-PROMS, contact Volian Enterorices Inc.\n\nPhone: (724) 335-3744\n\nEmail: VEPROMS@VOLIAN.COM\n\nSerial Number Warning","VE-PROMS");
+ MessageBox.Show("No Serial Number. Defaulting to Working Demo Mode.\n\n"+
+ "To purchase VE-PROMS, contact Volian Enterprises, Inc.\n\n"+
+ "Phone: (724) 335-3744\n\n"+
+ "Email: VolianEnterprises@volian.com",
+ "Serial Number Warning");
+ return;
+ }
+ // Just read past this byte. At this point we already
+ // have a serial number. We now just want to get the
+ // description text (usually plant/utility name) associated
+ // with the serial number.
+ j = nextchar(brsn);
+//
+// This was always failing. Could not find a reason why. Appears that
+// the Exclusive OR arithmatic is a little different in .NET. The
+// nextchar() funtion seems to be returning the correct values.
+//
+// if (j!=xor)
+// {
+// if (brsn!=null) brsn.Close();
+// if (fssn!=null) fssn.Close();
+// return;
+// }
+ char [] title = new char[length];
+ i=0;
+ while((--length) > 0 && (j=nextchar(brsn))!=0xFF)
+ {
+ title[i++] = (char)j;
+ }
+ SerialNumTitle = new string(title);
+ // remove the serial number at the beginning of the title
+ // - we didn't need to do this - jsj 7/18/2006
+// SerialNumTitle = SerialNumTitle.Substring(SerialNumTitle.IndexOf(' ')+1);
+ }
+ catch(Exception e)
+ {
+ MessageBox.Show(e.Message,"Serial Number Error");
+ return;
+ }
+ if (brsn!=null) brsn.Close();
+ if (fssn!=null) fssn.Close();
+ }
+
+ private byte nextchar(BinaryReader br)
+ {
+ byte retval = 0xFF; // unsigned -1
+ try
+ {
+ byte nxt;
+ retval = br.ReadByte();
+ if(retval != 0xFF)
+ {
+ nxt=retval;
+ retval=(byte)((nxt-sum) & 0xFF);
+ sum=(byte)(((nxt<<1) & 0xFE) | ((nxt>>7) & 0x1));
+ }
+ }
+ catch(Exception e)
+ {
+// MessageBox.Show(e.Message);
+ return retval;
+ }
+
+ return retval;
+ }
+
+ public uint GetSNOption(uint a)
+ {
+ if (SerialNum == -1)
+ return 0;
+ else
+ return ((uint)SerialNumberOptionsByPlant[SerialNum]&(uint)a);
+ }
+
+ public string SerialNumberString
+ {
+ get
+ {
+ string rtnstr = "";
+ if (SerialNum == -1) // demo
+ rtnstr = "Thank you for trying VE-PROMS";
+ else
+ rtnstr = "Serial Number: " + SerialNum.ToString();
+
+ return rtnstr;
+ }
+ }
+
+ public string SerialNumberTitleString
+ {
+ get
+ {
+ return SerialNumTitle;
+ }
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/ShrtNm.cs b/PROMS/ReferencedObjects/LibSource/Utils/ShrtNm.cs
new file mode 100644
index 00000000..44c83100
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/ShrtNm.cs
@@ -0,0 +1,51 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: ShrtNm.cs $ $Revision: 1 $
+ * $Author: Kathy $ $Date: 7/27/04 8:34a $
+ *
+ * $History: ShrtNm.cs $
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.ComponentModel;
+
+namespace Utils
+{
+ ///
+ /// Summary description for ShrtNm.
+ ///
+ public class ShortName
+ {
+ [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
+ [return:MarshalAs(UnmanagedType.U4)]
+ public static extern int GetShortPathName(
+ [MarshalAs(UnmanagedType.LPTStr)] string lpszLongPath,
+ [MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszShortPath,
+ [MarshalAs(UnmanagedType.U4)] int cchBuffer);
+
+ private string _LongFileName;
+ private StringBuilder _ShortFileName;
+
+ public ShortName(string longname)
+ {
+ _LongFileName = longname;
+ _ShortFileName = new StringBuilder(256);
+ int len = GetShortPathName(_LongFileName,_ShortFileName,256);
+ if (len==256) _ShortFileName=null;
+ if (len==0) _ShortFileName.Append(longname);
+ }
+
+ [Description("FileName")]public string ShortFileName
+ {
+ get{return _ShortFileName.ToString();}
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/SymbDlg.cs b/PROMS/ReferencedObjects/LibSource/Utils/SymbDlg.cs
new file mode 100644
index 00000000..716f7e24
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/SymbDlg.cs
@@ -0,0 +1,214 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: SymbDlg.cs $ $Revision: 1 $
+ * $Author: Kathy $ $Date: 7/27/04 8:34a $
+ *
+ * $History: SymbDlg.cs $
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.Text;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace Utils
+{
+ ///
+ /// Summary description for SymbDlg.
+ ///
+ public class SymbDlg : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.TabControl tbctlSymbol;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private ListBox symlistbox;
+ public SymbolListB SymList1;
+ public string ReturnText;
+ private int NumItems;
+ private System.Windows.Forms.TextBox tbValue;
+ private System.Windows.Forms.Button btnOK;
+ private System.Windows.Forms.Button btnCancel;
+ public GridItem gridItem;
+ private string[] SymbolFonts = {"VESymb","Courier New","VolianDraw"};
+
+ public SymbDlg(SymbolListB symb, GridItem grditm)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ ReturnText=null;
+ gridItem = grditm;
+
+ SymList1 = symb;
+ NumItems = symb.SymbolListStrings.Length;
+ InitializeComponent();
+
+ DoListTabPage();
+ DoGridTabPage();
+
+ if (gridItem!=null)
+ {
+ tbValue.Text = (string) gridItem.Value;
+ tbValue.Visible = true;
+ }
+ else
+ tbValue.Visible = false;
+ }
+
+ private void DoGridTabPage()
+ {
+ //TabPage gridTabPage = new TabPage("Grid");
+ //tbctlSymbol.TabPages.Add(gridTabPage);
+ }
+
+ private void symlistbox_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
+ {
+ // Set the DrawMode property to draw fixed sized items.
+ symlistbox.DrawMode = DrawMode.OwnerDrawFixed;
+
+ // Draw the background of the ListBox control for each item.
+ e.DrawBackground();
+ // Create a new Brush and initialize to a Black colored brush by default.
+ Brush myBrush = Brushes.Black;
+ Font fontVESymb = new Font(SymbolFonts[SymList1.SymbolList[e.Index].CharacterSet],e.Font.SizeInPoints);
+ Font fontregular = new Font("Courier New",e.Font.SizeInPoints);
+ float x;
+ // Draw the current item text based on the current Font and the custom brush settings.
+ e.Graphics.DrawString(SymList1.SymbolList[e.Index].CharacterCode,fontVESymb,myBrush,e.Bounds.Left,e.Bounds.Top);
+ x=e.Graphics.MeasureString(SymList1.SymbolList[e.Index].CharacterCode,fontVESymb).Width;
+ e.Graphics.DrawString(SymList1.SymbolListStrings[e.Index],fontregular,myBrush,e.Bounds.Left+x,e.Bounds.Top);
+ e.DrawFocusRectangle();
+ }
+
+ private void DoListTabPage()
+ {
+ TabPage listTabPage = new TabPage("List");
+ tbctlSymbol.TabPages.Add(listTabPage);
+ symlistbox = new ListBox();
+ symlistbox.Height = 200;
+ symlistbox.Width = 400;
+ listTabPage.Controls.Add(symlistbox);
+ symlistbox.DrawItem += new DrawItemEventHandler(symlistbox_DrawItem);
+ symlistbox.DoubleClick += new EventHandler(symlistbox_DoubleClick);
+ symlistbox.DrawMode = DrawMode.OwnerDrawFixed;
+ // add dummy items, these will be resolved when displayed.
+ for(int i=0; i
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(SymbDlg));
+ this.tbctlSymbol = new System.Windows.Forms.TabControl();
+ this.tbValue = new System.Windows.Forms.TextBox();
+ this.btnOK = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // tbctlSymbol
+ //
+ this.tbctlSymbol.Location = new System.Drawing.Point(8, 0);
+ this.tbctlSymbol.Name = "tbctlSymbol";
+ this.tbctlSymbol.SelectedIndex = 0;
+ this.tbctlSymbol.Size = new System.Drawing.Size(464, 264);
+ this.tbctlSymbol.TabIndex = 0;
+ //
+ // tbValue
+ //
+ this.tbValue.Location = new System.Drawing.Point(8, 280);
+ this.tbValue.Name = "tbValue";
+ this.tbValue.Size = new System.Drawing.Size(504, 20);
+ this.tbValue.TabIndex = 1;
+ this.tbValue.Text = "";
+ //
+ // btnOK
+ //
+ this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btnOK.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.btnOK.Location = new System.Drawing.Point(72, 320);
+ this.btnOK.Name = "btnOK";
+ this.btnOK.Size = new System.Drawing.Size(104, 24);
+ this.btnOK.TabIndex = 2;
+ this.btnOK.Text = "Save Text";
+ this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.btnCancel.Location = new System.Drawing.Point(208, 320);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(72, 23);
+ this.btnCancel.TabIndex = 3;
+ this.btnCancel.Text = "Cancel";
+ //
+ // SymbDlg
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+ this.ClientSize = new System.Drawing.Size(672, 350);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnOK);
+ this.Controls.Add(this.tbValue);
+ this.Controls.Add(this.tbctlSymbol);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "SymbDlg";
+ this.Text = "Symbol";
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private void btnOK_Click(object sender, System.EventArgs e)
+ {
+ ReturnText = tbValue.Text;
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/SymbDlg.resx b/PROMS/ReferencedObjects/LibSource/Utils/SymbDlg.resx
new file mode 100644
index 00000000..d350e478
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/SymbDlg.resx
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ False
+
+
+ True
+
+
+ Private
+
+
+ Private
+
+
+ 8, 8
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ (Default)
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ True
+
+
+ 80
+
+
+ True
+
+
+ SymbDlg
+
+
+ Private
+
+
+
+ AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAADAAADAAAAAwMAAwAAAAMAAwADAwAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
+ AAD///8AiIiIiIiIiIiIiIiIiIiIiPF3F3F3F3F3F3d3d3d3d3jxdxdxdxdxdxd3d3d3d3d49xdxdxdx
+ dxdxd3d3d3d3ePcXcXcXcXcXcXd3d3d3d3jxcXcXcXcXcXcXd3d3d3d48XF3F3F3F3F3F3d3d3d3ePdx
+ F3F3F3F3F3F3d3d3d3j3cRdxdxdxdxdxd3d3d3d49xdxdxdxdxdxdxd3d3d3ePcXcXcXcXcXcXcXd3d3
+ d3jxdxcXcXcXcXcXcXd3d3d48XcXF3F3F3F3F3F3d3d3ePdxdxF3F3F3F3F3F3d3d3j3cXcRdxdxdxdx
+ dxd3d3d49xdxdxdxdxdxdxdxd3d3ePcXcXcXcXcXcXcXcXd3d3jxdxdxcXcXcXcXcXcXd3d48XcXcXF3
+ F3F3F3F3F3d3ePdxdxd3F3F3F3F3F3F3d3j3cXcXdxdxdxdxdxdxd3d49xdxd3dxdxdxdxdxdxd3ePcX
+ cXd3cXcXcXcXcXcXd3jxdxd3d3cXcXcXcXcXcXd48XcXd3d3F3F3F3F3F3F3ePdxd3d3d3F3F3F3F3F3
+ F3j3cXd3d3dxdxdxdxdxdxd49xd3d3d3dxdxdxdxdxdxePcXd3d3d3cXcXcXcXcXcXjxd3d3d3d3cXcX
+ cXcXcXcY8Xd3d3d3d3F3F3F3F3F3GP////////////////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/SymbLst.cs b/PROMS/ReferencedObjects/LibSource/Utils/SymbLst.cs
new file mode 100644
index 00000000..ef3a92ab
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/SymbLst.cs
@@ -0,0 +1,142 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: SymbLst.cs $ $Revision: 2 $
+ * $Author: Kathy $ $Date: 11/15/04 10:54a $
+ *
+ * $History: SymbLst.cs $
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 11/15/04 Time: 10:54a
+ * Updated in $/LibSource/Utils
+ * B2004-057: crash on scroll fixed & rest of PSI/Title symbols added
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+
+namespace Utils
+{
+ ///
+ /// Summary description for SymbLst.
+ ///
+ ///
+ public class SymbolListItem
+ {
+ public string CharacterCode;
+ public byte Translation;
+ public short CharacterSet;
+ public SymbolListItem(string cc, byte trans, short cs)
+ {
+ CharacterCode = cc;
+ Translation = trans;
+ CharacterSet = cs;
+ }
+ }
+ public class SymbolListB
+ {
+ public string[] SymbolListStrings;
+ public SymbolListItem[] SymbolList;
+ public SymbolListB()
+ {
+ }
+ }
+
+ public class SymbolListSteps : SymbolListB // for steps
+ {
+
+ public SymbolListSteps()
+ {
+ SymbolListStrings = new string[]
+ {
+ "Degree",
+ "Delta",
+ "Greater Than or Equal To",
+ "Less Than Or Equal To",
+ "Plus or Minus",
+ "Sigma",
+ "Gamma",
+ "One Half",
+ "ACCUM Character",
+ "Solid Bullet",
+ "Approximatly Equal",
+ "Similar or Equal",
+ "Division Symbol",
+ "Square Root",
+ "Rho",
+ "PI",
+ "Micro",
+ "Lower Case Delta",
+ "Lower Case Sigma",
+ "One Fourth",
+ "Distinguished Zero",
+ "Average Disintegration Energy",
+ "Grave",
+ "Vertical Line",
+ "Epsilon",
+ "Theta",
+ "Dot in Oval",
+ "Tau",
+ "Hard Space",
+ "Diamond",
+ "Turn On Bold",
+ "Turn Off Bold",
+ "Turn On Underline",
+ "Turn Off Underline",
+ "Turn On Italics",
+ "Turn Off Italics",
+ "Turn On Superscript",
+ "Turn Off Superscript",
+ "Turn On Subscript",
+ "Turn Off Subscript"
+ };
+
+ SymbolList = new SymbolListItem[] {
+ new SymbolListItem("\xB0",0xF8,0), /* ø - Degree */
+ new SymbolListItem("\x44",0x7F,0), /* - Delta */
+ new SymbolListItem("\xB3",0xF2,0), /* ò - Greater Than or Equal */
+ new SymbolListItem("\xA3",0xF3,0), /* ó - Less Than or Equal */
+ new SymbolListItem("\xB1",0xF1,0), /* ñ - Plus or Minus */
+ new SymbolListItem("\x53",0xE4,0), /* ä - Sigma */
+ new SymbolListItem("\x67",0xE7,0), /* ç - (Printed as a Gamma) */
+ new SymbolListItem("\xBD",0xAB,1), /* « - One Half */
+ new SymbolListItem("\xFE",0xFE,0), /* þ - ACCUM Character */
+ new SymbolListItem("\xB7",0x07,0), /* - Solid Bullet */
+ new SymbolListItem("\xBB",0xF7,0), /* Similar */
+ new SymbolListItem("\x40",0xF0,0), /* ÷ - Approximately equal */
+ new SymbolListItem("\xB8",0xF6,0), /* ö - Division symbol */
+ new SymbolListItem("\xD6",0xFB,0), /* û - Square Root */
+ new SymbolListItem("\x72",0xE2,0), /* â - (Printed as a rho) */
+ new SymbolListItem("\x70",0xE3,0), /* ã - (Printed as pi) */
+ new SymbolListItem("\x6D",0xE6,0), /* æ - micro */
+ new SymbolListItem("\x64",0xEB,0), /* ë - Lower Case Delta */
+ new SymbolListItem("\x73",0xE5,0), /* å - Lower Case Sigma */
+ new SymbolListItem("\xBC",0xAC,1), /* ¬ - One Fourth */
+ new SymbolListItem("\xC6",0xED,0), /* í - Distinguished Zero */
+ new SymbolListItem("\x9F",0x90,0), // Average Deintegration Energy
+ new SymbolListItem("\xEC",0x8D,1), // Grave
+ new SymbolListItem("\xBD",0xB3,0), // Vertical Bar
+ new SymbolListItem("\x65",0xEE,0), // Epsilon
+ new SymbolListItem("\x71",0xE9,0), // Theta
+ new SymbolListItem("\x9E",0xEC,0), // Dot With Oval
+ new SymbolListItem("\x74",0xA8,0), // Tau
+ new SymbolListItem("\xA0",0xFF,1), // Hard Space
+ new SymbolListItem("\xA8",0xA9,0), // Diamond
+ new SymbolListItem("\xD5",0xD5,1), // Bold on
+ new SymbolListItem("\xD6",0xD6,1), // Bold off
+ new SymbolListItem("\xAE",0xAE,1), // Underline on
+ new SymbolListItem("\xAF",0xAF,1), // Underline off
+ new SymbolListItem("\xB2",0xB2,1), // Italics on
+ new SymbolListItem("\xDD",0xDD,1), // Italics off
+ new SymbolListItem("\xC6",0xC6,1), // Superscript on
+ new SymbolListItem("\xC7",0xC7,1), // Superscript off
+ new SymbolListItem("\xD1",0xD1,1), // Subscript on
+ new SymbolListItem("\xA6",0xA6,1) // Subscript off
+ };
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/UsrRunTime.cs b/PROMS/ReferencedObjects/LibSource/Utils/UsrRunTime.cs
new file mode 100644
index 00000000..29f06624
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/UsrRunTime.cs
@@ -0,0 +1,624 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: UsrRunTime.cs $ $Revision: 9 $
+ * $Author: Jsj $ $Date: 10/31/07 10:11a $
+ *
+ * $History: UsrRunTime.cs $
+ *
+ * ***************** Version 9 *****************
+ * User: Jsj Date: 10/31/07 Time: 10:11a
+ * Updated in $/LibSource/Utils
+ * Bug fix to ExeAdjust()
+ *
+ * ***************** Version 8 *****************
+ * User: Jsj Date: 7/21/06 Time: 2:57p
+ * Updated in $/LibSource/Utils
+ * added comment of logic that might be needed in future.
+ *
+ * ***************** Version 7 *****************
+ * User: Jsj Date: 5/17/05 Time: 11:54a
+ * Updated in $/LibSource/Utils
+ * cleanup
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 4/21/05 Time: 10:17a
+ * Updated in $/LibSource/Utils
+ * issingleuser
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 4/12/05 Time: 1:00p
+ * Updated in $/LibSource/Utils
+ * B2004-050: single user needed network info
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 1/24/05 Time: 2:44p
+ * Updated in $/LibSource/Utils
+ * B2005-004 fixes
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 1/10/05 Time: 12:57p
+ * Updated in $/LibSource/Utils
+ * B2004-063 fix
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 11/12/04 Time: 10:32a
+ * Updated in $/LibSource/Utils
+ * Save the user's TEMP dir path ExeAjust() handles TEMP dir and Data Dir
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:34a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+using System.IO;
+using System.Windows.Forms;
+using System.Text;
+using Org.Mentalis.Files;
+
+namespace Utils
+{
+ public enum UserCStatus
+ {
+ PRINACTIVE=0, PRACTIVE=1 // process record is NOT active, active respectively
+ };
+
+ public class UserData
+ {
+ public byte UserStatus;
+ public string UserNetworkID;
+ public string UserName;
+ public string UserPhone1;
+ public string UserPhone2;
+ public string UserLoc1;
+ public string UserLoc2;
+ public string UserShell; // 1 - vfw; 2 - browser; 3 - 32-bit browser
+ public string UserProcess;
+
+ // the first constructor loads data from a user's cfg file
+ public UserData(string ucfgpath)
+ {
+ if (File.Exists(ucfgpath)==false) return;
+ // create an xml node from the [User Data] in the cfg file & transfer
+ // to this. Note that the UserNetworkID is not set until the serial
+ // number is read to determine whether in multi-user-mode (B2004-050)
+ PrivateProfile ppUserData = new PrivateProfile(ucfgpath);
+ UserName=ppUserData.Attr("User Data","UserName");
+ UserPhone1=ppUserData.Attr("User Data","UserPhone1");
+ UserPhone2=ppUserData.Attr("User Data","UserPhone2");
+ UserLoc1=ppUserData.Attr("User Data","UserLoc1");
+ UserLoc2=ppUserData.Attr("User Data","UserLoc2");
+ char tmp = '\x03';
+ UserShell = tmp.ToString(); // 1 - vfw; 2 - browser; 3 - 32-bit browser
+ UserProcess="";
+ ppUserData=null;
+ }
+
+ public void SetNetworkID(string ucfgpath, bool inmultiuser)
+ {
+ // create an xml node from the [User Data] in the cfg file & transfer
+ // to this.
+ PrivateProfile ppUserData = new PrivateProfile(ucfgpath);
+ UserNetworkID=ppUserData.Attr("User Data","UserNetworkID");
+ if (inmultiuser && (UserNetworkID == "" || UserNetworkID==null))
+ {
+ MessageBox.Show("Invalid UserNetworkID from " + ucfgpath +", set before reexecuting VE-PROMS.","VE-PROMS Error");
+ Environment.Exit(-1);
+ }
+ ppUserData=null;
+ }
+ // the next constructor gets the input 'nth' record from the dat file (dat file is
+ // passed in via a FileStream
+ public UserData(FileStream dfs, int n)
+ {
+ // seek to the position as defined by n.
+ long skpos = (long)(n * 140); // 140 is the size of the record from old proms.
+ dfs.Seek(skpos,SeekOrigin.Begin);
+ byte [] test = new byte[140];
+ dfs.Read(test,0,140);
+ UserStatus = test[0];
+ string tmp = Encoding.ASCII.GetString(test,0,140);
+ UserNetworkID = tmp.Substring(1,9).Replace('\0',' ').Trim();
+ UserName = tmp.Substring(10,31).Replace('\0',' ').Trim();
+ UserPhone1 = tmp.Substring(41,16).Replace('\0',' ').Trim();
+ UserPhone2 = tmp.Substring(57,16).Replace('\0',' ').Trim();
+ UserLoc1 = tmp.Substring(73,31).Replace('\0',' ').Trim();
+ UserLoc2 = tmp.Substring(104,31).Replace('\0',' ').Trim();
+ UserShell = tmp.Substring(135,2).Replace('\0',' ').Trim();
+ UserProcess = tmp.Substring(137,3).Replace('\0',' ').Trim();
+ }
+
+ // write this user data out to the filestream at the current position in file
+ // defined in dfs
+ public void Write(FileStream dfs)
+ {
+ dfs.WriteByte(UserStatus);
+ byte[] btmp = Encoding.ASCII.GetBytes(UserNetworkID.PadRight(9,'\0'));
+ dfs.Write(btmp,0,9);
+ btmp = Encoding.ASCII.GetBytes(UserName.PadRight(31,'\0'));
+ dfs.Write(btmp,0,31);
+ btmp = Encoding.ASCII.GetBytes(UserPhone1.PadRight(16,'\0'));
+ dfs.Write(btmp,0,16);
+ btmp = Encoding.ASCII.GetBytes(UserPhone2.PadRight(16,'\0'));
+ dfs.Write(btmp,0,16);
+ btmp = Encoding.ASCII.GetBytes(UserLoc1.PadRight(31,'\0'));
+ dfs.Write(btmp,0,31);
+ btmp = Encoding.ASCII.GetBytes(UserLoc2.PadRight(31,'\0'));
+ dfs.Write(btmp,0,31);
+ btmp = Encoding.ASCII.GetBytes(UserShell.PadRight(2,'\0'));
+ dfs.Write(btmp,0,2);
+ btmp = Encoding.ASCII.GetBytes(UserProcess.PadRight(3,'\0'));
+ dfs.Write(btmp,0,3);
+ }
+ };
+
+ ///
+ /// Summary description for UserRunTime. This class contains all pertinent information
+ /// for the runtime for this instance of the program, including cfg, paths, menu file,
+ /// security, serial number, options, etc.
+ ///
+ public class UserRunTime
+ {
+ public string exepath;
+ public string syspath;
+ public string netsyspath;
+ public string TempDirPath;
+
+ public string ucfgpath; // user config file name
+ public string appcfgpath; // app config file name
+
+ public Security sec;
+ public SerialNo SerialNumber;
+ public string OptionsFile;
+ public string initials; // user login name
+ public string UserID; // cfg name and/or login
+ public MenuXML menuwinXML;
+ public MenuXML menuwin2XML;
+ public string myUserNetworkID;
+ public UserData myUserData;
+ public bool InMultiUserMode;
+
+ // make some form properties here, such as color. - make need it's own class,
+ //
+ public UserRunTime()
+ {
+ menuwin2XML = null;
+ SetExeName();
+ // load in xml list of plants. Then do exist tests to see if they
+ // exist on the datapath.
+ menuwinXML = new MenuXML(syspath + "\\menuwin.xml");
+ }
+
+ public void SetSecurity(Security isec)
+ {
+ // set the user's run time security settings. also, flag whether this user is
+ // running in multi user mode (just so we don't have to keep making this check
+ // later)
+ sec = isec;
+ // Do this separate (SetUserMode()) to remove interdependent logic path between
+ // security(vesam), user CFG file, and the serial number
+// InMultiUserMode = (SerialNumber.GetSNOption((uint)Utils.SerialNo.SN_Flags.SN_NETWORK_ON)>0)?true:false;
+ }
+
+ public void SetUserMode()
+ {
+ if (SerialNumber.SerialNum != -1)
+ InMultiUserMode = (SerialNumber.GetSNOption((uint)Utils.SerialNo.SN_Flags.SN_NETWORK_ON)>0)?true:false;
+ if (InMultiUserMode) myUserData.SetNetworkID(ucfgpath, InMultiUserMode);
+ }
+
+ private bool IsSingleUserMode()
+ {
+ // Need to do:
+ // This needs to check if a lock is currently set as well
+ // - jsj 7/20/06
+ return !InMultiUserMode;
+ }
+
+ // Adjust the input file with the required pathname as follows:
+ // '~': (system path) i.e. c:\VE-PROMS
+ // '@': (executable path) i.e. c:\VE-PROMS\BIN
+ // '\342': current data directory i.e. c:\VEHPR1B\PROCS
+ // '\347': resolve for single user mode, append tempdir onto data dir i.e. TEMPS\JOHN____.D00
+ public string ExeAdjust(string str)
+ {
+ if (exepath==null)SetExeName();
+
+ // This logic will allow me to combine the use of our special
+ // tokens. For example, I needed a user temp directory in the
+ // VE-PROMS root for the Search Across Procedure Sets option:
+ // "~\374results" --> C:\VE-PROMS\TEMPS\JOHN____.D00\RESUTLS
+
+ StringBuilder exebuff = new StringBuilder();
+ StringBuilder exetkn = new StringBuilder(str);
+ string exetkn_str = exetkn.ToString();
+ int pos = 0;
+ char[] tchar = "~@\xE7\xE2".ToCharArray();
+ /** Bug Fix: B2007-015
+ * If a short file/directory name contained a ~ character, it was
+ * being processed, when it should not have.
+ * i.e. we were getting the current directory, then looping back up
+ * and searching the directory string (finding a ~ char)
+ *
+ * I added logic to use a starting position in the IndexOfAny() function
+ * so that we can skip past the portions already processes.
+ */
+ while ((pos=exetkn_str.IndexOfAny(tchar,pos))>-1)
+ {
+ char[] chr;
+ string curdir = Directory.GetCurrentDirectory(); // for use with '\xE2'
+ chr = new char[exetkn_str.Length];
+ chr = exetkn_str.ToCharArray();
+ exetkn.Remove(pos,1);
+
+ switch (chr[0])
+ {
+ case '~': exetkn.Insert(pos,syspath+"\\"); // i.e. c:\VE-PROMS
+ pos += syspath.Length +1;
+ break;
+ case '@': exetkn.Insert(pos,exepath+"\\"); // i.e. c:\VE-PROMS\BIN
+ pos += exepath.Length + 1;
+ break;
+ case '\xE2': // case '\342':
+ exetkn.Insert(pos,curdir+"\\"); // i.e. c:\VEHPR1B\PROCS
+ pos += curdir.Length + 1;
+ break;
+ case '\xE7': // case '\347':
+ if (!IsSingleUserMode()&& TempDirPath!=null)
+ {
+ exetkn.Insert(pos,TempDirPath+"\\"); // i.e. TEMPS\JOHN____.D00
+ pos += TempDirPath.Length + 1;
+ }
+ break;
+ }
+ exetkn_str = exetkn.ToString();
+ }
+ return exetkn.ToString();
+ }
+
+ private void SetExeName()
+ {
+ ShortName sname = new ShortName(System.Environment.CommandLine);
+ string cmdlinepath = sname.ShortFileName;
+ string upbuff = cmdlinepath.ToUpper();
+ string tmp = upbuff.Substring(1,upbuff.LastIndexOf("\\")-1);
+ int idx = tmp.IndexOf("VE-PROMS.NET");
+ if (idx > 0)
+ {
+ exepath = tmp.Substring(0,idx+8) + tmp.Substring(idx+12);
+ syspath = exepath.Substring(0,exepath.IndexOf("\\BIN"));
+ netsyspath = syspath + ".NET";
+ }
+ else
+ {
+ exepath = tmp;
+ syspath = exepath.Substring(0,exepath.IndexOf("\\BIN"));
+ netsyspath = syspath + ".NET";
+ }
+ }
+
+ public void SetAppConfig(string pth)
+ {
+ appcfgpath = pth;
+ }
+
+ public bool SetUserConfig()
+ {
+ bool Rtnval = true;
+ PrivateProfile Veproms_ini = new PrivateProfile(ExeAdjust("~veproms.ini"));
+ // Find the UserId (not the number, he name/initials)
+ if (UserID==null || UserID.Equals(""))
+ {
+ // see if it's defined via an environment variable
+ UserID = System.Environment.GetEnvironmentVariable("userid");
+ if (UserID == null)
+ {
+ // Check the VEPROMS.INI file
+// UserID = Veproms_ini.Attr("/ini/section[@name='veconfig']/param[@name='userid']/@value");
+ UserID = Veproms_ini.Attr("veconfig","userid");
+ }
+ if (UserID == null || UserID.Equals(""))
+ {
+ if (sec.initials != null && !sec.initials.Equals(""))
+ {
+ // default to the user's login name
+ UserID = sec.initials;
+ }
+ else
+ {
+ // default to VEPROMS.CFG
+ UserID = "VEPROMS";
+ }
+ }
+ }
+ // Fing the VECONFIG path
+ ucfgpath=System.Environment.GetEnvironmentVariable("veconfig");
+ // If VECONFIG environment variable not set then check the
+ // VEPROMS.INI file for VECONFIG settings.
+ if (ucfgpath == null || ucfgpath.Equals(""))
+ {
+// ucfgpath = Veproms_ini.Attr("/ini/section[@name='veconfig']/param[@name='file']/@value");
+ ucfgpath = Veproms_ini.Attr("veconfig","file");
+ if (ucfgpath==null || ucfgpath.Equals(""))
+ {
+ // still no path, use default cfg file path
+ ucfgpath = ExeAdjust("~CONFIG");
+ }
+ }
+
+ if (ucfgpath != null)
+ {
+ string tmp_UID="";
+ // See it the VECONFIG path includes a CFG file name.
+ // if no CFG file name, then build one based on userid
+ bool atroot = ucfgpath.EndsWith(":\\");
+ if (!atroot)
+ {
+ if (ucfgpath.EndsWith("\\"))
+ {
+ // trim the ending backslash
+ ucfgpath = ucfgpath.Substring(0,ucfgpath.Length-1);
+ }
+ }
+ //See if we need to build a CFG file name
+ if (atroot || Directory.Exists(ucfgpath))
+ {
+ // use the no more than the first 8 chars of the userid
+ tmp_UID = (UserID.Length > 8)?UserID.Substring(0,8) : UserID;
+
+ // Build the CFG file name and append to the VECONFIG path
+ ucfgpath = ucfgpath + "\\" + tmp_UID + ".CFG";
+ }
+ }
+ if (File.Exists(ucfgpath))
+ myUserData = new UserData(ucfgpath);
+ else
+ {
+ // error - cfg file does not exist
+ Rtnval = false;
+ MessageBox.Show("Configuration file:\n\n" + ucfgpath + "\n\nDoes not exist","Missing CFG file");
+ }
+ return Rtnval;
+ }
+
+ public void FreeMenuWinXML()
+ {
+ menuwinXML=null;
+ }
+ public void LoadMenuWin2()
+ {
+ if (menuwin2XML == null)
+ menuwin2XML = new MenuXML(syspath + "\\menuwin2.xml");
+ // menuwin2XML = new MenuXML("e:\\ve-proms\\menuwin2.xml");
+ }
+ public void FreeMenuWin2XML()
+ {
+ menuwin2XML=null;
+ }
+
+ // The following methods update the cfg file (delete item, add item & mod)
+ //public bool DeletePathFromCfg(string delpth)
+ //{
+ // IniReader in1 = new IniReader(ucfgpath);
+ // string curpath = in1.ReadString("Menu","DataPath","");
+ // string modpath = curpath.Replace(delpth,"");
+ // inifile.WriteINIKeyValueStr("Menu","DataPath",modpath,ucfgpath);
+ // return true;
+ //}
+
+ //public void AddPathToCfg(string pth)
+ //{
+ // string newpath=null;
+ // INIFile inifile = new INIFile();
+ // string curpath = inifile.GetINIKeyValueStr("Menu","DataPath","",132,ucfgpath);
+ // string tmp = curpath.TrimEnd(" \t".ToCharArray());
+ // // If none exists, just add that entered, if it ends with ';', don't add another
+ // if (tmp==null||tmp=="")
+ // newpath = pth;
+ // else if (tmp.Substring(tmp.Length-1,1)==";")
+ // newpath = tmp + pth;
+ // else
+ // newpath = tmp+";"+pth;
+ // inifile.WriteINIKeyValueStr("Menu","DataPath",newpath,ucfgpath);
+ //}
+
+ //public void ModTitleToCfg(string oldtitle, string newtitle)
+ //{
+ // INIFile inifile = new INIFile();
+ // string curpath = inifile.GetINIKeyValueStr("Menu","DataPath","",132,ucfgpath);
+ // string newpath=curpath.Replace(oldtitle,newtitle);
+ // inifile.WriteINIKeyValueStr("Menu","DataPath",newpath,ucfgpath);
+ //}
+
+ // Check if plant (defined by location) is in the menuwin file. Return 0 if not,
+ // 1 if in file and -1 if error reading file.
+ public int IsInMenuWin(string location)
+ {
+ // see if this plant is already in the file, check menuwin
+ // and if there, assume in both.
+ try
+ {
+ // Create an instance of StreamReader to read from a file.
+ // The using statement also closes the StreamReader.
+ using (StreamReader sr = new StreamReader(syspath+"\\menuwin"))
+ {
+ string line;
+ while ((line = sr.ReadLine()) != null)
+ {
+ int indx;
+ indx = line.ToUpper().IndexOf(location.ToUpper());
+ if (indx>-1)
+ {
+ sr.Close();
+ return 1;
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ // Let the user know what went wrong.
+ Console.WriteLine("Could not test " + e.Message + " for plant existence in menuwin file");
+ return -1;
+ }
+ return 0;
+ }
+
+ public bool AddToMenuWin(string title,string location)
+ {
+ int inmenufile = IsInMenuWin(location);
+ if (inmenufile==-1)return false; // error checking for it
+ if (inmenufile==1)return true; // already there.
+
+ // make backup files in case of failure.
+ FileInfo menuwinbak = new FileInfo(syspath+"\\menuwin");
+ menuwinbak.CopyTo(syspath+"\\menuwin.BAK",true);
+ menuwinbak=null;
+
+ // add the title and location to the menuwin menuwin.xml files.
+ // menuwin first.
+ FileStream fs = new FileStream(syspath+"\\menuwin",
+ FileMode.Open, FileAccess.ReadWrite, FileShare.None);
+
+ // if the file couldn't open, give an error.
+ if (fs == null)
+ {
+ MessageBox.Show("Could not add plant to menuwin file.","VE-PROMS");
+ menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
+ menuwinbak.Delete();
+ return false;
+ }
+ // go to last character of file & see if we have a /r/n. There
+ // needs to be a single newline between plants in the menuwin file
+ // or an error will occur.
+ fs.Seek(-2,SeekOrigin.End);
+ StreamReader tmpReader = new StreamReader(fs);
+ int tmpi1 = tmpReader.Peek();
+ bool hasnewline=false;
+ if (tmpi1==0xD)hasnewline=true;
+ fs.Seek(0,SeekOrigin.End);
+
+ StreamWriter swFromFileStream = new StreamWriter(fs);
+ if (hasnewline)
+ swFromFileStream.Write(title);
+ else
+ swFromFileStream.Write("\r\n"+title);
+ string tmpl = "\r\n{t}" + location + " menu ~menu1a\r\n";
+ swFromFileStream.Write(tmpl);
+ swFromFileStream.Flush();
+ swFromFileStream.Close();
+ fs.Close();
+
+ // now add menuwin.xml text, add this before the end tags for
+ // system attach & menuwin (i.e. that's the seek part of this
+ // subtracting from end of file the number of characters for
+ // these two tags.
+ // make backup files in case of failure.
+ FileInfo menuwinxbak = new FileInfo(syspath+"\\menuwin");
+ menuwinxbak.CopyTo(syspath+"\\menuwinx.BAK",true);
+ menuwinxbak=null;
+
+ fs = new FileStream(syspath+"\\menuwin.xml",
+ FileMode.Open, FileAccess.Write, FileShare.None);
+ if (fs == null)
+ {
+ MessageBox.Show("Could not add plant to menuwin.xml file.","VE-PROMS");
+ //delete menuwin & rename the bak file.
+ menuwinbak = new FileInfo(syspath+"\\menuwin");
+ menuwinbak.Delete();
+ menuwinbak = null;
+ menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
+ menuwinbak.CopyTo(syspath+"\\menuwin");
+ menuwinbak.Delete();
+ menuwinxbak = new FileInfo(syspath+"\\menuwinx.BAK");
+ menuwinxbak.Delete();
+ return false;
+ }
+ long flen = fs.Length;
+ fs.SetLength(flen-27); //remove tags.
+ fs.Seek(0,SeekOrigin.End);
+ swFromFileStream = new StreamWriter(fs);
+ swFromFileStream.Write("\r\n");
+ swFromFileStream.Write(title);
+ swFromFileStream.Write("\r\n{t}");
+ swFromFileStream.Write(location);
+ swFromFileStream.Write(" menu menu1a\r\n\r\n");
+ swFromFileStream.Write("\r\n");
+
+ swFromFileStream.Flush();
+ swFromFileStream.Close();
+ fs.Close();
+ menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
+ menuwinbak.Delete();
+ menuwinxbak = new FileInfo(syspath+"\\menuwinx.BAK");
+ menuwinxbak.Delete();
+ // reload so that the new plant node gets added to the xml tree.
+ menuwinXML = null;
+ menuwinXML = new MenuXML(syspath + "\\menuwin.xml");
+ MessageBox.Show("Please send \\ve-proms\\menuwin & \\ve-proms\\menuwin.xml files to Volian.","VE-PROMS");
+ return true;
+ }
+
+ public bool ModMenuWin(string newtitle, string oldtitle)
+ {
+ // replace the oldtitle with the new in both the menuwin file
+ // and the menuwin.xml file.
+ FileInfo menuwinbak = new FileInfo(syspath+"\\menuwin");
+ menuwinbak.CopyTo(syspath+"\\menuwin.BAK",true);
+ menuwinbak=null;
+
+ // read the whole file, replace the plant title string & save the file.
+ StreamReader sr = File.OpenText(syspath+"\\menuwin");
+ string input;
+ if ((input=sr.ReadToEnd())!=null)
+ {
+ sr.Close();
+ string output = input.Replace(oldtitle,newtitle);
+ StreamWriter sw = new StreamWriter(syspath+"\\menuwin",false);
+ sw.Write(output);
+ sw.Close();
+ }
+ else
+ {
+ sr.Close();
+ MessageBox.Show("Could not update menuwin file with new plant title","VE-PROMS");
+ menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
+ menuwinbak.CopyTo(syspath+"\\menuwin",true);
+ menuwinbak.Delete();
+ return false;
+ }
+
+ // now do the xml file.
+ menuwinbak = new FileInfo(syspath+"\\menuwin.xml");
+ menuwinbak.CopyTo(syspath+"\\menuwinx.BAK",true);
+ menuwinbak=null;
+
+ // read the whole file, replace the plant title string & save the file.
+ sr = File.OpenText(syspath+"\\menuwin.xml");
+ if ((input=sr.ReadToEnd())!=null)
+ {
+ sr.Close();
+ string output = input.Replace(oldtitle,newtitle);
+ StreamWriter sw = new StreamWriter(syspath+"\\menuwin.xml",false);
+ sw.Write(output);
+ sw.Close();
+ }
+ else
+ {
+ sr.Close();
+ MessageBox.Show("Could not update menuwin.xml file with new plant title","VE-PROMS");
+ menuwinbak = new FileInfo(syspath+"\\menuwin.BAK");
+ menuwinbak.CopyTo(syspath+"\\menuwin",true);
+ menuwinbak.Delete();
+ menuwinbak = new FileInfo(syspath+"\\menuwinx.BAK");
+ menuwinbak.CopyTo(syspath+"\\menuwin.xml",true);
+ menuwinbak.Delete();
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/Utils.csproj b/PROMS/ReferencedObjects/LibSource/Utils/Utils.csproj
new file mode 100644
index 00000000..f76c3c53
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/Utils.csproj
@@ -0,0 +1,218 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {680054D3-49C4-40E7-92A5-67B97DCE6308}
+ Debug
+ AnyCPU
+
+
+
+
+ Utils
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ Utils
+ OnBuildSuccess
+
+
+
+
+ 0.0
+
+
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Drawing
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+ Form
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Form
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ About.cs
+ Designer
+
+
+ SymbDlg.cs
+ Designer
+
+
+
+
+
+ False
+ .NET Framework 2.0 %28x86%29
+ true
+
+
+ False
+ .NET Framework 3.0 %28x86%29
+ false
+
+
+ False
+ .NET Framework 3.5
+ false
+
+
+
+
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}
+ Org.Mentalis.Files
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/Utils.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/Utils/Utils.csproj.vspscc
new file mode 100644
index 00000000..2a9d52bc
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/Utils.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\Utils"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/Utils/VEdt.cs b/PROMS/ReferencedObjects/LibSource/Utils/VEdt.cs
new file mode 100644
index 00000000..ad55ff69
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/Utils/VEdt.cs
@@ -0,0 +1,98 @@
+/*********************************************************************************************
+ * Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: VEdt.cs $ $Revision: 1 $
+ * $Author: Kathy $ $Date: 7/27/04 8:35a $
+ *
+ * $History: VEdt.cs $
+ *
+ * ***************** Version 1 *****************
+ * User: Kathy Date: 7/27/04 Time: 8:35a
+ * Created in $/LibSource/Utils
+ *********************************************************************************************/
+
+using System;
+
+namespace Utils
+{
+ ///
+ /// Summary description for VEdt.
+ ///
+ public class VEDateTime
+ {
+ public DateTime dt;
+ public string dtstr;
+
+ public VEDateTime(long tm)
+ {
+ System.Globalization.CultureInfo info =
+ new System.Globalization.CultureInfo("en-US", false);
+
+ System.Globalization.Calendar calendar = info.Calendar;
+
+
+ // do some conversion so that proms will be able to use this
+ // date/time. Proms had it in seconds since 00:00:00 1/1/1970.
+ // .NET has it in ticks since 00:00:00 1/1/1
+ DateTime promsdt = new DateTime(1970,1,1,0,0,0,0); // Jan 1, 1970
+
+ //
+ // Get the offset time between this time zone and UTC (GMT) time.
+ // Convert the offset to seconds.
+ // Subtract the offset from the UTC time gotten for Jan 1, 1970
+ ThisTimeZone TZ = new ThisTimeZone();
+ TimeSpan TimeZoneSpan = TZ.GetUtcOffset(promsdt); // Time Zone offset from UTC
+ long TimeZoneAdj = Math.Abs(TimeZoneSpan.Ticks / 10000000); // convert to seconds
+ DateTime cnv = promsdt.AddSeconds(tm-TimeZoneAdj);
+ dtstr = cnv.ToLongDateString() + " " + cnv.ToLongTimeString();
+ }
+ }
+ /*
+ * TimeZone is an Abstract Class. You need to inherit the TimeZone Class
+ * and overload a couple of it's functions in order to use it.
+ * - called in CalculatePromsDate() above.
+ */
+ public class ThisTimeZone : TimeZone
+ {
+ private TimeZone curTZ;
+ public TimeSpan SpanTZ;
+
+ public ThisTimeZone()
+ {
+ curTZ = CurrentTimeZone; // local timezone
+ }
+
+ // get the UTC (GMT) value for the given date/time
+ public override TimeSpan GetUtcOffset(DateTime ForThisDate)
+ {
+ SpanTZ = curTZ.GetUtcOffset(ForThisDate);
+ return SpanTZ;
+ }
+
+ // Name of the local Daylight savings time zone
+ public override string DaylightName
+ {
+ get
+ {
+ return curTZ.DaylightName;
+ }
+ }
+
+ // Name of the local standard time zone
+ public override string StandardName
+ {
+ get
+ {
+ return curTZ.StandardName;
+ }
+ }
+
+ // Get the start and end dates for daylight savings
+ public override System.Globalization.DaylightTime GetDaylightChanges(int year)
+ {
+ return curTZ.GetDaylightChanges(year);
+ }
+ }
+}
+
diff --git a/PROMS/ReferencedObjects/LibSource/VlnProfiler/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/VlnProfiler/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnProfiler/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.cs b/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.cs
new file mode 100644
index 00000000..b8ac2fa7
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Specialized;
+
+namespace VlnProfiler
+{
+ ///
+ /// Summary description for Profiler.
+ ///
+ public class Profiler
+ {
+ static HybridDictionary dicTiming;
+ static HybridDictionary dicDuration;
+
+ static Profiler()
+ {
+ Reset();
+ }
+
+ public static void Reset()
+ {
+ dicTiming = new HybridDictionary();
+ dicTiming[" Total"]=DateTime.Now;
+ dicDuration = new HybridDictionary();
+ }
+
+ public static void Start(string sName)
+ {
+ dicTiming[sName]=DateTime.Now;
+ }
+
+ public static void End(string sName)
+ {
+ if( dicDuration.Contains(sName))
+ dicDuration[sName]=((TimeSpan) dicDuration[sName]) + (DateTime.Now - ((DateTime) dicTiming[sName]));
+ else
+ dicDuration[sName]=DateTime.Now - ((DateTime) dicTiming[sName]);
+ }
+
+ public static string ToString(string Format)
+ {
+ string str="";
+ string sep="";
+ if(Format.IndexOf("%")>=0)
+ {
+ double ttl = Convert.ToDouble(((TimeSpan) (DateTime.Now - ((DateTime) dicTiming[" Total"]))).Ticks);
+ double ttlOther=ttl;
+ foreach(string strKey in dicDuration.Keys)
+ {
+ ttlOther-=((TimeSpan) dicDuration[strKey]).Ticks;
+ double dt = Convert.ToDouble(((TimeSpan) dicDuration[strKey]).Ticks)/ttl;
+ //TODO: If Percent - Convert to Percent of Total
+ str+=sep+dt.ToString(Format) + " " + strKey;
+ sep="\r\n";
+ }
+ ttlOther = ttlOther/ttl;
+ str+=sep+ttlOther.ToString(Format) + " Other";
+ }
+ else
+ {
+ foreach(string strKey in dicDuration.Keys)
+ {
+ str+=sep+((TimeSpan)dicDuration[strKey]).ToString(/*Format*/) + " " + strKey;
+ sep="\r\n";
+ }
+ }
+ str+=sep + "".PadRight(20,'-');
+ str+=sep + ((TimeSpan) (DateTime.Now - ((DateTime) dicTiming[" Total"]))).ToString(/*Format*/) + " Total";
+ return str;
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.csproj b/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.csproj
new file mode 100644
index 00000000..22b18753
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.csproj
@@ -0,0 +1,125 @@
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {38044313-1E5E-4F20-A9E7-3CBDDDCADCDC}
+ Debug
+ AnyCPU
+
+
+
+
+ VlnProfiler
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ VlnProfiler
+ OnBuildSuccess
+
+
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.XML
+
+
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.csproj.vspscc
new file mode 100644
index 00000000..fd09df5a
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnProfiler/VlnProfiler.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\VlnProfiler"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/VlnStatus/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusBarFrm.cs b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusBarFrm.cs
new file mode 100644
index 00000000..6828458b
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusBarFrm.cs
@@ -0,0 +1,232 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: StatusBarFrm.cs $ $Revision: 3 $
+ * $Author: Jsj $ $Date: 4/08/04 9:50a $
+ *
+ * $History: StatusBarFrm.cs $
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 4/08/04 Time: 9:50a
+ * Updated in $/LibSource/VlnStatus
+ * added profile code and try to optimize
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 11/26/02 Time: 3:38p
+ * Updated in $/LibSource/VlnStatus
+ * Added overbounds check
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+//using ROProfiler; //don't forget to add VlnProfiler to the reference list
+
+namespace VlnStatus
+{
+ ///
+ /// Create a status window with a progress bar
+ ///
+ public class StatusBarFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.ProgressBar progressBar1;
+ private System.Windows.Forms.Label lblBar;
+ private System.Windows.Forms.Label StatMsg;
+// private string strLblLast="";
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+
+ public StatusBarFrm()
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ Text = "Status";
+ }
+
+ public StatusBarFrm(string StatusBoxTitle)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ Text = StatusBoxTitle;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.progressBar1 = new System.Windows.Forms.ProgressBar();
+ this.lblBar = new System.Windows.Forms.Label();
+ this.StatMsg = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // progressBar1
+ //
+ this.progressBar1.Location = new System.Drawing.Point(29, 83);
+ this.progressBar1.Name = "progressBar1";
+ this.progressBar1.Size = new System.Drawing.Size(297, 27);
+ this.progressBar1.TabIndex = 0;
+ //
+ // lblBar
+ //
+ this.lblBar.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.lblBar.Location = new System.Drawing.Point(29, 136);
+ this.lblBar.Name = "lblBar";
+ this.lblBar.Size = new System.Drawing.Size(297, 16);
+ this.lblBar.TabIndex = 1;
+ this.lblBar.Text = "% Complete";
+ this.lblBar.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // StatMsg
+ //
+ this.StatMsg.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.StatMsg.Location = new System.Drawing.Point(29, 18);
+ this.StatMsg.Name = "StatMsg";
+ this.StatMsg.Size = new System.Drawing.Size(307, 56);
+ this.StatMsg.TabIndex = 2;
+ this.StatMsg.Text = "Progress Bar";
+ this.StatMsg.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // StatusBarFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
+ this.ClientSize = new System.Drawing.Size(350, 171);
+ this.ControlBox = false;
+ this.Controls.Add(this.StatMsg);
+ this.Controls.Add(this.lblBar);
+ this.Controls.Add(this.progressBar1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "StatusBarFrm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Status";
+ this.TopMost = true;
+ this.Load += new System.EventHandler(this.StatusBarFrm_Load);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private void StatusBarFrm_Load(object sender, System.EventArgs e)
+ {
+
+ }
+
+ public int Value
+ {
+ get
+ {
+ return progressBar1.Value;
+ }
+ set
+ {
+ if (value >= progressBar1.Maximum)
+ progressBar1.Value = progressBar1.Maximum;
+ else
+ progressBar1.Value = value;
+ UpateLabel();
+ }
+ }
+
+ public int Maximum
+ {
+ get
+ {
+ return progressBar1.Maximum;
+ }
+ set
+ {
+ progressBar1.Maximum = value;
+ }
+ }
+
+ public int Step
+ {
+ get
+ {
+ return progressBar1.Step;
+ }
+ set
+ {
+ progressBar1.Step = value;
+ }
+ }
+
+ public void PerformStep()
+ {
+ progressBar1.PerformStep();
+ }
+
+ private void UpateLabel()
+ {
+ lblBar.Text = (Math.Round((decimal)(progressBar1.Value * 100) / progressBar1.Maximum)).ToString();
+ lblBar.Text += "% Complete";
+// if( lblBar.Text != strLblLast)
+// {
+// Profiler.Start("UpdateLabel");
+ lblBar.Refresh();
+// lblBar.Update();
+// Profiler.End("UpdateLabel");
+// }
+// strLblLast = lblBar.Text;
+ }
+
+ public string StatusMessage
+ {
+ get
+ {
+ return StatMsg.Text;
+ }
+ set
+ {
+ StatMsg.Text = value;
+// Profiler.Start("StatusMessage");
+ StatMsg.Refresh();
+// StatMsg.Update();
+// Profiler.End("StatusMessage");
+ }
+ }
+
+ public string StatusBoxTitle
+ {
+ get
+ {
+ return Text;
+ }
+ set
+ {
+ Text = value;
+ }
+ }
+
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusBarFrm.resx b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusBarFrm.resx
new file mode 100644
index 00000000..63f8de01
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusBarFrm.resx
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ (Default)
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ True
+
+
+ 80
+
+
+ StatusBarFrm
+
+
+ True
+
+
+ Private
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusMessageFrm.cs b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusMessageFrm.cs
new file mode 100644
index 00000000..9dbf8d70
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusMessageFrm.cs
@@ -0,0 +1,140 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: StatusMessageFrm.cs $ $Revision: 3 $
+ * $Author: Jsj $ $Date: 5/11/04 9:30a $
+ *
+ * $History: StatusMessageFrm.cs $
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 5/11/04 Time: 9:30a
+ * Updated in $/LibSource/VlnStatus
+ *
+ * ***************** Version 2 *****************
+ * User: Jsj Date: 11/26/02 Time: 3:38p
+ * Updated in $/LibSource/VlnStatus
+ * Added overbounds check
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace VlnStatus
+{
+ ///
+ /// Create status message window.
+ ///
+ public class StatusMessageFrm : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Label lblStatMsg;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+
+ public StatusMessageFrm()
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+ }
+
+ public StatusMessageFrm(string StatTitle)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+
+ Text = StatTitle;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblStatMsg = new System.Windows.Forms.Label();
+ this.SuspendLayout();
+ //
+ // lblStatMsg
+ //
+ this.lblStatMsg.Location = new System.Drawing.Point(19, 20);
+ this.lblStatMsg.Name = "lblStatMsg";
+ this.lblStatMsg.Size = new System.Drawing.Size(420, 81);
+ this.lblStatMsg.TabIndex = 0;
+ this.lblStatMsg.Text = "Put Satus Message Here";
+ this.lblStatMsg.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // StatusMessageFrm
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(7, 19);
+ this.ClientSize = new System.Drawing.Size(457, 117);
+ this.ControlBox = false;
+ this.Controls.Add(this.lblStatMsg);
+ this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "StatusMessageFrm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Status";
+ this.TopMost = true;
+ this.Load += new System.EventHandler(this.StatusMessageFrm_Load);
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+
+ private void StatusMessageFrm_Load(object sender, System.EventArgs e)
+ {
+
+ }
+
+ public string StatusMessage
+ {
+ get
+ {
+ return lblStatMsg.Text;
+ }
+ set
+ {
+ lblStatMsg.Text = value;
+ lblStatMsg.Refresh();
+ }
+ }
+
+ public string StatusBoxTitle
+ {
+ get
+ {
+ return Text;
+ }
+ set
+ {
+ Text = value;
+ }
+ }
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusMessageFrm.resx b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusMessageFrm.resx
new file mode 100644
index 00000000..7edd5b3c
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/StatusMessageFrm.resx
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ False
+
+
+ Private
+
+
+ Private
+
+
+ False
+
+
+ (Default)
+
+
+ False
+
+
+ False
+
+
+ 8, 8
+
+
+ StatusMessageFrm
+
+
+ True
+
+
+ 80
+
+
+ True
+
+
+ Private
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatus.csproj b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatus.csproj
new file mode 100644
index 00000000..63a9ff5d
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatus.csproj
@@ -0,0 +1,148 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {551CB7B3-00B1-11D7-8590-482B59000000}
+ Debug
+ AnyCPU
+
+
+
+
+ VlnStatus
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ VlnStatus
+ OnBuildSuccess
+
+
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Drawing
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+ Code
+
+
+ Form
+
+
+ Form
+
+
+ Code
+
+
+ Code
+
+
+ StatusBarFrm.cs
+ Designer
+
+
+ StatusMessageFrm.cs
+ Designer
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatus.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatus.csproj.vspscc
new file mode 100644
index 00000000..ad462ea7
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatus.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\VlnStatus"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatusBar.cs b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatusBar.cs
new file mode 100644
index 00000000..a7a4e2cd
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatusBar.cs
@@ -0,0 +1,148 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: VlnStatusBar.cs $ $Revision: 4 $
+ * $Author: Jsj $ $Date: 11/26/02 4:25p $
+ *
+ * $History: VlnStatusBar.cs $
+ *
+ * ***************** Version 4 *****************
+ * User: Jsj Date: 11/26/02 Time: 4:25p
+ * Updated in $/LibSource/VlnStatus
+ * fixed problem with counter
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 11/26/02 Time: 3:38p
+ * Updated in $/LibSource/VlnStatus
+ * Added overbounds check
+ *********************************************************************************************/
+using System;
+
+namespace VlnStatus
+{
+ ///
+ /// Creates a Status Window with a progression bar control.
+ ///
+ /// This class has two constructors. One allows you to pass in the title
+ /// of the Status Box. The Other provides a default title of "Status".
+ /// The Status Box Title can also be set/changed via the StatusBoxTitle
+ /// property.
+ ///
+ ///
+ ///
+ public class VlnStatusBar
+ {
+ StatusBarFrm StatBar;
+ private int Cnt;
+
+ // Create a status window with the default title of "Status"
+ public VlnStatusBar()
+ {
+ StatBar = new StatusBarFrm();
+ StatBar.Show();
+ }
+
+ // Create a status window with the passed in title
+ public VlnStatusBar(string Title)
+ {
+ StatBar = new StatusBarFrm(Title);
+ StatBar.Show();
+ }
+
+ // Increament the the status bar by the passed in value.
+ public void PerformStep(int val)
+ {
+// StatBar.Value = val;
+// Cnt = val;
+ BarValue = val;
+ StatBar.PerformStep();
+ }
+
+ // Increament the the status bar by one
+ public void PerformStep()
+ {
+// StatBar.Value = StatBar.Value + 1;
+ Cnt++;
+ BarValue = Cnt;
+ StatBar.PerformStep();
+ }
+
+ // This property gets or sets the current status bar value.
+ public int BarValue
+ {
+ get
+ {
+ return StatBar.Value;
+ }
+ set
+ {
+ StatBar.Value = value;
+ Cnt = value;
+ }
+ }
+
+ // This property sets or gets the maximum value that the
+ // BarValue property can be. i.e. when BarValue reaches this
+ // number, the status bar is completely displayed.
+ public int BarMax
+ {
+ get
+ {
+ return StatBar.Maximum;
+ }
+ set
+ {
+ StatBar.Maximum = value;
+ }
+ }
+
+ // This property sets or gets the increamenting value used to
+ // move the status bar. For example, if set to 5, each tick of
+ // the status bar represents a value of 5.
+ public int BarStepValue
+ {
+ get
+ {
+ return StatBar.Step;
+ }
+ set
+ {
+ StatBar.Step = value;
+ }
+ }
+
+ // This property sets or gets the message above the status bar.
+ public string StatMsg
+ {
+ get
+ {
+ return StatBar.StatusMessage;
+ }
+ set
+ {
+ StatBar.StatusMessage = value;
+ }
+ }
+
+ // This property sets or gets the Status Window Title
+ public string StatusBoxTitle
+ {
+ get
+ {
+ return StatBar.StatusBoxTitle;
+ }
+ set
+ {
+ StatBar.StatusBoxTitle = value;
+ }
+ }
+
+ public void Dispose()
+ {
+ StatBar.Dispose();
+ }
+
+ }
+}
+
diff --git a/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatusMessage.cs b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatusMessage.cs
new file mode 100644
index 00000000..e0221ee8
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/VlnStatus/VlnStatusMessage.cs
@@ -0,0 +1,79 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: VlnStatusMessage.cs $ $Revision: 3 $
+ * $Author: Jsj $ $Date: 11/26/02 3:38p $
+ *
+ * $History: VlnStatusMessage.cs $
+ *
+ * ***************** Version 3 *****************
+ * User: Jsj Date: 11/26/02 Time: 3:38p
+ * Updated in $/LibSource/VlnStatus
+ * Added overbounds check
+ *********************************************************************************************/
+
+using System;
+
+namespace VlnStatus
+{
+ ///
+ /// Creates a Status Window to display a status message.
+ ///
+ /// This class has two constructors. One allows you to pass in the title
+ /// of the Status Box. The Other provides a default title of "Status".
+ /// The Status Box Title can also be set/changed via the StatusBoxTitle
+ /// property.
+ ///
+ ///
+ public class VlnStatusMessage
+ {
+ StatusMessageFrm StatusMessageBox;
+
+ // Create a status window with the default title of "Status"
+ public VlnStatusMessage()
+ {
+ StatusMessageBox = new StatusMessageFrm();
+ StatusMessageBox.Show();
+ }
+
+ // Create a status window with the passed in title.
+ public VlnStatusMessage(string StatusBoxTitle)
+ {
+ StatusMessageBox = new StatusMessageFrm(StatusBoxTitle);
+ StatusMessageBox.Show();
+ }
+
+ // This property gets or sets the current status message
+ public string StatusMessage
+ {
+ get
+ {
+ return StatusMessageBox.StatusMessage;
+ }
+ set
+ {
+ StatusMessageBox.StatusMessage = value;
+ }
+ }
+
+ // This property gets or sets the status box title
+ public string StatusBoxTitle
+ {
+ get
+ {
+ return StatusMessageBox.StatusBoxTitle;
+ }
+ set
+ {
+ StatusMessageBox.StatusBoxTitle = value;
+ }
+ }
+
+ public void Dispose()
+ {
+ StatusMessageBox.Dispose();
+ }
+
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/AssemblyInfo.cs b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/AssemblyInfo.cs
new file mode 100644
index 00000000..7e3b35a5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// 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("")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// 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 Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.1.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ImageDialog.cs b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ImageDialog.cs
new file mode 100644
index 00000000..381a64c5
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ImageDialog.cs
@@ -0,0 +1,119 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: ImageDialog.cs $ $Revision: 2 $
+ * $Author: Kathy $ $Date: 1/08/03 10:24a $
+ *
+ * $History: ImageDialog.cs $
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 1/08/03 Time: 10:24a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * added header
+ *********************************************************************************************/
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace ctlXMLEditLib
+{
+ ///
+ /// Summary description for ViewImage - View Image pops up a dialog
+ /// which contains a display of the image file.
+ ///
+ public class ImageDialog : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.PictureBox roImage;
+ private System.Windows.Forms.Button btnClose;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ public ImageDialog(string filename)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ InitializeComponent();
+ Image.GetThumbnailImageAbort myCallback =
+ new Image.GetThumbnailImageAbort(ThumbnailCallback);
+
+ Bitmap bm = new Bitmap(filename);
+ SizeF sizef = new SizeF(bm.Width/bm.HorizontalResolution,
+ bm.Height/bm.VerticalResolution);
+ // 504 & 384 is the size of the image window (roImage).
+ float fscale = Math.Min(504/sizef.Width,384/sizef.Height);
+ sizef.Width *= fscale;
+ sizef.Height *= fscale;
+ Image thmb = bm.GetThumbnailImage((int)sizef.Width, (int)sizef.Height, myCallback, IntPtr.Zero );
+
+ this.roImage.Image = thmb;
+ }
+
+ public bool ThumbnailCallback()
+ {
+ return false;
+ }
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.roImage = new System.Windows.Forms.PictureBox();
+ this.btnClose = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // roImage
+ //
+ this.roImage.Location = new System.Drawing.Point(32, 8);
+ this.roImage.Name = "roImage";
+ this.roImage.Size = new System.Drawing.Size(504, 384);
+ this.roImage.TabIndex = 0;
+ this.roImage.TabStop = false;
+ //
+ // btnClose
+ //
+ this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnClose.Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
+ this.btnClose.Location = new System.Drawing.Point(240, 432);
+ this.btnClose.Name = "btnClose";
+ this.btnClose.Size = new System.Drawing.Size(112, 24);
+ this.btnClose.TabIndex = 1;
+ this.btnClose.Text = "Close";
+ //
+ // ImageDialog
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+ this.ClientSize = new System.Drawing.Size(568, 477);
+ this.Controls.AddRange(new System.Windows.Forms.Control[] {
+ this.btnClose,
+ this.roImage});
+ this.Name = "ImageDialog";
+ this.Text = "View Image";
+ this.ResumeLayout(false);
+
+ }
+ #endregion
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ImageDialog.resx b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ImageDialog.resx
new file mode 100644
index 00000000..a3863deb
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ImageDialog.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ImageDialog
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ZoomDialog.cs b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ZoomDialog.cs
new file mode 100644
index 00000000..c2f238c7
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ZoomDialog.cs
@@ -0,0 +1,151 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: ZoomDialog.cs $ $Revision: 3 $
+ * $Author: Kathy $ $Date: 12/06/02 11:56a $
+ *
+ * $History: ZoomDialog.cs $
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 12/06/02 Time: 11:56a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * change font for zoom
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 11/04/02 Time: 1:38p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * wasn't displaying text & make text fixed font for alignment
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 8/23/02 Time: 3:03p
+ * Created in $/LibSource/ctlXMLEditLib
+ *********************************************************************************************/
+
+using System;
+using System.Drawing;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+
+namespace ctlXMLEditLib
+{
+ ///
+ /// Summary description for ZoomDialog.
+ ///
+ ///
+
+ public class ZoomDialog : System.Windows.Forms.Form
+ {
+ private System.Windows.Forms.Button btnSave;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.TextBox tbZoom;
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private string edittext;
+
+ public string ZoomText
+ {
+ get
+ {
+ return tbZoom.Text;
+ }
+ }
+
+ public ZoomDialog(string zmtext)
+ {
+ //
+ // Required for Windows Form Designer support
+ //
+ edittext = zmtext;
+ InitializeComponent();
+ tbZoom.Text = zmtext;
+ //
+ // TODO: Add any constructor code after InitializeComponent call
+ //
+ }
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ if( disposing )
+ {
+ if(components != null)
+ {
+ components.Dispose();
+ }
+ }
+ base.Dispose( disposing );
+ }
+
+ #region Windows Form Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.tbZoom = new System.Windows.Forms.TextBox();
+ this.btnSave = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // tbZoom
+ //
+ this.tbZoom.Font = new System.Drawing.Font("Letter Gothic", 8.249999F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.tbZoom.Location = new System.Drawing.Point(24, 16);
+ this.tbZoom.Multiline = true;
+ this.tbZoom.Name = "tbZoom";
+ this.tbZoom.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.tbZoom.Size = new System.Drawing.Size(576, 392);
+ this.tbZoom.TabIndex = 0;
+ //
+ // btnSave
+ //
+ this.btnSave.DialogResult = System.Windows.Forms.DialogResult.OK;
+ this.btnSave.Location = new System.Drawing.Point(80, 440);
+ this.btnSave.Name = "btnSave";
+ this.btnSave.Size = new System.Drawing.Size(80, 32);
+ this.btnSave.TabIndex = 1;
+ this.btnSave.Text = "Save";
+ this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Location = new System.Drawing.Point(192, 440);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(80, 32);
+ this.btnCancel.TabIndex = 2;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // ZoomDialog
+ //
+ this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
+ this.ClientSize = new System.Drawing.Size(616, 485);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnSave);
+ this.Controls.Add(this.tbZoom);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Name = "ZoomDialog";
+ this.Text = "Zoom";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+ #endregion
+ private void btnSave_Click(object sender, System.EventArgs e)
+ {
+ this.Close();
+ }
+ private void btnCancel_Click(object sender, System.EventArgs e)
+ {
+ this.Close();
+ }
+
+ }
+}
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ZoomDialog.resx b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ZoomDialog.resx
new file mode 100644
index 00000000..19dc0dd8
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ZoomDialog.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEdit.cs b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEdit.cs
new file mode 100644
index 00000000..276ac97c
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEdit.cs
@@ -0,0 +1,1670 @@
+/*********************************************************************************************
+ * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
+ * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
+ * ------------------------------------------------------------------------------
+ * $Workfile: ctlXMLEdit.cs $ $Revision: 36 $
+ * $Author: Jsj $ $Date: 7/06/06 9:32a $
+ *
+ * $History: ctlXMLEdit.cs $
+ *
+ * ***************** Version 36 *****************
+ * User: Jsj Date: 7/06/06 Time: 9:32a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * needed full path to read ROAPP.INI
+ *
+ * ***************** Version 35 *****************
+ * User: Jsj Date: 5/03/05 Time: 11:44a
+ * Updated in $/LibSource/ctlXMLEditLib
+ *
+ * ***************** Version 34 *****************
+ * User: Jsj Date: 7/02/03 Time: 9:26a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * made messagebox calls modal by removing the parent window reference
+ *
+ * ***************** Version 33 *****************
+ * User: Kathy Date: 6/11/03 Time: 2:01p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * Bug fix B2003-045 (save date as part of graphic)
+ *
+ * ***************** Version 32 *****************
+ * User: Kathy Date: 5/21/03 Time: 12:41p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * B2003-036: save of group data to ro if both have a common field
+ *
+ * ***************** Version 31 *****************
+ * User: Kathy Date: 2/07/03 Time: 11:19a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * Error on pathname compares if long filename
+ *
+ * ***************** Version 30 *****************
+ * User: Kathy Date: 2/03/03 Time: 10:36a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * UI Improve
+ *
+ * ***************** Version 29 *****************
+ * User: Kathy Date: 1/22/03 Time: 12:17p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * duplicate/save as bug
+ *
+ * ***************** Version 28 *****************
+ * User: Kathy Date: 1/15/03 Time: 1:56p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * sizing of labels & form
+ *
+ * ***************** Version 27 *****************
+ * User: Kathy Date: 1/08/03 Time: 10:05a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * Add view image
+ *
+ * ***************** Version 26 *****************
+ * User: Jsj Date: 1/06/03 Time: 11:29a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * INI file logic
+ *
+ * ***************** Version 25 *****************
+ * User: Jsj Date: 1/02/03 Time: 3:47p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * Added logic to check INI files for default graphics file extension
+ *
+ * ***************** Version 24 *****************
+ * User: Jsj Date: 12/17/02 Time: 4:51p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * fixed date/time for graphic files
+ *
+ * ***************** Version 23 *****************
+ * User: Kathy Date: 12/16/02 Time: 12:11p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * once data is saved, don't flag it as changed
+ *
+ * ***************** Version 22 *****************
+ * User: Kathy Date: 12/13/02 Time: 10:05a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * bugs with combo (& more than one field with data)
+ *
+ * ***************** Version 21 *****************
+ * User: Jsj Date: 12/10/02 Time: 3:35p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * Default Graphic file extension fix
+ *
+ * ***************** Version 20 *****************
+ * User: Kathy Date: 12/10/02 Time: 2:24p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * fieldname special chars
+ *
+ * ***************** Version 19 *****************
+ * User: Kathy Date: 12/02/02 Time: 8:28a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * fieldname replace chars
+ *
+ * ***************** Version 18 *****************
+ * User: Kathy Date: 11/26/02 Time: 11:08a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * fix required bug on combo type & fix improve sizing
+ *
+ * ***************** Version 17 *****************
+ * User: Kathy Date: 11/20/02 Time: 11:36a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * zoom button moved on main form
+ *
+ * ***************** Version 16 *****************
+ * User: Kathy Date: 11/19/02 Time: 11:33a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * zoom tool tip & tab order
+ *
+ * ***************** Version 15 *****************
+ * User: Kathy Date: 10/24/02 Time: 11:15a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * some image file date (still needs fixed)
+ *
+ * ***************** Version 14 *****************
+ * User: Kathy Date: 10/15/02 Time: 2:14p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * required fields bug
+ *
+ * ***************** Version 13 *****************
+ * User: Kathy Date: 10/11/02 Time: 11:35a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * Required fields & restore data
+ *
+ * ***************** Version 12 *****************
+ * User: Kathy Date: 10/10/02 Time: 10:43a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * console.writeline->messagebox
+ *
+ * ***************** Version 11 *****************
+ * User: Kathy Date: 10/07/02 Time: 11:26a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * graphics image file support
+ *
+ * ***************** Version 10 *****************
+ * User: Kathy Date: 9/27/02 Time: 1:12p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * fix digit as first char in fieldname
+ *
+ * ***************** Version 9 *****************
+ * User: Jsj Date: 9/26/02 Time: 12:12p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * removed reference
+ *
+ * ***************** Version 8 *****************
+ * User: Jsj Date: 9/26/02 Time: 11:09a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * added reference to VLNXML
+ *
+ * ***************** Version 7 *****************
+ * User: Kathy Date: 9/25/02 Time: 9:54a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * remove xmlvln
+ *
+ * ***************** Version 6 *****************
+ * User: Kathy Date: 9/19/02 Time: 9:59a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * fix minor bugs
+ *
+ * ***************** Version 5 *****************
+ * User: Kathy Date: 9/11/02 Time: 1:13p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * vlnxml
+ *
+ * ***************** Version 4 *****************
+ * User: Kathy Date: 9/10/02 Time: 12:17p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * modify xpath expression to find field contents
+ *
+ * ***************** Version 3 *****************
+ * User: Kathy Date: 9/05/02 Time: 12:41p
+ * Updated in $/LibSource/ctlXMLEditLib
+ * dev
+ *
+ * ***************** Version 2 *****************
+ * User: Kathy Date: 8/30/02 Time: 9:42a
+ * Updated in $/LibSource/ctlXMLEditLib
+ * dev
+ *
+ * ***************** Version 1 *****************
+ * User: Jsj Date: 8/23/02 Time: 3:02p
+ * Created in $/LibSource/ctlXMLEditLib
+ *********************************************************************************************/
+
+using System;
+using System.IO;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Windows.Forms;
+using System.Drawing.Imaging;
+using System.Runtime.InteropServices;
+using System.Xml;
+using System.Xml.Schema;
+using System.Text;
+using RODBInterface;
+using Org.Mentalis.Files;
+//using IniFileIO;
+
+
+
+namespace ctlXMLEditLib
+{
+ ///
+ /// This windows control takes an input XML Schema and displays windows controls for the
+ /// schema elements.
+ /// If XML is also passed in, it uses that for the data.
+ /// Methods supported are:
+ /// ctlXMLEdit(VlnXmlElement myelem, XmlSchema myschema)
+ /// Constructor - VlnXmlElement contains data for edit and contains top
+ /// - document node if creating new xml data.
+ /// - XmlSchema contains field definitions
+ /// bool SaveData
+ /// - saves data in windows into passed in VlnXmlElement.
+ /// - returns true if successful, false if failed.
+ ///
+ ///
+ ///
+ public class ctlXMLEdit : System.Windows.Forms.UserControl
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.Container components = null;
+ private Random random = new Random();
+ private XmlSchema myXmlSchema;
+ private int screenx;
+ private int screeny;
+ private int tabindx;
+ private bool mysavexml;
+ private Hashtable myHT;
+ private bool dosaveflag;
+ private VlnXmlElement editelem;
+ private XmlDocument editdoc;
+ private TextBox zoomtextbox;
+ // the following is used for handling images. Note that if we want to have more
+ // than one image defined in an ro, this should be become a list.
+ private TextBox GraphicsFiletextbox;
+ private TextBox GraphicsWdtextbox;
+ private TextBox GraphicsHttextbox;
+ private System.Windows.Forms.Button btnFindFile;
+ private string GraphicsText;
+ private ToolTip zmtooltip;
+ private string DefaultGraphicFileExtension;
+ int MaxWidth; // largest textbox/groupbox width to size control.
+ int himage, wimage;
+ int hmin, hmax;
+ int wmin, wmax;
+ int MAXLT = 60; // make these defines
+ int MAXWT = 84;
+ int STDCPI = 12;
+ int STDLPI = 6;
+ int DPPL = (720/6);
+ int DPPC = (720/12);
+ int height, width;
+
+ // use this struct to define attributes for the text box fields, storing
+ // the pattern, radio button association, required field flag, etc.
+ struct TextBoxAttrTag
+ {
+
+ bool required; //whether the field is required
+ string req_msg; //message to print if required, but not set
+ string pattern; //pattern for validation
+ RadioButton radio; // if this text box has associated radio button
+ bool imagechild; //whether this field is a subchild of an image
+ string imagename; //if subchild of image, name of image parent (for save)
+ string imagedate; //if this was filename, save the date/time stamp
+ public TextBoxAttrTag(bool reqd, string ptn, RadioButton rd, bool img,
+ string imgname, string imgdate)
+ {
+ this.req_msg = null;
+ this.required = reqd;
+ this.pattern = ptn;
+ this.radio = rd;
+ this.imagechild = img;
+ this.imagename = imgname;
+ this.imagedate = imgdate;
+ }
+ public void SetPattern(string pattern) {this.pattern = pattern;}
+ public void SetRequired(bool req) {this.required = req;}
+ public void SetRequiredMessage(string ireq_msg) {this.req_msg = ireq_msg;}
+ public string GetPattern { get {return pattern;}}
+ public string GetRequiredMessage { get {return req_msg;}}
+ public bool GetRequired { get {return required;}}
+ public RadioButton GetRadio { get {return radio;}}
+ public bool GetImageChild { get {return imagechild;}}
+ public string GetImageName { get {return imagename;}}
+ public string GetImageDate { get {return imagedate;}}
+ public void SetImageDate(string imgdate) {this.imagedate = imgdate;}
+ }
+
+ public ctlXMLEdit(VlnXmlElement myelem, XmlSchema myschema, ArrayList reqfields)
+ {
+ // This call is required by the Windows.Forms Form Designer.
+ InitializeComponent();
+ zmtooltip = new ToolTip();
+ myHT = new Hashtable();
+ tabindx=0;
+ screenx=8;
+ screeny=10;
+ MaxWidth = 0;
+ mysavexml = false;
+ dosaveflag = false;
+ editelem = myelem;
+ editdoc = myelem.OwnerDocument;
+ myXmlSchema = myschema;
+ GraphicsText = null;
+ GraphicsFiletextbox = null;
+// DefaultGraphicFileExtension = ".TIF"; // default graphics file extension
+ string ApplicationPath = Application.StartupPath;
+ string ROINI = Directory.GetCurrentDirectory()+ "\\ROAPP.INI";
+
+ // Get the default file extension for graphic files
+// DefaultGraphicFileExtension = TheIniFile.GetINIKeyValueStr("ROApp","Extention","",5,"ROAPP.INI");
+ // Bug fix: B2006-025
+ // needed to pass the full path of ROAPP.INI
+ IniReader in1 = new IniReader(ROINI);
+ DefaultGraphicFileExtension = in1.ReadString("ROApp","Extention","");
+ if (DefaultGraphicFileExtension.Equals(""))
+ {
+ string ApplPathUp = ApplicationPath.ToUpper();
+ int idx = ApplPathUp.IndexOf("VE-PROMS.NET\\BIN");
+ if (idx >= 0)
+ {
+ string PromsINI = ApplicationPath.Substring(0, idx);
+ PromsINI += "VE-PROMS\\VEPROMS.INI";
+ IniReader in2 = new IniReader(PromsINI);
+ DefaultGraphicFileExtension = in2.ReadString("Graphics", "defaultext", ".TIF");
+ }
+ else
+ DefaultGraphicFileExtension = ".TIF";
+ }
+// if (File.Exists(PromsINI))
+// DefaultGraphicFileExtension = TheIniFile.GetINIKeyValueStr("Graphics","defaultext",".TIF",5,PromsINI);
+// if (File.Exists("ROAPP.INI"))
+// DefaultGraphicFileExtension = TheIniFile.GetINIKeyValueStr("ROApp","Extention",".TIF",5,"ROAPP.INI");
+ if (!DefaultGraphicFileExtension.StartsWith("."))
+ DefaultGraphicFileExtension = "." + DefaultGraphicFileExtension;
+
+ // Put out window fields based on schema fields.
+ DisplaySchemaControls(myXmlSchema);
+
+ // Add field data to fields.
+ DisplayFieldContents((XmlNode) myelem);
+
+ // Set required fields based on list. (can add message later).
+ SetRequiredFields(reqfields);
+ dosaveflag=true;
+ }
+
+ // set the required fields tag on those fields which are included in the passed
+ // in required fields list.
+ private void DoSet(TextBox hwnd, string msg)
+ {
+ if (hwnd == null) return;
+ if (hwnd.Tag != null)
+ {
+ TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
+ tag.SetRequired(true);
+ tag.SetRequiredMessage(msg);
+ hwnd.Tag = tag;
+ }
+ }
+
+ private void SetRequiredFields(ArrayList reqfields)
+ {
+ Object o;
+ TextBox hwnd;
+ string field, msg;
+ int indx;
+ foreach (string strfld in reqfields)
+ {
+ indx = strfld.IndexOf("\t"); // message is stored after field, tab delim
+ field = strfld.Substring(0,indx);
+ msg = strfld.Substring(indx,strfld.Length-indx);
+
+ o = null;
+ o = myHT[field];
+ if (o == null)
+ {
+ // there may be an a,b,c,d tacked on to represent combo types.
+ // try them. if we have a combo type, then set them all as required
+ // because the checker will only check the one that is visible.
+ o = myHT[field+"a"];
+ if (o != null) // set all combo types required, the checker
+ {
+ DoSet((TextBox)o,msg);
+ DoSet((TextBox)myHT[field+"b"],msg);
+ DoSet((TextBox)myHT[field+"c"],msg);
+ DoSet((TextBox)myHT[field+"d"],msg);
+ }
+ }
+ else if (o != null)
+ {
+ hwnd = (TextBox) o;
+ if (hwnd.Tag != null)
+ {
+ TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
+ tag.SetRequired(true);
+ tag.SetRequiredMessage(msg);
+ hwnd.Tag = tag;
+ }
+ }
+ }
+ }
+
+ // Given a parent XmlNode, walk through the child nodes & add the text for the
+ // node to the associated text box.
+ private void DisplayFieldContents(XmlNode node)
+ {
+ Object o;
+ TextBox hwnd;
+ XmlNode nd;
+ // if we have an image, check it for validity, i.e. file exists, etc.??
+ foreach (string str in myHT.Keys)
+ {
+ o = myHT[str];
+ hwnd = (TextBox) o;
+ nd = node.SelectSingleNode(str);
+ // if not found with just the string, search the tree.
+ if (nd==null)nd = node.SelectSingleNode("*/"+str);
+ if (nd != null)
+ {
+ hwnd.Text = nd.InnerText; // set the field's text from XML
+
+ // check if this window has a button name as part of its tag. If
+ // so it's a combo type & the radio button/visibility may need to
+ // be reset. If this button is not checked (during setup), then
+ // check it. By setting it's Checked property to true, an event
+ // is thrown which causes the code to be run which turns off/on
+ // visibility of the text boxes.
+ if (hwnd.Tag != null)
+ {
+ TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
+ RadioButton radio;
+ radio = tag.GetRadio;
+
+ if (radio != null )
+ {
+ // Use a tag on the groupbox to know that the radio button
+ // was set - the first xml element in the group is the
+ // active one.
+ GroupBox gp = (GroupBox) radio.Parent;
+ if (gp.Tag == null && radio.Checked == false)
+ {
+ // see if this is the first member of the group in the
+ // xml node.
+ string nmgr = str.Substring(0,str.Length-1);
+ XmlNode grpnd = (XmlNode) editelem.FirstChild;
+ bool first = true;
+ while (grpnd != null)
+ {
+ if (grpnd.Name.Substring(0,grpnd.Name.Length-1) == nmgr)
+ {
+ if (grpnd.Name == str)
+ {
+ if (first)
+ {
+ radio.Checked = true;
+ radio.Parent.Tag = true;
+ }
+ break;
+ }
+ first = false;
+ }
+ grpnd = grpnd.NextSibling;
+ }
+ }
+ }
+ bool img;
+ img = tag.GetImageChild;
+ if (img==true && str == "Image_Filename")
+ {
+ int indx = hwnd.Text.IndexOf(" ");
+ if (indx>=0)
+ {
+ tag.SetImageDate(hwnd.Text.Substring(0,indx));
+ hwnd.Tag = tag;
+ hwnd.Text = hwnd.Text.Substring(indx+1,hwnd.Text.Length-indx-1);
+ }
+ }
+ if (img==true && str == "Image_Width")
+ width = System.Convert.ToInt32(hwnd.Text);
+ if (img==true && str == "Image_Height")
+ height = System.Convert.ToInt32(hwnd.Text);
+ }
+ }
+ }
+ // if we're doing an image file & all data has been set, update the
+ // height/width data of the image.
+ if (GraphicsFiletextbox != null && GraphicsFiletextbox.Text != "") UpdateHtWd();
+ }
+ public TextBox GetGraphicsFiletextbox()
+ {
+ return GraphicsFiletextbox;
+ }
+ public int GetMaxWidth()
+ {
+ // if MaxWidth is small, a scroll bar appears below the fields
+ // so make this a bit larger, so a scroll bar doesn't appear
+ if (MaxWidth<30) return MaxWidth+60;
+ return MaxWidth+30;
+ }
+ public int GetMaxLength()
+ {
+ return screeny+50;
+ }
+ public void SetNotSaved()
+ {
+ mysavexml = true;
+ }
+ ///
+ /// Clean up any resources being used.
+ ///
+ protected override void Dispose( bool disposing )
+ {
+ zmtooltip.RemoveAll();
+ if( disposing )
+ {
+ if( components != null )
+ components.Dispose();
+ }
+ base.Dispose( disposing );
+ }
+
+ // RestoreData restores the data in the text boxes to be that which was originally
+ // sent into the control (ctlXMLEdit)
+ public void RestoreData()
+ {
+ dosaveflag=false;
+ mysavexml=false;
+ TextBox hwnd;
+ // first, clear out all of the text boxes.
+
+ foreach (string str in myHT.Keys)
+ {
+ object o = myHT[str];
+ hwnd = (TextBox) o;
+ hwnd.Text = "";
+ TextBoxAttrTag tag = (TextBoxAttrTag) hwnd.Tag;
+ RadioButton radio;
+ radio = tag.GetRadio;
+ if (radio != null )
+ {
+ GroupBox gp = (GroupBox) radio.Parent;
+ gp.Tag = null;
+ }
+ }
+ // Add field data to fields.
+ DisplayFieldContents((XmlNode) editelem);
+ dosaveflag=true;
+ }
+
+ public bool DataChanged()
+ {
+ if (mysavexml) return true;
+ return false;
+ }
+
+ // SaveData saves the data in the element which had been sent to the control. Return
+ // true if success, false if fail.
+ public bool SaveData()
+ {
+
+ if (mysavexml)
+ {
+ TextBox hwnd;
+ TextBoxAttrTag tag;
+ string imgdate;
+
+ //go thru the hash table to get textboxes. Find the ones that have text.
+ foreach (string str in myHT.Keys)
+ {
+ object o = myHT[str];
+ hwnd = (TextBox) o;
+ imgdate = null;
+
+ // if this is a required field and there is no text, put out an error
+ // message and get out of here.
+ if (hwnd.Tag != null)
+ {
+ tag = (TextBoxAttrTag) hwnd.Tag;
+ if (tag.GetRequired == true && hwnd.Visible == true && (hwnd.Text == null || hwnd.Text == ""))
+ {
+ string message = CvtFldToUserFld(str) + " must be entered because it is\nused to define the " + tag.GetRequiredMessage;
+ string caption = "Error on Save RO Data";
+ MessageBoxButtons buttons = MessageBoxButtons.OK;
+ DialogResult result;
+ result = MessageBox.Show(message, caption, buttons);
+ return (false);
+ }
+ imgdate = tag.GetImageDate;
+
+ }
+
+ // find the element in the current element node.
+ // if text exists and the element exists, just reset the innertext.
+ // if text exists and it's a new element, add it.
+ // if the element is there and there's no text. delete it.
+ XmlNode elmnode = (XmlNode) editelem;
+ XmlNode nd = elmnode.SelectSingleNode(str);
+ if (nd == null) nd = elmnode.SelectSingleNode("*/"+str);
+
+ // handle, element exists - but text removed first (delete element)
+ if ((hwnd.Text == null || hwnd.Text == "") && nd != null)
+ {
+ XmlNode parent = nd.ParentNode;
+ parent.RemoveChild(nd);
+ }
+ else
+ {
+ // found the node, just set text and text exists, just modify text.
+ if (nd != null)
+ {
+ if (str == "Image_Filename")
+ nd.InnerText = imgdate + " " + hwnd.Text;
+ else
+ nd.InnerText = hwnd.Text;
+ }
+ // node not here. Make a new element
+ else if (hwnd.Text != null && hwnd.Text != "")
+ {
+ // if this is part of an image, then be sure that the
+ // parent image node was created and if not, create it.
+ bool ischldimag = false;
+ if (hwnd.Tag != null)
+ {
+ tag = (TextBoxAttrTag) hwnd.Tag;
+ if (tag.GetImageChild == true) ischldimag = true;
+ }
+ if (ischldimag)
+ {
+ tag = (TextBoxAttrTag) hwnd.Tag; // yikes, compile errors
+ string imagnm = tag.GetImageName;
+ VlnXmlElement ielm;
+ VlnXmlElement newelem;
+ nd = elmnode.SelectSingleNode(imagnm);
+ if (nd == null) // make this image node.
+ {
+ newelem = (VlnXmlElement) editdoc.CreateElement(imagnm);
+ editelem.AppendChild((XmlNode) newelem);
+ ielm = newelem;
+ }
+ else
+ ielm = (VlnXmlElement) nd;
+ newelem = (VlnXmlElement) editdoc.CreateElement(str);
+ if (str == "Image_Filename")
+ newelem.InnerText = imgdate + " " + hwnd.Text;
+ else
+ newelem.InnerText = hwnd.Text;
+ ielm.AppendChild((XmlNode) newelem);
+ }
+ else
+ {
+ // just added at the current level
+ VlnXmlElement newelem = (VlnXmlElement) editdoc.CreateElement(str);
+ newelem.InnerText = hwnd.Text;
+ editelem.AppendChild((XmlNode) newelem);
+ nd = (XmlNode) newelem;
+ }
+ }
+ // check on order of combo types if this was one. Note that the 'active'
+ // type within the combo, i.e. text, variable, table or xyplot, must
+ // be the first one in xml tree (before the others) in order to be the
+ // active one as presented to user. This was done since more than one can have data.
+ if (hwnd.Tag != null)
+ {
+ tag = (TextBoxAttrTag) hwnd.Tag;
+ RadioButton rb = tag.GetRadio;
+ if (rb != null)
+ {
+ if (rb.Checked == true)
+ {
+ // this one needs to be before any others (of the same
+ // group type) in the xml childlist - just make it 1st.
+ XmlNode parent = nd.ParentNode;
+ parent.RemoveChild(nd);
+ parent.PrependChild(nd);
+ }
+ }
+ }
+ }
+ }
+ mysavexml=false; // data has been saved, don't allow it again.
+ return(true);
+ }
+ return (false);
+ }
+
+ #region Component Designer generated code
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnFindFile = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // btnFindFile
+ //
+ this.btnFindFile.Location = new System.Drawing.Point(608, 8);
+ this.btnFindFile.Name = "btnFindFile";
+ this.btnFindFile.Size = new System.Drawing.Size(96, 24);
+ this.btnFindFile.TabIndex = 1;
+ this.btnFindFile.Text = "Find File";
+ this.btnFindFile.Visible = false;
+ this.btnFindFile.Click += new System.EventHandler(this.btnFindFile_click);
+ this.ResumeLayout(false);
+
+ this.Controls.Add(btnFindFile);
+
+ }
+ #endregion
+
+ // Given a schema, display labels or radio buttons and their associated textboxes
+ // Radio button names are derived from removing the type from the element name.
+ private void DisplaySchemaControls(XmlSchema myXmlSchema)
+ {
+ // the first element is the group name, get past this to the data. This group
+ // name is a complex type, which is processed below.
+ bool first=true;
+ try
+ {
+ foreach(object item in myXmlSchema.Items)
+ {
+ if (item is XmlSchemaElement && first)
+ {
+ first=false;
+ }
+
+ // in the RO schema (and any types derived from it), the fields are
+ // defined within the ComplexType.
+ if (item is XmlSchemaComplexType)
+ DisplayXmlSchemaComplexType((XmlSchemaComplexType)item); //complexType
+ }
+ }
+ catch(Exception e)
+ {
+ MessageBox.Show(e.ToString(),"Error displaying fields from schema");
+ }
+ }
+
+
+ //XmlSchemaComplexType
+ private void DisplayXmlSchemaComplexType(XmlSchemaComplexType complexType)
+ {
+ if (complexType.ContentModel == null)
+ {
+ if (complexType.Particle != null)
+ DisplayXmlSchemaParticle(complexType.Particle);
+ }
+ }
+
+ //XmlSchemaSimpleType processes a simple type schema element which contains a fields
+ // attributes such as patterns, maxLength and whether it is single (type is
+ // 'normalizedString') or a multiline text box(type is 'string'). Also, a radio
+ // button is passed in if this was called to handle an element within a combo type.
+ // This button is saved for a given text box so that initialization of these combo types can occur.
+ private string DisplayXmlSchemaSimpleType(XmlSchemaSimpleType simpleType, TextBox mytextbox, RadioButton radio,
+ bool img, string imgname)
+ {
+ // set up for text box tag, which stores whether field is required and
+ // if a pattern exists for validation.
+ string pattern = null;
+ string getannot=null;
+ if (simpleType.Annotation != null)
+ {
+ object item = simpleType.Annotation.Items[0];
+ if (item is XmlSchemaDocumentation)
+ {
+ XmlSchemaDocumentation doc = (XmlSchemaDocumentation) item;
+ XmlNode[] node = (XmlNode[]) doc.Markup;
+
+ getannot = node[0].InnerText;
+ if (getannot == "VLN_FINDFILE")
+ {
+ this.btnFindFile.Location = new System.Drawing.Point(mytextbox.Location.X+mytextbox.Width+50,mytextbox.Location.Y-(2*(int)mytextbox.Font.GetHeight()));
+ this.btnFindFile.Visible = true;
+ GraphicsFiletextbox = mytextbox;
+ GraphicsFiletextbox.LostFocus += new System.EventHandler(this.GraphicText_lostfocus);
+ getannot = null;
+ }
+ if (getannot!=null && getannot!="")
+ {
+ if (getannot.IndexOf("Lines")>=0)
+ {
+ GraphicsHttextbox = mytextbox;
+ mytextbox.LostFocus += new System.EventHandler(this.GraphicsHt_lostfocus);
+ }
+ if (getannot.IndexOf("Character")>=0)
+ {
+ GraphicsWdtextbox = mytextbox;
+ mytextbox.LostFocus += new System.EventHandler(this.GraphicsWd_lostfocus);
+ }
+ }
+ }
+ }
+
+
+ if (simpleType.Content is XmlSchemaSimpleTypeRestriction)
+ {
+ // A Schema Type Restriction is used to define single or multi-line boxes.
+ XmlSchemaSimpleTypeRestriction myRestrictions = (XmlSchemaSimpleTypeRestriction) simpleType.Content;
+ if (myRestrictions.BaseTypeName.Name == "normalizedString")
+ mytextbox.Multiline = false;
+ else
+ {
+ mytextbox.Multiline = true;
+ mytextbox.AcceptsReturn = true;
+ mytextbox.Height = (int) mytextbox.Font.GetHeight() * 4;
+ mytextbox.ScrollBars = ScrollBars.Vertical;
+ zmtooltip.SetToolTip(mytextbox, "Press Shift F2 To Zoom");
+ }
+
+ // Schema facets were used for maxlength & patterns, process these if found.
+ foreach(XmlSchemaFacet facet in myRestrictions.Facets)
+ {
+ if (facet is XmlSchemaMaxLengthFacet)
+ {
+ if (mytextbox.Multiline == false)
+ mytextbox.MaxLength = System.Convert.ToInt32(facet.Value);
+ // if the box is small, make the width a little bigger so maxlength text can fit.
+ int wd = System.Convert.ToInt32(facet.Value);
+ if (wd<5) wd++;
+ mytextbox.Width = (int) mytextbox.Font.SizeInPoints * wd;
+ MaxWidth = (mytextbox.Width>MaxWidth)?mytextbox.Width:MaxWidth;
+ }
+ else if (facet is XmlSchemaPatternFacet)
+ {
+ pattern = facet.Value;
+ }
+ }
+ }
+
+ // Now setup a tag for the text box which will store attributes associated with it
+ // for seeing if it is a required field, checking a pattern or processing a radio box
+ // initialization.
+ if (mytextbox.Tag == null)
+ {
+ TextBoxAttrTag tag = new TextBoxAttrTag(false, pattern, radio, img, (img?imgname:null), null);
+ mytextbox.Tag = (object) tag;
+ }
+ return getannot;
+ }
+
+ //XmlSchemaParticle's contain the individual schema elements which represent
+ // fields defined for this given RO group. It may also contain a schema 'choice'
+ // which was used to handle the combo type data type fields.
+ private void DisplayXmlSchemaParticle(XmlSchemaParticle particle)
+ {
+ if (particle is XmlSchemaElement)
+ DisplayXmlSchemaElement((XmlSchemaElement)particle);
+ else if (particle is XmlSchemaSequence)
+ {
+ foreach(XmlSchemaParticle particle1 in ((XmlSchemaSequence)particle).Items)
+ DisplayXmlSchemaParticle(particle1);
+ }
+ else if (particle is XmlSchemaChoice)
+ DisplayXmlSchemaChoice((XmlSchemaChoice) particle);
+ else
+ MessageBox.Show(particle.ToString(),"Not Implemented for this type");
+ }
+
+ // For a combo field, display the radio button & the text field. Select the first
+ // button. If data is also sent in during initialization of this control, i.e.
+ // edit versus new, the selected button will be changed during the XML file
+ // data load process.
+ // Return value (set as reference params): 'x' & 'y' size of the text field so that
+ // the caller can determine the max to set the group box x, y size value and know
+ // how far to move down on the screen.
+ private void DisplayXmlSchemaRadioAndTextBox(XmlSchemaElement element, GroupBox gbox, bool first, int x, int y,
+ int boxx, ref int retx, ref int rety)
+ {
+ int ysize;
+ RadioButton radio = new RadioButton();
+ radio.Location = new System.Drawing.Point(x,20);
+ radio.Name = element.Name + element.SchemaTypeName.Name;
+ string tmp;
+ if (element.SchemaTypeName.Name.Length>1 && char.IsDigit(element.SchemaTypeName.Name,1))
+ tmp = element.SchemaTypeName.Name.Substring(1,element.SchemaTypeName.Name.Length-1);
+ else
+ tmp = element.SchemaTypeName.Name;
+ radio.Text = CvtFldToUserFld(tmp);
+ //radio.Width = (int) radio.Font.SizeInPoints * radio.Text.Length + 20; // add 20 for button
+
+ radio.TabIndex = 0;
+ ysize = (int) radio.Height;
+
+ if (first) radio.Checked = true;
+ radio.CheckedChanged += new System.EventHandler(this.radiocheckchg);
+ gbox.Controls.Add(radio);
+
+ TextBox tb = new TextBox();
+ tb.Location = new Point(boxx+20, y+25);
+ if (!first) tb.Visible = false;
+ myHT.Add(element.Name,tb);
+ // add the textbox to the ctlxmledit control rather than groupbox - the
+ // groupbox is just to control the choices, the text box won't display if in
+ // the groupbox.
+ Controls.Add(tb);
+ tb.TextChanged += new System.EventHandler(this.textbox_change);
+ tb.GotFocus += new System.EventHandler(this.textbox_zoombtn);
+ tb.KeyDown += new KeyEventHandler(MyOnKeyDown);
+ gbox.Contains(tb);
+ // the following will set attributes on the text boxes such as maxlength, multiline, etc.
+ DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType, tb, radio,false,null);
+ rety = (ysize + 25 + tb.Height);
+ retx = tb.Width;
+ }
+
+ //XmlSchemaChoice: processes the 'combo data type' which is represented by a
+ // a schema choice element. This is handled by a group box and using radio
+ // button/textbox pairs to represent each element within the choice.
+ private void DisplayXmlSchemaChoice(XmlSchemaChoice choice)
+ {
+ bool first = true;
+ int screenposx, screenposy;
+ int maxyfortext=0,maxxfortext=0;
+ GroupBox groupbox = new GroupBox();
+ groupbox.SuspendLayout();
+ groupbox.Location = new System.Drawing.Point(screenx,screeny);
+ XmlSchemaElement elem = (XmlSchemaElement) choice.Items[0];
+ groupbox.Name = elem.Name;
+ groupbox.TabStop = false;
+
+ // remove the last character of the name for the title of the group box.
+ string tstr = CvtFldToUserFld(elem.Name);
+ groupbox.Text = tstr.Remove((tstr.Length)-1,1);
+ screenposx = screenx+20;
+ screenposy = screeny+20;
+
+ foreach (object o in choice.Items)
+ {
+ // put out a radio button/text box for each item in the choice.
+ int xmax=0, ymax=0;
+ DisplayXmlSchemaRadioAndTextBox((XmlSchemaElement) o,groupbox,first,screenposx,screenposy,screenx,ref xmax,ref ymax);
+ first = false;
+ maxyfortext = ymax>maxyfortext?ymax:maxyfortext;
+ maxxfortext = xmax>maxxfortext?xmax:maxxfortext;
+ screenposx = screenposx + 160;
+ }
+
+ // get the widths of all children of this group box & use this to set the size
+ // of the groupbox.
+ int gritms = groupbox.Controls.Count;
+ screeny=screeny+maxyfortext+10;
+ MaxWidth = (maxxfortext+40>MaxWidth)?maxxfortext+40:MaxWidth;
+ groupbox.Size = new System.Drawing.Size(maxxfortext+40, maxyfortext+10);
+ Controls.Add(groupbox);
+ }
+
+ private void DisplayXmlSchemaElement(XmlSchemaElement element)
+ {
+ // always add a label.
+ Label mylabel;
+ int sscreeny;
+ mylabel = new System.Windows.Forms.Label();
+ mylabel.Location = new Point(screenx, screeny);
+ mylabel.Name = element.Name;
+ mylabel.Text = CvtFldToUserFld(element.Name);
+ mylabel.AutoSize = true;
+ Controls.Add(mylabel);
+ // add 3 onto screeny so that textbox is slightly below label.
+ screeny = screeny+mylabel.Height+3;
+ sscreeny = screeny; // save 'y' location in case of annotation.
+ if (element.SchemaType != null && element.SchemaType is XmlSchemaComplexType)
+ {
+ GraphicsText = element.Name;
+ DisplayXmlSchemaComplexType((XmlSchemaComplexType)element.SchemaType);
+ screeny+=30;
+ }
+ else
+ {
+ TextBox mytextbox;
+ mytextbox = new TextBox();
+ mytextbox.Location = new Point(screenx, screeny);
+ myHT.Add(element.Name,mytextbox);
+ tabindx++;
+ Controls.Add(mytextbox);
+ screeny+=mytextbox.Height;
+ mytextbox.TextChanged += new System.EventHandler(this.textbox_change);
+ mytextbox.Validating += new System.ComponentModel.CancelEventHandler(this.textbox_Validating);
+ mytextbox.GotFocus += new System.EventHandler(this.textbox_zoombtn);
+ mytextbox.KeyDown += new KeyEventHandler(MyOnKeyDown);
+
+ string labelAnnot;
+ bool imgchld = false;
+ if (element.Name == "Image_Filename" || element.Name == "Image_Height" || element.Name == "Image_Width") imgchld = true;
+ // Pass the textbox in to set attributes such as maxlength, multiline and pattern
+ labelAnnot = DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType,mytextbox, null,imgchld,GraphicsText);
+ if (labelAnnot != null)
+ {
+ Label annot;
+ annot = new System.Windows.Forms.Label();
+ annot.Location = new Point(screenx+mytextbox.Width+10, sscreeny);
+ annot.Name = "annot" + screeny.ToString();
+ annot.Text = labelAnnot;
+ annot.AutoSize = true;
+ Controls.Add(annot);
+ }
+ screeny+=mytextbox.Height;
+ }
+ }
+
+ // the following is needed to load the control.
+ private void ctlXMLEdit_Load(object sender, System.EventArgs e)
+ {
+
+ }
+
+ // when data in a text box has changed, flag it (except for when this
+ // happens during loading of original data). This flag will be used
+ // later to know whether to save data.
+ private void textbox_change(object sender, System.EventArgs e)
+ {
+ if(dosaveflag)mysavexml = true;
+ }
+
+ // radiocheckchg - called when a radio button is selected. This will set
+ // visibility for associated text box.
+ private void radiocheckchg(object sender, System.EventArgs e)
+ {
+ RadioButton btnsel = (RadioButton) sender;
+ TextBox assocbox;
+ string btntext, str;
+
+ if(dosaveflag)mysavexml = true;
+ btntext = CvtUserFldToFld(btnsel.Text);
+
+ // now get the actual textbox and set visibility depending
+ // on whether the box is checked, i.e. turned on(if checked, it should
+ // be set to visible)
+
+ str = btnsel.Name.Replace(btntext,"");
+ object o = myHT[str];
+ if (o == null) return;
+ assocbox = (TextBox) o;
+ // make the text box visible if checked, otherwise, invisible
+ assocbox.Visible = btnsel.Checked;
+ }
+
+ // these two methods convert user input field names from/to xml tags. (xml tags
+ // cannot begin with digit, have spaces or other special chars.
+ private string CvtUserFldToFld(string fldname)
+ {
+ if (fldname.Length < 2)
+ return fldname;
+ // a digit cannot start an xml fieldname, prepend a "__" to it.
+ string tmp0;
+ if (char.IsDigit(fldname,0))
+ tmp0 = "__" + fldname;
+ else
+ tmp0 = fldname;
+ // an xml fieldname cannot have a space, change it to a "__"
+ string tmpstr = tmp0.Replace(" ","__");
+ int len = tmpstr.Length;
+ int cnt = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval;
+
+ while (cnt < len)
+ {
+ char tmpchr = tmpstr[cnt];
+ if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
+ {
+ decval = tmpchr;
+ outstr += OKpunch + decval.ToString("D3");
+ }
+ else
+ {
+ outstr += tmpchr.ToString();
+ }
+ cnt++;
+ }
+ return outstr;
+ }
+
+ private string CvtFldToUserFld(string fldname)
+ {
+ string tmpstr0;
+ if (fldname.Length < 2) return fldname;
+ // an xml element name cannot begin with a digit. we had prepended a "__"
+ if (fldname.Substring(0,2) == "__" && char.IsDigit(fldname,2))
+ tmpstr0 = fldname.Substring(2,fldname.Length-2);
+ else
+ tmpstr0 = fldname;
+ // an xml element name cannot have a space, we converted to a "__"
+ string tmpstr = tmpstr0.Replace("__"," ");
+ int len = tmpstr.Length;
+ int cur = 0;
+
+ // this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
+ // of the character we replaced.
+ string OKpunch = "-._";
+
+ string outstr = "";
+ int decval, indx;
+ if (tmpstr.Length <6)
+ indx = -1;
+ else
+ indx=tmpstr.IndexOf(OKpunch,cur);
+ string asc_spchar;
+ while (indx>=0)
+ {
+ outstr += tmpstr.Substring(cur,indx-cur);
+ asc_spchar = tmpstr.Substring(indx+3,3);
+ decval = System.Convert.ToInt16(asc_spchar,10);
+ outstr += System.Convert.ToChar(decval).ToString();
+ cur = indx+6;
+ if (cur+6 > len)
+ indx = -1;
+ else
+ indx = tmpstr.IndexOf(OKpunch,cur);
+ }
+ if (cur0)
+ lname = iname.Substring(slindx+1,iname.Length-slindx-1);
+ else
+ lname = iname;
+ // now check to see if this is a local file - to do this, check
+ // to see if either has a "~" which may signify a short filename.
+ // If so, compare the short file names (Note that comparing long
+ // filenames didn't work, i.e. the kernel routine did not return
+ // a long filename if a short one was sent in).
+
+ // open an existing file, or create a new one
+
+ FileInfo lfi = new FileInfo(lname); // local file & info
+
+ if (lfi.Exists == false) // !exist, copy it & move on
+ {
+ // Copy the file to the local directory
+ ifi.CopyTo(lname);
+ // update fields on window....
+ GraphicsFiletextbox.Text = lfi.Name;
+ TextBoxAttrTag tag = (TextBoxAttrTag) GraphicsFiletextbox.Tag;
+ tag.SetImageDate(CalculatePromsDate(ifi.LastWriteTime));
+ GraphicsFiletextbox.Tag = tag;
+ UpdateHtWd();
+ return true;
+ }
+ else // A local file exists by the same name
+ {
+ if (ifi.Exists == false)
+ {
+ MessageBox.Show("Input file doesn't exist.","Error");
+ return false;
+ }
+ else
+ {
+ // first just check if these are really the same, just the
+ // user put a path in.
+ int same = 0;
+ if (ifi.DirectoryName.IndexOf("~")>=0 || lfi.DirectoryName.IndexOf("~")>=0)
+ {
+
+ StringBuilder shortlname = new StringBuilder(257);
+ StringBuilder shortiname = new StringBuilder(257);
+ GetShortPathName(ifi.DirectoryName,shortiname,257);
+ GetShortPathName(lfi.DirectoryName,shortlname,257);
+ same = String.Compare(shortlname.ToString(),shortlname.ToString());
+ }
+ if (same == 0)
+ {
+ TextBoxAttrTag tag = (TextBoxAttrTag) GraphicsFiletextbox.Tag;
+ tag.SetImageDate(CalculatePromsDate(lfi.LastWriteTime));
+ GraphicsFiletextbox.Tag = tag;
+ return true;
+ }
+ else
+ {
+ // Is the file the same - size, date, time
+ // old code checked for both findfirst failures??
+ string msg=null;
+ if (lfi.LastWriteTime > ifi.LastWriteTime)
+ msg = "A newer copy of t";
+ else if (lfi.LastWriteTime < ifi.LastWriteTime)
+ msg = "An older copy of t";
+ else if (lfi.Length != ifi.Length)
+ msg = "A different copy of t";
+ msg = msg + "he selected file\nexists in the RO directory\n";
+ msg = msg + "Do you want to replace it\n";
+ msg = msg + "with the selected file?";
+ MessageBoxButtons buttons = MessageBoxButtons.YesNoCancel;
+ DialogResult result;
+ result = MessageBox.Show( msg, "Graphics File Copy", buttons);
+ if (result == DialogResult.Yes)
+ {
+ lfi.Delete();
+ ifi.CopyTo(lname,true);
+ // update dialog data & ht/wd
+ GraphicsFiletextbox.Text = lfi.Name;
+ TextBoxAttrTag tag = (TextBoxAttrTag) GraphicsFiletextbox.Tag;
+ tag.SetImageDate(CalculatePromsDate(lfi.LastWriteTime));
+ GraphicsFiletextbox.Tag = tag;
+ UpdateHtWd();
+ return true;
+ }
+ else if (result != DialogResult.No) // not yes or no. Cancel out.
+ return false;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ // if changed height, calculate associated width
+ private void GraphicsHt_lostfocus(object sender, System.EventArgs e)
+ {
+ TextBox ht = (TextBox) sender;
+ if (ht.Modified == true)
+ {
+ try
+ {
+ int newht= System.Convert.ToInt32(ht.Text);
+ setHtWdBasedUponHeight(newht);
+ }
+ catch (Exception ee)
+ {
+ MessageBox.Show("Invalid Height Input",ee.ToString());
+ }
+ }
+ }
+ // if changed width, calculate associated height
+ private void GraphicsWd_lostfocus(object sender, System.EventArgs e)
+ {
+ TextBox wd = (TextBox) sender;
+ if (wd.Modified == true)
+ {
+ try
+ {
+ int newwd= System.Convert.ToInt32(wd.Text);
+ setHtWdBasedUponWidth(newwd);
+ }
+ catch (Exception ee)
+ {
+ MessageBox.Show("Invalid Width Input", ee.ToString());
+ }
+ }
+ }
+
+ private void setHtWdBasedUponHeight(int nuval)
+ {
+ int w,h;
+ if(himage!=0)
+ {
+ if(nuval==0)nuval=(himage+DPPL-1)/DPPL;
+ if(nuval > hmax)nuval=hmax;
+ else if(nuval < hmin)nuval=hmin;
+ h=nuval;
+ // The <<1, +1, and >>1 efectively round the result
+ // by multiplying by 2 performing the division adding
+ // 1 and dividing by 2
+ w=(((h*STDCPI*wimage)<<1)/(himage*STDLPI)+1)>>1;
+ }
+ else
+ {
+ w=h=0;
+ }
+ GraphicsWdtextbox.Text = w.ToString();
+ GraphicsHttextbox.Text = h.ToString();
+ }
+
+ private void setHtWdBasedUponWidth(int nuval)
+ {
+ int w,h;
+ if(himage!=0)
+ {
+ if(nuval==0)nuval=(wimage+DPPC-1)/DPPC;
+ if(nuval > wmax)nuval=wmax;
+ else if(nuval < wmin)nuval=wmin;
+ w=nuval;
+ //
+ // The <<1, +1, and >>1 efectively round the result
+ // by multiplying by 2 performing the division adding
+ // 1 and dividing by 2
+ h=(((w*STDLPI*himage)<<1)/(wimage*STDCPI)+1)>>1;
+ }
+ else
+ {
+ w=h=0;
+ }
+ GraphicsWdtextbox.Text = w.ToString();
+ GraphicsHttextbox.Text = h.ToString();
+ }
+
+ private void UpdateHtWd()
+ {
+ // copy the file local and also get it's width/height by reading the file.
+ Bitmap image;
+
+ try
+ {
+ string dir = Directory.GetCurrentDirectory();
+ string GraphicsFileName = GraphicsFiletextbox.Text;
+// FileInfo fi = new FileInfo(GraphicsFiletextbox.Text);
+ if (GraphicsFileName.IndexOf('.') == -1)
+ GraphicsFileName += DefaultGraphicFileExtension; // default graphics file extension
+ FileInfo fi = new FileInfo(GraphicsFileName);
+ if (fi.Exists == false)
+ {
+ MessageBox.Show("Graphics File is missing","Error");
+ wimage=himage=height=width=0;
+ return;
+ }
+
+ image = new Bitmap(GraphicsFileName);
+ himage = image.Height;
+ wimage = image.Width;
+ hmax=MAXLT; // 60 Lines
+ int hmxw=STDLPI*MAXWT*himage/(wimage*STDCPI);
+ if(hmxw < hmax)
+ {// Size is limited to the width of the paper
+ hmax=hmxw;
+ wmax=MAXWT;
+ }
+ else
+ {
+ wmax=STDCPI*hmax*wimage/(himage*STDLPI);
+ }
+ hmin=1;
+ int hmnw=STDLPI*6*himage/(wimage*STDCPI);
+ if(hmnw > hmin)
+ {// Size is limited by the width of the graphic
+ hmin=hmnw;
+ wmin=6;
+ }
+ else
+ {
+ wmin=STDCPI*1*wimage/(himage*STDLPI);
+ }
+ setHtWdBasedUponHeight(height);
+ }
+ catch (Exception exx)
+ {
+ MessageBox.Show(exx.Message.ToString(),"error on processing of graphics file");
+ }
+ }
+
+ private void btnFindFile_click(object sender, System.EventArgs e)
+ {
+ bool done = false;
+ while (done == false)
+ {
+ OpenFileDialog openFileDialog1 = new OpenFileDialog();
+ openFileDialog1.InitialDirectory = Directory.GetCurrentDirectory();
+ openFileDialog1.Filter =
+ "Bitmap files (*.bmp)|*.bmp|Enhanced Windows metafiles (*.emf)|*.emf|Graphics Interchange Format (*.gif)|*.gif|Icons (*.ico)|*.ico|JPEG (*.jpg)|*.jpg|Portable Network Graphics (*.png)|*.png|TIFF (*.tif)|*.tif|Windows Metafile (*.wmf)|*.wmf" ;
+ openFileDialog1.FilterIndex = 7 ;
+ openFileDialog1.RestoreDirectory = true ;
+ openFileDialog1.CheckFileExists = true;
+// try
+// {
+ if(openFileDialog1.ShowDialog() != DialogResult.OK)
+ done = true;
+ else
+ {
+ string iname = openFileDialog1.FileName;
+ done = ValidGraphicsFile(iname);
+ if (done == true)
+ {
+ FileInfo fi = new FileInfo(iname);
+ GraphicsFiletextbox.Text = fi.Name;
+ UpdateHtWd();
+ }
+ }
+// }
+// catch (Exception j)
+// {
+// MessageBox.Show(j.Message,"debug");
+// }
+ }
+
+ }
+ }
+
+ /*
+ * TimeZone is an Abstract Class. You need to inherit the TimeZone Class
+ * and overload a couple of it's functions in order to use it.
+ * - called in CalculatePromsDate() above.
+ */
+ public class ThisTimeZone : TimeZone
+ {
+ private TimeZone curTZ;
+ public TimeSpan SpanTZ;
+
+ public ThisTimeZone()
+ {
+ curTZ = CurrentTimeZone; // local timezone
+ }
+
+ // get the UTC (GMT) value for the given date/time
+ public override TimeSpan GetUtcOffset(DateTime ForThisDate)
+ {
+ SpanTZ = curTZ.GetUtcOffset(ForThisDate);
+ return SpanTZ;
+ }
+
+ // Name of the local Daylight savings time zone
+ public override string DaylightName
+ {
+ get
+ {
+ return curTZ.DaylightName;
+ }
+ }
+
+ // Name of the local standard time zone
+ public override string StandardName
+ {
+ get
+ {
+ return curTZ.StandardName;
+ }
+ }
+
+ // Get the start and end dates for daylight savings
+ public override System.Globalization.DaylightTime GetDaylightChanges(int year)
+ {
+ return curTZ.GetDaylightChanges(year);
+ }
+ }
+}
+
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEdit.resx b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEdit.resx
new file mode 100644
index 00000000..8b3cc379
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEdit.resx
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ctlXMLEdit
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEditLib.csproj b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEditLib.csproj
new file mode 100644
index 00000000..11b477d0
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEditLib.csproj
@@ -0,0 +1,159 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {DECA8343-6351-11D6-8487-00A0CC271352}
+ Debug
+ AnyCPU
+
+
+
+
+ ctlXMLEditLib
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ ctlXMLEditLib
+ OnBuildSuccess
+
+
+
+
+
+
+ SAK
+ SAK
+ SAK
+ SAK
+
+
+ bin\Debug\
+ false
+ 285212672
+ false
+
+
+ DEBUG;TRACE
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+
+
+ bin\Release\
+ false
+ 285212672
+ false
+
+
+ TRACE
+
+
+ false
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ none
+ prompt
+
+
+ true
+ bin\Debug\
+ DEBUG;TRACE
+ 285212672
+ full
+ x86
+ prompt
+
+
+ bin\x86\Release\
+ TRACE
+ 285212672
+ true
+
+
+ x86
+ prompt
+
+
+
+ System
+
+
+ System.Data
+
+
+ System.Drawing
+
+
+ System.Windows.Forms
+
+
+ System.XML
+
+
+
+
+ Code
+
+
+ UserControl
+
+
+ Form
+
+
+ Form
+
+
+ ctlXMLEdit.cs
+ Designer
+
+
+ ImageDialog.cs
+ Designer
+
+
+ ZoomDialog.cs
+ Designer
+
+
+
+
+ {A46428FC-1E35-4B8D-8B06-A1DF8BAC7A04}
+ Org.Mentalis.Files
+
+
+ {0C7825FD-AA05-11D6-84D1-00A0CC271352}
+ RODBInterface
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEditLib.csproj.vspscc b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEditLib.csproj.vspscc
new file mode 100644
index 00000000..6eea3c2d
--- /dev/null
+++ b/PROMS/ReferencedObjects/LibSource/ctlXMLEditLib/ctlXMLEditLib.csproj.vspscc
@@ -0,0 +1,10 @@
+""
+{
+"FILE_VERSION" = "9237"
+"ENLISTMENT_CHOICE" = "NEVER"
+"PROJECT_FILE_RELATIVE_PATH" = "relative:LibSource\\ctlXMLEditLib"
+"NUMBER_OF_EXCLUDED_FILES" = "0"
+"ORIGINAL_PROJECT_FILE_PATH" = ""
+"NUMBER_OF_NESTED_PROJECTS" = "0"
+"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
+}