From 5900520fe3c10dfe9a731cee12ef213786a66a59 Mon Sep 17 00:00:00 2001 From: pmasl Date: Mon, 7 May 2018 13:25:29 -0700 Subject: [PATCH] New auto tuning demo --- media/auto-tuning.png | Bin 0 -> 17428 bytes .../force-last-good-plan-2/AutoTuningDemo.sln | 38 + .../DemoWorkload/App.Config | 35 + .../DemoWorkload/DemoWorkload.csproj | 205 +++++ .../DemoWorkload/DemoWorkload.ruleset | 237 ++++++ .../DemoWorkload/FrmConfig.Designer.cs | 281 +++++++ .../DemoWorkload/FrmConfig.cs | 63 ++ .../DemoWorkload/FrmConfig.resx | 500 ++++++++++++ .../DemoWorkload/FrmMain.Designer.cs | 475 +++++++++++ .../DemoWorkload/FrmMain.cs | 746 ++++++++++++++++++ .../DemoWorkload/FrmMain.resx | 506 ++++++++++++ .../DemoWorkload/GlobalSuppressions.cs | Bin 0 -> 1474 bytes .../DemoWorkload/Program.cs | 29 + .../DemoWorkload/Properties/AssemblyInfo.cs | 39 + .../Properties/Resources.Designer.cs | 93 +++ .../DemoWorkload/Properties/Resources.resx | 130 +++ .../Properties/Settings.Designer.cs | 26 + .../DemoWorkload/Properties/Settings.settings | 7 + .../DemoWorkload/Resources/SQLBackground.jpg | Bin 0 -> 19025 bytes .../DemoWorkload/Resources/sqlserver.ico | Bin 0 -> 22486 bytes .../DemoWorkload/packages.config | 4 + .../force-last-good-plan-2/README.md | 56 ++ .../force-last-good-plan-2/Screenshots/1.png | Bin 0 -> 17428 bytes .../WideWorldImporters.sqlproj | 76 ++ .../dbo/Stored Procedures/report.sql | 9 + 25 files changed, 3555 insertions(+) create mode 100644 media/auto-tuning.png create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/AutoTuningDemo.sln create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/App.Config create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.ruleset create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.Designer.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.resx create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/GlobalSuppressions.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Program.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/AssemblyInfo.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.Designer.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.settings create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Resources/SQLBackground.jpg create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Resources/sqlserver.ico create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/packages.config create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/README.md create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/Screenshots/1.png create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/WideWorldImporters.sqlproj create mode 100644 samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/dbo/Stored Procedures/report.sql diff --git a/media/auto-tuning.png b/media/auto-tuning.png new file mode 100644 index 0000000000000000000000000000000000000000..c16c42848dfec4e8666ae213dd77d4c53d390df6 GIT binary patch literal 17428 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 literal 0 HcmV?d00001 diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/AutoTuningDemo.sln b/samples/features/automatic-tuning/force-last-good-plan-2/AutoTuningDemo.sln new file mode 100644 index 00000000..afc9aa26 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/AutoTuningDemo.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DemoWorkload", "DemoWorkload\DemoWorkload.csproj", "{2881A3C4-9153-46F2-8196-9929ED9C17D6}" +EndProject +Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "WideWorldImporters", "WideWorldImporters\WideWorldImporters.sqlproj", "{38641248-77EA-479B-B496-3EDA463ACEAD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Debug|x86.ActiveCfg = Debug|x86 + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Debug|x86.Build.0 = Debug|x86 + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Release|Any CPU.Build.0 = Release|Any CPU + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Release|x86.ActiveCfg = Release|x86 + {2881A3C4-9153-46F2-8196-9929ED9C17D6}.Release|x86.Build.0 = Release|x86 + {38641248-77EA-479B-B496-3EDA463ACEAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38641248-77EA-479B-B496-3EDA463ACEAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38641248-77EA-479B-B496-3EDA463ACEAD}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {38641248-77EA-479B-B496-3EDA463ACEAD}.Debug|x86.ActiveCfg = Debug|Any CPU + {38641248-77EA-479B-B496-3EDA463ACEAD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38641248-77EA-479B-B496-3EDA463ACEAD}.Release|Any CPU.Build.0 = Release|Any CPU + {38641248-77EA-479B-B496-3EDA463ACEAD}.Release|Any CPU.Deploy.0 = Release|Any CPU + {38641248-77EA-479B-B496-3EDA463ACEAD}.Release|x86.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/App.Config b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/App.Config new file mode 100644 index 00000000..2fcb39fd --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/App.Config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj new file mode 100644 index 00000000..0ce1ccbb --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj @@ -0,0 +1,205 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {2881A3C4-9153-46F2-8196-9929ED9C17D6} + WinExe + Properties + DemoWorkload + DemoWorkload + v4.6 + + + 512 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + DemoWorkload.ruleset + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + DemoWorkload.ruleset + + + true + bin\Debug\ + DEBUG;TRACE + full + AnyCPU + bin\Debug\WindowsFormsApplication2.exe.CodeAnalysisLog.xml + true + GlobalSuppressions.cs + prompt + DemoWorkload.ruleset + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets + true + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false + false + true + true + + + bin\Release\ + TRACE + true + pdbonly + AnyCPU + bin\Release\WindowsFormsApplication2.exe.CodeAnalysisLog.xml + true + GlobalSuppressions.cs + prompt + DemoWorkload.ruleset + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets + true + ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules + false + false + + + Resources\sqlserver.ico + + + false + + + false + + + + + + + DemoWorkload.Program + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + FrmConfig.cs + + + Form + + + FrmMain.cs + + + + + FrmConfig.cs + + + FrmMain.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + False + Microsoft .NET Framework 4.6 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.ruleset b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.ruleset new file mode 100644 index 00000000..579ebe36 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.ruleset @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.Designer.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.Designer.cs new file mode 100644 index 00000000..ee1f0dff --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.Designer.cs @@ -0,0 +1,281 @@ +namespace DemoWorkload +{ + partial class FrmConfig + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA2204:Literals should be spelled correctly", MessageId = "PageRead")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "System.Windows.Forms.Control.set_Text(System.String)")] + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmConfig)); + this.LabelReadsPerWrite = new System.Windows.Forms.Label(); + this.ReadsPerWrite = new System.Windows.Forms.NumericUpDown(); + this.LabelRPT = new System.Windows.Forms.Label(); + this.RequestCount = new System.Windows.Forms.NumericUpDown(); + this.lblInstance = new System.Windows.Forms.Label(); + this.tbConnectionString = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtMaxTPS = new System.Windows.Forms.TextBox(); + this.lblRunningThread = new System.Windows.Forms.Label(); + this.txtMaxPageRead = new System.Windows.Forms.TextBox(); + this.lblServerTran = new System.Windows.Forms.Label(); + this.TransactionCount = new System.Windows.Forms.NumericUpDown(); + this.lblThreadCnt = new System.Windows.Forms.Label(); + this.ThreadCount = new System.Windows.Forms.NumericUpDown(); + this.btnSave = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.ReadsPerWrite)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.RequestCount)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.TransactionCount)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.ThreadCount)).BeginInit(); + this.SuspendLayout(); + // + // LabelReadsPerWrite + // + this.LabelReadsPerWrite.Location = new System.Drawing.Point(0, 0); + this.LabelReadsPerWrite.Name = "LabelReadsPerWrite"; + this.LabelReadsPerWrite.Size = new System.Drawing.Size(100, 23); + this.LabelReadsPerWrite.TabIndex = 50; + // + // ReadsPerWrite + // + this.ReadsPerWrite.Location = new System.Drawing.Point(0, 0); + this.ReadsPerWrite.Name = "ReadsPerWrite"; + this.ReadsPerWrite.Size = new System.Drawing.Size(120, 20); + this.ReadsPerWrite.TabIndex = 51; + // + // LabelRPT + // + this.LabelRPT.AutoSize = true; + this.LabelRPT.BackColor = System.Drawing.Color.Transparent; + this.LabelRPT.Location = new System.Drawing.Point(14, 101); + this.LabelRPT.Name = "LabelRPT"; + this.LabelRPT.Size = new System.Drawing.Size(107, 13); + this.LabelRPT.TabIndex = 44; + this.LabelRPT.Text = "Requests per Thread"; + // + // RequestCount + // + this.RequestCount.Location = new System.Drawing.Point(152, 99); + this.RequestCount.Maximum = new decimal(new int[] { + 5000000, + 0, + 0, + 0}); + this.RequestCount.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.RequestCount.Name = "RequestCount"; + this.RequestCount.Size = new System.Drawing.Size(99, 20); + this.RequestCount.TabIndex = 43; + this.RequestCount.Value = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + // + // lblInstance + // + this.lblInstance.AutoSize = true; + this.lblInstance.BackColor = System.Drawing.Color.Transparent; + this.lblInstance.Location = new System.Drawing.Point(14, 217); + this.lblInstance.Name = "lblInstance"; + this.lblInstance.Size = new System.Drawing.Size(91, 13); + this.lblInstance.TabIndex = 42; + this.lblInstance.Text = "Connection String"; + // + // tbConnectionString + // + this.tbConnectionString.Location = new System.Drawing.Point(16, 243); + this.tbConnectionString.Name = "tbConnectionString"; + this.tbConnectionString.Size = new System.Drawing.Size(271, 20); + this.tbConnectionString.TabIndex = 40; + this.tbConnectionString.TextChanged += new System.EventHandler(this.tbInstance_TextChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Location = new System.Drawing.Point(14, 25); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(109, 13); + this.label3.TabIndex = 38; + this.label3.Text = "Max TPS (thousands)"; + // + // txtMaxTPS + // + this.txtMaxTPS.Location = new System.Drawing.Point(152, 22); + this.txtMaxTPS.Name = "txtMaxTPS"; + this.txtMaxTPS.Size = new System.Drawing.Size(99, 20); + this.txtMaxTPS.TabIndex = 37; + this.txtMaxTPS.TabStop = false; + // + // lblRunningThread + // + this.lblRunningThread.AutoSize = true; + this.lblRunningThread.BackColor = System.Drawing.Color.Transparent; + this.lblRunningThread.Location = new System.Drawing.Point(14, 50); + this.lblRunningThread.Name = "lblRunningThread"; + this.lblRunningThread.Size = new System.Drawing.Size(107, 13); + this.lblRunningThread.TabIndex = 36; + this.lblRunningThread.Text = "Max PageRead Time"; + // + // txtMaxPageRead + // + this.txtMaxPageRead.Location = new System.Drawing.Point(152, 47); + this.txtMaxPageRead.Name = "txtMaxPageRead"; + this.txtMaxPageRead.Size = new System.Drawing.Size(99, 20); + this.txtMaxPageRead.TabIndex = 35; + this.txtMaxPageRead.TabStop = false; + this.txtMaxPageRead.Text = "10000"; + // + // lblServerTran + // + this.lblServerTran.AutoSize = true; + this.lblServerTran.BackColor = System.Drawing.Color.Transparent; + this.lblServerTran.Location = new System.Drawing.Point(14, 153); + this.lblServerTran.Name = "lblServerTran"; + this.lblServerTran.Size = new System.Drawing.Size(102, 13); + this.lblServerTran.TabIndex = 34; + this.lblServerTran.Text = "Server Transactions"; + // + // TransactionCount + // + this.TransactionCount.Location = new System.Drawing.Point(152, 151); + this.TransactionCount.Maximum = new decimal(new int[] { + 5000000, + 0, + 0, + 0}); + this.TransactionCount.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.TransactionCount.Name = "TransactionCount"; + this.TransactionCount.Size = new System.Drawing.Size(99, 20); + this.TransactionCount.TabIndex = 29; + this.TransactionCount.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // lblThreadCnt + // + this.lblThreadCnt.AutoSize = true; + this.lblThreadCnt.BackColor = System.Drawing.Color.Transparent; + this.lblThreadCnt.Location = new System.Drawing.Point(14, 127); + this.lblThreadCnt.Name = "lblThreadCnt"; + this.lblThreadCnt.Size = new System.Drawing.Size(46, 13); + this.lblThreadCnt.TabIndex = 31; + this.lblThreadCnt.Text = "Threads"; + // + // ThreadCount + // + this.ThreadCount.Location = new System.Drawing.Point(152, 125); + this.ThreadCount.Maximum = new decimal(new int[] { + 200, + 0, + 0, + 0}); + this.ThreadCount.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.ThreadCount.Name = "ThreadCount"; + this.ThreadCount.Size = new System.Drawing.Size(99, 20); + this.ThreadCount.TabIndex = 28; + this.ThreadCount.Value = new decimal(new int[] { + 80, + 0, + 0, + 0}); + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(16, 293); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(149, 23); + this.btnSave.TabIndex = 49; + this.btnSave.Text = "Save Configuration Values"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // FrmConfig + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(310, 332); + this.Controls.Add(this.btnSave); + this.Controls.Add(this.LabelReadsPerWrite); + this.Controls.Add(this.ReadsPerWrite); + this.Controls.Add(this.LabelRPT); + this.Controls.Add(this.RequestCount); + this.Controls.Add(this.lblInstance); + this.Controls.Add(this.tbConnectionString); + this.Controls.Add(this.label3); + this.Controls.Add(this.txtMaxTPS); + this.Controls.Add(this.lblRunningThread); + this.Controls.Add(this.txtMaxPageRead); + this.Controls.Add(this.lblServerTran); + this.Controls.Add(this.TransactionCount); + this.Controls.Add(this.lblThreadCnt); + this.Controls.Add(this.ThreadCount); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmConfig"; + this.Text = "Configuration Settings"; + this.Load += new System.EventHandler(this.ConfigForm_Load); + ((System.ComponentModel.ISupportInitialize)(this.ReadsPerWrite)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.RequestCount)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.TransactionCount)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.ThreadCount)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label LabelReadsPerWrite; + private System.Windows.Forms.NumericUpDown ReadsPerWrite; + private System.Windows.Forms.Label LabelRPT; + private System.Windows.Forms.NumericUpDown RequestCount; + private System.Windows.Forms.Label lblInstance; + private System.Windows.Forms.TextBox tbConnectionString; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtMaxTPS; + private System.Windows.Forms.Label lblRunningThread; + private System.Windows.Forms.TextBox txtMaxPageRead; + private System.Windows.Forms.Label lblServerTran; + private System.Windows.Forms.NumericUpDown TransactionCount; + private System.Windows.Forms.Label lblThreadCnt; + private System.Windows.Forms.NumericUpDown ThreadCount; + private System.Windows.Forms.Button btnSave; + } +} \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.cs new file mode 100644 index 00000000..df87e893 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.cs @@ -0,0 +1,63 @@ +using System; +using System.Configuration; +using System.Windows.Forms; + +namespace DemoWorkload +{ + public partial class FrmConfig : Form + { + + public FrmConfig() + { + InitializeComponent(); + } + + private void ConfigForm_Load(object sender, EventArgs e) + { + tbConnectionString.Text = Program.CONN_STR; + TransactionCount.Value = Program.TRANSACTION_COUNT; + ThreadCount.Value = Program.THREAD_COUNT; + RequestCount.Value = Program.REQUEST_COUNT; + txtMaxPageRead.Text = Program.MAX_PageRead.ToString(); + txtMaxTPS.Text = Program.MAX_TPS.ToString(); + } + + private void btnSave_Click(object sender, EventArgs e) + { + Program.THREAD_COUNT = (int)this.ThreadCount.Value; + Program.REQUEST_COUNT = (int)this.RequestCount.Value; + Program.TRANSACTION_COUNT = (int)this.TransactionCount.Value; + Program.CONN_STR = this.tbConnectionString.Text; + Program.MAX_TPS = Convert.ToInt32(this.txtMaxTPS.Text); + Program.MAX_PageRead = Convert.ToInt32(this.txtMaxPageRead.Text); + + // also persist changes in app config + Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + KeyValueConfigurationCollection settings = config.AppSettings.Settings; + ConnectionStringSettingsCollection connStrs = config.ConnectionStrings.ConnectionStrings; + + // update SaveBeforeExit + settings["ThreadCount"].Value = Program.THREAD_COUNT.ToString(); + settings["RequestCount"].Value = Program.REQUEST_COUNT.ToString(); + settings["RowCount"].Value = Program.ROW_COUNT.ToString(); + settings["TransactionCount"].Value = Program.TRANSACTION_COUNT.ToString(); + settings["MaxTps"].Value = Program.MAX_TPS.ToString(); + settings["MaxPageReads"].Value = Program.MAX_PageRead.ToString(); + connStrs["WideWorldImporters"].ConnectionString = Program.CONN_STR; + + //save the file + config.Save(ConfigurationSaveMode.Modified); + + } + + private void tbInstance_TextChanged(object sender, EventArgs e) + { + + } + + private void label1_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.resx b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.resx new file mode 100644 index 00000000..6d7dc61e --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmConfig.resx @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + zwD45t8A++/qAO3j3wDSsaIA89XHAPTWyQDz1skA9NjLAPPXygD129AA9dzRAPXd0gD239UA9+HXAPjo + 4QD56uMA+OniAPrs5gD56+UA/PPvAPz18gDGo5IAx6aWANW0pADava4AyrCjAPXazQD02cwA5Mu/APbf + 0wD13tMA9+PZAPjl3AD88u0A+/HsAPz28wD9+fcA/vz7AMirmwDz2csAzbmuAOfZ0QDe080A+/LtAOXe + 2gDi29cA28/IANzRygD67+gA+/HrAOHZ1AD89O8A+/PuAPPr5gD9+PUAg29hAJB+cgCNfHAA8O3rAHpl + VQB7ZlcAfmlaAH5qWwB/a1wAgW1eAIBsXQCCbl8Ag3BiAI17bgCUhHgAk4N3AJeHewCcjoQApZiOAKeb + kgCrn5YAraKaAKyhmQCuo5sA4NjSAMG6tQDo5OEA5+PgAHxoWAB9aVkAhXJjAIFvYACFc2UAh3VnAIl3 + aQCLeWsAi3psAI5+cQCRgXQAj39yAJWGegCYiX0Am42CAJ+RhgChlIkAoJOIAKebkQCpnpUAq6CXAK+l + nQC4r6gA39bPAOXg3ACRgnUAlYZ5AJmLfgCekIQAm42BAKOXjACilosAoZWKALGnngCupJsAtaykALKp + oQC2raUAwLmzAL+4sgC9trAApZqPAKedkwC5sakAt6+nALOrowC8ta4AurOsAL+4sQC+t7AAwry2AP36 + 9wD9+/kA6eflAP79/ACyqqEAsamgALy1rQC6s6sAubKqALy2rwC7ta0Awby1APb08QD9/PoAOcEAADHJ + AAAuzAAAJ9UAANP4/ADd+/4A2/n8ANv6/gDV8/cA0Pb9AM/s8QC77/kAvO/5AMTx+gDM6e8Atez5ALbs + +QC16vYAve76AMXj6gDe6+4ApuX3AKfm9wCo5vcAsNrmAMDc5ACZ4PYAqOb5AKfj9gC10tsAu9jhAMrg + 5wB70/QAe9T0AJDc9gCN1fAAkt32AJHY8QCY3fQAsczVAMPX3gDA09oA2eLlANDY2wBqzPIAaszxAGrL + 8QBqyO4AasjtAGvF6gBrxekAfs3rAJ/J2QCryNMAq8fSAG7B5QB2v94Am73NAK3J1QCsxtEAtc/aALfN + 1wB9tM4AoLzKAKS/zACnws8ApsHOAJ63xACpxNEApL3KAKK7yACqxNEAts3YAMfP0wCRs8YAj62+AKK+ + zgCIqb0Am7PBAKC4xgCasb8Ap7/NAJKpuACYr74AlKq5AJWrugCRprYAl629AI2hsgCQpLQAjaCxAP// + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAGRjYU9DTkxNTUpJYF9ISEdHAAAAAAAAAAAAAAAAAAAAZQoP + ISEhISEhISEhISEhIkgAAAAAAAAAAAAAAAAAAABmCicTExMTExMSFBESEhAyXwAAAAAAAAAAAAAAAAAA + AFAKCwsnJicnJycTFKKgEjJgAAAAAAAAAAAAAAAAAAAAaDELCwsLCwsmJycTo6EUMksAAAAAAAAAAAAA + AAAAAABpMRYWFhYVFRULCwsmJzMyTAAAAAAAAAAAAAAAAAAAAFIxKSrL3d/18uvq7OkLJjJiAAAAAAAA + AAAAAAAAAAAAazEY3NnUuLHG09je7fELMk8AAAAAAAAAAAAAAAAAAABsMRnjxbWrsLrBztDX+hUyYwAA + AAAAAAAAAAAAAAAAAHwxK+/CtquwusHN0NL4FzJkAAAAAAAAAAAAAAAAAAAAVJUs5sS2q6+6wc3P0fkp + MmUAAAAAAAAAAAAAAAAAAABulQzlxLassLrBzs/R9hgyZwAAAAAAAAAAAAAAAAAAAG+VGuDEt6yvusHO + 0NHyGTJFAAAAAAAAAAAAAAAAAAAAfZUb4sS3rLC6wM7P0vQZImoAAAAAAAAAAAAAAAAAAACIlR7hxLes + sLrBzNDS9SwkeAAAAAAAAAAAAAAAAAAAAIkBCuTEt6ywusHN0NL3AwJRAAAAAAAAAAAAAAAAAAAAV0YO + 1sS2q7C6wc7Q0vM1NVMAAAAAAAAAAAAAAAAAAABZkYbVu62kpaepsrzD8ExgegAAAAAAAAAAAAAAAAAA + AIEBN9qlpaWlpaWlpaXuGiV8AAAAAAAAAAAAAAAAAAAAgAEfv76zqqamqK65x8kcNHsAAAAAAAAAAAAA + AAAAAACWAQeetL+95+Hb6MjKQRs0cAAAAAAAAAAAAAAAAAAAAIIBBS8vIAcfQDc9DTwdHiV+AAAAAAAA + AAAAAAAAAAAAi/v7+/v7+/v7+/v7+/v7lVUAAAAAAAAAAAAAAAAAAACKkYaci4NYVn9teURmYUxgcQAA + AAAAAAAAAAAAAAAAAJmUXV1eCXc4ODk+W3Y2OzpyAAAAAAAAAAAAAAAAAAAAmPsKkwSSMEIvIAhALg08 + I3MAAAAAAAAAAAAAAAAAAACH+zEKnwQDMAUgBx83PTwjWgAAAAAAAAAAAAAAAAAAAIb7lZUKBAMwQi8H + Bi09PCN0AAAAAAAAAAAAAAAAAAAAhfsBAZUKBDACBQc/LT08KJcAAAAAAAAAAAAAAAAAAABc+/v7AQEB + AQGVlZUxMTEFjAAAAAAAAAAAAAAAAAAAAJGdXFyFho+Qm42cjpqKdYuEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP//////KAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAId0Zv+Fc2X/hXJj/4Nw + Yv+Db2H/gm5f/4FtXv+AbF3/gGxc/35qW/9+aVr/fWlZ/3xnWP97Z1f/e2ZW/3pmVv96ZVX/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXdp//77 + +v/SsaL/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/x6aW/3tm + V/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACLeWv//vv6//TZzP/02Mz/9NjM//TYy//02Mv/9NfL//TYyv/z18n/89fK//TWyf/z1sn/89bI//PV + x//Iq5v/fGhY/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + q//p5+X/6OTh/+jk4f/n4+D/5+Hf/+Xg3P/l3tv/5N3Z/+Lb1//h2dT/4NjS/9/Wz//e083/3NHK/9vP + yP+pnpX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAvLWt///////++/r//fv5//76+f/9+vf//fj3//349f/89/P//PXy//vz8P/78+7/+/Hs//vv + 6v/67uj/1bSk/6ugl/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC9trD////////8+////Pr//fz6//77+f/++fj//fn2//329P/89fL//PTx//zz + 7//78u3/+/Dr//vv6P/VtKT/rqOb/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4sv////////38//79/P/+/Pr//vv5//75+P/9+fb//fj1//z2 + 8//89PH//PPw//zy7f/78ev/+u/p/9W0pP+vpZ3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLmz///////+/v3///39//79/P/+/Pr//vr5//35 + 9//99/b//ffz//z08f/89O///PLt//vw6//67+n/5Mu//7GpoP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBurX///////////////////7+///+ + /v///v7///79///+/f/+/f3//v38//79/P/+/Pz//vz7//78+//99vT/s6uj/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK8tv/BvLX/wbu1/8C6 + tP/AubP/v7iy/7+4sf++t7D/vLav/7y1rv+7tK3/urOs/7myqv+5sKn/uK+o/7evp/+2raX/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA/ygAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAA + AAAAAAAAAAEAAAABAAAAAAAA/vn4AP349wD++vkA/PHtAPzz8AD78/AA/ff1AP77+gD12s8A9+HYAPjm + 3wD56uQA++/qAO3j3wDn4uAA0rGiAPPVxwD01skA89bJAPTYywDz18oA9dvQAPbd0gD13NEA9t7TAPXd + 0gD239UA9+HXAPfj2gD45NsA+erjAPjp4gD67OYA+/DrAPzz7wDl3tsA/PXyAMajkgDHppYA1bSkAMqw + owD12s0A9NnMAPbd0QD13tMA9uDVAPXf1AD24tgA9+TbAPjl3AD46OAA+u7oAPzy7QD78ewA4trWAPz2 + 8wDu6ugA/vz7AMirmwDz2csA59nRAN7TzQD78u0A/PXxAOnc1ADc0MkA/PTvAPvz7gD9+PUAkH5yAI18 + cADw7esAemVVAHtmVwB+aVoAfmpbAH9rXACBbV4AgGxdAIJuXwCDcGIAgm9hAI17bgCUhHgAloZ6AJyO + hACtopoA9vLvAOjk4QB8aFgAfWlZAIVyYwCFc2UAh3VnAIl3aQCLemwAjn5xAJGBdACPf3IAmYp+AJuN + ggCgk4gApZmPAKqflgCroJcAr6WdALivqACKeWoAkYJ1AJuNgQCfkYUAo5eMAKGVigCnnJIAsaeeAK6k + mwC1rKQAtq2lAODY0QDAubMAv7iyALmxqQC3r6cAvLWuALqzrAC/uLEAvrewAMK8tgDAurQA/fr3AP37 + +QDp5+UA//79AP79/ACyqqEAvLWtALy2rwC7ta0A/fz6ADXFAAAr0QAA2/v9ANP4/ADd+/4A3Pr9ANv5 + /ADb+v4A1vT4AMjz+gDB6fAAz+zxANHt8gC77/kAvO/5AMLw+gDS9v0A2+rtALXs+QC27PkAter2AKbl + 9wCn5vcAqOb3AKvm9wDG4egAl971AJjg9gCo5vkAttnkAGvN8QBszvEAbc3xAG7O8gBvzvEAcM7xAHTP + 8QB40vMAetP0AHvU9AB81PQAfNPzAJDc9gCN1fAAkt32AJHY8QCe3/UAydvhAGzO8wBtzPIAb8zzAG3K + 7gBtyO0Aa8XqAHDO8gBwzfEAb8zwAG/M7wBvy+8Ab8ntAG7H7ABuyOsAbsfqAHLO8QBxy+8AcMnsAG3E + 5gBwx+kAd9HzAHLG6ABxxecAccHiAHXH5wByv94AeszsAHjC4QCfydkAq8jTALfR2wC2ztgAbsLmAG/A + 4wB0wOIAfLnUAJm8zAChvssArMnWAKzG0gCxy9YAjrXJAKS/zACnws8AnrfEAKnE0QCkvcoAorvIAKrE + 0QCFqb0AjbLGAI6uwACrxdMAnrbDAJuzwQCasb8AobnHAJKpuACYr74Alau6AJGnuACQpbUAl629AI2h + sgCPo7MAjaCxAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABeXVxcUVFRUVJQTk9PTEtbW1tbWkpKSUkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfCBAQJiYm + JiYmJiYmJiYmJiYmJiYmJ0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgCCsrFBQUFBQUFBQUExUSEhIS + ExMRO1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTCAkJCQkJCSsqKysrKxQVFRUVjYwTO1sAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABhOgkJCQkJCQkJCQkqKysUFBQUjYwVO00AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABiOhgYGBgYGBgYFhYWCQkJCQkJKis8O04AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUOhkZLS0t + LS0aGhoYGBYJCQkJCQkqO1IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVOhsbLi4uLhsuLy0ZGRcsLCws + FhYJO1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkOhwcCrvi4fHx9/Xv5e7l5fAtGhgWO10AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABuOh0d2uDYqZaWoKbW0dTX3+3uGS0aO14AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABWhjIy6LmhmZWVn6bQxsbH0t39LhsZO18AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvhgsL9Lai + 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 + AAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB// + AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/g + AAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB// + AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD///////8AAP// + /////wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAId0 + Zv+Fc2X/hXJj/4VyY/+DcGL/g3Bi/4NwYv+DcGL/g29h/4JuX/+BbV7/gGxd/4BsXP9+alv/fmla/31p + Wf99aVn/fWlZ/31pWf98Z1j/e2dX/3tmVv96Zlb/emVV/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIl3af/++/r/0rGi/9Kxov/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8aj + kv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Hppb/e2ZX/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt5a//++/r/9NnM//TZzP/02Mz/9NjM//TYzP/02Mz/9NjM//TY + y//02Mv/9NfL//TYyv/z18n/89fK//TWyf/01sn/9NbJ//TWyf/z1sn/89bI//PVx//Iq5v/fGhY/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI17bv/+/Pr/9NrO//Tazv/12s7/9drO//Xa + zv/12s7/9NnN//Tazf/02c3/9NnN//TZzP/02cz/9NjL//PXyv/z18r/89fK//PXyv8uzAD/OcEA//PW + yP/Iq5v/fWlZ/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5+cf/+/Pv/9dvP//Xb + z//028//9NvP//Tbz//028//9dvP//Taz//12s7/9drO//Xazf/02c3/9NnM//TYzP/02Mz/9NjM//TY + zP8n1QD/MckA//PYyv/Iq5v/f2tc/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGB + dP/+/Pv/9dzS//Xc0v/13NH/9dzR//Xc0f/13NH/9d3R//Xd0f/13ND/9dzQ//Xb0P/028//9NvP//Xa + zv/12s7/9drO//Xazv/12c3/9NnM//PZy//Iq5v/gW1e/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJODd//+/Pv/9t7T//be0//13tP/9d7T//Xe0//13tP/9d7T//Xe0v/13dL/9d3S//Xc + 0v/13dH/9dvQ//Tbz//028//9NvP//Tbz//1287/9drO//Xazf/Iq5v/gW9g/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJWGev/+/Pv/9t/V//bf1f/24NX/9uDV//bg1f/24NX/9t/V//bg + 1f/139T/9d7U//bf0//23tP/9t3S//bd0f/23dH/9t3R//bd0f/13ND/9dvQ//Xaz//Iq5v/g3Bi/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiJff/+/Pv/9+HX//fh1//34dj/0dnd/6vJ + 1v+hvsv/nbXD/562w/+Vq7r/kqm4/46uwP+Ptsr/jrLE/4+1yP+MtMr/q8XT//Xe0//13dL/9d3R//Xc + 0P/Iq5v/hXNl/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqMgP/+/Pz/9+PZ//fj + 2f+10Nv/mbzM/5/J2f+w2ub/wenw/8Hp8P+16vb/l930/3rM7P9yxuj/dcfn/3jC4f98udT/ham9/4yy + x//23tT/9d7T//Xd0v/Iq5v/h3Vn/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyO + hP/+/fz/+OXc//jl3P+et8T/kdjx/6bl9/+77/n/yPP6/8jz+v+27Pn/l9/2/3fR8/9uy+//b8ru/2/J + 7f9xxef/b8Dj/42gsf/24Nb/9t/V//bf0//Iq5v/iXdp/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJ+Rhv/+/fz/+Obf//jm3/+guMb/kNz2/6fm9/+77/n/yPP6/8jz+v+27Pn/mOD2/3nT + 9P9tzfH/b8vv/3DJ7P9ux+r/bcTm/42hsv/34df/9uDW//bf1f/Iq5v/i3ps/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGUif/+/fz/+Ojh//jo4f+husf/kNz2/6bm9/+87/n/yPP6/8jz + +v+17Pj/meD2/3zU9P9szvP/b83w/2/L7v9uyOv/bcTm/4+js//34tn/9+HY//fh1v/Iq5v/jXxw/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOXjP/+/fz/+erj//nq4/+iu8j/kt32/6fm + 9/+77/n/yPP6/8jz+v+17Pn/meD2/3vU9P9tzPL/b83x/27L7/9tyOz/bcHn/5CktP/35Nv/9+Pa//bi + 2P/Hppb/j39y/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOXjP/+/fz/+erj//nq + 4/+kvcr/kt32/6fm9/+87/n/yPP6/8jz+v+27Pn/mOD2/3vU9P9tzPL/b87x/2/L7/9tx+z/b8Pm/5Gm + tv/35Nv/9+Pa//bi2P/Hppb/j39y/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOX + jP/+/fz/+erj//nq4/+et8T/kdjx/6bl9/+77/n/yPP6/8jz+v+27Pn/mOD2/3vU9P9szfP/cc7x/2/L + 7/9ux+z/ccDi/42gsf/35Nv/9+Pa//bi2P/Hppb/j39y/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKOXjP/+/fz/+erj//nq4/+guMb/kNz2/6fm9/+77/n/yPP6/8jz+v+27Pn/mOD2/3vU + 9P9rzPH/cM7y/2/M7/9tyOr/b8Hl/42hsv/35Nv/9+Pa//bi2P/Hppb/kYJ1/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOXjP/+/fz/+erj//nq4/+husf/kNz2/6bm9/+87/n/yPP6/8jz + +v+17Pj/meD2/3vU9P9szvH/bs7x/3DL7/9vx+n/ccLi/5Cltv/35Nv/9+Pa//bi2P/Hppb/kYJ1/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWaj//+/f3/+evl//nr5f+iu8j/kt32/6fm + 9/+77/n/yPP6/8jz+v+17Pn/meD2/3vV9P9rzvH/b87w/3DL7v9wx+n/cr7d/5KouP/45d3/9+Tc//jk + 2//Hppb/kYJ1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKedk////v7//vv6//77 + +v+kvcr/kt32/6fm9/+87/n/yPP6/8jz+v+27Pn/mOD2/3vU9P9tzPL/b87x/3HL7v9vx+r/c7/f/5Gn + uP/++vn//vr4//76+P/99/X/lIR4/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKuf + lv/w7ev/7ePf/+3j3/+kv8z/kt32/6jm9/+87/n/yPP6/8jz+v+17Pn/mOD2/3vU9P9vzPP/cM3x/3HL + 7/9vx+r/ccDf/5KpuP/p3NX/6NvT/+fa0v/m2ND/l4d7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKyhmf/CvLb/v7iy/7+4sv+mwc7/kt32/6jm9/+87/n/yPP6/8jz+v+27Pn/meD2/3vT + 9P9uzvH/cM7x/3HL7/9ux+r/dMDi/5Squv+KeGr/hXNk/4BtXv99aFn/mYt+/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy7f+nws//kt32/6jm9/+87/n/yPP6/8jz + +v+27Pn/mOD2/3vT9P9uzvL/cM7x/2/M7/9ux+v/ccLi/5Wruv/56uT/+eri//jo4P/KsKP/m42B/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy7f+pxNH/kt32/6jm + 9/+87/n/yPP6/8jz+v+27Pn/l9/2/3jS8/9uzPD/cs7x/3DM8P9tyO3/bcTn/5etvf/56uT/+eri//jo + 4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy + 7f+rx9L/kt32/6fm9/+77/n/yPP6/8jz+v+27Pn/mOD2/3zT8/9vzPD/dM/x/2/M8P9tyu7/a8Xq/5iv + vv/56uT/+eri//jo4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6k + m////v3/+/Lt//vy7f+ryNP/qOb5/8Tx+v/T+Pz/2/v9/9v7/f/c+/7/2/r+/9L2/f/B7/r/we/6/6vm + 9/+e3/X/jdXw/5qxv//56uT/+eri//jo4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAK6km////v3/+/Lt//vy7f+tydX/3fv+/937/v/d+/7/3fv+/937/v/d+/7/3Pv9/9z6 + /f/c+v3/3Pr9/9v6/f/b+v3/3fv+/5uzwf/56uT/+eri//jo4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy7f/K4Of/u9jh/8Xj6v/P7PH/1vT4/9b0 + +P/b+fz/2/n8/9b0+P/R7fL/1/X5/9Dt8v/C3+b/sszW/7PM1v/56uT/+eri//jo4P/KsKP/m42B/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGnnv///v7//PPv//zz7//28u//2+rt/8Pd + 5f+4093/r8vW/7HL1v+qxNH/p8LP/6zG0v+2ztj/q8bS/7DL1v+30dr/yNzh/+7q6P/56+X/+evk//jp + 4v/KsKP/npCE/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKqof///v7//PXx//z1 + 8f/89fH//PXx//z18f/89fH//PTx//z08P/88+///PLu//zx7f/78Oz/+vDq//ru6P/67uj/+u7o//ru + 6P/67Of/+ezl//nq4//KsKP/oJOI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALWs + pP///v7//fbz//328//89vP//Pbz//z28//89vP//Pbz//z18v/89fD//PPv//vz7v/78u3/+vHr//vv + 6v/77+r/++/q//vv6v/67uj/+uzm//nr5P/KsKP/opaL/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAALeup/////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////+/fz/pZiO/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALixqf/CvLb/v7my/7+5sv+7ta3/u7Wt/7u1rf+7ta3/t6+n/7Kp + of+topr/p5uS/6GViv+bjYL/lYZ5/5B+cv+QfnL/kH5y/5B+cv+KeWr/hXJj/4BtXv99aFn/p5uR/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqzq//p5+X/6OTh/+jk4f/o5OH/6OTh/+jk + 4f/o5OH/5+Pg/+fh3//l4Nz/5d7b/+Td2f/i29f/4dnU/+DY0v/g2NL/4NjS/+DY0v/f1s//3tPN/9zR + yv/bz8j/qZ6V/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1rf///////vv6//77 + +v/9+/n//fv5//37+f/9+/n//vr5//369//9+Pf//fj1//z38//89fL/+/Pw//vz7v/78+7/+/Pu//vz + 7v/78ez/++/q//ru6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1 + rf///////vv6//77+v/9+/n//fv5//37+f/9+/n//vr5//369//9+Pf//fj1//z38//89fL/+/Pw//vz + 7v/78+7/+/Pu//vz7v/78ez/++/q//ru6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAALy1rf///////vv6//77+v/9+/n//fv5//37+f/9+/n//vr5//369//9+Pf//fj1//z3 + 8//89fL/+/Pw//vz7v/78+7/+/Pu//vz7v/78ez/++/q//ru6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1rf///////vv6//77+v/9+/n//fv5//37+f/9+/n//vr5//36 + 9//9+Pf//fj1//z38//89fL/+/Pw//vz7v/78+7/+/Pu//vz7v/78ez/++/q//ru6P/VtKT/q6CX/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1rf///////vv6//77+v/9+/n//fv5//37 + +f/9+/n//vr5//369//9+Pf//fj1//z38//89fL/+/Pw//vz7v/78+7/+/Pu//vz7v/78ez/++/q//ru + 6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL22sP////////z7///8 + +////Pr///z6///8+v///Pr//fz6//77+f/++fj//fn2//329P/89fL//PTx//zz7//88+///PPv//zz + 7//78u3/+/Dr//vv6P/VtKT/rqOb/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4 + sv////////38///9/P/+/fz//v38//79/P/+/fz//vz6//77+f/++fj//fn2//349f/89vP//PTx//zz + 8P/88/D//PPw//zz8P/88u3/+/Hr//rv6f/VtKT/r6Wd/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAMC5s////////v79//7+/f///f3///39///9/f///f3//v38//78+v/++vn//fn3//33 + 9v/99/P//PTx//z07//89O///PTv//z07//88u3/+/Dr//rv6f/VtKT/samg/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG6tf////////////////////////////////////////7+///+ + /v///v7///79///+/f/+/f3//v38//79/P/+/fz//v38//79/P/+/Pz//vz7//78+//99vT/s6uj/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK8tv/BvLX/wbu1/8G7tf/AurT/wLq0/8C6 + tP/AurT/wLmz/7+4sv+/uLH/vrew/7y2r/+8ta7/u7St/7qzrP+6s6z/urOs/7qzrP+5sqr/ubCp/7iv + qP+3r6f/tq2l/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////AAD/8AAAD/8AAP/wAAAP/wAA//AAAA// + AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/w + AAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA// + AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/w + AAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA// + AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/w + AAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA////////AAD///////8AAA== + + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs new file mode 100644 index 00000000..d75e8b4a --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs @@ -0,0 +1,475 @@ +namespace DemoWorkload +{ + partial class FrmMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.DataPoint dataPoint1 = new System.Windows.Forms.DataVisualization.Charting.DataPoint(0D, 0D); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.DataPoint dataPoint2 = new System.Windows.Forms.DataVisualization.Charting.DataPoint(0D, 1D); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea3 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.Windows.Forms.DataVisualization.Charting.DataPoint dataPoint3 = new System.Windows.Forms.DataVisualization.Charting.DataPoint(0D, 1D); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); + this.btnRun = new System.Windows.Forms.Button(); + this.btnStop = new System.Windows.Forms.Button(); + this.btnRegress = new System.Windows.Forms.Button(); + this.btnAutoTune = new System.Windows.Forms.Button(); + this.lbResults = new System.Windows.Forms.Label(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.configurationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ErrorMessages = new System.Windows.Forms.TextBox(); + this.chtTPS = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.lblTime = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.lblThreads = new System.Windows.Forms.ToolStripStatusLabel(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.btnReset = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.btnToggle = new System.Windows.Forms.Button(); + this.chtPageReads = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.chtCPU = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.label3 = new System.Windows.Forms.Label(); + this.menuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chtTPS)).BeginInit(); + this.statusStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chtPageReads)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.chtCPU)).BeginInit(); + this.SuspendLayout(); + // + // btnRun + // + this.btnRun.BackColor = System.Drawing.Color.White; + this.btnRun.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnRun.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnRun.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.btnRun.Location = new System.Drawing.Point(421, 16); + this.btnRun.Name = "btnRun"; + this.btnRun.Size = new System.Drawing.Size(84, 30); + this.btnRun.TabIndex = 3; + this.btnRun.Text = "Start"; + this.btnRun.UseVisualStyleBackColor = false; + this.btnRun.Click += new System.EventHandler(this.OnRunClick); + // + // btnStop + // + this.btnStop.BackColor = System.Drawing.Color.White; + this.btnStop.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnStop.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnStop.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.btnStop.Location = new System.Drawing.Point(691, 16); + this.btnStop.Name = "btnStop"; + this.btnStop.Size = new System.Drawing.Size(82, 30); + this.btnStop.TabIndex = 25; + this.btnStop.Tag = "Data"; + this.btnStop.Text = "Stop"; + this.btnStop.UseVisualStyleBackColor = false; + this.btnStop.Click += new System.EventHandler(this.btnStop_Click); + // + // btnRegress + // + this.btnRegress.BackColor = System.Drawing.Color.White; + this.btnRegress.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnRegress.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnRegress.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.btnRegress.Location = new System.Drawing.Point(511, 16); + this.btnRegress.Name = "btnRegress"; + this.btnRegress.Size = new System.Drawing.Size(84, 30); + this.btnRegress.TabIndex = 46; + this.btnRegress.Text = "Regress"; + this.btnRegress.UseVisualStyleBackColor = false; + this.btnRegress.Click += new System.EventHandler(this.btnRegress_Click); + // + // btnAutoTune + // + this.btnAutoTune.BackColor = System.Drawing.Color.White; + this.btnAutoTune.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnAutoTune.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnAutoTune.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.btnAutoTune.Location = new System.Drawing.Point(601, 16); + this.btnAutoTune.Name = "btnAutoTune"; + this.btnAutoTune.Size = new System.Drawing.Size(84, 30); + this.btnAutoTune.TabIndex = 47; + this.btnAutoTune.Text = "Auto Tune"; + this.btnAutoTune.UseVisualStyleBackColor = false; + this.btnAutoTune.Click += new System.EventHandler(this.btnAutoTune_Click); + // + // lbResults + // + this.lbResults.BackColor = System.Drawing.Color.Transparent; + this.lbResults.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbResults.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(166))))); + this.lbResults.Location = new System.Drawing.Point(3, 0); + this.lbResults.Name = "lbResults"; + this.lbResults.Size = new System.Drawing.Size(235, 53); + this.lbResults.TabIndex = 31; + this.lbResults.Text = "Baseline"; + this.lbResults.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // menuStrip1 + // + this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.optionsToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Padding = new System.Windows.Forms.Padding(6, 1, 0, 1); + this.menuStrip1.Size = new System.Drawing.Size(815, 24); + this.menuStrip1.TabIndex = 32; + this.menuStrip1.Text = "menuStrip1"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.configurationToolStripMenuItem, + this.exitToolStripMenuItem}); + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 22); + this.optionsToolStripMenuItem.Text = "Options"; + // + // configurationToolStripMenuItem + // + this.configurationToolStripMenuItem.Name = "configurationToolStripMenuItem"; + this.configurationToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.configurationToolStripMenuItem.Text = "Configuration"; + this.configurationToolStripMenuItem.Click += new System.EventHandler(this.configurationToolStripMenuItem_Click); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.exitToolStripMenuItem.Text = "Exit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // ErrorMessages + // + this.ErrorMessages.Location = new System.Drawing.Point(846, 79); + this.ErrorMessages.Multiline = true; + this.ErrorMessages.Name = "ErrorMessages"; + this.ErrorMessages.ReadOnly = true; + this.ErrorMessages.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.ErrorMessages.Size = new System.Drawing.Size(360, 272); + this.ErrorMessages.TabIndex = 5; + this.ErrorMessages.TabStop = false; + // + // chtTPS + // + this.chtTPS.BackColor = System.Drawing.Color.Transparent; + chartArea1.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Seconds; + chartArea1.AxisX.MajorGrid.Enabled = false; + chartArea1.AxisX.MajorGrid.Interval = 0D; + chartArea1.AxisX.MajorGrid.IntervalOffset = 0D; + chartArea1.AxisX.MajorGrid.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Auto; + chartArea1.AxisX.MajorTickMark.Enabled = false; + chartArea1.AxisX.Maximum = 100D; + chartArea1.AxisX.Minimum = 0D; + chartArea1.AxisY.MajorGrid.Enabled = false; + chartArea1.AxisY.Minimum = 0D; + chartArea1.BackColor = System.Drawing.Color.Transparent; + chartArea1.Name = "ChartArea1"; + this.chtTPS.ChartAreas.Add(chartArea1); + legend1.BackColor = System.Drawing.Color.Transparent; + legend1.Enabled = false; + legend1.Name = "Legend1"; + this.chtTPS.Legends.Add(legend1); + this.chtTPS.Location = new System.Drawing.Point(18, 90); + this.chtTPS.Name = "chtTPS"; + this.chtTPS.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; + series1.ChartArea = "ChartArea1"; + series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Area; + series1.Color = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(166))))); + series1.Legend = "Legend1"; + series1.MarkerBorderWidth = 3; + series1.Name = "TPS"; + series1.Points.Add(dataPoint1); + this.chtTPS.Series.Add(series1); + this.chtTPS.Size = new System.Drawing.Size(755, 267); + this.chtTPS.TabIndex = 33; + this.chtTPS.Text = "chtTPS"; + // + // statusStrip1 + // + this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel1, + this.lblTime, + this.toolStripStatusLabel3, + this.lblThreads}); + this.statusStrip1.Location = new System.Drawing.Point(0, 645); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(815, 22); + this.statusStrip1.TabIndex = 35; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Size = new System.Drawing.Size(80, 17); + this.toolStripStatusLabel1.Text = "Elapsed Time:"; + // + // lblTime + // + this.lblTime.Name = "lblTime"; + this.lblTime.Size = new System.Drawing.Size(13, 17); + this.lblTime.Text = "0"; + // + // toolStripStatusLabel3 + // + this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; + this.toolStripStatusLabel3.Size = new System.Drawing.Size(100, 17); + this.toolStripStatusLabel3.Text = "Running Threads:"; + // + // lblThreads + // + this.lblThreads.Name = "lblThreads"; + this.lblThreads.Size = new System.Drawing.Size(13, 17); + this.lblThreads.Text = "0"; + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.Color.Transparent; + this.splitContainer1.Location = new System.Drawing.Point(0, 25); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.splitContainer1.Panel1.Controls.Add(this.btnReset); + this.splitContainer1.Panel1.Controls.Add(this.btnAutoTune); + this.splitContainer1.Panel1.Controls.Add(this.btnRegress); + this.splitContainer1.Panel1.Controls.Add(this.label2); + this.splitContainer1.Panel1.Controls.Add(this.btnToggle); + this.splitContainer1.Panel1.Controls.Add(this.chtTPS); + this.splitContainer1.Panel1.Controls.Add(this.btnRun); + this.splitContainer1.Panel1.Controls.Add(this.btnStop); + this.splitContainer1.Panel1.Controls.Add(this.lbResults); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.chtPageReads); + this.splitContainer1.Panel2.Controls.Add(this.chtCPU); + this.splitContainer1.Size = new System.Drawing.Size(786, 655); + this.splitContainer1.SplitterDistance = 398; + this.splitContainer1.TabIndex = 39; + // + // btnReset + // + this.btnReset.BackColor = System.Drawing.Color.White; + this.btnReset.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnReset.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnReset.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.btnReset.Location = new System.Drawing.Point(173, 362); + this.btnReset.Name = "btnReset"; + this.btnReset.Size = new System.Drawing.Size(84, 30); + this.btnReset.TabIndex = 48; + this.btnReset.Text = "Reset"; + this.btnReset.UseVisualStyleBackColor = false; + this.btnReset.Click += new System.EventHandler(this.btnReset_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.label2.Location = new System.Drawing.Point(58, 70); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(142, 17); + this.label2.TabIndex = 42; + this.label2.Text = "Batch Requests / sec"; + // + // btnToggle + // + this.btnToggle.BackColor = System.Drawing.Color.White; + this.btnToggle.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnToggle.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnToggle.ForeColor = System.Drawing.SystemColors.ControlDarkDark; + this.btnToggle.Location = new System.Drawing.Point(18, 362); + this.btnToggle.Name = "btnToggle"; + this.btnToggle.Size = new System.Drawing.Size(149, 30); + this.btnToggle.TabIndex = 39; + this.btnToggle.Text = "Show diagnostics "; + this.btnToggle.UseVisualStyleBackColor = false; + this.btnToggle.Click += new System.EventHandler(this.btnToggle_Click); + // + // chtPageReads + // + chartArea2.AxisX.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.False; + chartArea2.AxisX.LabelStyle.Enabled = false; + chartArea2.AxisX.LineColor = System.Drawing.Color.White; + chartArea2.AxisX.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.NotSet; + chartArea2.AxisX.LineWidth = 0; + chartArea2.AxisX.MajorGrid.Enabled = false; + chartArea2.AxisX.MajorTickMark.Enabled = false; + chartArea2.AxisY.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.NotSet; + chartArea2.AxisY.MajorGrid.Enabled = false; + chartArea2.AxisY.MajorTickMark.Enabled = false; + chartArea2.AxisY.Maximum = 20000D; + chartArea2.AxisY.Minimum = 0D; + chartArea2.AxisY.Title = "Current Page Reads / sec"; + chartArea2.AxisY.TitleFont = new System.Drawing.Font("Microsoft Sans Serif", 10F); + chartArea2.AxisY.TitleForeColor = System.Drawing.SystemColors.ControlDarkDark; + chartArea2.BorderWidth = 0; + chartArea2.Name = "ChartArea1"; + this.chtPageReads.ChartAreas.Add(chartArea2); + this.chtPageReads.Location = new System.Drawing.Point(0, 120); + this.chtPageReads.Name = "chtPageReads"; + series2.ChartArea = "ChartArea1"; + series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Bar; + series2.Color = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(73)))), ((int)(((byte)(0))))); + series2.Name = "PageReads"; + series2.Points.Add(dataPoint2); + this.chtPageReads.Series.Add(series2); + this.chtPageReads.Size = new System.Drawing.Size(685, 84); + this.chtPageReads.TabIndex = 42; + this.chtPageReads.Text = "chtPageReads"; + this.chtPageReads.Click += new System.EventHandler(this.chtPageReads_Click); + // + // chtCPU + // + this.chtCPU.BackColor = System.Drawing.Color.Transparent; + chartArea3.AxisX.LabelStyle.Enabled = false; + chartArea3.AxisX.LineColor = System.Drawing.Color.White; + chartArea3.AxisX.MajorGrid.Enabled = false; + chartArea3.AxisX.MajorTickMark.Enabled = false; + chartArea3.AxisX.MaximumAutoSize = 10F; + chartArea3.AxisY.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.NotSet; + chartArea3.AxisY.MajorGrid.Enabled = false; + chartArea3.AxisY.MajorTickMark.Enabled = false; + chartArea3.AxisY.Maximum = 100D; + chartArea3.AxisY.Minimum = 0D; + chartArea3.AxisY.Title = "Current % CPU Usage"; + chartArea3.AxisY.TitleForeColor = System.Drawing.SystemColors.ControlDarkDark; + chartArea3.BackColor = System.Drawing.Color.White; + chartArea3.BorderColor = System.Drawing.Color.White; + chartArea3.Name = "ChartArea1"; + chartArea3.Position.Auto = false; + chartArea3.Position.Height = 30F; + chartArea3.Position.Width = 77.49682F; + chartArea3.Position.X = 3F; + chartArea3.Position.Y = 1F; + this.chtCPU.ChartAreas.Add(chartArea3); + this.chtCPU.Dock = System.Windows.Forms.DockStyle.Fill; + this.chtCPU.Location = new System.Drawing.Point(0, 0); + this.chtCPU.Name = "chtCPU"; + this.chtCPU.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; + series3.ChartArea = "ChartArea1"; + series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Bar; + series3.Color = System.Drawing.Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(198)))), ((int)(((byte)(0))))); + series3.Name = "CPUUsage"; + series3.Points.Add(dataPoint3); + this.chtCPU.Series.Add(series3); + this.chtCPU.Size = new System.Drawing.Size(786, 253); + this.chtCPU.TabIndex = 41; + this.chtCPU.Click += new System.EventHandler(this.chtCPU_Click); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Location = new System.Drawing.Point(843, 40); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(83, 13); + this.label3.TabIndex = 11; + this.label3.Text = "Error Messages:"; + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.BackColor = System.Drawing.Color.White; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ClientSize = new System.Drawing.Size(815, 667); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.label3); + this.Controls.Add(this.ErrorMessages); + this.Controls.Add(this.menuStrip1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; + this.Name = "FrmMain"; + this.Text = "WideWorldImporters Report"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing); + this.Load += new System.EventHandler(this.FrmMain_Load); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chtTPS)).EndInit(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chtPageReads)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.chtCPU)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnRun; + private System.Windows.Forms.Button btnStop; + private System.Windows.Forms.Button btnAutoTune; + private System.Windows.Forms.Button btnRegress; + private System.Windows.Forms.Button btnReset; + private System.Windows.Forms.Label lbResults; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem configurationToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.TextBox ErrorMessages; + private System.Windows.Forms.DataVisualization.Charting.Chart chtTPS; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + private System.Windows.Forms.ToolStripStatusLabel lblTime; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3; + private System.Windows.Forms.ToolStripStatusLabel lblThreads; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.Button btnToggle; + private System.Windows.Forms.DataVisualization.Charting.Chart chtCPU; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.DataVisualization.Charting.Chart chtPageReads; + } +} + diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs new file mode 100644 index 00000000..e05f3d43 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs @@ -0,0 +1,746 @@ +//---------------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +//---------------------------------------------------------------------------------- +// The example companies, organizations, products, domain names, +// e-mail addresses, logos, people, places, and events depicted +// herein are fictitious. No association with any real company, +// organization, product, domain name, email address, logo, person, +// places, or events is intended or should be inferred. + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; +using System.Windows.Forms.Integration; + +/// +/// +/// Documentation References: +/// Automatic Tuning: http://docs.microsoft.com/sql/relational-databases/automatic-tuning/automatic-tuning +/// +/// + +namespace DemoWorkload +{ + public partial class FrmMain : Form + { + delegate void SetTextCallback(string text); + + public Object ErrorLock = new Object(); + public Object StopLock = new Object(); + + List RunningThreads = new List(); + Thread MonitorThread; + + bool Stopped = true; + long BaselineTPS = 1; + int Height_2Panels = 0; + int Height_1Panel = 0; + int TPSChartTime = 0; + + public int ReadAutoTune() + { + string ConfigSelect = string.Format("select count(*) from sys.database_automatic_tuning_options where actual_state = 1"); + + System.Data.SqlClient.SqlConnection conn = new SqlConnection(Program.CONN_STR); + + SqlCommand ConfigQuery = new SqlCommand(); + ConfigQuery.Connection = conn; + ConfigQuery.CommandTimeout = 600; + ConfigQuery.CommandText = ConfigSelect; + + try + { + conn.Open(); + int status = (int)ConfigQuery.ExecuteScalar(); + return status; + } + catch (Exception ex) + { + ShowThreadExceptionDialog("AutoTuneStatus", ex); + return 0; + } + finally + { + conn.Close(); + } + } + + public FrmMain() + { + InitializeComponent(); + } + + delegate void SetInt64Callback(Int64 value); + delegate void SetIntCallback(int value); + + /// + /// Adds a line of text into the message box + /// + private void AddText(string text) + { + // InvokeRequired required compares the thread ID of the + // calling thread to the thread ID of the creating thread. + // If these threads are different, it returns true. + if (this.ErrorMessages.InvokeRequired) + { + SetTextCallback d = new SetTextCallback(AddText); + this.Invoke(d, new object[] { text }); + } + else + { + this.ErrorMessages.AppendText("\r\n" + text); + } + + } + /// + /// Updates the thread count display + /// + private void UpdateCount(string TC) + { + try { this.lblThreads.Text = TC.ToString(); } + catch (Exception ex) { ShowThreadExceptionDialog("UpdateCount", ex); } + } + + /// + /// Updates the elapsed time display + /// + private void UpdateElapsed(string Elapsed) + { + this.lblTime.Text = Elapsed.ToString(); + } + + /// + /// Updates the CPU% bar in the chart + /// Note that this proc does NOT cause the chart to refresh. + /// that is done in UpdateTPS(), which should be called after this proc. + /// + private void UpdateCPUChart(int CPU) + { + try { + if (this.statusStrip1.InvokeRequired) + { + SetIntCallback d = new SetIntCallback(UpdateCPUChart); + this.Invoke(d, new object[] { CPU }); + } + else + { + CPU = (CPU == 0) ? 1 : CPU; + this.chtCPU.Series["CPUUsage"].Points.Clear(); + this.chtCPU.Series["CPUUsage"].Points.Add(new DataPoint(0, CPU)); + this.chtCPU.Update(); + } + } + catch (Exception ex) { ShowThreadExceptionDialog("UpdateCPUChart", ex); } + } + + /// + /// Updates PageReads in the Chart + /// + private void UpdatePageReadChart(Int64 PageReads) + { + try { + if (this.statusStrip1.InvokeRequired) + { + SetInt64Callback d = new SetInt64Callback(UpdatePageReadChart); + this.Invoke(d, new object[] { PageReads }); + } + else + { + PageReads = (PageReads == 0) ? 1 : PageReads; + this.chtPageReads.Series["PageReads"].Points.Clear(); + this.chtPageReads.Series["PageReads"].Points.Add(new DataPoint(0, PageReads)); + this.chtPageReads.Update(); + } + } + catch (Exception ex) { ShowThreadExceptionDialog("UpdatePageReadChart", ex); } + } + + /// + /// Updates the TPS bar in the chart, and causes the whole chart to be re-drawn with the new data. + /// + private void UpdateTPSChart(Int64 TPS) + { + try { + if (this.statusStrip1.InvokeRequired) + { + SetInt64Callback d = new SetInt64Callback(UpdateTPSChart); + this.Invoke(d, new object[] { TPS }); + } + else + { + // Updating Speedometer + if (TPS >= 0) + { + //double normalizedTPS = (double)TPS; + //uiControls.speedDial.CurrentValue = normalizedTPS; + //uiControls.speedDial.DialText = normalizedTPS.ToString("#.##"); + + // Updating TPS chart + TPSChartTime++; + + // X Axis Overflow + if (TPSChartTime > this.chtTPS.ChartAreas[0].AxisX.Maximum) + { + this.chtTPS.ChartAreas[0].AxisX.Maximum += 100; + } + + this.chtTPS.Series[0].Points.Add(new System.Windows.Forms.DataVisualization.Charting.DataPoint(TPSChartTime, TPS)); + } + else + { + this.chtTPS.Series[0].Points.Clear(); + TPSChartTime = 0; + } + this.chtTPS.Update(); + } + } + catch (Exception ex) { ShowThreadExceptionDialog("UpdateTPSChart", ex); } + } + + /// + /// Updates Results + /// + public void UpdateResults(string Results) + { + try + { + lock (StopLock) + { + if (Stopped) + { + return; + } + } + if (this.statusStrip1.InvokeRequired) + { + SetTextCallback d = new SetTextCallback(UpdateResults); + this.Invoke(d, new object[] { Results }); + } + else + { + this.lbResults.Text = Results; + this.lbResults.Refresh(); + } + } + catch (Exception ex) { ShowThreadExceptionDialog("UpdateResults", ex); } + } + + /// + /// Executes Read Commands + /// + void OnRunClick(object sender, EventArgs e) + { + try + { + //string ReadCommand; + string WriteCommand; + lock (StopLock) + { + Stopped = false; + } + + WriteCommand = "DECLARE @packagetypeid int = 7; EXEC dbo.report @packagetypeid"; + this.ErrorMessages.Clear(); + + ThreadParams tp = new ThreadParams(Program.REQUEST_COUNT, Program.TRANSACTION_COUNT, Program.ROW_COUNT, WriteCommand); + for (int j = 0; j < Program.THREAD_COUNT; j++) + { + int Threads = RunningThreads.Count(); + // Create a thread with parameters. + ParameterizedThreadStart pts = new ParameterizedThreadStart(ThreadWorker); + RunningThreads.Add(new Thread(pts)); + RunningThreads.ElementAt(Threads).Start(tp); + } + ThreadStart ts1 = new ThreadStart(ThreadMonitor); + this.MonitorThread = new Thread(ts1); + this.MonitorThread.Start(); + } + catch (Exception ex) { ShowThreadExceptionDialog("OnRunClick", ex); } + } + + /// + /// Executes Transactions on the target server + /// + void ThreadWorker(object tp) + { + //////////////////////////////////////////////////////////////////////////////// + // Connect to the data source. + //////////////////////////////////////////////////////////////////////////////// + + System.Data.SqlClient.SqlConnection conn = new SqlConnection(Program.CONN_STR); + + ThreadParams MyTP = (ThreadParams)tp; + SqlCommand WriteCmd = new SqlCommand(); + WriteCmd.Connection = conn; + WriteCmd.CommandTimeout = 600; + WriteCmd.CommandText = MyTP.WriteCommandText; + WriteCmd.Parameters.Add("@ServerTransactions", SqlDbType.Int, 4).Value = (int)MyTP.serverTransactions; + WriteCmd.Parameters.Add("@RowsPerTransaction", SqlDbType.Int, 4).Value = (int)MyTP.rowsPerTransaction; + WriteCmd.Parameters.Add("@ThreadID", SqlDbType.Int, 4).Value = (int)Thread.CurrentThread.ManagedThreadId; + + // Executing transactions on the target server + try + { + conn.Open(); + for (int i = 0; i < MyTP.requestsPerThread; i++) + { + lock (StopLock) + { + if (Stopped) + { + break; + } + } + WriteCmd.ExecuteNonQuery(); + } + } + catch (Exception ex) + { + lock (this.ErrorLock) + { + this.AddText(ex.Message + " " + Thread.CurrentThread.ManagedThreadId.ToString()); + } + } + finally + { + conn.Close(); + } + } + + /// + /// Thread Monitor + /// + void ThreadMonitor() + { + //Set-up & initialization + DateTime Start = DateTime.Now; + DateTime PerfCounterStart = DateTime.Now, PerfCounterEnd; + Int64 LastPerfCounterValue = 0, ThisPerfCounterValue = 0, TPS = 0; + Int64 PageReadCounterValue = 0, LastPageReadCounter = 0, ThisPageReadCounter = 0; + int CPU_Usage = 0; + int mo_tables = 0; + PerformanceCounter CPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); + Int64 TotalTPS = 0, TotalIterations = 0; + + // Open the connection + System.Data.SqlClient.SqlConnection conn = new SqlConnection(Program.CONN_STR); + + string cmdStr = string.Format("select max(cntr_value) FROM sys.dm_os_performance_counters WHERE counter_name = 'Batch Requests/sec'"); + string PageReadcmdStr = string.Format("select max(cntr_value) FROM sys.dm_os_performance_counters WHERE counter_name = 'Page reads/sec'"); + + SqlCommand Perfcmd = new SqlCommand(); + Perfcmd.Connection = conn; + Perfcmd.CommandTimeout = 600; + Perfcmd.CommandText = cmdStr; + + //query to determine which stage we're in + SqlCommand PageReadcmd = new SqlCommand(); + PageReadcmd.Connection = conn; + PageReadcmd.CommandTimeout = 600; + PageReadcmd.CommandText = PageReadcmdStr; + +// string ConfigSelect = string.Format("select count(*) from sys.database_automatic_tuning_options where actual_state = 1"); +// + // SqlCommand ConfigQuery = new SqlCommand(); + // ConfigQuery.Connection = conn; + // ConfigQuery.CommandTimeout = 600; + // ConfigQuery.CommandText = ConfigSelect; + + + + try + { + conn.Open(); + } + catch (Exception ex) + { + lock (this.ErrorLock) + { + this.AddText(ex.Message + " " + Thread.CurrentThread.ManagedThreadId.ToString()); + } + } + + if (conn.State != ConnectionState.Open) + { + MessageBox.Show("Monitor failed to connect to server.", "Error", MessageBoxButtons.OK); + return; + } + + mo_tables = ReadAutoTune(); + + if (mo_tables == 0) + { + //This is the case where Auto Tuning is turned OFF. + UpdateResults("Baseline"); + //Calling UpdateTPSChart with a negative value causes it to clear the current chart and reset. + UpdateTPSChart(-1); + } + else + { + UpdateResults("Auto Tuning"); + } + + while (RunningThreads.Count > 0) + { + List DeadThreads = new List(); + foreach (Thread MyThread in RunningThreads) + { + if (!MyThread.IsAlive) + { + DeadThreads.Add(MyThread); + } + } + foreach (Thread DThread in DeadThreads) + { + RunningThreads.Remove(DThread); + } + DeadThreads.Clear(); + PerfCounterEnd = DateTime.Now; + + try + { + ThisPerfCounterValue = (Int64)Perfcmd.ExecuteScalar(); + ThisPageReadCounter = (Int64)PageReadcmd.ExecuteScalar(); + } + catch (Exception ex) + { + lock (this.ErrorLock) + { + this.AddText(ex.Message + " " + Thread.CurrentThread.ManagedThreadId.ToString()); + } + } + + if (LastPageReadCounter == 0) + { + LastPageReadCounter = ThisPageReadCounter; + } + + if (LastPerfCounterValue != 0) + { + CPU_Usage = (int)CPUCounter.NextValue(); + + TimeSpan PerfCounterInterval = PerfCounterEnd - PerfCounterStart; + if (PerfCounterInterval.Milliseconds > 0) + { + TPS = (Int64)((ThisPerfCounterValue - LastPerfCounterValue) / (float)(PerfCounterInterval.Seconds + (PerfCounterInterval.Milliseconds / 1000))); + PageReadCounterValue = (Int64)((ThisPageReadCounter - LastPageReadCounter) / (float)(PerfCounterInterval.Seconds + (PerfCounterInterval.Milliseconds / 1000))); + UpdateCPUChart(CPU_Usage); + UpdatePageReadChart(PageReadCounterValue); + UpdateTPSChart(TPS); + } + if (mo_tables == 0) + { + TotalTPS += TPS; + TotalIterations += 1; + BaselineTPS = TotalTPS / TotalIterations; + } + else + { + UpdateResults("Auto Tuning"); + } + } + + PerfCounterStart = PerfCounterEnd; + LastPerfCounterValue = ThisPerfCounterValue; + LastPageReadCounter = ThisPageReadCounter; + PerfCounterStart = PerfCounterEnd; + this.UpdateCount(RunningThreads.Count.ToString()); + Thread.Sleep(1000); + TimeSpan Elapsed = DateTime.Now - Start; + UpdateElapsed(Elapsed.ToString(@"hh\:mm\:ss")); + } + + TPS = 0; + CPU_Usage = 0; + PageReadCounterValue = 0; + UpdatePageReadChart(PageReadCounterValue); + UpdateCPUChart(CPU_Usage); + UpdateTPSChart(TPS); + } + + /// + /// Stop Button + /// + private void btnStop_Click(object sender, EventArgs e) + { + lock (StopLock) + { + Stopped = true; + } + } + /// + /// Application Exit + /// + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + Application.Exit(); + } + + /// + /// Regression Button + /// + private void btnRegress_Click(object sender, EventArgs e) + { + try + { + string RegressCommand; + lock (StopLock) + { + Stopped = false; + } + + RegressCommand = "DBCC FREEPROCCACHE; DECLARE @packagetypeid int = 1; EXEC dbo.report @packagetypeid"; + this.ErrorMessages.Clear(); + + // Open the connection + System.Data.SqlClient.SqlConnection conn = new SqlConnection(Program.CONN_STR); + + SqlCommand RegressCmd = new SqlCommand(); + RegressCmd.Connection = conn; + RegressCmd.CommandTimeout = 600; + RegressCmd.CommandText = RegressCommand; + + // Executing command on the target server + try + { + conn.Open(); + RegressCmd.ExecuteNonQuery(); + + UpdateResults("Regression"); + } + catch (Exception ex) + { + lock (this.ErrorLock) + { + this.AddText(ex.Message); + } + } + finally + { + conn.Close(); + } + + } + catch (Exception ex) { ShowThreadExceptionDialog("btnRegress_Click", ex); } + } + + /// + /// Auto Tuning Button + /// + private void btnAutoTune_Click(object sender, EventArgs e) + { + try + { + string AutoTuneCommand; + lock (StopLock) + { + Stopped = false; + } + + AutoTuneCommand = " ALTER DATABASE current SET AUTOMATIC_TUNING ( FORCE_LAST_GOOD_PLAN = ON ); DBCC FREEPROCCACHE; ALTER DATABASE current SET QUERY_STORE CLEAR ALL;"; + this.ErrorMessages.Clear(); + + // Open the connection + System.Data.SqlClient.SqlConnection conn = new SqlConnection(Program.CONN_STR); + + SqlCommand AutoTuneCmd = new SqlCommand(); + AutoTuneCmd.Connection = conn; + AutoTuneCmd.CommandTimeout = 600; + AutoTuneCmd.CommandText = AutoTuneCommand; + + // Executing command on the target server + try + { + conn.Open(); + AutoTuneCmd.ExecuteNonQuery(); + int mo_tables = ReadAutoTune(); + + if (mo_tables == 1) + { + UpdateResults("Auto Tuning"); + } + } + catch (Exception ex) + { + lock (this.ErrorLock) + { + this.AddText(ex.Message); + } + } + finally + { + conn.Close(); + } + + } + catch (Exception ex) { ShowThreadExceptionDialog("btnAutoTune_Click", ex); } + } + + /// + /// Reset Button + /// + private void btnReset_Click(object sender, EventArgs e) + { + try + { + string ResetCommand; + lock (StopLock) + { + Stopped = false; + } + + ResetCommand = "DBCC FREEPROCCACHE; ALTER DATABASE current SET QUERY_STORE CLEAR ALL; ALTER DATABASE current SET AUTOMATIC_TUNING ( FORCE_LAST_GOOD_PLAN = OFF );"; + this.ErrorMessages.Clear(); + + // Open the connection + System.Data.SqlClient.SqlConnection conn = new SqlConnection(Program.CONN_STR); + + SqlCommand ResetCmd = new SqlCommand(); + ResetCmd.Connection = conn; + ResetCmd.CommandTimeout = 600; + ResetCmd.CommandText = ResetCommand; + + // Executing command on the target server + try + { + conn.Open(); + ResetCmd.ExecuteNonQuery(); + } + catch (Exception ex) + { + lock (this.ErrorLock) + { + this.AddText(ex.Message); + } + } + finally + { + conn.Close(); + } + + } + catch (Exception ex) { ShowThreadExceptionDialog("btnReset_Click", ex); } + } + + /// + /// Configuration Settings + /// + private void configurationToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + FrmConfig cf = new FrmConfig(); + cf.ShowDialog(); + } + catch (Exception ex) { ShowThreadExceptionDialog("configurationToolStripMenuItem_Click", ex); } + } + + /// + /// Show Diagnostics + /// + private void btnToggle_Click(object sender, EventArgs e) + { + try + { + splitContainer1.Panel2Collapsed = !splitContainer1.Panel2Collapsed; + if (splitContainer1.Panel2Collapsed) + { + this.Height = this.Height_1Panel; + btnToggle.Text = "Show diagnostics"; + } + else + { + this.Height = this.Height_2Panels; + btnToggle.Text = "Hide diagnostics"; + } + } + catch (Exception ex) { ShowThreadExceptionDialog("btnToggle_Click", ex); } + } + + /// + /// Frm Main Load + /// + private void FrmMain_Load(object sender, EventArgs e) + { + try { + ElementHost host = new ElementHost(); + + host.Dock = DockStyle.Fill; + + this.Height_1Panel = splitContainer1.Panel1.Height + 100; + this.Height_2Panels = this.Height; + splitContainer1.Panel2Collapsed = true; + this.Height = Height_1Panel; + } + catch (Exception ex) { ShowThreadExceptionDialog("FrmMain_Load", ex);} + } + + /// + /// Frm Main Closing + /// + private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) + { + lock (StopLock) + { + Stopped = true; + } + Thread.Sleep(1000); + if (MonitorThread != null && MonitorThread.ThreadState == System.Threading.ThreadState.Running) + { + MonitorThread.Abort(); + } + } + + /// + /// Creates an error message and displays it. + /// + private static DialogResult ShowThreadExceptionDialog(string title, Exception e) + { + string errorMsg = "An application error occurred"; + errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace; + return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore, + MessageBoxIcon.Stop); + } + + private void chtPageReads_Click(object sender, EventArgs e) + { + + } + + private void chtCPU_Click(object sender, EventArgs e) + { + + } + } + + /// + /// ThreadParams Class + /// + class ThreadParams + { + public int requestsPerThread; // how many many separate client requests per thread + public int serverTransactions; // how many separate transactions to run on the server per request + public int rowsPerTransaction; // how many rows to inserts/read per transaction + public string WriteCommandText; // command text for request + + public ThreadParams(int requestsPerThread, int serverTransactions, int rowsPerTransaction, string WriteCommandText) + { + this.requestsPerThread = requestsPerThread; + this.serverTransactions = serverTransactions; + this.rowsPerTransaction = rowsPerTransaction; + this.WriteCommandText = WriteCommandText; + } + + } + +} diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx new file mode 100644 index 00000000..8176630a --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 126, 17 + + + + + AAABAAYAEBAAAAEACABoBQAAZgAAABAQAAABACAAaAQAAM4FAAAgIAAAAQAIAKgIAAA2CgAAICAAAAEA + IACoEAAA3hIAADAwAAABAAgAqA4AAIYjAAAwMAAAAQAgAKglAAAuMgAAKAAAABAAAAAgAAAAAQAIAAAA + AAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAADIxsYAx6SUAPLSwwDz18sAsaCYAMa5swD56+UA0MfDAPvy + 7gDGopAAxqOSAMellADHppUAyKiYANW0pACeh3wA17mqAMmuoACgin8AyrCjAKOOhADy1MUA8tXHAPPX + yQD13tMA9d/UAPbi2AD35NsA+OXcALmtpwD46uMAxqSSAMiolwDIq5sAqZaMAM25rgC7raUA1sa9ALit + pwDQycUAkX90AKaThwCxoJYArZySAK+flQC2p54AwLStAL2zrQDCurUAYk5AAG9cTwCfiHgAlIByAL2p + mwCZiH0AxLCiAKWVigCll44A3tTNAMrBuwDGwLwAW0U0AGVNOwBaRjcAcFlIAG9ZSAB8ZlYAkXppAIhz + ZACmkYEArpmKAL6snwD68uwA/Pj1AGdVRgB2ZFYAf21fALaikgDXyb4A4dzYAMW9tgDT0c4AV41YAM76 + /gDH8/oAu+z2AMX0/QDm6+wA3O3xAKDq/gCsy9QAu9jgALPX4gCgqq0AleP9AJXi/ACYzeAAss3XAJmr + sQCksLQAaL7iAHDL7gCSxdoAjbXFAGbB6ABmveQAlcjeAHGPngCsws4AgZajAK2+yQCmqq8A////APz8 + /AD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzVFQ0JBQT86AAAAAAAAABBRIQ0MIAsKPgAAAAAAAAAT + cRgXFgNTAkAAAAAAAAAAFXEBY15sJg4yAAAAAAAAACpxaGBVZXAiSwAAAAAAAAAjcWdfVWluEjMAAAAA + AAAALHFrX1VqbxRMAAAAAAAAAAVxYVpVZm0bTQAAAAAAAAAuO11XVFZkREQAAAAAAAAAJXFZXFtiWCQp + AAAAAAAAAC9xcXFxcXFxNwAAAAAAAAAGTzg2TkdGNDQAAAAAAAAACHFKSR8cGREtAAAAAAAAAChycXFx + cXFQSAAAAAAAAABSPTEwJx4eHh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD8AAIA/AACAPwAAgD8AAIA/ + AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAA//8AACgAAAAQAAAAIAAAAAEA + IAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsaCW/5SAcv+Ic2T/fGZW/29ZSP9wWUj/cFlI/2VN + O/+ll47/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ6HfP/Fvbb/yKiX/8emlf/HpZT/xqSS/8aj + kv/GopD/W0U0/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgin////////PXyf/y1cf/8tTF//LS + w/9XjVj/x6SU/1pGN/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo46E///////Ixsb/maux/6Cq + rf9xj57/1sa9/8iomP9iTkD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKaTh///////jbXF/5Xi + /P/H8/r/aL7i/6aqr//Iq5v/Z1VG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACploz//////5LF + 2v+V4/3/x/P6/2bB6P+BlqP/ya6g/29cT/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArZyS//// + //+VyN7/leP9/8fz+v9mveT/rb7J/8qwo/92ZFb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGg + mP//////mM3g/6Dq/v/H8/r/cMvu/6zCzv/24tj/f21f/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAC2p57/3tTN/7PX4v/F9P3/zvr+/7vs9v+ksLT/kXpp/5F6af8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAu62l///////c7fH/u9jg/6zL1P+yzdf/5uvs/825rv+Rf3T/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAMC0rf//////////////////////////////////////mYh9/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADGubP/18m+/8Swov+9qZv/tqKS/66Ziv+mkYH/n4h4/5+IeP8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA0MfD///////8+PX/+vLs//jq4//35Nv/9d7T/9e5qv+vn5X/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAANDJxf/8/Pz////////////////////////////h3Nj/vqyf/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADT0c7/xsC8/8K6tf+9s63/uK2n/7mtp/+5raf/tqmh/9HG + wP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/ + AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAA//8AACgAAAAgAAAAQAAAAAEACAAAAAAAAAQAAAAA + AAAAAAAAAAEAAAABAAAAAAAA//7+AP339gD++fgA/vr5AP329AD88/AA/PTxAPvz8ADn4d8A/vv6APXa + zwD45t8A++/qAO3j3wDSsaIA89XHAPTWyQDz1skA9NjLAPPXygD129AA9dzRAPXd0gD239UA9+HXAPjo + 4QD56uMA+OniAPrs5gD56+UA/PPvAPz18gDGo5IAx6aWANW0pADava4AyrCjAPXazQD02cwA5Mu/APbf + 0wD13tMA9+PZAPjl3AD88u0A+/HsAPz28wD9+fcA/vz7AMirmwDz2csAzbmuAOfZ0QDe080A+/LtAOXe + 2gDi29cA28/IANzRygD67+gA+/HrAOHZ1AD89O8A+/PuAPPr5gD9+PUAg29hAJB+cgCNfHAA8O3rAHpl + VQB7ZlcAfmlaAH5qWwB/a1wAgW1eAIBsXQCCbl8Ag3BiAI17bgCUhHgAk4N3AJeHewCcjoQApZiOAKeb + kgCrn5YAraKaAKyhmQCuo5sA4NjSAMG6tQDo5OEA5+PgAHxoWAB9aVkAhXJjAIFvYACFc2UAh3VnAIl3 + aQCLeWsAi3psAI5+cQCRgXQAj39yAJWGegCYiX0Am42CAJ+RhgChlIkAoJOIAKebkQCpnpUAq6CXAK+l + nQC4r6gA39bPAOXg3ACRgnUAlYZ5AJmLfgCekIQAm42BAKOXjACilosAoZWKALGnngCupJsAtaykALKp + oQC2raUAwLmzAL+4sgC9trAApZqPAKedkwC5sakAt6+nALOrowC8ta4AurOsAL+4sQC+t7AAwry2AP36 + 9wD9+/kA6eflAP79/ACyqqEAsamgALy1rQC6s6sAubKqALy2rwC7ta0Awby1APb08QD9/PoAOcEAADHJ + AAAuzAAAJ9UAANP4/ADd+/4A2/n8ANv6/gDV8/cA0Pb9AM/s8QC77/kAvO/5AMTx+gDM6e8Atez5ALbs + +QC16vYAve76AMXj6gDe6+4ApuX3AKfm9wCo5vcAsNrmAMDc5ACZ4PYAqOb5AKfj9gC10tsAu9jhAMrg + 5wB70/QAe9T0AJDc9gCN1fAAkt32AJHY8QCY3fQAsczVAMPX3gDA09oA2eLlANDY2wBqzPIAaszxAGrL + 8QBqyO4AasjtAGvF6gBrxekAfs3rAJ/J2QCryNMAq8fSAG7B5QB2v94Am73NAK3J1QCsxtEAtc/aALfN + 1wB9tM4AoLzKAKS/zACnws8ApsHOAJ63xACpxNEApL3KAKK7yACqxNEAts3YAMfP0wCRs8YAj62+AKK+ + zgCIqb0Am7PBAKC4xgCasb8Ap7/NAJKpuACYr74AlKq5AJWrugCRprYAl629AI2hsgCQpLQAjaCxAP// + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAGRjYU9DTkxNTUpJYF9ISEdHAAAAAAAAAAAAAAAAAAAAZQoP + ISEhISEhISEhISEhIkgAAAAAAAAAAAAAAAAAAABmCicTExMTExMSFBESEhAyXwAAAAAAAAAAAAAAAAAA + AFAKCwsnJicnJycTFKKgEjJgAAAAAAAAAAAAAAAAAAAAaDELCwsLCwsmJycTo6EUMksAAAAAAAAAAAAA + AAAAAABpMRYWFhYVFRULCwsmJzMyTAAAAAAAAAAAAAAAAAAAAFIxKSrL3d/18uvq7OkLJjJiAAAAAAAA + AAAAAAAAAAAAazEY3NnUuLHG09je7fELMk8AAAAAAAAAAAAAAAAAAABsMRnjxbWrsLrBztDX+hUyYwAA + AAAAAAAAAAAAAAAAAHwxK+/CtquwusHN0NL4FzJkAAAAAAAAAAAAAAAAAAAAVJUs5sS2q6+6wc3P0fkp + MmUAAAAAAAAAAAAAAAAAAABulQzlxLassLrBzs/R9hgyZwAAAAAAAAAAAAAAAAAAAG+VGuDEt6yvusHO + 0NHyGTJFAAAAAAAAAAAAAAAAAAAAfZUb4sS3rLC6wM7P0vQZImoAAAAAAAAAAAAAAAAAAACIlR7hxLes + sLrBzNDS9SwkeAAAAAAAAAAAAAAAAAAAAIkBCuTEt6ywusHN0NL3AwJRAAAAAAAAAAAAAAAAAAAAV0YO + 1sS2q7C6wc7Q0vM1NVMAAAAAAAAAAAAAAAAAAABZkYbVu62kpaepsrzD8ExgegAAAAAAAAAAAAAAAAAA + AIEBN9qlpaWlpaWlpaXuGiV8AAAAAAAAAAAAAAAAAAAAgAEfv76zqqamqK65x8kcNHsAAAAAAAAAAAAA + AAAAAACWAQeetL+95+Hb6MjKQRs0cAAAAAAAAAAAAAAAAAAAAIIBBS8vIAcfQDc9DTwdHiV+AAAAAAAA + AAAAAAAAAAAAi/v7+/v7+/v7+/v7+/v7lVUAAAAAAAAAAAAAAAAAAACKkYaci4NYVn9teURmYUxgcQAA + AAAAAAAAAAAAAAAAAJmUXV1eCXc4ODk+W3Y2OzpyAAAAAAAAAAAAAAAAAAAAmPsKkwSSMEIvIAhALg08 + I3MAAAAAAAAAAAAAAAAAAACH+zEKnwQDMAUgBx83PTwjWgAAAAAAAAAAAAAAAAAAAIb7lZUKBAMwQi8H + Bi09PCN0AAAAAAAAAAAAAAAAAAAAhfsBAZUKBDACBQc/LT08KJcAAAAAAAAAAAAAAAAAAABc+/v7AQEB + AQGVlZUxMTEFjAAAAAAAAAAAAAAAAAAAAJGdXFyFho+Qm42cjpqKdYuEAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP//////KAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAId0Zv+Fc2X/hXJj/4Nw + Yv+Db2H/gm5f/4FtXv+AbF3/gGxc/35qW/9+aVr/fWlZ/3xnWP97Z1f/e2ZW/3pmVv96ZVX/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXdp//77 + +v/SsaL/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/x6aW/3tm + V/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACLeWv//vv6//TZzP/02Mz/9NjM//TYy//02Mv/9NfL//TYyv/z18n/89fK//TWyf/z1sn/89bI//PV + x//Iq5v/fGhY/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + q//p5+X/6OTh/+jk4f/n4+D/5+Hf/+Xg3P/l3tv/5N3Z/+Lb1//h2dT/4NjS/9/Wz//e083/3NHK/9vP + yP+pnpX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAvLWt///////++/r//fv5//76+f/9+vf//fj3//349f/89/P//PXy//vz8P/78+7/+/Hs//vv + 6v/67uj/1bSk/6ugl/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC9trD////////8+////Pr//fz6//77+f/++fj//fn2//329P/89fL//PTx//zz + 7//78u3/+/Dr//vv6P/VtKT/rqOb/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4sv////////38//79/P/+/Pr//vv5//75+P/9+fb//fj1//z2 + 8//89PH//PPw//zy7f/78ev/+u/p/9W0pP+vpZ3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwLmz///////+/v3///39//79/P/+/Pr//vr5//35 + 9//99/b//ffz//z08f/89O///PLt//vw6//67+n/5Mu//7GpoP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBurX///////////////////7+///+ + /v///v7///79///+/f/+/f3//v38//79/P/+/Pz//vz7//78+//99vT/s6uj/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK8tv/BvLX/wbu1/8C6 + tP/AubP/v7iy/7+4sf++t7D/vLav/7y1rv+7tK3/urOs/7myqv+5sKn/uK+o/7evp/+2raX/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA//4A + AP/+AAD//gAA//4AAP/+AAD//gAA//4AAP/+AAD//gAA/ygAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAA + AAAAAAAAAAEAAAABAAAAAAAA/vn4AP349wD++vkA/PHtAPzz8AD78/AA/ff1AP77+gD12s8A9+HYAPjm + 3wD56uQA++/qAO3j3wDn4uAA0rGiAPPVxwD01skA89bJAPTYywDz18oA9dvQAPbd0gD13NEA9t7TAPXd + 0gD239UA9+HXAPfj2gD45NsA+erjAPjp4gD67OYA+/DrAPzz7wDl3tsA/PXyAMajkgDHppYA1bSkAMqw + owD12s0A9NnMAPbd0QD13tMA9uDVAPXf1AD24tgA9+TbAPjl3AD46OAA+u7oAPzy7QD78ewA4trWAPz2 + 8wDu6ugA/vz7AMirmwDz2csA59nRAN7TzQD78u0A/PXxAOnc1ADc0MkA/PTvAPvz7gD9+PUAkH5yAI18 + cADw7esAemVVAHtmVwB+aVoAfmpbAH9rXACBbV4AgGxdAIJuXwCDcGIAgm9hAI17bgCUhHgAloZ6AJyO + hACtopoA9vLvAOjk4QB8aFgAfWlZAIVyYwCFc2UAh3VnAIl3aQCLemwAjn5xAJGBdACPf3IAmYp+AJuN + ggCgk4gApZmPAKqflgCroJcAr6WdALivqACKeWoAkYJ1AJuNgQCfkYUAo5eMAKGVigCnnJIAsaeeAK6k + mwC1rKQAtq2lAODY0QDAubMAv7iyALmxqQC3r6cAvLWuALqzrAC/uLEAvrewAMK8tgDAurQA/fr3AP37 + +QDp5+UA//79AP79/ACyqqEAvLWtALy2rwC7ta0A/fz6ADXFAAAr0QAA2/v9ANP4/ADd+/4A3Pr9ANv5 + /ADb+v4A1vT4AMjz+gDB6fAAz+zxANHt8gC77/kAvO/5AMLw+gDS9v0A2+rtALXs+QC27PkAter2AKbl + 9wCn5vcAqOb3AKvm9wDG4egAl971AJjg9gCo5vkAttnkAGvN8QBszvEAbc3xAG7O8gBvzvEAcM7xAHTP + 8QB40vMAetP0AHvU9AB81PQAfNPzAJDc9gCN1fAAkt32AJHY8QCe3/UAydvhAGzO8wBtzPIAb8zzAG3K + 7gBtyO0Aa8XqAHDO8gBwzfEAb8zwAG/M7wBvy+8Ab8ntAG7H7ABuyOsAbsfqAHLO8QBxy+8AcMnsAG3E + 5gBwx+kAd9HzAHLG6ABxxecAccHiAHXH5wByv94AeszsAHjC4QCfydkAq8jTALfR2wC2ztgAbsLmAG/A + 4wB0wOIAfLnUAJm8zAChvssArMnWAKzG0gCxy9YAjrXJAKS/zACnws8AnrfEAKnE0QCkvcoAorvIAKrE + 0QCFqb0AjbLGAI6uwACrxdMAnrbDAJuzwQCasb8AobnHAJKpuACYr74Alau6AJGnuACQpbUAl629AI2h + sgCPo7MAjaCxAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABeXVxcUVFRUVJQTk9PTEtbW1tbWkpKSUkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfCBAQJiYm + JiYmJiYmJiYmJiYmJiYmJ0oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgCCsrFBQUFBQUFBQUExUSEhIS + ExMRO1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTCAkJCQkJCSsqKysrKxQVFRUVjYwTO1sAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABhOgkJCQkJCQkJCQkqKysUFBQUjYwVO00AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABiOhgYGBgYGBgYFhYWCQkJCQkJKis8O04AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUOhkZLS0t + LS0aGhoYGBYJCQkJCQkqO1IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVOhsbLi4uLhsuLy0ZGRcsLCws + FhYJO1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkOhwcCrvi4fHx9/Xv5e7l5fAtGhgWO10AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAABuOh0d2uDYqZaWoKbW0dTX3+3uGS0aO14AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAABWhjIy6LmhmZWVn6bQxsbH0t39LhsZO18AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvhgsL9Lai + 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 + AAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB// + AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/g + AAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB// + AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD/4AAAH/8AAP/gAAAf/wAA/+AAAB//AAD///////8AAP// + /////wAAKAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAId0 + Zv+Fc2X/hXJj/4VyY/+DcGL/g3Bi/4NwYv+DcGL/g29h/4JuX/+BbV7/gGxd/4BsXP9+alv/fmla/31p + Wf99aVn/fWlZ/31pWf98Z1j/e2dX/3tmVv96Zlb/emVV/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIl3af/++/r/0rGi/9Kxov/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8aj + kv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Go5L/xqOS/8ajkv/Hppb/e2ZX/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIt5a//++/r/9NnM//TZzP/02Mz/9NjM//TYzP/02Mz/9NjM//TY + y//02Mv/9NfL//TYyv/z18n/89fK//TWyf/01sn/9NbJ//TWyf/z1sn/89bI//PVx//Iq5v/fGhY/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI17bv/+/Pr/9NrO//Tazv/12s7/9drO//Xa + zv/12s7/9NnN//Tazf/02c3/9NnN//TZzP/02cz/9NjL//PXyv/z18r/89fK//PXyv8uzAD/OcEA//PW + yP/Iq5v/fWlZ/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5+cf/+/Pv/9dvP//Xb + z//028//9NvP//Tbz//028//9dvP//Taz//12s7/9drO//Xazf/02c3/9NnM//TYzP/02Mz/9NjM//TY + zP8n1QD/MckA//PYyv/Iq5v/f2tc/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJGB + dP/+/Pv/9dzS//Xc0v/13NH/9dzR//Xc0f/13NH/9d3R//Xd0f/13ND/9dzQ//Xb0P/028//9NvP//Xa + zv/12s7/9drO//Xazv/12c3/9NnM//PZy//Iq5v/gW1e/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJODd//+/Pv/9t7T//be0//13tP/9d7T//Xe0//13tP/9d7T//Xe0v/13dL/9d3S//Xc + 0v/13dH/9dvQ//Tbz//028//9NvP//Tbz//1287/9drO//Xazf/Iq5v/gW9g/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJWGev/+/Pv/9t/V//bf1f/24NX/9uDV//bg1f/24NX/9t/V//bg + 1f/139T/9d7U//bf0//23tP/9t3S//bd0f/23dH/9t3R//bd0f/13ND/9dvQ//Xaz//Iq5v/g3Bi/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJiJff/+/Pv/9+HX//fh1//34dj/0dnd/6vJ + 1v+hvsv/nbXD/562w/+Vq7r/kqm4/46uwP+Ptsr/jrLE/4+1yP+MtMr/q8XT//Xe0//13dL/9d3R//Xc + 0P/Iq5v/hXNl/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqMgP/+/Pz/9+PZ//fj + 2f+10Nv/mbzM/5/J2f+w2ub/wenw/8Hp8P+16vb/l930/3rM7P9yxuj/dcfn/3jC4f98udT/ham9/4yy + x//23tT/9d7T//Xd0v/Iq5v/h3Vn/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyO + hP/+/fz/+OXc//jl3P+et8T/kdjx/6bl9/+77/n/yPP6/8jz+v+27Pn/l9/2/3fR8/9uy+//b8ru/2/J + 7f9xxef/b8Dj/42gsf/24Nb/9t/V//bf0//Iq5v/iXdp/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJ+Rhv/+/fz/+Obf//jm3/+guMb/kNz2/6fm9/+77/n/yPP6/8jz+v+27Pn/mOD2/3nT + 9P9tzfH/b8vv/3DJ7P9ux+r/bcTm/42hsv/34df/9uDW//bf1f/Iq5v/i3ps/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGUif/+/fz/+Ojh//jo4f+husf/kNz2/6bm9/+87/n/yPP6/8jz + +v+17Pj/meD2/3zU9P9szvP/b83w/2/L7v9uyOv/bcTm/4+js//34tn/9+HY//fh1v/Iq5v/jXxw/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOXjP/+/fz/+erj//nq4/+iu8j/kt32/6fm + 9/+77/n/yPP6/8jz+v+17Pn/meD2/3vU9P9tzPL/b83x/27L7/9tyOz/bcHn/5CktP/35Nv/9+Pa//bi + 2P/Hppb/j39y/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOXjP/+/fz/+erj//nq + 4/+kvcr/kt32/6fm9/+87/n/yPP6/8jz+v+27Pn/mOD2/3vU9P9tzPL/b87x/2/L7/9tx+z/b8Pm/5Gm + tv/35Nv/9+Pa//bi2P/Hppb/j39y/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOX + jP/+/fz/+erj//nq4/+et8T/kdjx/6bl9/+77/n/yPP6/8jz+v+27Pn/mOD2/3vU9P9szfP/cc7x/2/L + 7/9ux+z/ccDi/42gsf/35Nv/9+Pa//bi2P/Hppb/j39y/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKOXjP/+/fz/+erj//nq4/+guMb/kNz2/6fm9/+77/n/yPP6/8jz+v+27Pn/mOD2/3vU + 9P9rzPH/cM7y/2/M7/9tyOr/b8Hl/42hsv/35Nv/9+Pa//bi2P/Hppb/kYJ1/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKOXjP/+/fz/+erj//nq4/+husf/kNz2/6bm9/+87/n/yPP6/8jz + +v+17Pj/meD2/3vU9P9szvH/bs7x/3DL7/9vx+n/ccLi/5Cltv/35Nv/9+Pa//bi2P/Hppb/kYJ1/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWaj//+/f3/+evl//nr5f+iu8j/kt32/6fm + 9/+77/n/yPP6/8jz+v+17Pn/meD2/3vV9P9rzvH/b87w/3DL7v9wx+n/cr7d/5KouP/45d3/9+Tc//jk + 2//Hppb/kYJ1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKedk////v7//vv6//77 + +v+kvcr/kt32/6fm9/+87/n/yPP6/8jz+v+27Pn/mOD2/3vU9P9tzPL/b87x/3HL7v9vx+r/c7/f/5Gn + uP/++vn//vr4//76+P/99/X/lIR4/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKuf + lv/w7ev/7ePf/+3j3/+kv8z/kt32/6jm9/+87/n/yPP6/8jz+v+17Pn/mOD2/3vU9P9vzPP/cM3x/3HL + 7/9vx+r/ccDf/5KpuP/p3NX/6NvT/+fa0v/m2ND/l4d7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAKyhmf/CvLb/v7iy/7+4sv+mwc7/kt32/6jm9/+87/n/yPP6/8jz+v+27Pn/meD2/3vT + 9P9uzvH/cM7x/3HL7/9ux+r/dMDi/5Squv+KeGr/hXNk/4BtXv99aFn/mYt+/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy7f+nws//kt32/6jm9/+87/n/yPP6/8jz + +v+27Pn/mOD2/3vT9P9uzvL/cM7x/2/M7/9ux+v/ccLi/5Wruv/56uT/+eri//jo4P/KsKP/m42B/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy7f+pxNH/kt32/6jm + 9/+87/n/yPP6/8jz+v+27Pn/l9/2/3jS8/9uzPD/cs7x/3DM8P9tyO3/bcTn/5etvf/56uT/+eri//jo + 4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy + 7f+rx9L/kt32/6fm9/+77/n/yPP6/8jz+v+27Pn/mOD2/3zT8/9vzPD/dM/x/2/M8P9tyu7/a8Xq/5iv + vv/56uT/+eri//jo4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6k + m////v3/+/Lt//vy7f+ryNP/qOb5/8Tx+v/T+Pz/2/v9/9v7/f/c+/7/2/r+/9L2/f/B7/r/we/6/6vm + 9/+e3/X/jdXw/5qxv//56uT/+eri//jo4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAK6km////v3/+/Lt//vy7f+tydX/3fv+/937/v/d+/7/3fv+/937/v/d+/7/3Pv9/9z6 + /f/c+v3/3Pr9/9v6/f/b+v3/3fv+/5uzwf/56uT/+eri//jo4P/KsKP/m42B/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6km////v3/+/Lt//vy7f/K4Of/u9jh/8Xj6v/P7PH/1vT4/9b0 + +P/b+fz/2/n8/9b0+P/R7fL/1/X5/9Dt8v/C3+b/sszW/7PM1v/56uT/+eri//jo4P/KsKP/m42B/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALGnnv///v7//PPv//zz7//28u//2+rt/8Pd + 5f+4093/r8vW/7HL1v+qxNH/p8LP/6zG0v+2ztj/q8bS/7DL1v+30dr/yNzh/+7q6P/56+X/+evk//jp + 4v/KsKP/npCE/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKqof///v7//PXx//z1 + 8f/89fH//PXx//z18f/89fH//PTx//z08P/88+///PLu//zx7f/78Oz/+vDq//ru6P/67uj/+u7o//ru + 6P/67Of/+ezl//nq4//KsKP/oJOI/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALWs + pP///v7//fbz//328//89vP//Pbz//z28//89vP//Pbz//z18v/89fD//PPv//vz7v/78u3/+vHr//vv + 6v/77+r/++/q//vv6v/67uj/+uzm//nr5P/KsKP/opaL/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAALeup/////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////+/fz/pZiO/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALixqf/CvLb/v7my/7+5sv+7ta3/u7Wt/7u1rf+7ta3/t6+n/7Kp + of+topr/p5uS/6GViv+bjYL/lYZ5/5B+cv+QfnL/kH5y/5B+cv+KeWr/hXJj/4BtXv99aFn/p5uR/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqzq//p5+X/6OTh/+jk4f/o5OH/6OTh/+jk + 4f/o5OH/5+Pg/+fh3//l4Nz/5d7b/+Td2f/i29f/4dnU/+DY0v/g2NL/4NjS/+DY0v/f1s//3tPN/9zR + yv/bz8j/qZ6V/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1rf///////vv6//77 + +v/9+/n//fv5//37+f/9+/n//vr5//369//9+Pf//fj1//z38//89fL/+/Pw//vz7v/78+7/+/Pu//vz + 7v/78ez/++/q//ru6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1 + rf///////vv6//77+v/9+/n//fv5//37+f/9+/n//vr5//369//9+Pf//fj1//z38//89fL/+/Pw//vz + 7v/78+7/+/Pu//vz7v/78ez/++/q//ru6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAALy1rf///////vv6//77+v/9+/n//fv5//37+f/9+/n//vr5//369//9+Pf//fj1//z3 + 8//89fL/+/Pw//vz7v/78+7/+/Pu//vz7v/78ez/++/q//ru6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1rf///////vv6//77+v/9+/n//fv5//37+f/9+/n//vr5//36 + 9//9+Pf//fj1//z38//89fL/+/Pw//vz7v/78+7/+/Pu//vz7v/78ez/++/q//ru6P/VtKT/q6CX/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy1rf///////vv6//77+v/9+/n//fv5//37 + +f/9+/n//vr5//369//9+Pf//fj1//z38//89fL/+/Pw//vz7v/78+7/+/Pu//vz7v/78ez/++/q//ru + 6P/VtKT/q6CX/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL22sP////////z7///8 + +////Pr///z6///8+v///Pr//fz6//77+f/++fj//fn2//329P/89fL//PTx//zz7//88+///PPv//zz + 7//78u3/+/Dr//vv6P/VtKT/rqOb/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4 + sv////////38///9/P/+/fz//v38//79/P/+/fz//vz6//77+f/++fj//fn2//349f/89vP//PTx//zz + 8P/88/D//PPw//zz8P/88u3/+/Hr//rv6f/VtKT/r6Wd/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAMC5s////////v79//7+/f///f3///39///9/f///f3//v38//78+v/++vn//fn3//33 + 9v/99/P//PTx//z07//89O///PTv//z07//88u3/+/Dr//rv6f/VtKT/samg/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG6tf////////////////////////////////////////7+///+ + /v///v7///79///+/f/+/f3//v38//79/P/+/fz//v38//79/P/+/Pz//vz7//78+//99vT/s6uj/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK8tv/BvLX/wbu1/8G7tf/AurT/wLq0/8C6 + tP/AurT/wLmz/7+4sv+/uLH/vrew/7y2r/+8ta7/u7St/7qzrP+6s6z/urOs/7qzrP+5sqr/ubCp/7iv + qP+3r6f/tq2l/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////AAD/8AAAD/8AAP/wAAAP/wAA//AAAA// + AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/w + AAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA// + AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/w + AAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA// + AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA//AAAA//AAD/8AAAD/8AAP/w + AAAP/wAA//AAAA//AAD/8AAAD/8AAP/wAAAP/wAA////////AAD///////8AAA== + + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/GlobalSuppressions.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/GlobalSuppressions.cs new file mode 100644 index 0000000000000000000000000000000000000000..04ce0dc9c1287556cfa4af767969df0b21b598f6 GIT binary patch literal 1474 zcmdUvL5mYX6ol(6_#c`%DY#izJb4Q%qK6eBiz2dzaWZB{lT64=g#GjCSFddnH(~EG zFw@ihx?a6{)&2X|7u6bgTCMa|OWo;}l4g7djWIjXYjs2|v{oOpof^IqUGhICX39z( zdj}%DGSf~Qo-M0Jzxw+%N~Kr39k zh@a^elpXo!dJB)A%zg|$9WyhKon;N`duCU$r_xj1=&>H@f2iNJU+5+EUs1tUKThiK z3FSt#xI~E|db6SfOJ-}TAJMYZe6Dk}y(ZS(N~qrv*D}igJ7!z7OE}_=cjU09P zCt^j8F0$mW9rTa`QfQxf)L^(r9ocq_>;dE6f;lpB#pYIrqg+qsmNPppv$orMeP^{{ z-{c^}hksViqE@?P3F>fEgBDz)x9m>A#(NS~y5cc-+0EwIM@(V5V5ei(tk`3v zPG{RN->`1Yn9qvr(~o{#`V~%KFMb7fAeb&)Y$X6 zjyh`cIfv0tYf$pa8!B literal 0 HcmV?d00001 diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Program.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Program.cs new file mode 100644 index 00000000..b3002c7d --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Program.cs @@ -0,0 +1,29 @@ +using System; +using System.Configuration; +using System.Windows.Forms; +using System.Globalization; + +namespace DemoWorkload +{ + static class Program + { + public static int THREAD_COUNT = int.Parse(ConfigurationManager.AppSettings["ThreadCount"], CultureInfo.InvariantCulture); + public static int REQUEST_COUNT = int.Parse(ConfigurationManager.AppSettings["RequestCount"], CultureInfo.InvariantCulture); + public static int ROW_COUNT = int.Parse(ConfigurationManager.AppSettings["RowCount"], CultureInfo.InvariantCulture); + public static int TRANSACTION_COUNT = int.Parse(ConfigurationManager.AppSettings["TransactionCount"], CultureInfo.InvariantCulture); + public static long MAX_TPS = int.Parse(ConfigurationManager.AppSettings["MaxTps"], CultureInfo.InvariantCulture); + public static long MAX_PageRead = int.Parse(ConfigurationManager.AppSettings["MaxPageReads"], CultureInfo.InvariantCulture); + public static string CONN_STR = ConfigurationManager.ConnectionStrings["WideWorldImporters"].ConnectionString; + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FrmMain()); + } + } +} diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/AssemblyInfo.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..b7f7dbf0 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/AssemblyInfo.cs @@ -0,0 +1,39 @@ +using System.Resources; +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("DemoWorkload")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("DemoWorkload")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2016")] +[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("b5dbed29-db11-442b-bd31-d0e6e97feff7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] + diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.Designer.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.Designer.cs new file mode 100644 index 00000000..25ec838b --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.Designer.cs @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DemoWorkload.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", "4.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("DemoWorkload.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; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SQLBackground { + get { + object obj = ResourceManager.GetObject("SQLBackground", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap SQLBackground1 { + get { + object obj = ResourceManager.GetObject("SQLBackground1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + /// + internal static System.Drawing.Icon sqlserver { + get { + object obj = ResourceManager.GetObject("sqlserver", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx new file mode 100644 index 00000000..3e218d5d --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\SQLBackground.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\SQLBackground.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\sqlserver.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs new file mode 100644 index 00000000..413e5601 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DemoWorkload.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.settings b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Resources/SQLBackground.jpg b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Resources/SQLBackground.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3e79d8b32e03d0e088a8757eb9c0e8faeafbc6fc GIT binary patch literal 19025 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 literal 0 HcmV?d00001 diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Resources/sqlserver.ico b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Resources/sqlserver.ico new file mode 100644 index 0000000000000000000000000000000000000000..cac0eae03dce892e71689254d9f500afec12e564 GIT binary patch literal 22486 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 + + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/README.md b/samples/features/automatic-tuning/force-last-good-plan-2/README.md new file mode 100644 index 00000000..149a56d1 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/README.md @@ -0,0 +1,56 @@ +# Auto Tuning Performance Improvement Sample + +This Windows Forms sample application built on .NET Framework 4.6 demonstrates the benefits of using SQL Server Automatic Tuning. You can compare the performance difference between enabling Automatic Tuning or leaveing it disabled, while running a workload that introduces a parameter sniffing regression. + +The demo is run in this [17-minute video explaining In-Memory OLTP](https://www.youtube.com/watch?v=l5l5eophmK4) (demo is at 8:25). + + + +## About this sample + + +* **Latest release:** [in-memory-oltp-perf-demo-v1.0](https://github.com/Microsoft/sql-server-samples/releases/tag/in-memory-oltp-demo-v1.0) +* **Applies to:** SQL Server 2017 (or higher), Azure SQL Database +* **Key features:** Automatic Tuning +* **Workload:** Reporting +* **Programming Language:** T-SQL, C# +* **Authors:** Pedro Lopes + +![Alt text](/media/auto-tuning.png "WideWorldImporters Report") + +## Running this sample +1. Before you can run this sample, you must have the following perquisites: + - SQL Server 2017 (or higher) + - Visual Studio 2015 (or higher) with the latest SSDT installed. + +2. Clone this repository using Git for Windows (http://www.git-scm.com/), or download the zip file. + +3. From Visual Studio, open the **AutoTuningDemo.sln** file from the root directory. + +4. In Visual Studio Build menu, select **Build Solution** (or Press F6). + +5. In the **App.config** file, located in the project root, find the **WideWorldImporters** app setting and edit the connectionString if needed. Currently it is configured to connect to the local default SQL Server Instance using Integrated Security. + +6. Publish the WideWorldImporters Database + - Right click on the WideWorldImporters SQL Server Database Project and Select **Publish** + - Click Edit... to choose your connection string + - Click Publish + - Note: For publishing to Azure SQL you need to change the DB project target platform to **Microsoft Azure SQL Database V12** + +7. Build the app for release and run it. Do not use the debugger, as that will slow down the app. + +8. Start the workload with the **Start** button, and run for a while to show perf profile. Then press the **Regress** button to introduce the problem and observe the throughput going down. + +9. Run for a while to show perf profile of regressed workload, and then press the **Auto Tuning** button and observe the system going back to a previously good plan captured by Query Store, and throughput is restored to initial Baseline status. You can tweak aspects of the workload (e.g., number of threads) through the configuration form accessed using the "Options" menu. No need to recompile or restart the application. + +10. Publish the database project to the same database – the tool will take care of making the necessary changes. + +When deploying to Azure SQL Database, make sure to run the app in an Azure VM in the same region as the database. + +For any feedback on the sample, contact: sqlserversamples@microsoft.com + +## About the code +The code included in this sample is not intended to be a set of best practices on how to build scalable enterprise grade applications. This is beyond the scope of this quick start sample. + +## More information +- [Automatic tuning] (https://docs.microsoft.com/en-us/sql/relational-databases/automatic-tuning/automatic-tuning) diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/Screenshots/1.png b/samples/features/automatic-tuning/force-last-good-plan-2/Screenshots/1.png new file mode 100644 index 0000000000000000000000000000000000000000..c16c42848dfec4e8666ae213dd77d4c53d390df6 GIT binary patch literal 17428 zcmdVBby(C}*DyTlQB)8tK$K7^fgvOvQbl?I>1G^KT85G~842kDhCI^UA?C$SHOR zLDb%m3jvJ_`~#p`~wIiFMxO-c^dpa_e@&L4gw*?5&oU1 zw@EbugH-ksn)WI-CiYH9lriKP(#+bP!`j&XCNBpU2lw5Tn`RgYMEs4+qX(+b^%sUc zGiiJErdKj<7asDY2bwE+>mRO({dqG>vzhHL@{agDvhoK8S_S1D`dNKCTLI)FwI?l3 zuinl!`a{mDjQtzh!6s~M$V<>x{>q@dEoY*`d~l+`g>woP%C1)$h6AnN55ABQ2oy1G zbuwv-c5F>zv37BDYcqJ^Ha!VH>KX)c zU#tNMCJuf~BtX&bGtHixQl9(kR}@7zzNh3^in%!NwYR12A_8>x$5X1IfPIiJ>RP1b zyS3A!&eJql@5+73BiFg1X(O;J#0oQ++lFw}KiIN4I*iHjTpP?e*cct%Z+7+EEUG?u z-8Qt{*W=s?Rz5iqCM%Qh_A%$yd_h~2p9H(5Eran5w_P4Z&qZGWk0lkv_OMj8+r$>f z;jE3=rd;*P@(Q9~nUUQ`PZyzGeW$a1=tHM~v1HG%uzQ34oqTroZlTPnVdwnZMg83b ze=hRvypxbGxA>MDRTUc3ogX{T2^}?xGW$4F_9!`i4-h@9=f-UKR<90nt9@4B6GSDQ zlWy5b2%CB@8x$r~=>d}bDV#(o34&Cl%Nw)hqHUZ%>JJg(WIPAII z#teUrG7k)>Tlbw)qL4mB2zM|mJ(O?Azr)HvJbw0;4pUUvJXdU&kSu?`qw0!}30B{N z&rd*6AV16mkvfuLn$p?%jxtTAKS;dflG&-FY$L5^+$qTY2xQ7T-pK0UUhN5FUu=vM z>0Sd?s@t>L@xbtCd7xgEbg!9h4zWL!KzGy?cQ~PV6m9nS!TWjh34x>clAe66QAc$d z2{IN+Cdl~44BzwJV)n4N1XGaRu^r)4Kwgqary~l9L@SzTeiy&7tIhS zj`43=V3t@T+ncY`&_W_{)iPV{U9Gn5bL6qtq@1$hpd8w7Qn74D#PPh2RS-xjede zbFz(YNX>^uS{ooXJ39Dhs8r`!^<%7(wIA^~%54D?IV<%THs5c#i88stBD5ZIw1(Um z%~0Im70Q{V-khEGk3M>h_S_2T^;}1Ie&J1xC-R(Y^1nW_@HB{I-=$RRx>X1<4RUY3$st>-?2^TugR_i+Nwt3E7>D4%#^yIz3I&*3C z`cM}1Pt8-+`X9)JQ{t@E%788=2GMXfA(Yrz6`30gW2I?r6cN>9-5Y);{Lk82%~=+% z?hS?FM>?{X7tDKr+;1|pUsRL6&i=-w)YRQs?uT25-tIs>Rw_*=dj>bl1e7$c2hxmdtbTW6;?fYlXgC)9ynYaT?obJ)v?zmlScbs7QY}`?w z=kD@r)1=x*K_Cj;C!%nXBL~7c_uu{J|L9l^XKVx=1fGmOVjDf*r*mRYr*PHjL^)+{ zwG^8T(fr_vJ^EGod12O$&=L$!~!#~Zd*zA0n^G;rnnK&2xDE6jI=6&(Y z&aW7Pn58eXeF-FtfC&a--dlNWDbA#wx1cfzgipTO^;(A2#MZ2h$V$uK*43QnJ%$7u z{I+HO{VSKtQIS(zG!;FfEIitdFCWETg;_5D2kh+RLQfiK7B=W!+Dr7;omM?%SFQY( zll-%R#WXh-KALdVvdba?Y~vwVGdd~CJBe|V^}Dq5x>Hkrq>N7JZ?R(-RIbaS%>d;b3rTF^}t z--?v!ieyJi#B-TgeF^*b4E#qX!O$;nYO^^M#jKId%FQnw_YaJ{Rzh)euCYr0pPL4n+Uxv(H=Ezk|KQMnc;2uPkOSYR`#neeAAQ{a`h+18Hs8IG zgboiDTpyFy5C z=O$x(pr!>=cU&h~G-^af#FNQK*uRuehX?=mzhCtJXLbhku-nSxVCjy?!DX9j-2j36 zuUnCyu5N5AT2)stE7YrPj*Kp!!;ePLT|?X6m-@^n z(^m<;e`#8<&Avb9DBZ55Siojv{*59Km&v^Dz?x6jcl248_A(%D8T<9S0awp}kBi|e z8fE*Q&iV6L?Tcg~;VjA2$*ssK~pEeTVRmh8Z^w^2@{ z1#v_HIUe0jGF2CN(l?{C_C>x#2_Qr&58reie)+)MqgXv4Z*LKZ(~hyMDVxrSD=Bwg zsofAa!>c8=eIFYhqUsmI3#axvqP@!nI6eNV+Ji<#tMAE#J#V`dQT}gn+L0E#R*IB3 zFa9D)jW-R8v#v5XK4~+Pdh5N8jy)+GyTB5~;n{&jE>tI}4x?H@$maIg*q&@ zy+tD{E86gBAZ~Wy%S_*T{+N7>3y(%u1M++GA5xUB^Lo^~Zd{oUj4y~a(P-%U+`K5=AV|jm{-k zpm0sSeYIF9Q?$Ry?vE+!e<$&&aNKz*m!Q(sP`U^<^upMgT39Bl(KQdJL5MCQ zF8e4AbHaWc#hWX(`&y}#HaHqu`ndk43b8;6waMr}hE{9psAyy$&T@k5X8VR% zk;%QhY@NhYX1?vl{-=TmvW}0lL(18E;`LV%Tld>ZG`IV2DR1zY?%9rjH=4>@`nwW6P1gzKV+S z^6=zKR64h#%3Eoux<`gW@}xHXTI(5#6tVfwDJhx*!cih{$=-P_>xLvUr_yAnAQ7jc zn(CbqYm>CnbF+GVF9xKOp(du>VX#UH%AMLI4M;cW{w`rq{GND68 zj(>~7Bp||j+kV{diI;roQsSDpaFR~#PNUu8>8O;w_EYx#4=eTb%!#r2-w#6V-%&q7 zO-!X2(a0vh-$?K)XFpFm+j6;uoI1C1PP+ZDB{VT;NQm`Foc zHQBvfz9Ko`v0xLqW7j4O$=Wt4HLsp|t7)sv3VR{gpZdUqwVNBwC)9r*rTIQ&;m+_$ zo`^NEBHPw4^l$jeA}-ybd2xFt73;^0l`l(jWK#i}Xwdqt@eb!2_jun&OO!H7Hd*U% z$d|wOz=TPFKY^H~%of#Hqu=*tKs6cKPU|bkV7J)wVXyU}K>k1q@%wouE$hM02YX=| zFrII#)nQ2O2EW?!T%ps|EHme>w|X-&kKrA~7nG7IviGP>0y>MTf=6gSXI(10dH>On z7+h5dO$1R9kdY=_ybww3gcdp z2C1}lNX-cmyF*LkJX~HFr_2_!4^`WgMmBR~i7GE_P_1ux(-rOhw<{jzN;eupC6&#@6Y@9&iBrKi$5@R z<&0T#GL#v8)MDysqZ)iAZCjpYo(;x%AZEPo%-CF>=*Xf%-0MJEKr}uZ75tfYU?Iyo z*71loV21+hU_2aofo;cVEv=aj9Td z&d4~+$1r#~)kehz|Ce)?m8;XIp$`L&x;C3#$B36MU@mo8Fs*zLkf{8oCu%KWN~5U( z9edw7&eHY`=KksR^m=>sC&}>ImDufvE(y!5(g9t_hR|B-SUg;^U5luPe1hwVBUUbU zf@_^Vx82zG?_}h+1fv0|`A(gT^yF~lzX>GwP}j;HZ*WB)sP<>lJvu$`Kd$i@%$u;g z_UWYjzln;}Fp}ZioagK`yPs>LRu7N@oQ}I$mY+!eU6A*u_R9WllPSF#Rzljne@Oa7 z^nX~TfX%tz?B*G9NWnX|L;gU=!wVUTDa*znu`gW_ zrb|{1N&JJRQT0op<)32`)T#5C$pQf-U*zMBE-&yX+&Ha)wU2`PG!BL1v*oAp&DfZ< zvkCf4diq@>1;UZ<+HS%`=cErVpeE0a~83WuVXR$`k7=2R<$%TCuGr8Vq*Ed+jHlIw|UNjYVrzJ@7I&Skitj z02Lx>69rV#k2{M(_2N5U`Cl!y44oopEA7kQTTi)QYG!ZCHlnuP#8K4YUTRNwr~w@a zFppm~vDe|z9xF#pTRc(82@+#ruSO1cg1&c_ABeqZS_^p(3-Iz8z;Mil)+1u~wY)w#%#BsY zB(y2don9D@G~{N>WZDrAmT@ih6zk9qOQ-4-6v=sYhNTEjN}urrx7vBP*;y2bF|2Ma zy6Q;$?QV#N*>&%eUJ4h>K1{?ueJT7Qdkf3tGp~y;;g!96*(QF_b;ZNIK2aa9z|n&$ zN-7#ErT9mTBpvcS7EuaRrXS1mQ43+{{n5?g=*Ucicd1GSOaE%e4qLW92n z`J=0U+@?bO-&MlhgIP}ZDbM#QcwobzM4)9kdLI=*s+(bIE!A1lmMJ@?tg`YD814tE zF?Si7rudtZ1e-p^|A{)RhD)S2OBw>?fh-Ee<<$O8Z&(=Z$Y4418Yo8%8jzJRhgo9`E?du4W$FavQ%xYw#cut(ot)et zndr6}7BJz8IO$x=DKg=r!u92q@wR4RaB*-ArD?NReH7e;WPRWGb3pa1N>WDz{uJbe zH$XMs8dD-qI#{xFN$U>?gvpD#C%~e2gckYh`3%{cf>d$Y) z;#Lu~CbJWb;fbKp5#e=0pUju@9W3At`%Uz4=~^+o<%z`{IrB@2S`7^V4->~DZ6{bO zIZN~NFY5`d1yWoX1~i?ABlgF7jjOV*FzYukaizT`iVLLxr@8JGjmy{g6iuz3=s+q& zP?|7*I#2znL2aFK>-wC;%_UE`Hc&IOYm%g$-fZ5wGk)YX>qarxdbrV8Uu3$;QG5;t z!zQzdN)OqK1smQuVv|`8+ViWp@|fRb*k))S<2#Eay0R6`==&nMlHf zc1V&SEw`Jt5@K(8ZqYGkS~tUd`paw&Cx1n^&Os;mctz~$ft`z zIM#cVICv2)A90m1Jbf)E`=kAgL($;qPD~VcKxzL-RaRNq@D-0K`a)rvvydx~NZC}@ z1>R|U)<0?oI#jk)W!I5S%=9MhSexFI!rZpgXJ?6MpUX~J$W_%R))oWjL663)=#%)G zyP8g4FzX@!GIn=sXfWJ@W6pc#UtJ4w%koa&4KM0aZ{2$-X8_^io5+1AL5Yhu-!XkB zTLo0W58;FCy9FnQS&rc4WmNb$Ez&L~YcuI!$81<3pSl8Z=gAQyo!yH)MvZ`~fdLnZ z$l}R2Tx!CnL~W*$jg&FrMHRPxXc9f-(;tDjeOXQ~tht>9cgd9!6Fhw9VzRl_LRn@V zb)NvEJO*)@?Hn?lVDE*eAaDo_Z(}x-$#Z`yeI=`Lm6MEzuUSJwc>POnbS3sSx&`B| z!krc`XRz}nEC>8C8C3M#%`u{daJfxz1vI71$n#b5%~Wbmc0t3%yNX*!;6b>lCRf{L zSDDOxSxx1Ut^4`xlz7M!cmpy!@)k7Rq=bpiZ8?JxF=lQ)S|yd}AU@qzJvGmo2DGW; zte)NB6h^O=F)#8KKGaSI-yde$0C~dOfTWUt7?CX*9to6mq<=^UxB#QqOgs-tY+VmIVSkD3STUt(f*O)3}pO1=@s^e5ovPa`r&%2u;g@+NWMOKYj@D2U+BQcO3{&gEYBS*TCt-8bJ zX|dXqRifJHXMA*6A8l2M0rz<~1Qx?c$|fmsss!(n{9SbiLHs^L{w&YNDY3^CIXiZ0 z5U!IGxw9G9v&;v*4Opco2Y6F~-lgC1!5~OfBuJw|R-=N~I5rF?gRenIXkc(V$&dc5 zS8A-RKygC%`mu?n00g3G=?c<9`f<` zLx$6wR8UpFt%wPGlqZOwRZp3}<2c*Z+&U1?z0m$aa#Z|o^%w!$b%3p|I9pCCFOskd zel^4MF1#BUUvpYKG2h|-_g6jyHGew6)j~Bm^>|Qh)6g?mr>{!&>Ru6I&(0Jn1EahC z$*-)etY5}fh6Li}OPvfmHMkAJL)IxGS|^u}^)91(=I+?#w!`^w(apR%guJPxRb}u| z^CYukRo9{o;P7Q!BND{$bP{qc5xYU?AdE@Q&v1q=m?bf?F|?MduTDe2dI+OZi&wo3 zI<{L)=tSY}c`1*?7KHkpoku4Tb7T;n>#_vb=C9RQ=wl+okYN!F%WN5yeHcV!epI^n zwtLfYBj=_0=HXUcICh{(jKXDgLau`p@}&u65kC6rV?NUjNIqZc9xQ~@E3N71!WpU6 zG=E8_RJQ7<@#SwB9aq89$JuD(8W{ZGNU-EKPXjVS;sua-T0-zR+r|3&GoF=&t(1ww zo=1#k7a&iKU%=p_VZ7mg{YW*`*P0^CSyU)Y?WquHchwZgc~aMUiCxlwE{BLiFS>tH zDanLeO2z==26nXFLjsAY{ese5FRar2qaY>0UVVD(8jK`M?U1F7He;V{%%9f1mA4$Y zwEWaQwAj#BHYHZE+kd{gu5|(8L&A!l$yB>mY|mQIla-nIJ;O+}K?(eALV3OMA(}MMYU{M~X?Uw|oB$69j$*=(|_g3g$XuQng)o z8w3<`cO&kdTqETXsTytI0Mu5$9(iBke8x@zkqyN0n(9&^f^gb<%V?W>F;tddamQh9 zBFhqAIt9V~x)~`~UL>12b^jc&M?bc4w#5rYQ|m^b)V70U_He<;6#?&xKC+mlPtb?V zCOJ#f{n|4tQ#VLOLR>-7OLrsyE=U&!Zz{$1?ItIt$A@~(_2`&qfxOVI0U0ThO5jEo zOoR&MEXFRDYq4R|)OZuAv%)L?W7NS>Ff zF)3v+YuY314f(nEBPwIS20It-c9i?fZ zpm;`qhx3fx^*)SSK`#{WX;SR=6WR_9Mv&P4SVzx6z-n*UH+lH&O=YEPDZd$3(FX4U zgmp-NvXSmqpz|?}a$X^q!U+c|ySt1M4OBYp&fFSyQh1x&ZzG%D#fMl(_(G?NwH0Gr`pp8f7Gh!qWNB|&sJ2S|p{|}CG09B^S-yofYt-Z( z8?$K9k)}mmf7~zj{YNr8$D2Dh?dj30)ln85aF(Ijm=^L?oU}9eu3=5m?YGhF<~IyT z%R$}&+jSZhAw-fa6_DO8Ld|rr)#>)*b;Cv&=t+V&3XSmBYyr#q`kiqzb<53%4T%M; z2#~DAJqs)3*rN~GJ4zW0us z4x723Yt##Nv$vj-q&Wv!rbnA?=HBhOjV=mwW7*Gbax?1C`uGAYETrquAa`JZd#a2u3!;q1^P?WWLL zTK+n1W`&BIroIDSSlqf46Xib8<|+D+)`y)T5J=94iQE`NIl20YJ?~(%n9oKZVly!{ z;NG@XIlV_Pd z#)w;k-*!13lBvsToP@Y}p+unKx5EXZ)v%VNIy&VXfPk{SHDBNCrGpVM`!Hy-$2R(? zLF=|2-~iPVQk9p@4B3{eP5Lx!k4VMco0}=4trKPE=J!UNMzro6FVZIUrNs-_Haj!; zQLF1uL(56UlpUJU0K36`0M?p-+S0MGp5 zK#%tOL(R=s8k^@MLU2BCel)>{6iA3TEmkb7-|CJ}6aaQ`su9_a^jltu+u0ErqfkWwBgf?Q0Z{qrbbnL$NGa|%St?6NLbj_oQs$S@O_!vu)m z|7AF_sIp+qE1Jt(Q>!$1PCVUK#s)|pcw4~w!UkjuweYr4Hd$KTZxnajM)MU^xZUbS ztB(JEHY=OnU6t=#4ak_#-w3q;)f^1j^>v-LJNsBJ$H%MFp2(Gq9!VI${I+xs6oueS z#x_f_ovuIzq^FO)Ibf+p%)OOY(Ol_6WgB7tbt(uqI|!=K|2j+~vKtK`=I1N&3JVvG znJa$m9RYLev@I-pC*LSdb|m%25Qwn9^HZLhzSQcYJw0p+OG*o}f>(cW&tZF64Te;` zg?3Qu_;BpIr~If5vp{wa1cU-%{ucmGA$75xrP&62wb!{TdZEuB%K70qc>`!Ca(5e$ zddKKYxsEOUN^vH2a+ubKOxmJT*!+9+^~VGR(YHa_V;ls*(^UetxCaO_dNg0gCxZr(IunEIg2(6tQ2{H?D=Qm6W;5ZSuiKFIV^THd`cx|H#!X{@SP+oh z+1NCWxlTB+X#))EVg#+anXGQa;Scho2)8h1b|^t72S7svoVN7nQ0|{|eV;>831YfG z%E2b7lVugIsR6sVrzcg!HuLzW?tuseSU!3b(dqEF{7CMhjjiQOOq$@r=!J#h5Iaeh zl+n~4Mw;`$Wo&Nb-f{O9yaiYKK_Y#&PRU5{zbw%vjiQ3VTd8VQIbjEqMI19Kzi{;~ zE(%OUEBR6PAZ6lyDQ!tHD5V4KB=bP7gm<9n&QDbQC3c;OTy0g(w5p~J+V13k#wB&b zIVw4({R{{t+xm^}vfrn4baEPC2@$i5$7H($vVYj^*ll$8%GcM3$toia#(y2QC8$HS zQkLBAFa4=Wy6hFr<3l5MSkY;tIu|VZOSM5{oYmARU;M9lCvpWFkThZIEI&2#`P@8E z3qVU>QxitFSBd@i?Td;X^#GIp72+Mx<@%SW0)+l6<7Q|50WqLPd$#-DT(2YLr#{nX z6ZE}(|#wn7Awb(mzVq!!AF9_ge80eEi~9M zRMsy994Jjjlx7Lz@IQPUs6M(2GrbD314A>j!5M*c2bq7iDhC37LEU5ZuS4Z)m>jpY z$|ZMI6E7Rrz2Z*8F6i-=RNAD2u;N0OsbYM^-r@pJ2CJsTd@ZA@+_7nWlxr;&YCoNb zUK(=NnIf_Vo~gV%l}fIR9P*VXf;x;ToA=p_aXo$uH`k~w17EnGOfZJUGKV>K*n)q= zSJc8l6t~zj;H-_DDESPJY4UOt!TTV6?2hOIZX@VA_BCo ze&IV4jf>P z^`w+bg2<3#NeQ?fHemR|y|{e4w++Y*y9o26zsL^L@Kt{YBDF?DCe0Z)rxXBC`Z zXmc}BoMHzaBbX=NgmXq6@}e!!?poVSN&3RVtiEzkdTjx)&3dOP} zrSY>)Hn`>BovfaV--2Zh23rG7CxM~+AK*)6wEU=xK~Ri#Oasc3c%2TU=m6M$X5)Dq zIUSa_U8;LzL`18LZta7#%^h9+s*7=#x*r^~8Mrz4{^cU&Yp_gxQXWuj5@M{D>V0EQ z%qRHxY5+V|a0Ar^eP{ELi?Xt-pU@(N`UK(1*pJEng6hLJAX&*8%_spZ9D}Ix0gW^5 zFp$4HA69PZg!J%O#imS-si_M5rkRWBZpxyi*G$s)(>V7!-%iqDg`a(0Ni?o5VM-86 zL|xzT5o@y5)??niF6uKIw9sb=GbjEEcU(gJ<$HK z<#3HwC1MmI{^?2<1wHniVODh02AamMDJz6Nvk!Fda%eh52~)TF=$1RBu?hc_uchvusAIafdkY)x;G+ zg(4zXr=O0dI%E$j6@>o|e+S(^>Sv?TsG%{zBj3LDezKY*el@Dm($Oz!C0O&Y?fIa9 zOjeF~LK(}9)=$@MtI=Md)yS9PM($p5x7u5vkX&S6|EMRivfD4bW>r96EsdVnqNG^g zR$YlFY(^9Ef|Ae)^0y5aK$Gi{_@*x_Do^FGr!}FA<9*?LHu6)89_qT6_g2G?B$H7- zmy!A6D9veOK?=xM3DQoG`wUICAa!&Qc9B|Y+k97cQmRxZ#kjGa(xa*^Iw3n5){Nmb z9{crTM=!~A1F_Nj?^RVA5hru2J6_Eu!s|~$Dt@Fx<)qZlbrl8;JlQ>f{*--o4d6Tq zlCja{QJd~bbh2Aw%mY~$qXqfWX<;>)Tza&FezM^Si2jd!N3Xd#wpk)0Lr8(AT=jCW zqn1KJsxTcEy5sxa!CGE0DxwK-S?*zkQ`WZ&{>ea4vtPSe?q#HEHLVLnJ`p-e^z|Q` zqj1su3eJWtz)DiEEYsG8?etp76_nGKJ7`>RKBr6nEogPm9l<9m$?hIvU4F)bbiX)I zWHU;S8pvzn3~IB9*Dc>n?!^R=UoIRhT)WSw4IolwY{RF0% zjzP?Er&$|M`V>S*=E0{={bXR(M4{m%*-TXW5sS1M0AzzNc^;)CrUi8NrEOJhMHkd$ zgA8YrF)z5j3r@HTI7nemQ;>B5rvQZ~kmEYW%_>dlFwjFaHYfXzbK-E-#UkM7S_j-F z<0iRfX@PTX4C>lBH8RV^T5!F)5PtLz?r0m|XFV=#J6>6jY+a6P%cpM2BW)+{Fp{CW zGbe&IV>q9xO-qx`Rp0|I|76>`@pLX|Y6@B$w>Jr0ya5J6#n~ESnp_cHBj{{CqI)@G z?SV8oQ4C|(ys<~ zEzsT7+(dXPiXtrBP9_s4c6VKGRBba));yb0OyQ@^+X0xILc{Z&lB z9YJHnr?7+p$1$wtvu^{DmwyhG2`w|k0eab@eKt#fyV)+UkO=w_jMn$YwIM^{f6Y%h-9#YhGsTQ46^Cqm)FjqD4T9Uq{%Y8h8O9wE}|CfK6C; zXiohsvD`t!Y~t^_Bdj-VI?l%K*851y#w9@TkLdQ@!g=TO!4?8V(UTeAvCh_d*@u)zGEGxz^UR6_G6*}`X#_jGdE{QHd)AUR|zoSK)!#^r-$a#QUX3(wz z1sT(0QytT^rJY#V;aeMXH^yqipBdwoJLI1SKx>Q8437TSJs)7YTt{&7GU*TgA(BV} zGqEq)3ngo0P z1TcZGJoD63!k0~^b1@il^3v6jwb-o&a9@4x9^X)ut>>RiPKe8dYyDGg$dn971yC|LMm=g?J?0=fFnA_S4mM4Yb>;AV5Cpb^!Rt`5u-AI=( zFkD+*jMZ|0Y3JGY<2ha&`1pEmNK)88pJfEzRPWyD5D{C*{j+6l$nq%jByi*Ive3AX z=6BlA&4EGhRZ>U0JRm%n>!Zf7h!$Mr_*C^#1+x zhwqD5Huz%H#wglv&dazxe1EXm+!rM`Z>wXaiPp^{(&=82vT)=nALJUW(Kt_^ZoIiX zWEj}HvXp+V2t#;192KI{un)(Z)tU0~jLPBfFUTfCAetXx!gOKs=UMOQ7O%a}^x;-? zYvaDIvQS}MG&CfCgHcC^r*uVR_?coq1|}pS(b?MEcvnhFxspgkV{e;>GisQrfQcvE zn%3%Sn;yrInmge^ErAC_<}^XNWO533_eQvuNTzA7jMlF6`MW-}cs}A`F2;Qt^67KS zILuvq^w07NtY6|(M<5Mfe!&hr2r9#rdG}uF7=x?qN10C^weuMnr-tC!y5}m>4{7K7 zgU7?w1)qF3V$LXQFGUQyPJGb7Kdmi4p zy@iR6j4BWabZ8%?+0;bYlUPtkQn~={Ko_Sj;DBKcV+-5eNGOqjJFIKf!l$V!wJ1VAM zH{B*WJOVR-fuDfnKGU1#q7r4)dS}nudM03X0?D3tX7YXW>erGmckH`zx;=6^{p^u+ zyuBl)TKeawMI!m(XE={61aSA>m{4zrR-(pXMr+ zIOq4y+4B_SA~)(%oxPp`^det%tR-mtgx_N;a_oG!G`;)xe2o?4z^AV_-% zg+4v7nEUalW$y;$Mc|}e1W&w!=-7adqi8Q>Q5q$;60>vde(5lQ)SDEEXCr zbJumCuk2p6&d(1laP>D8lpYhBZ#K=fA!yrL>bx81(Rd7Vsp#2(ec9NUOO;Hl`{Jg3 zbu|6V{wM8)FSGVVl_8qPI3Xfem9AVsMMPfa9+Sx6Xlf~b&cnwqxh9h_^vVbvDuq}Q zG0hd+k7r9CX53TI5#pSlXOSzC*GLbWqg;~<7U4C|OzWPyXzU#sOfOfmn(G*(Ft8_| zoN%uDE!Lfa6FS5oQfMM}X-g`HGCL>3Sg9=~tZXqY!!f z9yL%hEOoMEM({Ka|0#^_TnMAmxc$0c^3aL)0bLHFnJjq7(}wrGCYm~CjhQ3-VrB~+ z179kli*9mK)$w)bH&avO;CZ<_Bt^}wpbIkKvvfgoY;+0Vq>g5uH&&TQXOG$7=w`=3 z&HK#FMdMFKYGuZ|W#(8dBhB&^-(q-cqshp3Al^nlb@@fPS=&zOy7t1n$acdIJi+z2 z#K-Ji!Fb6Tzgn$W{6MpN=T11=B(1N2cC9vlEAQo%Z!WcL-Ci@a3+%x&6vXZp!=2Km z&{ou_$Nbyfuk2I8T`rgS)~c)vk!2sFi-?LU*E;!^P(X#$h0rr6I{fS#zncmuXf*p# zx$*eYH}+^BPLh~9b6aq3$xkD)qX#&wIqETp;HO_Svl^P_8%8)3vqF1%L_6R1*!#Y% zD#D7F+~|v*tUBl;?iP(vfrr=RXzZ7jSvmN$F5E1Cd8{F4?KnHI*)h0aK9@jV6?3H_ zZB9JN>y>L}MVDM;xNlPG?n&$8rA-zlN6h$w`nfwUqfIqb1*8NtgHV9&9jK z`n)#af`zUZLlK&V>Wo!^9`-^E?T`bh~qxtY?XS284MO6-!W z;9%WBY5m&FUj0_t%H^5Fd5*OX%Ek?|^;jav&6}HNjgw=jd!)N>djHj4n#{{cigphF zVd2WV=3SZ|iBks`Aom0C2lc^bsB1$)@5V1yww-`{4{6jfQC(GN3&y>8Hd6u~s<;;#@4W;g5E%)DN7)aby!t-?%Q5kh literal 0 HcmV?d00001 diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/WideWorldImporters.sqlproj b/samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/WideWorldImporters.sqlproj new file mode 100644 index 00000000..9d0430bb --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/WideWorldImporters.sqlproj @@ -0,0 +1,76 @@ + + + + + Debug + AnyCPU + WideWorldImporters + 2.0 + 4.1 + {38641248-77ea-479b-b496-3eda463acead} + Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider + Database + + + WideWorldImporters + WideWorldImporters + 1033,CI + BySchemaAndSchemaType + True + v4.5 + CS + Properties + False + True + True + SQL_Latin1_General_CP1_CI_AS + PRIMARY + True + False + + + bin\Release\ + $(MSBuildProjectName).sql + False + pdbonly + true + false + true + prompt + 4 + + + bin\Debug\ + $(MSBuildProjectName).sql + false + true + full + false + true + true + prompt + 4 + + + 11.0 + + True + 11.0 + + + + + + + + + + + + + + dbo\WideWorldImporters.dacpac + False + + + \ No newline at end of file diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/dbo/Stored Procedures/report.sql b/samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/dbo/Stored Procedures/report.sql new file mode 100644 index 00000000..7c1b47d5 --- /dev/null +++ b/samples/features/automatic-tuning/force-last-good-plan-2/WideWorldImporters/dbo/Stored Procedures/report.sql @@ -0,0 +1,9 @@ +CREATE PROCEDURE [dbo].[report] + @packagetypeid int +AS +BEGIN + SELECT AVG([UnitPrice] * [Quantity] - [TaxRate]) + FROM [Sales].[OrderLines] + WHERE [PackageTypeID] = @packagetypeid; +END; +GO \ No newline at end of file