diff --git a/BLL/AppOperation.cs b/BLL/AppOperation.cs
new file mode 100644
index 0000000000000000000000000000000000000000..efb407ec684d5558a41ea73da4fbcbdd2a78fa3f
--- /dev/null
+++ b/BLL/AppOperation.cs
@@ -0,0 +1,60 @@
+using BLL.utils;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BLL
+{
+ ///
+ /// App操作类
+ ///
+ public class AppOperation
+ {
+ ///
+ /// 安装App到指定设备
+ ///
+ /// 设备ID
+ /// apk绝对路径
+ /// true false
+ public bool InstallApp(string deviceId,string fileName)
+ {
+ string command = ".\\adb\\adb.exe -s " + deviceId +" install " + fileName;
+ string str = Utils.Execute(command,0);
+ if (Utils.CheckDOSReturn(str) && str.IndexOf("Success") != -1)
+ {
+ return true;
+ }
+ else
+ {
+ logger.Info(str.GetType(), "安装App失败,详细信息见log文件,str" + str + "FileName:" + fileName + "deviceId:" + deviceId);
+ Debug.WriteLine("安装App失败,详细信息见log文件,str" + str + "FileName:" + fileName + "deviceId:" + deviceId);
+ return false;
+ }
+ }
+
+ ///
+ /// 根据设备ID和包名清除app缓存和数据
+ ///
+ /// 设备ID
+ /// 包名
+ /// true false
+ public bool ClearAppCaches(string deviceId, string packageName)
+ {
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell pm clear " + packageName;
+ string str = Utils.Execute(command, 100);
+ if (Utils.CheckDOSReturn(str) && str.IndexOf("Success") != -1)
+ {
+ return true;
+ }
+ else
+ {
+ logger.Info(str.GetType(), "清除App缓存失败,详细信息见log文件,str" + str + "PackageName:" + packageName + "deviceId:" + deviceId);
+ Debug.WriteLine("清除App缓存失败,详细信息见log文件,str" + str + "PackageName:" + packageName + "deviceId:" + deviceId);
+ return false;
+ }
+ }
+ }
+}
diff --git a/BLL/BLL.csproj b/BLL/BLL.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..589f221cd0839162318db0eb80b08a9aac2309d3
--- /dev/null
+++ b/BLL/BLL.csproj
@@ -0,0 +1,116 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}
+ Library
+ Properties
+ BLL
+ BLL
+ v4.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ bin\Debug\BLL.XML
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE
+ bin\Debug\BLL.XML
+ full
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+
+ ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll
+ True
+
+
+ ..\packages\PacketDotNet.0.13.0\lib\net\PacketDotNet.dll
+ True
+
+
+ ..\packages\SharpPcap.4.2.0\lib\net\SharpPcap.dll
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {7a7862f6-70c3-4b4c-b7a0-accc2c0ea311}
+ DAL
+
+
+ {44385e63-c4a7-49c7-99ac-e38c14341f03}
+ Model
+
+
+
+
+ Designer
+ Always
+
+
+
+
+
+ PreserveNewest
+
+
+
+
+
\ No newline at end of file
diff --git a/BLL/Config/log4net.config b/BLL/Config/log4net.config
new file mode 100644
index 0000000000000000000000000000000000000000..569682bb0a70c309788c2997afa18ee21f1e52c9
--- /dev/null
+++ b/BLL/Config/log4net.config
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BLL/DataBaseBLL.cs b/BLL/DataBaseBLL.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b0074435072792a1059a8cccaff3b1507fa872c5
--- /dev/null
+++ b/BLL/DataBaseBLL.cs
@@ -0,0 +1,143 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using DAL;
+using BLL.utils;
+using Model;
+using System.Data;
+using System.Diagnostics;
+
+namespace BLL
+{
+ ///
+ /// 数据库业务操作类
+ ///
+ public static class DataBaseBLL
+ {
+
+ private static SQLiteHelper sqlite;
+ ///
+ /// 初始化数据库
+ ///
+ ///
+ ///
+ public static void DataBaseInit(string settingDatabasePath, string settingDatabaseName)
+ {
+
+ String m_DataSource = "";
+ if (settingDatabasePath.Length == 0)
+ {
+ m_DataSource = System.AppDomain.CurrentDomain.BaseDirectory + settingDatabaseName + ".db";
+ }
+ else
+ {
+ m_DataSource = settingDatabasePath + "\\" + settingDatabaseName + ".db";
+ }
+ try
+ {
+ sqlite = new SQLiteHelper(m_DataSource);
+ }
+ catch (Exception dbe)
+ {
+ logger.Info(dbe.GetType(), " 初始化数据库出错:m_DataSource=" + m_DataSource + "ErrorMessage:" ,dbe);
+ throw dbe;
+ }
+ }
+
+ ///
+ ///写入数据到数据库中并写入日志
+ ///
+ ///
+ ///
+ public static void SaveData(List memoryInfoList,bool settingIsSave)
+ {
+ if (settingIsSave)
+ {
+ try
+ {
+ sqlite.BatchInsert("process_info", memoryInfoList);
+ }
+ catch (Exception savee)
+ {
+ throw savee;
+ }
+ }
+ }
+
+ ///
+ /// 通过Tag获取对应表中进程信息
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static DataSet GetProcessInfoByTag(string fileName, string tableName, string Tag)
+ {
+ SQLiteHelper opendb;
+ opendb = new SQLiteHelper(fileName);
+ String parameter = ";";
+ if (!Tag.Equals("All"))
+ {
+ parameter = " where tag = '" + Tag + "';";
+ }
+ DataSet ds = opendb.ExecuteDataset("select * from "+ tableName + parameter);
+ return ds;
+ }
+
+ ///
+ /// 获取表中Tag
+ ///
+ ///
+ ///
+ /// string[] tag
+ public static string[] getTag(string fileName, string tableName)
+ {
+ SQLiteHelper opendb;
+ opendb = new SQLiteHelper(fileName);
+ DataSet ds = opendb.ExecuteDataset("select tag from " + tableName + " group by tag;");
+ //logger.Info(this.GetType(), "getTag------ds数据:" + ds.Tables.Count + ":" + ds.Tables[0].Rows.Count);
+ if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
+ {
+ string[] tagList = new string[ds.Tables[0].Rows.Count];
+ for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
+ {
+ tagList[i] = ds.Tables[0].Rows[i].ItemArray[0].ToString();
+ }
+ return tagList;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ ///
+ /// 获取数据库中所有的表名
+ ///
+ ///
+ /// tablesList
+ public static string[] getTables(string fileName)
+ {
+ SQLiteHelper opendb;
+ opendb = new SQLiteHelper(fileName);
+ DataSet ds = opendb.ExecuteDataset("select name from sqlite_master where type='table' and name!='sqlite_sequence' order by name;");
+ if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
+ {
+ string[] tables = new string[ds.Tables[0].Rows.Count];
+ for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
+ {
+ Debug.WriteLine(ds.Tables[0].Rows[i].ItemArray[0]);
+ tables[i] = ds.Tables[0].Rows[i].ItemArray[0].ToString();
+ }
+ return tables;
+ }
+ else
+ {
+ Debug.WriteLine("ds.Tables.Count=" + ds.Tables.Count);
+ return null;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/BLL/GetAppInfo.cs b/BLL/GetAppInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1514807a86616b05c6797f4acaca632edfec3d4c
--- /dev/null
+++ b/BLL/GetAppInfo.cs
@@ -0,0 +1,364 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.IO;
+using Model;
+using BLL.utils;
+
+namespace BLL
+{
+ ///
+ /// 获取App信息类
+ ///
+ public class GetAppInfo
+ {
+ ///
+ /// 通过设备ID获取APP进程信息
+ ///
+ /// 设备ID
+ /// app进程ID
+ /// app包名
+ /// 系统sdk版本号
+ /// 获取流量信息标识
+ /// 返回memoryinfo对象
+ public static ProcessInfo GetInfo(string deviceId,int pid, string packageName, int sdkVersion ,bool getTcpFlag)
+ {
+ ProcessInfo processInfo = new ProcessInfo();
+ string[] cp = GetCpuAndPid(deviceId,pid, packageName, sdkVersion);
+ if (cp[0].Equals("-1"))
+ {
+ logger.Info(cp.GetType(), "获取app进程信息Error, cpu and pid is null!");
+ return null;
+ }
+ Debug.WriteLine("cp0PID=" + cp[0] + "\ncp1CPU=" + cp[1] + "\ncp2PackageName=" + cp[2]);
+ //避免当用户输入不完整的包名时获取不到信息
+ if (!cp[2].Equals("-1"))
+ {
+ packageName = cp[2];
+ }
+ processInfo.PrivateSS = GetRss(deviceId,pid, packageName);
+ if (cp != null && processInfo.PrivateSS != 0)
+ {
+ processInfo.ProcessName = cp[2];
+ processInfo.Pid = int.Parse(cp[0]);
+ processInfo.Cpu = float.Parse(cp[1]);
+ double[] tcpFlow = GetTcpFlow(deviceId,cp[2].Replace("\r","").Replace("\n",""),sdkVersion,getTcpFlag);
+ if (tcpFlow != null)
+ {
+ processInfo.TcpSndFlow = tcpFlow[0];
+ processInfo.TcpRcvFlow = tcpFlow[1];
+ }
+ else
+ {
+ processInfo.TcpSndFlow = -1;
+ processInfo.TcpRcvFlow = -1;
+ }
+ }
+ else
+ {
+ logger.Info(processInfo.GetType(), "获取app进程信息Error,processInfo is null!");
+ processInfo = null;
+ }
+ return processInfo;
+ }
+
+ ///
+ /// 通过设备ID获取手机进程信息
+ ///
+ /// 设备ID
+ /// 二维字符串列表
+ public static List> GetPs(string deviceId)
+ {
+ Debug.WriteLine("当前工作目录:" + System.IO.Directory.GetCurrentDirectory());
+ string str = Utils.Execute(".\\adb\\adb.exe -s " + deviceId + " shell top -n 1 |findstr com", 100);
+ //Debug.WriteLine("GetPs:" + str + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+ logger.Info(str.GetType(), "获取手机进程信息");
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return null;
+ }
+ if (str.Length > 50)
+ {
+ List> psList = new List> { };
+ using (StringReader sr = new StringReader(str))
+ {
+ string line;
+ try
+ {
+ while (sr.Peek() > -1)
+ {
+ line = sr.ReadLine().Trim();
+ //Debug.WriteLine("Ps----line行:"+line);
+ string[] sArray = line.Split(' ');
+ List sList = new List { };
+ foreach (string s in sArray)
+ {
+ //Debug.WriteLine(s);
+ if (!string.IsNullOrEmpty(s))
+ {
+ sList.Add(s);
+ }
+ }
+ psList.Add(sList);
+ }
+ sr.Close();
+ return psList;
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine("获取手机进程进行Error,str = " + str + ",\nErrorMessage:" + e.Data + e.Message);
+ logger.Info(e.GetType(), "获取手机进程进行Error,str = "+str+",\nErrorMessage:" , e);
+ sr.Close();
+ return null;
+ }
+ }
+ }
+ else
+ {
+ Debug.WriteLine("str.len小于50,str = 【" + str + "】");
+ return null;
+ }
+ }
+
+
+ ///
+ /// 通过设备ID获取APP内存信息
+ ///
+ /// 设备id
+ /// app进程id
+ /// app包名
+ /// 返回内存信息KB;pss
+ public static double GetRss(string deviceId, int pid, string packageName)
+ {
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell dumpsys meminfo ";
+ if (packageName != null)
+ {
+ command += packageName;
+ }
+ else
+ {
+ command += pid;
+ }
+ string str = Utils.Execute(command, 10);
+ //Debug.WriteLine("GetRss:"+str + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"PID:"+pid);
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return 0;
+ }
+ if (str.Length > 100)
+ {
+ using (StringReader sr = new StringReader(str))
+ {
+ string line;
+ //int lineIndex = 0;
+ try
+ {
+ do
+ {
+ line = sr.ReadLine().Trim();
+ //Debug.WriteLine("行{0}:{1}", ++lineIndex, line);
+ } while (!line.StartsWith("TOTAL"));
+ string[] sArray = line.Split(' ');
+ List sList = new List { };
+ foreach (string s in sArray)
+ {
+ //Debug.WriteLine(s);
+ if (!string.IsNullOrEmpty(s))
+ {
+ sList.Add(s);
+ }
+ }
+ sr.Close();
+ return Math.Round(double.Parse(sList[1]) / 1024 , 2);
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine("获取App内存信息Error,\nErrorMessage:" + e.Data + e.Message);
+ logger.Info(e.GetType(), "获取App内存信息Error,\nErrorMessage:" , e);
+ sr.Close();
+ return 0;
+ }
+ }
+ //int.Parse();
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ ///
+ /// 获取APP packagename和cpu及pid信息
+ ///
+ /// 设备ID
+ /// app进程id
+ /// app包名
+ /// 设备sdk版本
+ /// 返回cpu/pid/packagename string数组 0:pid 1:cpu
+ public static string[] GetCpuAndPid(string deviceId, int pid, string packageName, int sdkVersion)
+ {
+ //cp[0]:pid,cp[1]:cpu,cp[2]:packagename
+ string[] cp = new string[]{"-1","-1","-1"};
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell top -n 1 |findstr ";
+ if (packageName != null && packageName.Length > 0)
+ {
+ command += packageName;
+ }
+ else
+ {
+ command += pid;
+ }
+ string str = Utils.Execute(command, 10);
+ //string str = "[?25h[0m[1000;1H[K[?25h[0m[1000;1H[K0.0 1.7 0:00.11 com.coloros.spe+";
+ //Debug.WriteLine("GetCPUandPID:"+str + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return cp;
+ }
+ using (StringReader sr = new StringReader(str))
+ {
+ //当返回的数据大于1行时直接返回
+ if (sr.ReadToEnd().Split('\n').Count() > 1)
+ {
+ return cp;
+ }
+ string[] sArray = sr.ReadLine().Split(' ');// 一定是单引
+ List sList = new List { };
+ foreach (string s in sArray)
+ {
+ if (!string.IsNullOrEmpty(s))
+ {
+ //Debug.WriteLine(s);
+ sList.Add(s);
+ }
+ }
+ if (sdkVersion > 0 && sdkVersion < 24)
+ {
+ if (sList.Count == 9 | sList.Count == 10)
+ {
+ cp[0] = sList[0];
+ cp[1] = sList[2].Remove(sList[2].Length - 1, 1);
+ cp[2] = sList[sList.Count - 1];
+ }
+ else
+ {
+ Debug.WriteLine("adb 返回数据接口错误!SDK Version = " + sdkVersion + ",str =" + str);
+ logger.Info(sList.GetType(), "adb 返回数据接口错误!SDK Version = " + sdkVersion + ",str =" + str);
+ }
+ }
+ else if (sdkVersion < 26)
+ {
+ if (sList.Count == 11)
+ {
+ cp[0] = sList[0];
+ cp[1] = sList[4].Remove(sList[4].Length - 1, 1);
+ cp[2] = sList[sList.Count - 1];
+ }
+ else
+ {
+ Debug.WriteLine("adb 返回数据接口错误!SDK Version = " + sdkVersion + ",str =" + str);
+ logger.Info(sList.GetType(), "adb 返回数据接口错误!SDK Version = "+ sdkVersion + ",str =" + str);
+ }
+ }
+ else
+ {
+ if (sList.Count >= 12)
+ {
+ cp[0] = sList[0];
+ cp[1] = sList[8];
+ cp[2] = sList[sList.Count - 1];
+ }
+ else if (sList.Count == 4)
+ {
+ Debug.WriteLine("adb 返回数据乱码!SDK Version = " + sdkVersion + ",str =" + str);
+ logger.Info(sList.GetType(), "adb 返回数据乱码!SDK Version = " + sdkVersion + ",str =" + str);
+ GetCpuAndPid(deviceId, pid, packageName, sdkVersion);
+ }
+ else
+ {
+ for (int i = 0; i < sList.Count; i++)
+ {
+ Debug.WriteLine("sList:" + sList.ElementAt(i));
+ }
+ Debug.WriteLine("adb 返回数据接口错误!SDK Version = " + sdkVersion + ",str =" + str);
+ logger.Info(sList.GetType(), "adb 返回数据接口错误!SDK Version = " + sdkVersion + ",str =" + str);
+ }
+ }
+ return cp;
+ }
+ }
+
+ ///
+ ///通过设备ID获取当前对应app的上行流量/下行流量,只支持安卓8.0以下系统
+ ///
+ /// 设备ID
+ /// App包名
+ /// 系统sdk版本号
+ /// 获取流量信息标识
+ /// double [上行,下行]单位:KB
+ public static double[] GetTcpFlow(string deviceId, string packageName, int sdkVersion ,bool getTcpFlag)
+ {
+ double[] tcpFlow = { 0, 0 };
+ if (getTcpFlag && sdkVersion < 26)
+ {
+ string str = Utils.Execute(".\\adb\\adb.exe -s " + deviceId + " shell dumpsys package " + packageName + " | findstr userId", 10);
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return null;
+ }
+ using (StringReader sr = new StringReader(str))
+ {
+ str = sr.ReadLine();
+ if (!str.Trim().StartsWith("userId="))
+ {
+ logger.Info(str.GetType(), "返回数据非userId开头!,获取userId Error,str = " + str);
+ return null;
+ }
+ }
+ string[] sArray = str.Split('=');// 一定是单引
+ string userId = sArray[1].Trim();
+ string sndStr = Utils.Execute(".\\adb\\adb.exe -s " + deviceId + " shell cat proc/uid_stat/" + userId + "/tcp_snd", 10);//上行流量
+ if (!Utils.CheckDOSReturn(sndStr))
+ {
+ return null;
+ }
+ else if (sndStr.IndexOf("No such file or directory") != -1)
+ {
+ return null;
+ }
+ try
+ {
+ tcpFlow[0] = Math.Round(double.Parse(sndStr) / 1024, 2);
+ }
+ catch (Exception)
+ {
+ logger.Info(sndStr.GetType(), "snd_str不为数字!,snd_str = " + sndStr);
+ Debug.WriteLine("snd_str不为数字!,snd_str = " + sndStr);
+ return null;
+ }
+ string rcvStr = Utils.Execute(".\\adb\\adb.exe -s " + deviceId + " shell cat proc/uid_stat/" + userId + "/tcp_rcv", 10);//下行流量
+ if (!Utils.CheckDOSReturn(rcvStr))
+ {
+ return tcpFlow;
+ }
+ else if (sndStr.IndexOf("No such file or directory") != -1)
+ {
+ return tcpFlow;
+ }
+ try
+ {
+ tcpFlow[1] = Math.Round(double.Parse(rcvStr) / 1024, 2);
+ }
+ catch (Exception)
+ {
+ logger.Info(rcvStr.GetType(), "rcv_str不为数字!,rcv_str = " + rcvStr);
+ Debug.WriteLine("rcv_str不为数字!,rcv_str = " + rcvStr);
+ }
+ }
+ return tcpFlow;
+ }
+ }
+}
diff --git a/BLL/GetDeviceInfo.cs b/BLL/GetDeviceInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..5b99de1c7ea68c819ca390b932e81322cd033269
--- /dev/null
+++ b/BLL/GetDeviceInfo.cs
@@ -0,0 +1,269 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using BLL.utils;
+using System.IO;
+using Model;
+using System.Diagnostics;
+
+namespace BLL
+{
+ ///
+ /// 获取设备基础信息类
+ ///
+ public class GetDeviceInfo
+ {
+ ///
+ /// 获取设备基本信息列表
+ ///
+ /// 设备信息列表
+ public List GetDeviceInfoList()
+ {
+ List deviceIdList = GetDeviceIdList();
+ if (deviceIdList != null)
+ {
+ List deviceList = new List { };
+ for (int i = 0; i < deviceIdList.Count; i++)
+ {
+ string deviceId = deviceIdList.ElementAt(i);
+ DeviceInfo deviceInfo = new DeviceInfo() { };
+ deviceInfo.DeviceId = deviceId;
+ deviceInfo.DeviceBrand = GetDeviceBrand(deviceId);
+ deviceInfo.DeviceModel = GetDeviceModel(deviceId);
+ deviceInfo.DeviceReleaseVersion = GetReleaseVersion(deviceId);
+ deviceInfo.DeviceSDKVersion = GetSdkVersion(deviceId);
+ int[] wh = GetDeviceResolution(deviceId);
+ deviceInfo.DeviceResolutionW = wh[0];
+ deviceInfo.DeviceResolutionH = wh[1];
+ Debug.WriteLine(deviceInfo.GetString());
+ deviceList.Add(deviceInfo);
+ }
+ return deviceList;
+ }
+ else
+ {
+ logger.Info(this.GetType(), "Android设备ID列表为空,请检查设备是否连接正常!");
+ return null;
+ }
+ }
+ ///
+ /// 通过设备ID获取系统release version
+ ///
+ /// 设备ID
+ /// version
+ private string GetReleaseVersion(string deviceId)
+ {
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell getprop ro.build.version.release";
+ string str = Utils.Execute(command, 100);
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return string.Empty;
+ }
+ if (str.Trim().Length > 0 && str.Trim().Length < 8)
+ {
+ return str.Trim();
+ }
+ else
+ {
+ logger.Info(str.GetType(), "获取设备系统release版本号Error,str = " + str);
+ }
+ return string.Empty;
+ }
+
+ ///
+ /// 通过设备ID获取系统sdk version
+ ///
+ /// 设备ID
+ /// sdk version
+ private int GetSdkVersion(string deviceId)
+ {
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell getprop ro.build.version.sdk";
+ string str = Utils.Execute(command, 100);
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return 0;
+ }
+ if (str.Trim().Length > 0 && str.Trim().Length <= 3)
+ {
+ try
+ {
+ return int.Parse(str.Trim());
+ }
+ catch (Exception e2)
+ {
+ logger.Info(e2.GetType(), "获取设备系统sdk版本号Error,str = " + str,e2);
+ return 0;
+ }
+ }
+ else
+ {
+ logger.Info(str.GetType(), "获取设备系统sdk版本号Error,str = " + str);
+ }
+ return 0;
+ }
+
+ ///
+ /// 通过设备ID获取设备品牌
+ ///
+ /// 设备ID
+ /// brand
+ private string GetDeviceBrand(string deviceId)
+ {
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell getprop ro.product.brand";
+ string str = Utils.Execute(command, 100);
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return string.Empty;
+ }
+ if (str.Trim().Length > 0 && str.Trim().Length < 8)
+ {
+ return str.Trim();
+ }
+ else
+ {
+ logger.Info(str.GetType(), "获取设备品牌Error,str = " + str);
+ }
+ return string.Empty;
+ }
+
+ ///
+ /// 通过设备ID获取设备型号
+ ///
+ /// 设备ID
+ /// model
+ private string GetDeviceModel(string deviceId)
+ {
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell getprop ro.product.model";
+ string str = Utils.Execute(command, 100);
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return string.Empty;
+ }
+ if (str.Trim().Length > 0)
+ {
+ return str.Trim();
+ }
+ else
+ {
+ logger.Info(str.GetType(), "获取设备型号Error,str = " + str);
+ }
+ return string.Empty;
+ }
+
+ ///
+ /// 通过设备ID获取屏幕分辨率,[w,h]
+ ///
+ /// 设备ID
+ /// int[w,h]
+ private int[] GetDeviceResolution(string deviceId)
+ {
+ int[] whArray = { 0, 0 };
+ string command = ".\\adb\\adb.exe -s " + deviceId + " shell dumpsys window displays | findstr init";
+ string str = Utils.Execute(command, 100);
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return whArray;
+ }
+ string[] sArray = str.Split(' ');
+ List sList = new List { };
+ foreach (string s in sArray)
+ {
+ //Debug.WriteLine(s);
+ if (!string.IsNullOrEmpty(s))
+ {
+ sList.Add(s);
+ }
+ }
+ try
+ {
+ string[] wh = sList.ElementAt(0).Split('=')[1].Split('x');
+ whArray[0] = int.Parse(wh[0]);
+ whArray[1] = int.Parse(wh[1]);
+ }
+ catch (Exception dre)
+ {
+ Debug.WriteLine("获取分辨率Error,str=" + str + ",\nErrorMessage:" + dre);
+ logger.Info(dre.GetType(), "获取分辨率Error,str=" + str + ",\nErrorMessage:", dre);
+ }
+ return whArray;
+ }
+
+ ///
+ /// 获取当前电脑上连接的设备列表
+ ///
+ /// 设备ID列表
+ private List GetDeviceIdList()
+ {
+ Debug.WriteLine("当前工作目录:" + System.IO.Directory.GetCurrentDirectory());
+ string str = Utils.Execute(".\\adb\\adb.exe devices", 100);
+ logger.Info(str.GetType(), "GetDeviceIdList");
+ if (!Utils.CheckDOSReturn(str))
+ {
+ return null;
+ }
+ if (str.Length > 28)
+ {
+ List deviceIdList = new List { };
+ using (StringReader sr = new StringReader(str))
+ {
+ string line;
+ try
+ {
+ while (sr.Peek() > -1)
+ {
+ line = sr.ReadLine().Trim();
+ line = line.Replace("\t", " ");
+ if (line.Length>0 && line.IndexOf("List of devices attached") == -1)
+ {
+ string[] sArray = line.Split(' ');
+ if (sArray.Count() ==2)
+ {
+ if (!string.IsNullOrEmpty(sArray[0]))
+ {
+ logger.Info(sArray.GetType(), "DeviceId = " + sArray[0]);
+ Debug.WriteLine("DeviceId = " + sArray[0]);
+ deviceIdList.Add(sArray[0]);
+ }
+ else
+ {
+ foreach (var item in sArray)
+ {
+ Debug.WriteLine("devices = " + item);
+ logger.Info(sArray.GetType(), "devices = " + item);
+ }
+ }
+ }
+ else
+ {
+ foreach (var item in sArray)
+ {
+ Debug.WriteLine("devices = " + item);
+ logger.Info(sArray.GetType(), "devices = " + item);
+ }
+ logger.Info(sArray.GetType(), "获取设备列表返回数据错误:" + sArray.ToString());
+ Debug.WriteLine("获取设备列表返回数据错误:" + sArray.ToString());
+ }
+ }
+ }
+ sr.Close();
+ return deviceIdList;
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine( "获取设备列表Error,str=" + str + ",\nErrorMessage:"+ e.Data + e.Message);
+ logger.Info(e.GetType(), "获取设备列表Error,str=" + str + ",\nErrorMessage:", e);
+ sr.Close();
+ return null;
+ }
+ }
+ }
+ else
+ {
+ Debug.WriteLine("str.len小于28,str = 【" + str + "】");
+ return null;
+ }
+ }
+ }
+}
diff --git a/BLL/GetPortList.cs b/BLL/GetPortList.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9b68cac6be74ffc757b897c965bb7a04d73ff91c
--- /dev/null
+++ b/BLL/GetPortList.cs
@@ -0,0 +1,126 @@
+using BLL.utils;
+using Model;
+using SharpPcap;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace BLL
+{
+ class GetPortList
+ {
+ public ProcessPerformanceInfo ProcInfo { get; set; }
+ public List GetPortsByPid()
+ {
+ //进程id
+ int pid = ProcInfo.ProcessID;
+ //存放进程使用的端口号list
+ List portList = new List();
+ string str = Utils.Execute("netstat -ano",10);
+ Regex reg = new Regex("\\s+", RegexOptions.Compiled);
+ portList.Clear();
+ using (StringReader sr = new StringReader(str))
+ {
+ string line = null;
+ while ((line = sr.ReadLine()) != null)
+ {
+ line = line.Trim();
+ if (line.StartsWith("TCP", StringComparison.OrdinalIgnoreCase))
+ {
+ line = reg.Replace(line, ",");
+ string[] arr = line.Split(',');
+ if (arr[4] == pid.ToString())
+ {
+ string soc = arr[1];
+ int pos = soc.LastIndexOf(':');
+ int pot = int.Parse(soc.Substring(pos + 1));
+ portList.Add(pot);
+ }
+ }
+ else if (line.StartsWith("UDP", StringComparison.OrdinalIgnoreCase))
+ {
+ line = reg.Replace(line, ",");
+ string[] arr = line.Split(',');
+ if (arr[3] == pid.ToString())
+ {
+ string soc = arr[1];
+ int pos = soc.LastIndexOf(':');
+ int pot = int.Parse(soc.Substring(pos + 1));
+ portList.Add(pot);
+ }
+ }
+ }
+ }
+ return portList;
+ }
+
+ ///
+ /// 获取电脑网络信息
+ ///
+ ///
+ public IPPropertiesInfo GetPcNetInfo()
+ {
+ //获取本机IP地址
+ //IPAddress[] addrList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
+ //string IP = addrList[0].ToString();
+ IPPropertiesInfo ipPropertiesInfo = new IPPropertiesInfo();
+ NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
+ foreach (NetworkInterface adapter in nics)
+ {
+ bool Pd1 = (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet); //判断是否是以太网连接
+ if (Pd1)
+ {
+ IPInterfaceProperties ip = adapter.GetIPProperties(); //IP配置信息
+ if (ip.UnicastAddresses.Count > 0)
+ {
+ ipPropertiesInfo.IP = ip.UnicastAddresses[0].Address.ToString();//IP地址
+ ipPropertiesInfo.SubMark = ip.UnicastAddresses[0].IPv4Mask.ToString();//子网掩码
+
+ }
+ if (ip.GatewayAddresses.Count > 0)
+ {
+ ipPropertiesInfo.GateWay = ip.GatewayAddresses[0].Address.ToString();//默认网关
+ }
+ int DnsCount = ip.DnsAddresses.Count;
+ if (DnsCount > 0)
+ {
+ try
+ {
+ ipPropertiesInfo.DNS1 = ip.DnsAddresses[0].ToString(); //主DNS
+ ipPropertiesInfo.DNS2 = ip.DnsAddresses[1].ToString(); //备用DNS地址
+ }
+ catch(Exception er)
+ {
+ throw er;
+ }
+ }
+ }
+ }
+ //获取本机网络设备
+ var devices = CaptureDeviceList.Instance;
+ int count = devices.Count;
+ if (count < 1)
+ {
+ Debug.WriteLine("No device found on this machine");
+ logger.Info(devices.GetType(), "No device found on this machine");
+ }
+ else
+ {
+ List sList = new List() { };
+ foreach (var item in devices)
+ {
+ sList.Add(item.Name);
+ }
+ ipPropertiesInfo.NetDeviceList = sList;
+ }
+ return ipPropertiesInfo;
+ }
+ }
+}
\ No newline at end of file
diff --git a/BLL/GetPsInfo.cs b/BLL/GetPsInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..2e3ecc359b94a57b68debeed9fecde30d1f33c4a
--- /dev/null
+++ b/BLL/GetPsInfo.cs
@@ -0,0 +1,205 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Threading;
+using BLL.utils;
+using Model;
+using SharpPcap;
+
+namespace BLL
+{
+ ///
+ /// 获取PC进程信息类
+ ///
+ public class GetPsInfo
+ {
+ ///
+ /// 获取PC进程信息
+ ///
+ /// 输出cpu
+ ///
+ /// 进程id
+ /// CPU计算间隔时间(毫秒)未设置默认为1000。
+ ///
+ ///
+ public static ProcessInfo GetProcessInfo(out float cpu,out TimeSpan curTime, int pid, int interval, TimeSpan prevCpuTime)
+ {
+ double pruss = 0;
+ ProcessInfo processInfo = new ProcessInfo();
+
+ //该程序可以实时监控所有进程或者指定进程的工作集、私有工作集
+ //新建一个Stopwatch变量用来统计程序运行时间
+ //Stopwatch watch = Stopwatch.StartNew();
+ try
+ {
+ Process ps = Process.GetProcessById(pid);
+ //PerformanceCounter pf1 = new PerformanceCounter("Process", "Working Set - Private", ps.ProcessName);
+ //PerformanceCounter pf2 = new PerformanceCounter("Process", "Working Set", ps.ProcessName);
+ ////Debug.WriteLine("---------------------------------------------------------------------------");
+ ////Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "工作集(进程类)", ps.WorkingSet64 / 1024);
+ //psuss = (int)ps.WorkingSet64 / 1024;
+ ////Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "工作集 ", pf2.NextValue() / 1024);
+ //uss = (int)pf2.NextValue() / 1024;
+ //私有工作集
+ ////Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "私有工作集 ", pf1.NextValue() / 1024);
+ //Debug.WriteLine("---------------------------------------------------------------------------");
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PagedMemorySize64:分页内存量:\n", ps.PagedMemorySize64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PrivateMemorySize64:专用内存量:\n", ps.PrivateMemorySize64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PagedSystemMemorySize64:可分页系统内存量:\n", ps.PagedSystemMemorySize64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "WorkingSet64:物理内存量:\n", ps.WorkingSet64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "VirtualMemorySize64:虚拟内存量:\n", ps.VirtualMemorySize64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PeakPagedMemorySize64:虚拟内存分页文件中的最大内存量:\n", ps.PeakPagedMemorySize64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PeakVirtualMemorySize64:最大虚拟内存量:\n", ps.PeakVirtualMemorySize64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PeakWorkingSet64:最大物理内存量:\n", ps.PeakWorkingSet64 / 1024);
+ //Debug.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "NonpagedSystemMemorySize64:非分页系统内存量:\n", ps.NonpagedSystemMemorySize64 / 1024);
+ ps.Refresh();
+ if (ps.PrivateMemorySize64 > ps.PagedMemorySize64)
+ {
+ pruss = ps.PrivateMemorySize64 / 1024;
+ }
+ else
+ {
+ pruss = ps.PagedMemorySize64 / 1024;
+ }
+
+ //watch.Stop();
+ ////Debug.WriteLine(watch.Elapsed);
+ //return pruss/1024;
+ processInfo.Pid = pid;
+ processInfo.ProcessName = ps.ProcessName;
+ UsingProcess(out cpu, out curTime, pid, interval, prevCpuTime);
+ processInfo.Cpu = cpu;
+ processInfo.PrivateSS = Math.Round(pruss / 1024 , 2);
+ return processInfo;
+ }
+ catch (SystemException e1)
+ {
+ logger.Info(e1.GetType(), "获取PC进程信息Error!ErrorMessage:" ,e1);
+ cpu = 0;
+ curTime = TimeSpan.Zero;
+ return null;
+ }
+ }
+
+ ///
+ /// 获取PC进程CPU占用比
+ ///
+ ///
+ ///
+ /// 进程id
+ /// CPU计算间隔时间(毫秒)未设置默认为1000。
+ ///
+ ///
+ private static void UsingProcess(out float cpu, out TimeSpan curTime,int pid, int interval, TimeSpan prevCpuTime)
+ {
+ //未设置时间直接设置为1000;
+ if (interval == 0)
+ {
+ logger.Info(interval.GetType(), "获取PC进程CPU占用比,未设置时间!!!interval=0");
+ interval = 1000;
+ }
+ using (var pro = Process.GetProcessById(pid))
+ {
+ //上次记录的CPU时间
+ //var prevCpuTime = TimeSpan.Zero;
+
+ //当前时间
+ curTime = pro.TotalProcessorTime;
+ //间隔时间内的CPU运行时间除以逻辑CPU数量
+ var value = (curTime - prevCpuTime).TotalMilliseconds / interval / Environment.ProcessorCount * 100;
+ //prevCpuTime = curTime;
+ //输出
+ //Debug.WriteLine(value);
+ cpu = (float)value;
+ }
+ }
+
+ ///
+ /// 获取PC所有进程信息
+ ///
+ /// Process List
+ public static List GetPCPsList()
+ {
+ try
+ {
+ List psList = Process.GetProcesses().ToList();
+ return psList;
+ }
+ catch (Exception ps_e)
+ {
+ throw ps_e;
+ }
+ }
+
+ ///
+ /// 进程性能信息
+ ///
+ public ProcessPerformanceInfo ProcInfo { get; set; }
+
+ ///
+ /// 捕捉进程发送流量信息
+ ///
+ ///
+ ///
+ ///
+ public void CaptureFlowSend(string IP, int portID, int deviceID)
+ {
+ ICaptureDevice device = (ICaptureDevice)CaptureDeviceList.New()[deviceID];
+
+ device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrivalSend);
+
+ int readTimeoutMilliseconds = 1000;
+ device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
+
+ string filter = "src host " + IP + " and src port " + portID;
+ device.Filter = filter;
+ device.StartCapture();
+ ProcInfo.dev.Add(device);
+ }
+
+ ///
+ /// 捕捉进程下载流量信息
+ ///
+ ///
+ ///
+ ///
+ public void CaptureFlowRecv(string IP, int portID, int deviceID)
+ {
+ ICaptureDevice device = CaptureDeviceList.New()[deviceID];
+ device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrivalRecv);
+
+ int readTimeoutMilliseconds = 1000;
+ device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
+
+ string filter = "dst host " + IP + " and dst port " + portID;
+ device.Filter = filter;
+ device.StartCapture();
+ ProcInfo.dev.Add(device);
+ }
+
+ ///
+ /// 数据包发送时事件
+ ///
+ ///
+ ///
+ private void device_OnPacketArrivalSend(object sender, CaptureEventArgs e)
+ {
+ var len = e.Packet.Data.Length;
+ ProcInfo.NetSendBytes += len;
+ }
+
+ ///
+ /// 数据包到达时事件
+ ///
+ ///
+ ///
+ private void device_OnPacketArrivalRecv(object sender, CaptureEventArgs e)
+ {
+ var len = e.Packet.Data.Length;
+ ProcInfo.NetRecvBytes += len;
+ }
+ }
+ }
diff --git a/BLL/ProcessPerformanceInfo.cs b/BLL/ProcessPerformanceInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d94ac2691b753a241335f1f7497b42be623585d7
--- /dev/null
+++ b/BLL/ProcessPerformanceInfo.cs
@@ -0,0 +1,82 @@
+using SharpPcap;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BLL
+{
+ ///
+ /// 进程性能信息实体类
+ ///
+ public class ProcessPerformanceInfo : IDisposable
+ {
+ ///
+ /// 进程ID
+ ///
+ public int ProcessID { get; set; }
+
+ ///
+ /// 进程名
+ ///
+ public string ProcessName { get; set; }
+
+ ///
+ /// 私有工作集(KB)
+ ///
+ public float PrivateWorkingSet { get; set; }
+
+ ///
+ /// 工作集(KB)
+ ///
+ public float WorkingSet { get; set; }
+
+ ///
+ /// CPU占用率(%)
+ ///
+ public float CpuTime { get; set; }
+
+ ///
+ /// 每秒IO操作(不包含控制操作)读写数据的字节数(KB)
+ ///
+ public float IOOtherBytes { get; set; }
+
+ ///
+ /// 每秒IO操作数(不包括读写)(个数)
+ ///
+ public int IOOtherOperations { get; set; }
+
+ ///
+ /// 网络发送数据字节数
+ ///
+ public long NetSendBytes { get; set; }
+
+ ///
+ /// 网络接收数据字节数
+ ///
+ public long NetRecvBytes { get; set; }
+
+ ///
+ /// 网络数据总字节数
+ ///
+ public long NetTotalBytes { get; set; }
+
+ ///
+ /// ICaptureDevice list
+ ///
+ public List dev = new List();
+
+ ///
+ /// 实现IDisposable的方法
+ ///
+ public void Dispose()
+ {
+ foreach (ICaptureDevice d in dev)
+ {
+ d.StopCapture();
+ d.Close();
+ }
+ }
+ }
+}
diff --git a/BLL/Properties/AssemblyInfo.cs b/BLL/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9483452941a7119428d29866878e7617ef303457
--- /dev/null
+++ b/BLL/Properties/AssemblyInfo.cs
@@ -0,0 +1,38 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的常规信息通过以下
+// 特性集控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("BLL")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BLL")]
+[assembly: AssemblyCopyright("Copyright © 2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 使此程序集中的类型
+// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
+// 则将该类型上的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("0cf249b3-168b-4d3f-8a65-68825805cc18")]
+
+// 程序集的版本信息由下面四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.1")]
+[assembly: AssemblyFileVersion("1.1")]
+//log4配置
+[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Config/log4net.config", Watch = true)]
diff --git a/RAMMonitoringTools/adb/adb.exe b/BLL/adb/adb.exe
similarity index 100%
rename from RAMMonitoringTools/adb/adb.exe
rename to BLL/adb/adb.exe
diff --git a/BLL/packages.config b/BLL/packages.config
new file mode 100644
index 0000000000000000000000000000000000000000..ee7e89a94a6ccaf73ac1ff570f4c9ab6404efbc8
--- /dev/null
+++ b/BLL/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BLL/utils/Utils.cs b/BLL/utils/Utils.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f544b23b71ad315c7bd623643941aea85fccf076
--- /dev/null
+++ b/BLL/utils/Utils.cs
@@ -0,0 +1,255 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Management;
+using System.Text;
+using System.Threading.Tasks;
+using Model;
+
+namespace BLL.utils
+{
+ ///
+ /// 通用工具类
+ ///
+ public class Utils
+ {
+
+ ///
+ /// 初步检查dos返回值是否正确,过滤adb.exe找不到及命令执行出错
+ ///
+ /// dos返回的值
+ /// true or false
+ public static bool CheckDOSReturn(string str)
+ {
+ if(str.Length <= 0)
+ {
+ logger.Info(str.GetType(), "【请检查设备连接是否正常,str长度小于等于0," + (new StackTrace()).GetFrame(1).GetMethod().Name + "--str = " + str + "】");
+ return false;
+ }
+ else if (str.IndexOf("不是内部或外部命令,也不是可运行的程序或批处理文件") != -1)
+ {
+ logger.Info(str.GetType(), "【请检查工作目录下adb文件夹下adb程序是否存在,"+(new StackTrace()).GetFrame(1).GetMethod().Name+"--str = " + str + "】");
+ return false;
+ }
+ else if (str.IndexOf("error") != -1)
+ {
+ logger.Info(str.GetType(), "【请检查设备调试模式是否开启," + (new StackTrace()).GetFrame(1).GetMethod().Name + "--str = " + str + "】");
+ return false;
+ }
+ else if (str.IndexOf("killing") != -1)
+ {
+ logger.Info(str.GetType(), "【请检查adb服务是否已正常启动,着重检查adb服务端口是否被占用(5037)," + (new StackTrace()).GetFrame(1).GetMethod().Name + "--str = " + str + "】");
+ return false;
+ }
+ else if (str.IndexOf("daemon not running") != -1)
+ {
+ logger.Info(str.GetType(), "【adb 守护进程未启动," + (new StackTrace()).GetFrame(1).GetMethod().Name + "--str = " + str + "】");
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ //dosCommand Dos命令语句
+ //public static string Execute(string dosCommand,int seconds)
+ //{
+ // return Execute(dosCommand, 1000);
+ //}
+
+ ///
+ /// 执行DOS命令,返回DOS命令的输出
+ ///
+ /// dos命令
+ /// 等待命令执行的时间(单位:毫秒)如果设定为0,则无限等待
+ /// 返回DOS命令的输出
+ public static string Execute(string command, int seconds)
+ {
+ Debug.WriteLine("需要执行的命令:"+ command);
+ string outPut = ""; //输出字符串
+ if (command != null && !command.Equals(""))
+ {
+ Process process = new Process();//创建进程对象
+ ProcessStartInfo startInfo = new ProcessStartInfo();
+ startInfo.FileName = "cmd.exe";//设定需要执行的命令
+ startInfo.Arguments = "/C " + command;//“/C”表示执行完命令后马上退出
+ startInfo.UseShellExecute = false;//不使用系统外壳程序启动
+ startInfo.RedirectStandardInput = false;//不重定向输入
+ startInfo.RedirectStandardOutput = true; //重定向输出
+ startInfo.CreateNoWindow = true;//不创建窗口
+ process.StartInfo = startInfo;
+ try
+ {
+ if (process.Start())//开始进程
+ {
+ if (seconds == 0)
+ {
+ process.WaitForExit();//这里无限等待进程结束
+ }
+ else
+ {
+ process.WaitForExit(seconds); //等待进程结束,等待时间为指定的毫秒
+ }
+ outPut = process.StandardOutput.ReadToEnd();//读取进程的输出
+ }
+ }
+ catch(Exception e)
+ {
+ Debug.WriteLine(e.Data + e.Message);
+ logger.Info(e.GetType(), "ErrorMessage:",e);
+ }
+ finally
+ {
+ if (process != null)
+ process.Close();
+ }
+ }
+ return outPut;
+ }
+
+ ///
+ /// 执行DOS命令,创建窗口
+ ///
+ /// dos命令
+ public static void Execute(string command)
+ {
+ Debug.WriteLine("需要执行的命令:" + command);
+ if (command != null && !command.Equals(""))
+ {
+ Process process = new Process();//创建进程对象
+ ProcessStartInfo startInfo = new ProcessStartInfo();
+ startInfo.FileName = "cmd.exe";//设定需要执行的命令
+ //startInfo.Arguments = command;//表示执行完命令后马上退出
+ startInfo.UseShellExecute = false;//不使用系统外壳程序启动
+ startInfo.RedirectStandardInput = true;//重定向输入
+ //startInfo.RedirectStandardOutput = true; //重定向输出
+ startInfo.CreateNoWindow = false;//创建窗口
+ process.StartInfo = startInfo;
+ try
+ {
+ process.Start();//开始进程
+ process.StandardInput.WriteLine(command);
+ //process.StandardInput.AutoFlush = true;
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine(e.Data + e.Message);
+ logger.Info(e.GetType(), "ErrorMessage:", e);
+ }
+ }
+ }
+
+ ///
+ /// 通过WMI获取进程所有者名称
+ ///
+ /// 等于-1时一次返回所有进程信息
+ ///
+ public static List GetProcessUserName(int pid)
+ {
+ string sql;
+ if (pid < 0)
+ {
+ sql = "Select * from Win32_Process";
+ }
+ else
+ {
+ sql = "Select * from Win32_Process WHERE processID=" + pid;
+ }
+ List chooseList = new List();
+ SelectQuery query = new SelectQuery(sql);
+ ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
+ logger.Info(searcher.GetType(), "searchar长度:" + searcher.Get().Count);
+ foreach (ManagementObject disk in searcher.Get())
+ {
+ ChooseInfo chooseInfo = new ChooseInfo() { };
+ try
+ {
+ ManagementBaseObject inPar = null;
+ ManagementBaseObject outPar = null;
+ //Debug.WriteLine("disk.tostring:" + disk.GetPropertyValue("ProcessId").ToString());
+ //Debug.WriteLine("disk.tostring:" + disk.GetPropertyValue("Name").ToString());
+ chooseInfo.Pid = int.Parse(disk.GetPropertyValue("ProcessId").ToString());
+ chooseInfo.ChooseName = disk.GetPropertyValue("Name").ToString();
+ inPar = disk.GetMethodParameters("GetOwner");
+ outPar = disk.InvokeMethod("GetOwner", inPar, null);
+ //Debug.WriteLine("username============"+outPar["User"].ToString());
+ object userName = outPar["User"];
+ if (userName != null)
+ {
+ chooseInfo.UserName = userName.ToString();
+ }
+ else
+ {
+ chooseInfo.UserName = "SYSTEM";
+ }
+ }
+ catch(Exception e)
+ {
+ Debug.WriteLine(e);
+ chooseInfo.UserName = "SYSTEM";
+ }
+ //Debug.WriteLine(chooseInfo.GetString());
+ chooseList.Add(chooseInfo);
+ if (pid > 0)
+ {
+ break;
+ }
+ }
+ return chooseList;
+ }
+
+ ///
+ /// 输出日志到log文件
+ ///
+ ///
+ public void WriteLog(string msg)
+ {
+ string filePath = AppDomain.CurrentDomain.BaseDirectory + "Log";
+ if (!Directory.Exists(filePath))
+ {
+ Directory.CreateDirectory(filePath);
+ }
+ string logPath = AppDomain.CurrentDomain.BaseDirectory + "Log\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
+ try
+ {
+ using (StreamWriter sw = File.AppendText(logPath))
+ {
+ sw.WriteLine("消息:" + msg);
+ sw.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
+ sw.WriteLine("**************************************************");
+ sw.WriteLine();
+ sw.Flush();
+ sw.Close();
+ sw.Dispose();
+ }
+ }
+ catch (IOException e)
+ {
+ using (StreamWriter sw = File.AppendText(logPath))
+ {
+ sw.WriteLine("异常:" + e.Message);
+ sw.WriteLine("时间:" + DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"));
+ sw.WriteLine("**************************************************");
+ sw.WriteLine();
+ sw.Flush();
+ sw.Close();
+ sw.Dispose();
+ }
+ }
+ }
+
+ ///
+ /// 获取当前本地时间戳
+ ///
+ ///
+ public int GetCurrentTimeUnix()
+ {
+ TimeSpan cha = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)));
+ long t = (long)cha.TotalSeconds;
+ return (int)t;
+ }
+ }
+}
diff --git a/RAMMonitoringTools/utils/logger.cs b/BLL/utils/logger.cs
similarity index 59%
rename from RAMMonitoringTools/utils/logger.cs
rename to BLL/utils/logger.cs
index 311daf547cb1073922e280d4186122cd75c8195d..020461f91860e4e0a965adff969b899aaa0873d7 100644
--- a/RAMMonitoringTools/utils/logger.cs
+++ b/BLL/utils/logger.cs
@@ -5,10 +5,19 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace RAMMonitoringTools.utils
+namespace BLL.utils
{
- class logger
+ ///
+ /// log4net工具类
+ ///
+ public class logger
{
+ ///
+ /// logger fatal
+ ///
+ ///
+ ///
+ ///
public static void Fatal(Type type, object message, Exception exception = null)
{
ILog log = LogManager.GetLogger(type);
@@ -18,6 +27,12 @@ namespace RAMMonitoringTools.utils
log.Fatal(message, exception);
}
+ ///
+ /// logger error
+ ///
+ ///
+ ///
+ ///
public static void Error(Type type, object message, Exception exception = null)
{
ILog log = LogManager.GetLogger(type);
@@ -27,6 +42,12 @@ namespace RAMMonitoringTools.utils
log.Error(message, exception);
}
+ ///
+ /// logger warn
+ ///
+ ///
+ ///
+ ///
public static void Warn(Type type, object message, Exception exception = null)
{
ILog log = LogManager.GetLogger(type);
@@ -36,6 +57,12 @@ namespace RAMMonitoringTools.utils
log.Warn(message, exception);
}
+ ///
+ /// logger info
+ ///
+ ///
+ ///
+ ///
public static void Info(Type type, object message, Exception exception = null)
{
ILog log = LogManager.GetLogger(type);
@@ -45,6 +72,12 @@ namespace RAMMonitoringTools.utils
log.Info(message, exception);
}
+ ///
+ /// logger debug
+ ///
+ ///
+ ///
+ ///
public static void Debug(Type type, object message, Exception exception = null)
{
ILog log = LogManager.GetLogger(type);
diff --git a/RAMMonitoringTools/App.config b/DAL/App.config
similarity index 44%
rename from RAMMonitoringTools/App.config
rename to DAL/App.config
index 388818ce9c0258b6968f3f30c72dec21e4033208..e5763644f4cbcc598fb24bf0bce5b5239c510962 100644
--- a/RAMMonitoringTools/App.config
+++ b/DAL/App.config
@@ -3,13 +3,8 @@
-
-
-
+
-
-
-
@@ -17,7 +12,7 @@
-
+
@@ -27,36 +22,8 @@
-
-
-
-
- 1000
-
-
- 1000
-
-
- monitoring
-
-
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- True
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/DAL/DAL.csproj b/DAL/DAL.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..ef20f4bf39f88ba78e3e16ef9598434e8882b3fe
--- /dev/null
+++ b/DAL/DAL.csproj
@@ -0,0 +1,115 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}
+ Library
+ Properties
+ DAL
+ DAL
+ v4.5
+ 512
+ c82bc2ee
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ bin\Debug\DAL.XML
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE
+ bin\Debug\DAL.XML
+ full
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+
+ ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll
+ True
+
+
+ ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll
+ True
+
+
+
+
+
+ ..\packages\System.Data.SQLite.Core.1.0.109.2\lib\net45\System.Data.SQLite.dll
+ True
+
+
+ ..\packages\System.Data.SQLite.EF6.1.0.109.0\lib\net45\System.Data.SQLite.EF6.dll
+ True
+
+
+ ..\packages\System.Data.SQLite.Linq.1.0.109.0\lib\net45\System.Data.SQLite.Linq.dll
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {44385e63-c4a7-49c7-99ac-e38c14341f03}
+ Model
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+ 这台计算机上缺少此项目引用的 NuGet 程序包。启用“NuGet 程序包还原”可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。
+
+
+
+
+
\ No newline at end of file
diff --git a/DAL/Properties/AssemblyInfo.cs b/DAL/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d89967dcdf07989bd00b1bc7339ccc11c8be7ec1
--- /dev/null
+++ b/DAL/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的常规信息通过以下
+// 特性集控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("DAL")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("DAL")]
+[assembly: AssemblyCopyright("Copyright © 2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 使此程序集中的类型
+// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
+// 则将该类型上的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("89dd9800-3fdd-44ad-b131-842d6da306de")]
+
+// 程序集的版本信息由下面四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.1")]
+[assembly: AssemblyFileVersion("1.1")]
\ No newline at end of file
diff --git a/RAMMonitoringTools/SQLiteHelper.cs b/DAL/SQLiteHelper.cs
similarity index 73%
rename from RAMMonitoringTools/SQLiteHelper.cs
rename to DAL/SQLiteHelper.cs
index 28a917a13d473c657a92de3ec5dabf8e72eb5724..d6769d8878fcc341f3db540a15243e1d026b43bb 100644
--- a/RAMMonitoringTools/SQLiteHelper.cs
+++ b/DAL/SQLiteHelper.cs
@@ -1,350 +1,349 @@
-using System;
-using System.Collections.Generic;
-using RAMMonitoringTools.utils;
-using System.Data;
-using System.Data.SQLite;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace RAMMonitoringTools
-{
- ///
- /// SQLite数据库帮助类
- ///
- public class SQLiteHelper
- {
- ///
- /// 根据setting拼接数据库路径和名称,配置修改后重启软件后生效
- ///
- private readonly string m_DataSource = Properties.Settings.Default.DatabasePath + Properties.Settings.Default.DatabaseName+ ".db";
-
- ///
- /// ConnectionString样例:Data Source=Test.db;Pooling=true;FailIfMissing=false
- ///
- private readonly string m_ConnectionString;
-
- ///
- /// 静态构造函数,初始化连接字符串,检查数据库连接
- ///
- public SQLiteHelper(string m_DataSource)
- {
- if(m_DataSource.Length == 0)
- {
- if (Properties.Settings.Default.DatabasePath.Length == 0)
- {
- m_DataSource = System.AppDomain.CurrentDomain.BaseDirectory +Properties.Settings.Default.DatabaseName + ".db";
- }
- else
- {
- m_DataSource = Properties.Settings.Default.DatabasePath + "\\" + Properties.Settings.Default.DatabaseName + ".db";
- }
-
- }
- try
- {
- SQLiteConnectionStringBuilder connectionStringBuilder = new SQLiteConnectionStringBuilder
- {
- Version = 3,
- Pooling = true,
- FailIfMissing = false,
- DataSource = m_DataSource
- };
- m_ConnectionString = connectionStringBuilder.ConnectionString;
- using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
- {
- //验证数据库文件是否存在
- if (System.IO.File.Exists(m_DataSource) == false)
- {
- //创建数据库文件
- SQLiteConnection.CreateFile(m_DataSource);
- }
- //打开数据连接
- conn.Open();
- string query = "CREATE TABLE IF NOT EXISTS memory_info(id INTEGER PRIMARY KEY AUTOINCREMENT,tag NOT NULL,pid INT NOT NULL,name NOT NULL,cpu REAL NOT NULL,private_ss INT NOT NULL,add_time TIMESTAMP default (datetime('now', 'localtime')));";
- //创建命令
- SQLiteCommand cmd = new SQLiteCommand(query, conn);
- //执行命令
- cmd.ExecuteNonQuery();
- }
- }
- catch (Exception e)
- {
- MessageBox.Show("异常信息:"+e.Message);
- //throw e;
- }
- }
-
- #region basic method
-
- ///
- /// 获得连接对象
- ///
- ///
- private SQLiteConnection GetSQLiteConnection()
- {
- return new SQLiteConnection(m_ConnectionString);
- }
-
- ///
- /// 预备命令
- ///
- ///
- ///
- ///
- ///
- private void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] commandParameters)
- {
- if (conn.State != ConnectionState.Open)
- conn.Open();
- cmd.Parameters.Clear();
- cmd.Connection = conn;
- cmd.CommandText = cmdText;
- cmd.CommandType = CommandType.Text;
- cmd.CommandTimeout = 30;
- if (commandParameters != null)
- {
- foreach (object parm in commandParameters)
- cmd.Parameters.AddWithValue(string.Empty, parm);
-
- //for (int i = 0; i < p.Length; i++)
- // cmd.Parameters[i].Value = p[i];
- }
- }
-
- ///
- /// 返回受影响的行数
- ///
- /// 执行语句
- /// 传入的参数
- /// 返回受影响行数
- public int ExecuteNonQuery(string cmdText, params object[] commandParameters)
- {
- SQLiteCommand command = new SQLiteCommand();
- using (SQLiteConnection connection = GetSQLiteConnection())
- {
- PrepareCommand(command, connection, cmdText, commandParameters);
- return command.ExecuteNonQuery();
- }
- }
-
- ///
- /// 返回表集合
- ///
- /// 执行语句
- /// 传入的参数
- /// 返回DataSet
- public DataSet ExecuteDataset(string cmdText, params object[] commandParameters)
- {
- Console.WriteLine(cmdText);
- DataSet ds = new DataSet();
- SQLiteCommand command = new SQLiteCommand();
- using (SQLiteConnection connection = GetSQLiteConnection())
- {
- PrepareCommand(command, connection, cmdText, commandParameters);
- SQLiteDataAdapter da = new SQLiteDataAdapter(command);
-
- da.Fill(ds);
- }
- return ds;
- }
-
- ///
- /// 返回SqlDataReader对象
- ///
- /// 执行语句
- /// 传入的参数
- /// 返回SQLiteDataReader
- public SQLiteDataReader ExecuteReader(string cmdText, params object[] commandParameters)
- {
- SQLiteCommand command = new SQLiteCommand();
- SQLiteConnection connection = GetSQLiteConnection();
- try
- {
- PrepareCommand(command, connection, cmdText, commandParameters);
- SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
- return reader;
- }
- catch
- {
- connection.Close();
- throw;
- }
- }
-
- ///
- /// 返回表第一行
- ///
- /// 执行语句
- /// 传入的参数
- /// 返回:第一行
- public DataRow ExecuteDataRow(string cmdText, params object[] commandParameters)
- {
- DataSet ds = ExecuteDataset(cmdText, commandParameters);
- if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
- return ds.Tables[0].Rows[0];
- return null;
- }
-
- ///
- /// 返回结果集中的第一行第一列,忽略其他行或列
- ///
- /// 执行语句
- /// 传入的参数
- /// 返回:第一行第一列
- public object ExecuteScalar(string cmdText, params object[] commandParameters)
- {
- SQLiteCommand cmd = new SQLiteCommand();
- using (SQLiteConnection connection = GetSQLiteConnection())
- {
- PrepareCommand(cmd, connection, cmdText, commandParameters);
- return cmd.ExecuteScalar();
- }
- }
-
- #endregion
-
-
- #region advanced method
-
- ///
- /// 插入表数据
- ///
- /// 数据类型
- /// 表名
- /// 数据集合
- /// true或false
- public bool BatchInsert(string tableName, List dataList)
- {
- try
- {
- if (dataList != null && dataList.Count > 0)
- {
- foreach (var temp in dataList)
- {
- //var temp = dataList[0];
- PropertyInfo[] propertyInfos = temp.GetType().GetProperties();
- List propertyStrs = new List();
- string propertyStr = "";
- string propertyName = "";
- foreach (var propertyInfo in propertyInfos)
- {
- propertyStrs.Add(propertyInfo.Name);
- propertyStr = propertyStr + "@" + propertyInfo.Name + ",";
- propertyName = propertyName + propertyInfo.Name + ",";
- }
- //Console.WriteLine(propertyName);
- propertyStr = propertyStr.Remove(propertyStr.Length - 1);
- propertyName = propertyName.Remove(propertyName.Length - 1);
- //Console.WriteLine(propertyName);
- using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
- {
- using (SQLiteCommand command = new SQLiteCommand(conn))
- {
- command.Connection.Open();
- using (SQLiteTransaction transaction = conn.BeginTransaction())
- {
- command.Transaction = transaction;
- command.CommandText = "insert into " + tableName + "(" + propertyName + ")" + " values(" + propertyStr + ")";
- foreach (var needInsertData in dataList)
- {
- command.Parameters.Clear();
- for (int i = 0; i < propertyStrs.Count; i++)
- {
- command.Parameters.AddWithValue("@" + propertyStrs[i], propertyInfos[i].GetValue(needInsertData, null));
- }
- command.ExecuteNonQuery();
- }
- transaction.Commit();
- }
- }
- }
- }
- }
- }
- catch (Exception ex)
- {
- logger.Error(GetType(),ex);
- return false;
- }
- return true;
- }
-
- ///
- /// 删除表数据
- ///
- /// 表名
- /// true或false
- public bool DeleteTableData(string tableName)
- {
- try
- {
- using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
- {
- using (SQLiteCommand command = new SQLiteCommand(conn))
- {
- command.Connection.Open();
- command.CommandText = "delete from " + tableName;
- command.ExecuteNonQuery();
- }
- }
- }
- catch (Exception)
- {
- return false;
- }
- return true;
- }
-
- ///
- /// 获取数据库中所有的表名
- ///
- /// tables
- public string[] getTables()
- {
- DataSet ds = ExecuteDataset("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;");
- if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
- {
- string[] tables = new string[ds.Tables[0].Rows.Count-1];
- for (int i = 0; i < ds.Tables[0].Rows.Count-1; i++)
- {
- Console.WriteLine(ds.Tables[0].Rows[i].ItemArray[0]);
- tables[i] = ds.Tables[0].Rows[i].ItemArray[0].ToString();
-
- }
- return tables;
- }
- else
- {
- return null;
- }
- }
-
- ///
- /// 获取表中Tag
- ///
- ///
- /// string[] tag
- public string[] getTag(string TableName)
- {
- DataSet ds = ExecuteDataset("SELECT tag FROM memory_info group by tag;");
- logger.Info(this.GetType(), "getTag------ds数据:" + ds.Tables.Count + ":" + ds.Tables[0].Rows.Count);
- if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
- {
- string[] taglist = new string[ds.Tables[0].Rows.Count];
- for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
- {
- taglist[i] = ds.Tables[0].Rows[i].ItemArray[0].ToString();
- }
- return taglist;
- }
- else
- {
- return null;
- }
- }
- #endregion
- }
-}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SQLite;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DAL
+{
+ ///
+ /// SQLite数据库帮助类
+ ///
+ public class SQLiteHelper
+ {
+ ///
+ /// ConnectionString样例:Data Source=Test.db;Pooling=true;FailIfMissing=false
+ ///
+ private readonly string m_ConnectionString;
+
+ ///
+ /// 静态构造函数,初始化连接字符串,检查数据库连接
+ ///
+ public SQLiteHelper(string m_DataSource)
+ {
+ if(m_DataSource.Length == 0)
+ {
+ Debug.WriteLine("创建数据库出错:m_DataSource.Length == 0");
+ throw (new System.ArgumentException());
+ }
+ try
+ {
+ SQLiteConnectionStringBuilder connectionStringBuilder = new SQLiteConnectionStringBuilder
+ {
+ Version = 3,
+ Pooling = true,
+ FailIfMissing = false,
+ DataSource = m_DataSource
+ };
+ m_ConnectionString = connectionStringBuilder.ConnectionString;
+ using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
+ {
+ //验证数据库文件是否存在
+ if (System.IO.File.Exists(m_DataSource) == false)
+ {
+ //创建数据库文件
+ SQLiteConnection.CreateFile(m_DataSource);
+ }
+ //打开数据连接
+ conn.Open();
+ //if (IsExistsTable("memory_info"))
+ //{
+ // if (!IsExistsColumn("memory_info", "TcpSndFlow"))
+ // {
+ // //创建命令
+ // SQLiteCommand cmd1 = new SQLiteCommand("alter table memory_info add column TcpSndFlow int default 0;", conn);
+ // //执行命令
+ // cmd1.ExecuteNonQuery();
+ // }
+ // if (!IsExistsColumn("memory_info", "TcpRcvFlow"))
+ // {
+ // //创建命令
+ // SQLiteCommand cmd2 = new SQLiteCommand("alter table memory_info add column TcpRcvFlow int default 0;", conn);
+ // //执行命令
+ // cmd2.ExecuteNonQuery();
+ // }
+ //}
+ //else
+ //{
+ // string query = "CREATE TABLE IF NOT EXISTS process_info(id INTEGER PRIMARY KEY AUTOINCREMENT,Tag NOT NULL,Pid INT NOT NULL,processname NOT NULL,Cpu REAL NOT NULL,PrivateSS INT NOT NULL,TcpSndFlow INT NOT NULL,TcpRcvFlow INT NOT NULL,AddTime TIMESTAMP default (datetime('now', 'localtime')));";
+ // //创建命令
+ // SQLiteCommand cmd3 = new SQLiteCommand(query, conn);
+ // //执行命令
+ // cmd3.ExecuteNonQuery();
+ //}
+ //string query = "CREATE TABLE IF NOT EXISTS memory_info(id INTEGER PRIMARY KEY AUTOINCREMENT,tag NOT NULL,pid INT NOT NULL,name NOT NULL,cpu REAL NOT NULL,private_ss INT NOT NULL,add_time TIMESTAMP default (datetime('now', 'localtime')));";
+ string query = "CREATE TABLE IF NOT EXISTS process_info(id INTEGER PRIMARY KEY AUTOINCREMENT,Tag NOT NULL,Pid INT NOT NULL,processname NOT NULL,Cpu REAL NOT NULL,PrivateSS INT NOT NULL,TcpSndFlow INT NOT NULL,TcpRcvFlow INT NOT NULL,AddTime TIMESTAMP default (datetime('now', 'localtime')));";
+ //创建命令
+ SQLiteCommand cmd3 = new SQLiteCommand(query, conn);
+ //执行命令
+ cmd3.ExecuteNonQuery();
+ }
+ }
+ catch (Exception createex)
+ {
+ Debug.WriteLine("异常信息:" + createex.Message);
+ throw createex;
+ }
+ }
+
+ #region basic method
+
+ ///
+ /// 获得连接对象
+ ///
+ ///
+ private SQLiteConnection GetSQLiteConnection()
+ {
+ return new SQLiteConnection(m_ConnectionString);
+ }
+
+ ///
+ /// 预备命令
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] commandParameters)
+ {
+ if (conn.State != ConnectionState.Open)
+ {
+ conn.Open();
+ }
+ cmd.Parameters.Clear();
+ cmd.Connection = conn;
+ cmd.CommandText = cmdText;
+ cmd.CommandType = CommandType.Text;
+ cmd.CommandTimeout = 30;
+ if (commandParameters != null)
+ {
+ foreach (object parm in commandParameters)
+ cmd.Parameters.AddWithValue(string.Empty, parm);
+
+ //for (int i = 0; i < p.Length; i++)
+ // cmd.Parameters[i].Value = p[i];
+ }
+ }
+
+ ///
+ /// 返回受影响的行数
+ ///
+ /// 执行语句
+ /// 传入的参数
+ /// 返回受影响行数
+ public int ExecuteNonQuery(string cmdText, params object[] commandParameters)
+ {
+ SQLiteCommand command = new SQLiteCommand();
+ using (SQLiteConnection connection = GetSQLiteConnection())
+ {
+ PrepareCommand(command, connection, cmdText, commandParameters);
+ return command.ExecuteNonQuery();
+ }
+ }
+
+ ///
+ /// 返回表集合
+ ///
+ /// 执行语句
+ /// 传入的参数
+ /// 返回DataSet
+ public DataSet ExecuteDataset(string cmdText, params object[] commandParameters)
+ {
+ Debug.WriteLine(cmdText);
+ DataSet ds = new DataSet();
+ SQLiteCommand command = new SQLiteCommand();
+ using (SQLiteConnection connection = GetSQLiteConnection())
+ {
+ PrepareCommand(command, connection, cmdText, commandParameters);
+ SQLiteDataAdapter da = new SQLiteDataAdapter(command);
+ da.Fill(ds);
+ }
+ Debug.WriteLine("return ds............................");
+ return ds;
+ }
+
+ ///
+ /// 返回SqlDataReader对象
+ ///
+ /// 执行语句
+ /// 传入的参数
+ /// 返回SQLiteDataReader
+ public SQLiteDataReader ExecuteReader(string cmdText, params object[] commandParameters)
+ {
+ SQLiteCommand command = new SQLiteCommand();
+ SQLiteConnection connection = GetSQLiteConnection();
+ try
+ {
+ PrepareCommand(command, connection, cmdText, commandParameters);
+ SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
+ return reader;
+ }
+ catch (Exception readerex)
+ {
+ connection.Close();
+ throw readerex;
+ }
+ }
+
+ ///
+ /// 返回表第一行
+ ///
+ /// 执行语句
+ /// 传入的参数
+ /// 返回:第一行
+ public DataRow ExecuteDataRow(string cmdText, params object[] commandParameters)
+ {
+ DataSet ds = ExecuteDataset(cmdText, commandParameters);
+ if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
+ return ds.Tables[0].Rows[0];
+ return null;
+ }
+
+ ///
+ /// 返回结果集中的第一行第一列,忽略其他行或列
+ ///
+ /// 执行语句
+ /// 传入的参数
+ /// 返回:第一行第一列
+ public object ExecuteScalar(string cmdText, params object[] commandParameters)
+ {
+ SQLiteCommand cmd = new SQLiteCommand();
+ using (SQLiteConnection connection = GetSQLiteConnection())
+ {
+ PrepareCommand(cmd, connection, cmdText, commandParameters);
+ return cmd.ExecuteScalar();
+ }
+ }
+
+ #endregion
+
+
+ #region advanced method
+
+ ///
+ /// 插入表数据
+ ///
+ /// 数据类型
+ /// 表名
+ /// 数据集合
+ /// true或false
+ public bool BatchInsert(string tableName, List dataList)
+ {
+ try
+ {
+ if (dataList != null && dataList.Count > 0)
+ {
+ foreach (var temp in dataList)
+ {
+ //var temp = dataList[0];
+ PropertyInfo[] propertyInfos = temp.GetType().GetProperties();
+ List propertyStrs = new List();
+ string propertyStr = "";
+ string propertyName = "";
+ foreach (var propertyInfo in propertyInfos)
+ {
+ propertyStrs.Add(propertyInfo.Name);
+ propertyStr = propertyStr + "@" + propertyInfo.Name + ",";
+ propertyName = propertyName + propertyInfo.Name + ",";
+ }
+ //Debug.WriteLine(propertyName);
+ propertyStr = propertyStr.Remove(propertyStr.Length - 1);
+ propertyName = propertyName.Remove(propertyName.Length - 1);
+ //Debug.WriteLine(propertyName);
+ using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
+ {
+ using (SQLiteCommand command = new SQLiteCommand(conn))
+ {
+ command.Connection.Open();
+ using (SQLiteTransaction transaction = conn.BeginTransaction())
+ {
+ command.Transaction = transaction;
+ command.CommandText = "insert into " + tableName + "(" + propertyName + ")" + " values(" + propertyStr + ")";
+ foreach (var needInsertData in dataList)
+ {
+ command.Parameters.Clear();
+ for (int i = 0; i < propertyStrs.Count; i++)
+ {
+ command.Parameters.AddWithValue("@" + propertyStrs[i], propertyInfos[i].GetValue(needInsertData, null));
+ }
+ command.ExecuteNonQuery();
+ }
+ transaction.Commit();
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine("插入数据至数据库出错:" + ex.Data+ex.Message);
+ throw ex;
+ }
+ return true;
+ }
+
+ ///
+ /// 删除表数据
+ ///
+ /// 表名
+ /// true或false
+ public bool DeleteTableData(string tableName)
+ {
+ try
+ {
+ using (SQLiteConnection conn = new SQLiteConnection(m_ConnectionString))
+ {
+ using (SQLiteCommand command = new SQLiteCommand(conn))
+ {
+ command.Connection.Open();
+ command.CommandText = "delete from " + tableName;
+ command.ExecuteNonQuery();
+ }
+ }
+ }
+ catch (Exception deleteex)
+ {
+ throw deleteex;
+ }
+ return true;
+ }
+
+
+ ///
+ /// 判断表中是否存在对应名字的列
+ ///
+ /// 需要判断的表名
+ /// 需要判断的列名
+ /// true or false
+ private bool IsExistsColumn(string TableName, string ColumnName)
+ {
+ DataSet ds = ExecuteDataset("select * from sqlite_master where name='"+TableName+"' and sql like '%"+ColumnName+"%';");
+ if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ ///
+ /// 判断数据库中是否存在对应名字的表
+ ///
+ ///
+ /// true or false
+ private bool IsExistsTable(string TableName)
+ {
+ DataSet ds = ExecuteDataset("select * from sqlite_master where name='" + TableName + "';");
+ if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
+ {
+ return true;
+ }
+ return false;
+ }
+ #endregion
+ }
+}
diff --git a/RAMMonitoringTools/packages.config b/DAL/packages.config
similarity index 62%
rename from RAMMonitoringTools/packages.config
rename to DAL/packages.config
index 53ee880199d02ca5db6edbe00ed4e02a850d1135..74ab965a1b836752923bbaedaf4c6a6e2da28aea 100644
--- a/RAMMonitoringTools/packages.config
+++ b/DAL/packages.config
@@ -1,9 +1,8 @@
-
-
-
+
+
\ No newline at end of file
diff --git a/Model/ChooseInfo.cs b/Model/ChooseInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a2864cf125d81c089772aeb2a116d80583b9b4c3
--- /dev/null
+++ b/Model/ChooseInfo.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Model
+{
+ ///
+ /// 进程选项实体
+ ///
+ public class ChooseInfo
+ {
+ ///
+ /// 进程ID
+ ///
+ public int Pid { set; get; }
+
+ ///
+ /// 进程名称
+ ///
+ public string ChooseName { set; get; }
+
+ ///
+ /// 进程所属用户名称
+ ///
+ public string UserName { set; get; }
+
+ ///
+ /// 获取进程选项属性字符串
+ ///
+ /// 属性字符串
+ public string GetString()
+ {
+ return "pid:" + Pid + "\nname:" + ChooseName + "\nUsername:" + UserName;
+ }
+ }
+}
diff --git a/Model/DeviceInfo.cs b/Model/DeviceInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1babc5e7402af9fe76d90b863d5818e28944f9d4
--- /dev/null
+++ b/Model/DeviceInfo.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Model
+{
+ ///
+ /// 设备基础信息实体
+ ///
+ public class DeviceInfo
+ {
+ ///
+ /// 设备ID
+ ///
+ public string DeviceId { set; get; }
+
+ ///
+ /// 设备品牌
+ ///
+ public string DeviceBrand{set;get;}
+
+ ///
+ /// 设备型号
+ ///
+ public string DeviceModel { set; get; }
+
+ ///
+ /// 设备系统SDK版本
+ ///
+ public int DeviceSDKVersion { set; get; }
+
+ ///
+ /// 设备系统API版本
+ ///
+ public string DeviceReleaseVersion { set; get; }
+
+ ///
+ /// 设备屏幕分辨率宽
+ ///
+ public int DeviceResolutionW { set; get; }
+
+ ///
+ /// 设备屏幕分辨率高
+ ///
+ public int DeviceResolutionH { set; get; }
+
+
+ ///
+ /// 获取设备基础信息属性字符串
+ ///
+ ///
+ public string GetString()
+ {
+ return "DeviceId:" + DeviceId + "\nDeviceBrand:" + DeviceBrand + "\nDeviceModel:" + DeviceModel + "\nDeviceSDKVersion:" + DeviceSDKVersion + "\nDeviceReleaseVersion:" + DeviceReleaseVersion + "\nDeviceResolutionW:" + DeviceResolutionW + "\nDeviceResolutionH:" + DeviceResolutionH;
+ }
+ }
+}
diff --git a/Model/IPPropertiesInfo.cs b/Model/IPPropertiesInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0c479ebe6c65232f55460129dde5862a8c539201
--- /dev/null
+++ b/Model/IPPropertiesInfo.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Model
+{
+ ///
+ /// IP配置信息实体类
+ ///
+ public class IPPropertiesInfo
+ {
+ ///
+ /// IP地址
+ ///
+ public string IP { set; get; }
+
+ ///
+ /// 子网掩码
+ ///
+ public string SubMark { set; get; }
+
+ ///
+ /// 默认网关
+ ///
+ public string GateWay { set; get; }
+
+ ///
+ /// 主DNS
+ ///
+ public string DNS1 { set; get; }
+
+ ///
+ /// 备DNS
+ ///
+ public string DNS2 { set; get; }
+
+ ///
+ /// 网络设备列表
+ ///
+ public List NetDeviceList { set; get; }
+ }
+}
\ No newline at end of file
diff --git a/Model/Model.csproj b/Model/Model.csproj
new file mode 100644
index 0000000000000000000000000000000000000000..ed5ecc88d1a158676ce9c198b36e68992cd2f8fc
--- /dev/null
+++ b/Model/Model.csproj
@@ -0,0 +1,77 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}
+ Library
+ Properties
+ Model
+ Model
+ v4.5
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ bin\Debug\Model.XML
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE
+ bin\Debug\Model.XML
+ full
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Model/ProcessInfo.cs b/Model/ProcessInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a9cf9dc4336586df58f5e9246d35078bd8104d83
--- /dev/null
+++ b/Model/ProcessInfo.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Model
+{
+ ///
+ /// 进程信息实体
+ ///
+ public class ProcessInfo
+ {
+ ///
+ /// 记录标签
+ ///
+ public string Tag{set; get;}
+
+ ///
+ /// 进程ID
+ ///
+ public int Pid{set; get;}
+
+ ///
+ /// 进程名称
+ ///
+ public string ProcessName { set; get; }
+
+ ///
+ /// 进程CPU
+ ///
+ public float Cpu{set; get;}
+
+ ///
+ /// 进程内存
+ ///
+ public double PrivateSS { set; get; }
+
+ ///
+ /// 进程上行流量
+ ///
+ public double TcpSndFlow { set; get; }
+
+ ///
+ /// 进程下行流量
+ ///
+ public double TcpRcvFlow { set; get; }
+
+ ///
+ /// 获取进程属性字符串
+ ///
+ ///
+ public String GetString()
+ {
+ return "TAG:" + Tag + "\nPID:" + Pid + "\nProcessName:" + ProcessName + "\nCPU:" + Cpu + "\nPSS:" + PrivateSS + "\nTcpSndFlow:" + TcpSndFlow + "\nTcpRcvFlow:" + TcpRcvFlow;
+ }
+ }
+}
diff --git a/Model/Properties/AssemblyInfo.cs b/Model/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f03dd29df72c9611ff62295901a30557c4d6884c
--- /dev/null
+++ b/Model/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的常规信息通过以下
+// 特性集控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("Model")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Model")]
+[assembly: AssemblyCopyright("Copyright © 2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 使此程序集中的类型
+// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
+// 则将该类型上的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("e894de24-f68a-4543-a8d8-8b224b6d0c62")]
+
+// 程序集的版本信息由下面四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.1")]
+[assembly: AssemblyFileVersion("1.1")]
diff --git a/Model/SelectProcessInfo.cs b/Model/SelectProcessInfo.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a064256272f987c92a47f0faa3688266e6a40757
--- /dev/null
+++ b/Model/SelectProcessInfo.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Model
+{
+ ///
+ /// 进程信息查询实体,继承自ProcessInfo
+ ///
+ public class SelectProcessInfo : ProcessInfo
+ {
+ ///
+ /// 记录ID
+ ///
+ public int Id { set; get; }
+
+ ///
+ /// 记录添加时间
+ ///
+ public string AddTime { set; get; }
+
+ ///
+ /// 获取进程信息查询类属性字符串
+ ///
+ ///
+ public new string GetString()
+ {
+ return "ID:" + Id + "\nTAG:" + Tag + "\nPID:" + Pid + "\nProcessName:" + ProcessName + "\nCPU:" + Cpu + "\nPSS:" + PrivateSS + "\nAddTime:" + AddTime + "\nTcpSndFlow:" + TcpSndFlow + "\nTcpRcvFlow:" + TcpRcvFlow;
+ }
+ }
+}
diff --git a/RAMMonitoringTools.sln b/RAMMonitoringTools.sln
deleted file mode 100644
index 83e6d9f9dc8a388c35dfd7299fda95a3f20c9b43..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools.sln
+++ /dev/null
@@ -1,23 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.21005.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RAMMonitoringTools", "RAMMonitoringTools\RAMMonitoringTools.csproj", "{B157E5C3-2082-4F2E-BF8C-A3065DC130AF}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Any CPU.Build.0 = Release|Any CPU
- {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Any CPU.Deploy.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/RAMMonitoringTools/ChooseList.cs b/RAMMonitoringTools/ChooseList.cs
deleted file mode 100644
index 156fea3f537943b51b0144a7cd194ed59492a42d..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/ChooseList.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace RAMMonitoringTools
-{
- class ChooseList
- {
- private int pid;
-
- public int Pid
- {
- get { return pid; }
- set { pid = value; }
- }
- private string name;
-
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- private string username;
-
- public string Username
- {
- get { return username; }
- set { username = value; }
- }
- public new void ToString()
- {
- Console.WriteLine("pid:" + pid + "\nname:" + name + "\nUsername:" + Username);
- }
- }
-}
diff --git a/RAMMonitoringTools/Config/log4net.config b/RAMMonitoringTools/Config/log4net.config
deleted file mode 100644
index d4e16798921d5b31775d3c382b307bf032fcf615..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/Config/log4net.config
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/RAMMonitoringTools/GetAppInfo.cs b/RAMMonitoringTools/GetAppInfo.cs
deleted file mode 100644
index d78787c1b5947e56da90267deafcfa640cf3ac42..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/GetAppInfo.cs
+++ /dev/null
@@ -1,329 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Text;
-using System.Threading;
-using System.IO;
-using RAMMonitoringTools.utils;
-
-namespace RAMMonitoringTools
-{
- class GetAppInfo
- {
- ///
- /// 获取APP信息
- ///
- ///
- ///
- /// 返回memoryinfo对象
- public static MemoryInfo GetInfo(int pid,string packagename,int sdkversion)
- {
- MemoryInfo memoryinfo = new MemoryInfo();
- string[] cp = GetCPUandPID(pid,packagename, sdkversion);
- if (cp == null)
- {
- logger.Info(cp.GetType(),"GetInfo() cp is null!");
- return null;
- }
- Console.WriteLine("cp0PID="+cp[0]+"-cp1CPU="+cp[1]+ "-cp2PageName="+ cp[2]);
- memoryinfo.Private_ss = GetRss(pid,packagename);
- if (cp != null && memoryinfo.Private_ss != 0)
- {
- memoryinfo.Name = cp[2];
- memoryinfo.Pid = int.Parse(cp[0]);
- memoryinfo.Cpu = int.Parse(cp[1]);
- }
- else
- {
- logger.Info(memoryinfo.GetType(), "GetInfo()--memoryinfo is null!");
- memoryinfo = null;
- }
- return memoryinfo;
- }
-
- ///
- /// 获取手机进程信息
- ///
- /// List>
- public static List> GetPs()
- {
- Console.WriteLine("当前工作目录:" + System.IO.Directory.GetCurrentDirectory());
- string str = Execute(".\\adb\\adb.exe shell top -n 1 |findstr com", 100);
- //Console.WriteLine("GetPs:" + str + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
- logger.Info(str.GetType(), "GetPs");
- if (str.IndexOf("不是内部或外部命令,也不是可运行的程序或批处理文件。") != -1)
- {
- logger.Info(str.GetType(), "GetPs()--str = " + str);
- return null;
- }
- if (str.Length > 150)
- {
- List> pslist = new List> { };
- using (StringReader sr = new StringReader(str))
- {
- string line;
- try
- {
- while (sr.Peek() > -1)
- {
- line = sr.ReadLine().Trim();
- //Console.WriteLine("Ps----line行:"+line);
- string[] sArray = line.Split(' ');
- List sList = new List{ };
- foreach (string s in sArray)
- {
- //Console.WriteLine(s);
- if (!string.IsNullOrEmpty(s))
- {
- sList.Add(s);
- }
- }
- pslist.Add(sList);
- }
- sr.Close();
- return pslist;
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Data+e.Message);
- logger.Info(e.GetType(), "ErrorMessage:" + e.Data + e.Message);
- sr.Close();
- return null;
- }
- }
- }
- else
- {
- Console.WriteLine("str.len小于150,str = "+ str);
- return null;
- }
- }
-
- ///
- /// 获取系统release version
- ///
- /// release version
- public static string GetReleaseVersion()
- {
- string command = ".\\adb\\adb.exe shell getprop ro.build.version.release";
- string str = Execute(command, 10);
- if (str.IndexOf("不是内部或外部命令,也不是可运行的程序或批处理文件。") != -1)
- {
- logger.Info(str.GetType(), "GetReleaseVersion()--str = " + str);
- return null;
- }
- if (str.Trim().Length > 0 && str.Trim().Length < 8)
- {
- return str.Trim();
- }
- else
- {
- logger.Info(str.GetType(), "GetReleaseVersion()--str = " + str);
- }
- return null;
- }
-
- ///
- /// 获取系统sdk version
- ///
- /// sdk version
- public static int GetSdkVersion() {
- string command = ".\\adb\\adb.exe shell getprop ro.build.version.sdk";
- string str = Execute(command, 10);
- if (str.IndexOf("不是内部或外部命令,也不是可运行的程序或批处理文件。") != -1)
- {
- logger.Info(str.GetType(), "GetSdkVersion()--str = " + str);
- return 0;
- }
- if (str.Trim().Length > 0 && str.Trim().Length <= 3)
- {
- try
- {
- return int.Parse(str.Trim());
- }
- catch (Exception e2)
- {
- logger.Info(e2.GetType(), "GetSdkVersion()--str = " + str);
- return 0;
- }
- }
- else
- {
- logger.Info(str.GetType(), "GetSdkVersion()--str = " + str);
- }
- return 0;
- }
-
- ///
- /// 获取APP内存信息
- ///
- ///
- ///
- /// 返回内存信息KB;pss
- public static int GetRss(int pid,string packagename)
- {
- string command = ".\\adb\\adb.exe shell dumpsys meminfo ";
- if (pid == -1)
- {
- command += packagename;
- }
- else
- {
- command += pid;
- }
- string str = Execute(command,10);
- //Console.WriteLine("GetRss:"+str + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"PID:"+pid);
- if (str.IndexOf("不是内部或外部命令,也不是可运行的程序或批处理文件。") != -1)
- {
- return 0;
- }
- if (str.Length > 100)
- {
- using (StringReader sr = new StringReader(str))
- {
- string line;
- //int lineIndex = 0;
- try
- {
- do
- {
- line = sr.ReadLine().Trim();
- //Console.WriteLine("行{0}:{1}", ++lineIndex, line);
- } while (!line.StartsWith("TOTAL"));
- string[] sArray = line.Split(' ');
- List sList = new List { };
- foreach (string s in sArray)
- {
- //Console.WriteLine(s);
- if (!string.IsNullOrEmpty(s))
- {
- sList.Add(s);
- }
- }
- sr.Close();
- return int.Parse(sList[1]) / 1024;
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Data+e.Message);
- logger.Info(e.GetType(), "ErrorMessage:" + e.Data + e.Message);
- sr.Close();
- return 0;
- }
- }
- //int.Parse();
- }
- else
- {
- return 0;
- }
- }
-
- ///
- /// 获取APP cpu及pid信息
- ///
- ///
- ///
- /// 返回cpu及pid int数组 0:pid 1:cpu
- public static string[] GetCPUandPID(int pid, string packagename, int sdkversion)
- {
- //cp[0]:pid,cp[1]:cpu,cp[2]:packagename
- string[] cp = new string[3];
- string str = Execute(".\\adb\\adb.exe shell top -n 1 |findstr " + pid,10);
- //Console.WriteLine("GetCPUandPID:"+str + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
- if (str.IndexOf("不是内部或外部命令,也不是可运行的程序或批处理文件。") != -1)
- {
- logger.Info(str.GetType(), "GetCPUandPID()--str = " + str);
- return cp;
- }
- string[] sArray=str.Split(' ');// 一定是单引
- List sList = new List { };
- foreach (string s in sArray)
- {
- if (!string.IsNullOrEmpty(s))
- {
- //Console.WriteLine(s);
- sList.Add(s);
- }
- }
- if (sList.Count >= 3)
- {
- if (sdkversion> 0 && sdkversion < 24)
- {
- cp[0] = sList[0];
- cp[1] = sList[2].Remove(sList[2].Length - 1, 1);
- cp[2] = sList[sList.Count - 1];
- }
- else if (sdkversion < 26)
- {
- cp[0] = sList[0];
- cp[1] = sList[4].Remove(sList[4].Length - 1, 1);
- cp[2] = sList[sList.Count - 1];
- }
- else
- {
- cp[0] = sList[0];
- cp[1] = sList[8].Remove(sList[8].Length - 1, 1);
- cp[2] = sList[sList.Count - 1];
- }
- }
- return cp;
- }
-
- //dosCommand Dos命令语句
- //public static string Execute(string dosCommand,int seconds)
- //{
- // return Execute(dosCommand, 1000);
- //}
-
- ///
- /// 执行DOS命令,返回DOS命令的输出
- ///
- /// dos命令
- /// 等待命令执行的时间(单位:毫秒)如果设定为0,则无限等待
- /// 返回DOS命令的输出
- private static string Execute(string command, int seconds)
- {
- string output = ""; //输出字符串
- if (command != null && !command.Equals(""))
- {
- Process process = new Process();//创建进程对象
- ProcessStartInfo startInfo = new ProcessStartInfo();
- startInfo.FileName = "cmd.exe";//设定需要执行的命令
- startInfo.Arguments = "/C " + command;//“/C”表示执行完命令后马上退出
- startInfo.UseShellExecute = false;//不使用系统外壳程序启动
- startInfo.RedirectStandardInput = false;//不重定向输入
- startInfo.RedirectStandardOutput = true; //重定向输出
- startInfo.CreateNoWindow = true;//不创建窗口
- process.StartInfo = startInfo;
- try
- {
- if (process.Start())//开始进程
- {
- if (seconds == 0)
- {
- process.WaitForExit();//这里无限等待进程结束
- }
- else
- {
- process.WaitForExit(seconds); //等待进程结束,等待时间为指定的毫秒
- }
- output = process.StandardOutput.ReadToEnd();//读取进程的输出
- }
- }
- catch(Exception e)
- {
- Console.WriteLine(e.Data + e.Message);
- logger.Info(e.GetType(), "ErrorMessage:" + e.Data + e.Message);
- }
- finally
- {
- if (process != null)
- process.Close();
- }
- }
- return output;
- }
- }
-}
diff --git a/RAMMonitoringTools/GetPsInfo.cs b/RAMMonitoringTools/GetPsInfo.cs
deleted file mode 100644
index d94297bcb78a95de1153f5a69ed444153867028a..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/GetPsInfo.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using System.Threading;
-using RAMMonitoringTools.utils;
-
-namespace RAMMonitoringTools
-{
- class GetPsInfo
- {
- ///
- /// 获取PC进程信息
- ///
- /// 进程id
- /// CPU计算间隔时间(毫秒)未设置默认为1000。
- ///
- public static MemoryInfo GetInfo(int pid, int interval)
- {
- //int psuss = 0;
- //int uss = 0;
- int pruss = 0;
- MemoryInfo memoryinfo = new MemoryInfo();
-
- //该程序可以实时监控所有进程或者指定进程的工作集、私有工作集
- //新建一个Stopwatch变量用来统计程序运行时间
- //Stopwatch watch = Stopwatch.StartNew();
- try
- {
- Process ps = Process.GetProcessById(pid);
- //PerformanceCounter pf1 = new PerformanceCounter("Process", "Working Set - Private", ps.ProcessName);
- //PerformanceCounter pf2 = new PerformanceCounter("Process", "Working Set", ps.ProcessName);
- ////Console.WriteLine("---------------------------------------------------------------------------");
- ////Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "工作集(进程类)", ps.WorkingSet64 / 1024);
- //psuss = (int)ps.WorkingSet64 / 1024;
- ////Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "工作集 ", pf2.NextValue() / 1024);
- //uss = (int)pf2.NextValue() / 1024;
- //私有工作集
- ////Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "私有工作集 ", pf1.NextValue() / 1024);
- //Console.WriteLine("---------------------------------------------------------------------------");
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PagedMemorySize64:分页内存量:\n", ps.PagedMemorySize64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PrivateMemorySize64:专用内存量:\n", ps.PrivateMemorySize64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PagedSystemMemorySize64:可分页系统内存量:\n", ps.PagedSystemMemorySize64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "WorkingSet64:物理内存量:\n", ps.WorkingSet64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "VirtualMemorySize64:虚拟内存量:\n", ps.VirtualMemorySize64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PeakPagedMemorySize64:虚拟内存分页文件中的最大内存量:\n", ps.PeakPagedMemorySize64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PeakVirtualMemorySize64:最大虚拟内存量:\n", ps.PeakVirtualMemorySize64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "PeakWorkingSet64:最大物理内存量:\n", ps.PeakWorkingSet64 / 1024);
- //Console.WriteLine("{0}:{1} {2:N}KB", ps.ProcessName, "NonpagedSystemMemorySize64:非分页系统内存量:\n", ps.NonpagedSystemMemorySize64 / 1024);
- ps.Refresh();
- //Console.WriteLine("---------------------------------------------------------------------------");
- if (ps.PrivateMemorySize64 > ps.PagedMemorySize64)
- {
- pruss = (int)ps.PrivateMemorySize64 / 1024;
- }
- else
- {
- pruss = (int)ps.PagedMemorySize64 / 1024;
- }
-
- //watch.Stop();
- ////Console.WriteLine(watch.Elapsed);
- //return pruss/1024;
- memoryinfo.Pid = pid;
- memoryinfo.Name = ps.ProcessName;
- memoryinfo.Cpu = UsingProcess(pid,interval);
- memoryinfo.Private_ss = pruss / 1024;
- return memoryinfo;
- }
- catch (SystemException e1)
- {
- logger.Info(e1.GetType(),"ErrorMessage:" +e1.Data + e1.Message);
- return null;
- }
- }
-
- ///
- /// 获取PC进程CPU占用比
- ///
- /// 进程id
- /// CPU计算间隔时间(毫秒)未设置默认为1000。
- ///
- private static float UsingProcess(int pid,int interval)
- {
- //未设置时间直接设置为1000;
- if (interval == 0)
- {
- logger.Info(interval.GetType(),"未设置时间!!!interval=0");
- interval = 1000;
- }
- using (var pro = Process.GetProcessById(pid))
- {
- //上次记录的CPU时间
- var prevCpuTime = TimeSpan.Zero;
-
- //当前时间
- var curTime = pro.TotalProcessorTime;
- //间隔时间内的CPU运行时间除以逻辑CPU数量
- var value = (curTime - prevCpuTime).TotalMilliseconds / interval / Environment.ProcessorCount * 100;
- prevCpuTime = curTime;
- //输出
- //Console.WriteLine(value);
- //双精度强制转换为单精度
- return (float)value;
- }
- }
-
- ///
- /// 获取PC所有进程信息
- ///
- /// List
- public static List GetPCPsList()
- {
- try
- {
- List pslist = Process.GetProcesses().ToList();
- return pslist;
- }
- catch (Exception Ps_e)
- {
- logger.Info(Ps_e.GetType(),"ErrorMessage:" + Ps_e.Data + Ps_e.Message);
- return null;
- }
- }
- }
- }
diff --git a/RAMMonitoringTools/MainChooseForm.cs b/RAMMonitoringTools/MainChooseForm.cs
deleted file mode 100644
index 47b5bb3bf725e8e665692f4fcd3103b0c289e395..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/MainChooseForm.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Diagnostics;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using RAMMonitoringTools.utils;
-using System.Management;
-using System.Threading;
-
-namespace RAMMonitoringTools
-{
- public partial class MainChooseForm : Form
- {
- CancellationTokenSource cts;
- Task t;
- public MainChooseForm(string scene)
- {
- InitializeComponent();
- cts = new CancellationTokenSource();
- t = Task.Factory.StartNew(() => SetData(scene,cts.Token),cts.Token);
- SetSize();
- }
-
- public void Init()
- {
- if (MainChooseDGV.Columns.Count >= 3)
- {
- MainChooseDGV.Columns[0].Width = 100;
- MainChooseDGV.Columns[1].Width = this.Width - 200;
- MainChooseDGV.Columns[2].Width = 100;
- }
-
- }
-
- ///
- /// 设置表格大小
- ///
- private void SetSize()
- {
- flowLayoutPanel1.Height = this.Height - 80;
- flowLayoutPanel1.Width = this.Width -4;
- MainChooseDGV.Height = this.Height - 80;
- MainChooseDGV.Width = this.Width -4;
- Init() ;
- }
-
- ///
- /// 获取并设置表格数据
- ///
- ///
- ///
- private void SetData(string scene, CancellationToken ct)
- {
- if (scene.Equals("APP"))
- {
- List> pslist = GetAppInfo.GetPs();
- List clist = new List();
-
- if (pslist != null && pslist.Count > 1)
- {
- Console.WriteLine("pslist.count:" + pslist.Count);
- for (int i = 0; i < pslist.Count; i++)
- {
- if (ct.IsCancellationRequested)
- {
- Console.WriteLine("IsCancellationRequested");
- return;
- }
- List itemlist = pslist.ElementAt(i);
- if (itemlist.Count > 0)
- {
- try
- {
- ChooseList choose = new ChooseList();
- choose.Pid = int.Parse(itemlist.ElementAt(0));
- choose.Name = itemlist.ElementAt(itemlist.Count - 1);
- choose.Username = itemlist.ElementAt(1);
- clist.Add(choose);
- this.BeginInvoke(new Action(() =>
- {
- int index = MainChooseDGV.Rows.Add();
- MainChooseDGV.Rows[index].Cells[0].Value = choose.Pid;
- MainChooseDGV.Rows[index].Cells[1].Value = choose.Name;
- MainChooseDGV.Rows[index].Cells[2].Value = choose.Username; Init();
- }));
- }
- catch (Exception)
- {
- //解决部分情况下出现的乱码问题
- continue;
- }
- }
- }
- }
- else
- {
- Console.WriteLine("App pslist null!");
- logger.Info(this.GetType(),"App pslist null!");
- }
-
- }
- else if(scene.Equals("PC"))
- {
- List pslist = GetPsInfo.GetPCPsList();
- //List chooseList = Utils.GetProcessUserName(-1);
- List chooseList = new List();
- for (int i = 0; i < pslist.Count; i++)
- {
- if (ct.IsCancellationRequested)
- {
- Console.WriteLine("IsCancellationRequested");
- return;
- }
- Process process = pslist.ElementAt(i);
- ChooseList choose = new ChooseList();
- choose.Pid = process.Id;
- choose.Name = process.ProcessName;
- List usernamelist = Utils.GetProcessUserName(process.Id);
- string username = "";
- if (usernamelist != null && usernamelist.Count > 0)
- {
- username = usernamelist.ElementAt(0).Username;
- }
- if (string.IsNullOrEmpty(username))
- {
- username = "SYSTEM";
- }
- choose.Username = username;
- Console.WriteLine("进程所有者:" + choose.Username);
- this.BeginInvoke(new Action(() =>
- {
- int index = MainChooseDGV.Rows.Add();
- MainChooseDGV.Rows[index].Cells[0].Value = choose.Pid;
- MainChooseDGV.Rows[index].Cells[1].Value = choose.Name;
- MainChooseDGV.Rows[index].Cells[2].Value = choose.Username;
- Init();
- }));
- chooseList.Add(choose);
- }
- }
- else
- {
- logger.Info(this.GetType(),"场景标识错误----Scene:"+ scene);
- MessageBox.Show("场景标识错误!scene:" +scene,"警告",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
- }
- }
-
- ///
- /// 关闭按钮点击事件
- ///
- ///
- ///
- private void btnchooseclose_Click(object sender, EventArgs e)
- {
- if (t.IsCompleted)
- {
- this.Close();
- }
- else
- {
- StopTask(t, cts);
- }
- }
-
- public string ReturnValue { get; protected set; } //用这个公开属性传值
-
- ///
- /// 选择按钮点击事件
- ///
- ///
- ///
- private void btnchooseok_Click(object sender, EventArgs e)
- {
- ReturnValue = MainChooseDGV.SelectedRows[0].Cells[0].Value.ToString();
- if (String.IsNullOrEmpty(ReturnValue))
- {
- MessageBox.Show("请选择你想要使用的pid!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- }
- else
- {
- DialogResult = DialogResult.OK;
- if (t.IsCompleted)
- {
- this.Close();
- }
- else
- {
- StopTask(t, cts);
- }
- }
- }
-
- private void MainChooseForm_Load(object sender, EventArgs e)
- {
-
- }
-
- private void MainChooseDGV_SizeChanged(object sender, EventArgs e)
- {
-
- }
-
- ///
- /// 窗口大小改变事件
- ///
- ///
- ///
- private void MainChooseForm_SizeChanged(object sender, EventArgs e)
- {
- SetSize();
- }
-
- ///
- /// 停止线程并释放线程资源
- ///
- ///
- private void StopTask(Task t, CancellationTokenSource cts)
- {
- cts.Cancel();
- while (true)
- {
- Console.WriteLine("线程状态:" + t.Status);
- if (t.IsCompleted)
- {
- try
- {
- t.Dispose();
- Console.WriteLine(t.Status);
- this.Close();
- break;
- }
- catch (Exception e1)
- {
- Console.WriteLine(e1);
- logger.Info(e1.GetType(),"ChooseForm-线程停止失败-ErrorMessage:" + e1.Data + e1.Message);
- //throw e1;
- }
- }
- }
- }
-
- ///
- /// 点击右上角关闭按钮时事件
- ///
- ///
- ///
- private void MainChooseForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- Console.WriteLine("右上角关闭按钮被点击!!!!!!----------------------------------------------------------");
- if (!t.IsCompleted)
- {
- StopTask(t, cts);
- }
- }
- }
-}
diff --git a/RAMMonitoringTools/MainChooseForm.resx b/RAMMonitoringTools/MainChooseForm.resx
deleted file mode 100644
index f483e336ef58df43449c26e62fcdd7cc776ef973..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/MainChooseForm.resx
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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
-
-
- True
-
-
- True
-
-
- True
-
-
- True
-
-
- True
-
-
- True
-
-
- True
-
-
- True
-
-
\ No newline at end of file
diff --git a/RAMMonitoringTools/MainForm.Designer.cs b/RAMMonitoringTools/MainForm.Designer.cs
deleted file mode 100644
index 8d2ea0a4fc1d6edcb6b1a99ce425e522b2743a4c..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/MainForm.Designer.cs
+++ /dev/null
@@ -1,515 +0,0 @@
-namespace RAMMonitoringTools
-{
- partial class MainForm
- {
- ///
- /// 必需的设计器变量。
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// 清理所有正在使用的资源。
- ///
- /// 如果应释放托管资源,为 true;否则为 false。
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows 窗体设计器生成的代码
-
- ///
- /// 设计器支持所需的方法 - 不要
- /// 使用代码编辑器修改此方法的内容。
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- 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.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
- System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend();
- System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
- this.appchart = new System.Windows.Forms.DataVisualization.Charting.Chart();
- this.Timer = new System.Windows.Forms.Timer(this.components);
- this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();
- this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
- this.webstartbtn = new System.Windows.Forms.Button();
- this.label1 = new System.Windows.Forms.Label();
- this.panel1 = new System.Windows.Forms.Panel();
- this.appchoosebtn = new System.Windows.Forms.Button();
- this.pidchoosebtn = new System.Windows.Forms.Button();
- this.label4 = new System.Windows.Forms.Label();
- this.AppTag = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.PidTag = new System.Windows.Forms.TextBox();
- this.appclearbtn = new System.Windows.Forms.Button();
- this.webclearbtn = new System.Windows.Forms.Button();
- this.appstopbtn = new System.Windows.Forms.Button();
- this.webstopbtn = new System.Windows.Forms.Button();
- this.label2 = new System.Windows.Forms.Label();
- this.appstartbtn = new System.Windows.Forms.Button();
- this.packagenametext = new System.Windows.Forms.TextBox();
- this.pidtext = new System.Windows.Forms.TextBox();
- this.menuStrip = new System.Windows.Forms.MenuStrip();
- this.打开ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.OpenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.SettingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.ExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.ShowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.TopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.DownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.AllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.帮助ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.AboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.AppTimer = new System.Windows.Forms.Timer(this.components);
- this.openFileDialogDB = new System.Windows.Forms.OpenFileDialog();
- ((System.ComponentModel.ISupportInitialize)(this.appchart)).BeginInit();
- this.flowLayoutPanel2.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
- this.panel1.SuspendLayout();
- this.menuStrip.SuspendLayout();
- this.SuspendLayout();
- //
- // appchart
- //
- chartArea1.Name = "ChartArea1";
- this.appchart.ChartAreas.Add(chartArea1);
- legend1.Enabled = false;
- legend1.Name = "Legend1";
- this.appchart.Legends.Add(legend1);
- this.appchart.Location = new System.Drawing.Point(3, 314);
- this.appchart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.appchart.Name = "appchart";
- series1.ChartArea = "ChartArea1";
- series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
- series1.Legend = "Legend1";
- series1.Name = "Series1";
- this.appchart.Series.Add(series1);
- this.appchart.Size = new System.Drawing.Size(1173, 268);
- this.appchart.TabIndex = 3;
- this.appchart.Text = "appchart";
- //
- // Timer
- //
- this.Timer.Tick += new System.EventHandler(this.Timer_Tick);
- //
- // flowLayoutPanel2
- //
- this.flowLayoutPanel2.AutoSize = true;
- this.flowLayoutPanel2.Controls.Add(this.chart);
- this.flowLayoutPanel2.Controls.Add(this.appchart);
- this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
- this.flowLayoutPanel2.Location = new System.Drawing.Point(0, 139);
- this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.flowLayoutPanel2.Name = "flowLayoutPanel2";
- this.flowLayoutPanel2.Size = new System.Drawing.Size(1176, 609);
- this.flowLayoutPanel2.TabIndex = 5;
- this.flowLayoutPanel2.SizeChanged += new System.EventHandler(this.flowLayoutPanel2_SizeChanged);
- //
- // chart
- //
- this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- chartArea2.Name = "ChartArea1";
- this.chart.ChartAreas.Add(chartArea2);
- legend2.Enabled = false;
- legend2.Name = "Legend1";
- this.chart.Legends.Add(legend2);
- this.chart.Location = new System.Drawing.Point(3, 2);
- this.chart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.chart.Name = "chart";
- series2.ChartArea = "ChartArea1";
- series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
- series2.Legend = "Legend1";
- series2.Name = "Series1";
- this.chart.Series.Add(series2);
- this.chart.Size = new System.Drawing.Size(1173, 308);
- this.chart.TabIndex = 4;
- this.chart.Text = "chart";
- //
- // webstartbtn
- //
- this.webstartbtn.AutoSize = true;
- this.webstartbtn.Location = new System.Drawing.Point(762, 39);
- this.webstartbtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.webstartbtn.Name = "webstartbtn";
- this.webstartbtn.Size = new System.Drawing.Size(81, 42);
- this.webstartbtn.TabIndex = 0;
- this.webstartbtn.Text = "启动";
- this.webstartbtn.UseVisualStyleBackColor = true;
- this.webstartbtn.Click += new System.EventHandler(this.StartBtn_Click);
- //
- // label1
- //
- this.label1.Location = new System.Drawing.Point(12, 44);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(128, 30);
- this.label1.TabIndex = 2;
- this.label1.Text = "PC-PID:";
- this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // panel1
- //
- this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
- this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
- this.panel1.Controls.Add(this.appchoosebtn);
- this.panel1.Controls.Add(this.pidchoosebtn);
- this.panel1.Controls.Add(this.label4);
- this.panel1.Controls.Add(this.AppTag);
- this.panel1.Controls.Add(this.label3);
- this.panel1.Controls.Add(this.PidTag);
- this.panel1.Controls.Add(this.appclearbtn);
- this.panel1.Controls.Add(this.webclearbtn);
- this.panel1.Controls.Add(this.appstopbtn);
- this.panel1.Controls.Add(this.webstopbtn);
- this.panel1.Controls.Add(this.label2);
- this.panel1.Controls.Add(this.appstartbtn);
- this.panel1.Controls.Add(this.packagenametext);
- this.panel1.Controls.Add(this.label1);
- this.panel1.Controls.Add(this.webstartbtn);
- this.panel1.Controls.Add(this.pidtext);
- this.panel1.Controls.Add(this.menuStrip);
- this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
- this.panel1.Location = new System.Drawing.Point(0, 0);
- this.panel1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(1176, 139);
- this.panel1.TabIndex = 6;
- //
- // appchoosebtn
- //
- this.appchoosebtn.AutoSize = true;
- this.appchoosebtn.Location = new System.Drawing.Point(368, 87);
- this.appchoosebtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.appchoosebtn.Name = "appchoosebtn";
- this.appchoosebtn.Size = new System.Drawing.Size(81, 42);
- this.appchoosebtn.TabIndex = 16;
- this.appchoosebtn.Text = "选择";
- this.appchoosebtn.UseVisualStyleBackColor = true;
- this.appchoosebtn.Click += new System.EventHandler(this.appchoosebtn_Click);
- //
- // pidchoosebtn
- //
- this.pidchoosebtn.AutoSize = true;
- this.pidchoosebtn.Location = new System.Drawing.Point(368, 39);
- this.pidchoosebtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.pidchoosebtn.Name = "pidchoosebtn";
- this.pidchoosebtn.Size = new System.Drawing.Size(81, 42);
- this.pidchoosebtn.TabIndex = 15;
- this.pidchoosebtn.Text = "选择";
- this.pidchoosebtn.UseVisualStyleBackColor = true;
- this.pidchoosebtn.Click += new System.EventHandler(this.pidchoosebtn_Click);
- //
- // label4
- //
- this.label4.Location = new System.Drawing.Point(483, 93);
- this.label4.Name = "label4";
- this.label4.Size = new System.Drawing.Size(51, 30);
- this.label4.TabIndex = 14;
- this.label4.Text = "Tag:";
- this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // AppTag
- //
- this.AppTag.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
- this.AppTag.ImeMode = System.Windows.Forms.ImeMode.NoControl;
- this.AppTag.Location = new System.Drawing.Point(548, 98);
- this.AppTag.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.AppTag.MaxLength = 6;
- this.AppTag.Name = "AppTag";
- this.AppTag.Size = new System.Drawing.Size(170, 28);
- this.AppTag.TabIndex = 13;
- //
- // label3
- //
- this.label3.Location = new System.Drawing.Point(483, 42);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(51, 30);
- this.label3.TabIndex = 12;
- this.label3.Text = "Tag:";
- this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // PidTag
- //
- this.PidTag.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
- this.PidTag.ImeMode = System.Windows.Forms.ImeMode.NoControl;
- this.PidTag.Location = new System.Drawing.Point(548, 46);
- this.PidTag.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.PidTag.MaxLength = 6;
- this.PidTag.Name = "PidTag";
- this.PidTag.Size = new System.Drawing.Size(170, 28);
- this.PidTag.TabIndex = 11;
- //
- // appclearbtn
- //
- this.appclearbtn.AutoSize = true;
- this.appclearbtn.Location = new System.Drawing.Point(1027, 90);
- this.appclearbtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.appclearbtn.Name = "appclearbtn";
- this.appclearbtn.Size = new System.Drawing.Size(81, 42);
- this.appclearbtn.TabIndex = 9;
- this.appclearbtn.Text = "清除";
- this.appclearbtn.UseVisualStyleBackColor = true;
- this.appclearbtn.Click += new System.EventHandler(this.appclearbtn_Click);
- //
- // webclearbtn
- //
- this.webclearbtn.AutoSize = true;
- this.webclearbtn.Location = new System.Drawing.Point(1027, 39);
- this.webclearbtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.webclearbtn.Name = "webclearbtn";
- this.webclearbtn.Size = new System.Drawing.Size(81, 42);
- this.webclearbtn.TabIndex = 8;
- this.webclearbtn.Text = "清除";
- this.webclearbtn.UseVisualStyleBackColor = true;
- this.webclearbtn.Click += new System.EventHandler(this.webclearbtn_Click);
- //
- // appstopbtn
- //
- this.appstopbtn.AutoSize = true;
- this.appstopbtn.Location = new System.Drawing.Point(891, 90);
- this.appstopbtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.appstopbtn.Name = "appstopbtn";
- this.appstopbtn.Size = new System.Drawing.Size(81, 42);
- this.appstopbtn.TabIndex = 7;
- this.appstopbtn.Text = "暂停";
- this.appstopbtn.UseVisualStyleBackColor = true;
- this.appstopbtn.Click += new System.EventHandler(this.appstopbtn_Click);
- //
- // webstopbtn
- //
- this.webstopbtn.AutoSize = true;
- this.webstopbtn.Location = new System.Drawing.Point(891, 39);
- this.webstopbtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.webstopbtn.Name = "webstopbtn";
- this.webstopbtn.Size = new System.Drawing.Size(81, 42);
- this.webstopbtn.TabIndex = 6;
- this.webstopbtn.Text = "暂停";
- this.webstopbtn.UseVisualStyleBackColor = true;
- this.webstopbtn.Click += new System.EventHandler(this.webstopbtn_Click);
- //
- // label2
- //
- this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(15, 99);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(125, 18);
- this.label2.TabIndex = 5;
- this.label2.Text = "APP-PID/包名:";
- this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // appstartbtn
- //
- this.appstartbtn.AutoSize = true;
- this.appstartbtn.Location = new System.Drawing.Point(762, 90);
- this.appstartbtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.appstartbtn.Name = "appstartbtn";
- this.appstartbtn.Size = new System.Drawing.Size(81, 42);
- this.appstartbtn.TabIndex = 4;
- this.appstartbtn.Text = "启动";
- this.appstartbtn.UseVisualStyleBackColor = true;
- this.appstartbtn.Click += new System.EventHandler(this.AppStartBtn_Click);
- //
- // packagenametext
- //
- this.packagenametext.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
- this.packagenametext.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
- this.packagenametext.Location = new System.Drawing.Point(146, 96);
- this.packagenametext.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.packagenametext.Name = "packagenametext";
- this.packagenametext.Size = new System.Drawing.Size(184, 28);
- this.packagenametext.TabIndex = 3;
- //
- // pidtext
- //
- this.pidtext.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
- this.pidtext.ImeMode = System.Windows.Forms.ImeMode.NoControl;
- this.pidtext.Location = new System.Drawing.Point(146, 48);
- this.pidtext.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.pidtext.MaxLength = 6;
- this.pidtext.Name = "pidtext";
- this.pidtext.Size = new System.Drawing.Size(184, 28);
- this.pidtext.TabIndex = 1;
- //
- // menuStrip
- //
- this.menuStrip.BackColor = System.Drawing.Color.Gray;
- this.menuStrip.ImageScalingSize = new System.Drawing.Size(24, 24);
- this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.打开ToolStripMenuItem,
- this.ShowToolStripMenuItem,
- this.帮助ToolStripMenuItem});
- this.menuStrip.Location = new System.Drawing.Point(0, 0);
- this.menuStrip.Name = "menuStrip";
- this.menuStrip.Padding = new System.Windows.Forms.Padding(9, 2, 0, 2);
- this.menuStrip.Size = new System.Drawing.Size(1172, 32);
- this.menuStrip.TabIndex = 10;
- this.menuStrip.Text = "menuStrip1";
- //
- // 打开ToolStripMenuItem
- //
- this.打开ToolStripMenuItem.BackColor = System.Drawing.Color.Gray;
- this.打开ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.OpenToolStripMenuItem,
- this.SettingToolStripMenuItem,
- this.ExitToolStripMenuItem});
- this.打开ToolStripMenuItem.Name = "打开ToolStripMenuItem";
- this.打开ToolStripMenuItem.Size = new System.Drawing.Size(58, 28);
- this.打开ToolStripMenuItem.Text = "文件";
- //
- // OpenToolStripMenuItem
- //
- this.OpenToolStripMenuItem.Name = "OpenToolStripMenuItem";
- this.OpenToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
- this.OpenToolStripMenuItem.Text = "打开";
- this.OpenToolStripMenuItem.Click += new System.EventHandler(this.OpenToolStripMenuItem_Click);
- //
- // SettingToolStripMenuItem
- //
- this.SettingToolStripMenuItem.Name = "SettingToolStripMenuItem";
- this.SettingToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
- this.SettingToolStripMenuItem.Text = "设置";
- this.SettingToolStripMenuItem.Click += new System.EventHandler(this.SettingToolStripMenuItem_Click);
- //
- // ExitToolStripMenuItem
- //
- this.ExitToolStripMenuItem.Name = "ExitToolStripMenuItem";
- this.ExitToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
- this.ExitToolStripMenuItem.Text = "退出";
- this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click);
- //
- // ShowToolStripMenuItem
- //
- this.ShowToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.TopToolStripMenuItem,
- this.DownToolStripMenuItem,
- this.AllToolStripMenuItem});
- this.ShowToolStripMenuItem.Name = "ShowToolStripMenuItem";
- this.ShowToolStripMenuItem.Size = new System.Drawing.Size(58, 28);
- this.ShowToolStripMenuItem.Text = "显示";
- //
- // TopToolStripMenuItem
- //
- this.TopToolStripMenuItem.CheckOnClick = true;
- this.TopToolStripMenuItem.Name = "TopToolStripMenuItem";
- this.TopToolStripMenuItem.Size = new System.Drawing.Size(200, 30);
- this.TopToolStripMenuItem.Text = "上半部分铺满";
- this.TopToolStripMenuItem.Click += new System.EventHandler(this.TopToolStripMenuItem_Click);
- //
- // DownToolStripMenuItem
- //
- this.DownToolStripMenuItem.CheckOnClick = true;
- this.DownToolStripMenuItem.Name = "DownToolStripMenuItem";
- this.DownToolStripMenuItem.Size = new System.Drawing.Size(200, 30);
- this.DownToolStripMenuItem.Text = "下半部分铺满";
- this.DownToolStripMenuItem.Click += new System.EventHandler(this.DownToolStripMenuItem_Click);
- //
- // AllToolStripMenuItem
- //
- this.AllToolStripMenuItem.Checked = true;
- this.AllToolStripMenuItem.CheckOnClick = true;
- this.AllToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
- this.AllToolStripMenuItem.Name = "AllToolStripMenuItem";
- this.AllToolStripMenuItem.Size = new System.Drawing.Size(200, 30);
- this.AllToolStripMenuItem.Text = "各占一半";
- this.AllToolStripMenuItem.Click += new System.EventHandler(this.AllToolStripMenuItem_Click);
- //
- // 帮助ToolStripMenuItem
- //
- this.帮助ToolStripMenuItem.BackColor = System.Drawing.Color.Gray;
- this.帮助ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.AboutToolStripMenuItem});
- this.帮助ToolStripMenuItem.Name = "帮助ToolStripMenuItem";
- this.帮助ToolStripMenuItem.Size = new System.Drawing.Size(58, 28);
- this.帮助ToolStripMenuItem.Text = "帮助";
- //
- // AboutToolStripMenuItem
- //
- this.AboutToolStripMenuItem.Name = "AboutToolStripMenuItem";
- this.AboutToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
- this.AboutToolStripMenuItem.Text = "关于";
- this.AboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItem_Click);
- //
- // AppTimer
- //
- this.AppTimer.Interval = 1000;
- this.AppTimer.Tick += new System.EventHandler(this.AppTimer_Tick);
- //
- // openFileDialogDB
- //
- this.openFileDialogDB.DefaultExt = "db";
- //
- // MainForm
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(1176, 748);
- this.Controls.Add(this.flowLayoutPanel2);
- this.Controls.Add(this.panel1);
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MainMenuStrip = this.menuStrip;
- this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
- this.MinimumSize = new System.Drawing.Size(1182, 665);
- this.Name = "MainForm";
- this.Text = " 内存监控工具";
- this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
- this.Load += new System.EventHandler(this.MainForm_Load);
- ((System.ComponentModel.ISupportInitialize)(this.appchart)).EndInit();
- this.flowLayoutPanel2.ResumeLayout(false);
- ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
- this.panel1.ResumeLayout(false);
- this.panel1.PerformLayout();
- this.menuStrip.ResumeLayout(false);
- this.menuStrip.PerformLayout();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.DataVisualization.Charting.Chart appchart;
- private System.Windows.Forms.Timer Timer;
- private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2;
- private System.Windows.Forms.DataVisualization.Charting.Chart chart;
- private System.Windows.Forms.Button webstartbtn;
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Panel panel1;
- private System.Windows.Forms.TextBox packagenametext;
- private System.Windows.Forms.TextBox pidtext;
- private System.Windows.Forms.Button appstartbtn;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Timer AppTimer;
- private System.Windows.Forms.Button appstopbtn;
- private System.Windows.Forms.Button webstopbtn;
- private System.Windows.Forms.Button appclearbtn;
- private System.Windows.Forms.Button webclearbtn;
- private System.Windows.Forms.MenuStrip menuStrip;
- private System.Windows.Forms.ToolStripMenuItem 打开ToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem OpenToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem SettingToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem 帮助ToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem AboutToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem ShowToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem TopToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem DownToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem AllToolStripMenuItem;
- private System.Windows.Forms.OpenFileDialog openFileDialogDB;
- private System.Windows.Forms.Label label4;
- private System.Windows.Forms.TextBox AppTag;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.TextBox PidTag;
- private System.Windows.Forms.Button appchoosebtn;
- private System.Windows.Forms.Button pidchoosebtn;
-
- }
-}
-
diff --git a/RAMMonitoringTools/MainForm.cs b/RAMMonitoringTools/MainForm.cs
deleted file mode 100644
index 56a613b9aa871e9641b68768278fbdee9c379965..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/MainForm.cs
+++ /dev/null
@@ -1,784 +0,0 @@
-using RAMMonitoringTools.utils;
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Diagnostics;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-using System.Windows.Forms.DataVisualization.Charting;
-
-
-namespace RAMMonitoringTools
-{
- public partial class MainForm : Form
- {
- private List dataList = new List();
- private List AppdataList = new List();
- Task t1;
- Task t2;
- private int process_old_save_value = 0;
- private int app_old_save_value = 0;
- CancellationTokenSource webcts;
- CancellationTokenSource appcts;
- private SQLiteHelper sqlite;
- private int sdkversion = 0;
-
- //private int num = 5;//每次删除增加几个点
- public MainForm()
- {
- InitializeComponent();
- //初始化表格大小
- setChartSize();
- sqlite = new SQLiteHelper("");
-
- }
-
- ///
- /// 进程监控启动按钮事件
- ///
- ///
- ///
- private void StartBtn_Click(object sender, EventArgs e)
- {
- String strpid = "";
- String pidtag = "";
- strpid = pidtext.Text;
- pidtag = PidTag.Text;
- if (strpid.Length == 0)
- {
- MessageBox.Show("错误!请输入PID!","警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- else if(pidtag.Length ==0)
- {
- MessageBox.Show("错误!Tag未输入!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- else if (pidtag.Equals("All"))
- {
- MessageBox.Show("错误!Tag被占用!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- try
- {
- int pid = int.Parse(pidtext.Text);
- //初始化图表
- InitChart("内存占用情况");
- t1 = null;
- webcts = new CancellationTokenSource();
- //创建并启动线程
- t1 = Task.Factory.StartNew(() => UpdateChart(pid,pidtag,webcts.Token), webcts.Token);
- Console.WriteLine("t1_id:" + t1.Id);
- }
- catch (Exception)
- {
- MessageBox.Show("请检查PID!!!!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
-
- ///
- /// App监控启动按钮事件
- ///
- ///
- ///
- private void AppStartBtn_Click(object sender, EventArgs e)
- {
- //Console.WriteLine("内存:" +GetAppInfo.GetInfo("测试").Private_ss);
- //GetAppInfo.GetRss("com.android.mms");
- //MemoryInfo memory = GetAppInfo.GetInfo("com.android.mms");
- //MessageBox.Show("功能暂未开放,敬请期待!");
- //return;
- String apptext = "";
- String apptag = "";
- apptext = packagenametext.Text;
- apptag = AppTag.Text;
- if (apptext.Length == 0)
- {
- MessageBox.Show("错误!请输入App包名或PID!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- else if (apptag.Length == 0)
- {
- MessageBox.Show("错误!Tag未输入!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- else if (apptag.Equals("All"))
- {
- MessageBox.Show("错误!Tag被占用!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- int pid = -1;
- try
- {
- pid = int.Parse(apptext);
- if (pid < 0)
- {
- MessageBox.Show("输入错误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- }
- catch (Exception)
- {
-
- }
- try
- {
- //初始化图表
- InitAppChart("App内存占用情况");
- t2 = null;
- sdkversion = GetAppInfo.GetSdkVersion();
- if (sdkversion == 0)
- {
- logger.Info(sdkversion.GetType(),"系统api版本获取失败。SDK Version =" + sdkversion);
- MessageBox.Show("系统api版本获取失败,请检查设备连接情况。SDK Version =" + sdkversion, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- appcts = new CancellationTokenSource();
- //创建并启动线程
- t2 = Task.Factory.StartNew(() => UpdateAPPChart(pid, apptext, apptag, sdkversion ,appcts.Token), appcts.Token);
- Console.WriteLine("t2_id:" + t2.Id);
- }
- catch (Exception)
- {
- MessageBox.Show("请检查App包名或PID并确认App已经启动!!!!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
-
- }
-
- ///
- /// 初始化网页进程内存图表
- ///
- private void InitChart(string ChartShowName)
- {
- //定义图表区域
- this.chart.ChartAreas.Clear();
- ChartArea chartArea1 = new ChartArea("C1");
- this.chart.ChartAreas.Add(chartArea1);
- //定义存储和显示点的容器
- this.chart.Series.Clear();
- Series series1 = new Series("S1");
- series1.ChartArea = "C1";
- this.chart.Series.Add(series1);
- //设置图表显示样式
- //this.chart.ChartAreas[0].AxisY.Minimum = 0;
- //this.chart.ChartAreas[0].AxisY.Maximum = 100;
- //this.chart.ChartAreas[0].AxisX.Interval = 5;
- //this.chart.ChartAreas[0].AxisX.Title = "X轴";
- //this.chart.ChartAreas[0].AxisY.Title = "Y轴";
- this.chart.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
- this.chart.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
- //设置标题
- this.chart.Titles.Clear();
- this.chart.Titles.Add("S01");
- this.chart.Titles[0].Text = ChartShowName;
- this.chart.Titles[0].ForeColor = Color.RoyalBlue;
- this.chart.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
- //设置图表显示样式
- this.chart.Series[0].Color = Color.Red;
- this.chart.Series[0].ChartType = SeriesChartType.Line;
- this.chart.Series[0].Points.Clear();
- }
-
- ///
- /// 初始化APP内存信息图表
- ///
- private void InitAppChart(string ChatShowName)
- {
- //定义图表区域
- this.appchart.ChartAreas.Clear();
- ChartArea chartArea1 = new ChartArea("C1");
- this.appchart.ChartAreas.Add(chartArea1);
- //定义存储和显示点的容器
- this.appchart.Series.Clear();
- Series series1 = new Series("S1");
- series1.ChartArea = "C1";
- this.appchart.Series.Add(series1);
- //设置图表显示样式
- //this.appchart.ChartAreas[0].AxisY.Minimum = 0;
- //this.appchart.ChartAreas[0].AxisY.Maximum = 100;
- //this.appchart.ChartAreas[0].AxisX.Interval = 5;
- //this.appchart.ChartAreas[0].AxisX.Name = "X轴";
- this.appchart.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
- this.appchart.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
- //设置标题
- this.appchart.Titles.Clear();
- this.appchart.Titles.Add("S01");
- this.appchart.Titles[0].Text = ChatShowName;
-
- this.appchart.Titles[0].ForeColor = Color.RoyalBlue;
- this.appchart.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
- //设置图表显示样式
- this.appchart.Series[0].Color = Color.Red;
- this.appchart.Series[0].ChartType = SeriesChartType.Line;
- this.appchart.Series[0].Points.Clear();
- }
-
- ///
- /// flowLayoutPanel大小变化事件
- ///
- private void flowLayoutPanel2_SizeChanged(object sender, EventArgs e)
- {
- setChartSize();
- }
-
- ///
- /// 设置折线图大小
- ///
- private void setChartSize()
- {
- foreach (ToolStripMenuItem sdc in this.ShowToolStripMenuItem.DropDownItems)
- {
- if(sdc.Checked){
- switch(sdc.Name){
- case "TopToolStripMenuItem":
- this.chart.Height = this.flowLayoutPanel2.Height;
- this.chart.Width = this.flowLayoutPanel2.Width;
- break;
- case "DownToolStripMenuItem":
- this.appchart.Height = this.flowLayoutPanel2.Height;
- this.appchart.Width = this.flowLayoutPanel2.Width;
- break;
- case "AllToolStripMenuItem":
- this.appchart.Width = this.flowLayoutPanel2.Width;
- this.appchart.Height = this.flowLayoutPanel2.Height / 2;
- this.chart.Width = this.flowLayoutPanel2.Width;
- this.chart.Height = this.flowLayoutPanel2.Height / 2;
- break;
- };
- }
- }
- }
-
- ///
- ///写入数据到数据库中并写入日志
- ///
- ///
- private void SaveData(List memoryInfoList)
- {
- if (Properties.Settings.Default.isSave)
- {
- bool res = sqlite.BatchInsert("memory_info", memoryInfoList);
- if (!res)
- {
- //异步调用写入日志
- this.BeginInvoke(new Action(() => { logger.Info(this.GetType(), "memoryInfoList:" + memoryInfoList.ElementAt(0).GetString()); }));
- }
- }
- }
-
- ///
- /// 获取APP信息并更新折线图
- ///
- ///
- ///
- ///
- private void UpdateAPPChart(int pid,string packagename,string apptag,int sdkversion,CancellationToken ct)
- {
- if (AppdataList.Count > 0)
- {
- //AppdataList.Clear();
- for (int i = 0; i < AppdataList.Count - 1; i++)
- {
- this.Invoke(new Action(() => { this.appchart.Series[0].Points.AddXY(i+1, AppdataList.ElementAt(i)); }));
- }
- }
- while (true)
- {
- if(ct.IsCancellationRequested){
- Console.WriteLine("IsCancellationRequested");
- return;
- }
- //AppdataList.Add(ran());
- MemoryInfo appme = GetAppInfo.GetInfo(pid,packagename,sdkversion);
- if (appme != null)
- {
- AppdataList.Add(appme.Private_ss);
- appme.Tag = apptag;
- List li = new List { };
- li.Add(appme);
- //Console.WriteLine("queue.len:" + AppdataList.Count());
- if (Math.Abs(appme.Private_ss - process_old_save_value) >= Properties.Settings.Default.AppSaveOffset)
- {
- //调用数据保存方法
- SaveData(li);
- app_old_save_value = appme.Private_ss;
- }
- int chartcount = this.appchart.Series[0].Points.Count;
- int app_old_show_value = 0;
- if (chartcount>0)
- {
- app_old_show_value = (int)this.appchart.Series[0].Points.ElementAt(chartcount - 1).YValues[0];
- }
-
- if (Math.Abs(appme.Private_ss - app_old_show_value )>= Properties.Settings.Default.AppShowOffset)
- {
- this.BeginInvoke(new Action(() => { this.appchart.Series[0].Points.AddXY(AppdataList.Count, appme.Private_ss); }));
- }
- //实时获取配置控制获取信息循环间隔时间
- Thread.Sleep(Properties.Settings.Default.AppSleepTime);
- }
- else
- {
- logger.Info(this.GetType(), "获取App信息出错,请检查包名及连接状态! PID=" + pid + "App包名:" + packagename);
- MessageBox.Show("获取App信息出错,请检查包名及连接状态!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- this.BeginInvoke(new Action(() => { StopTask(t2, appcts); }));
- break;
- }
- //this.BeginInvoke(new Action(() => { this.appchart.Series[0].Points.Clear(); }));
- }
- }
-
- private int ran() {
- Thread.Sleep(2000);
- return new Random().Next(50, 100);
- }
-
- ///
- /// 获取进程信息并更新折线图
- ///
- ///
- ///
- ///
- private void UpdateChart(int pid,string tag,CancellationToken ct)
- {
- if (dataList.Count > 0)
- {
- //dataList.Clear();
- for (int i = 0; i < dataList.Count - 1; i++)
- {
- this.Invoke(new Action(() => { this.chart.Series[0].Points.AddXY(i+1, dataList.ElementAt(i)); }));
- }
- }
- while(true){
- if(ct.IsCancellationRequested){
- Console.WriteLine("IsCancellationRequested");
- return;
- }
- //GetPsInfo.
- MemoryInfo webme = GetPsInfo.GetInfo(pid,1000);
- if (webme != null)
- {
- webme.Tag = tag;
- dataList.Add(webme.Private_ss);
- List li = new List{};
- li.Add(webme);
- if (Math.Abs(webme.Private_ss - process_old_save_value)>= Properties.Settings.Default.ProcessSaveOffset)
- {
- //调用数据保存方法
- SaveData(li);
- process_old_save_value = webme.Private_ss;
- }
-
- //this.BeginInvoke(new Action(() => { this.chart.Series[0].Points.Clear(); }));
- int chartcount = this.chart.Series[0].Points.Count;
- int app_old_show_value = 0;
- if (chartcount > 0)
- {
- app_old_show_value = (int)this.chart.Series[0].Points.ElementAt(chartcount - 1).YValues[0];
- }
- if (Math.Abs(webme.Private_ss - app_old_show_value) >= Properties.Settings.Default.ProcessShowOffset)
- {
- this.BeginInvoke(new Action(() => { this.chart.Series[0].Points.AddXY(dataList.Count, webme.Private_ss); }));
- }
- //实时获取配置控制获取信息循环间隔时间
- Thread.Sleep(Properties.Settings.Default.ProcessSleepTime);
- }
- else
- {
- logger.Info(this.GetType(),"获取进程信息出错,请检查PID! PID =" + pid);
- MessageBox.Show("获取进程信息出错,请检查PID!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- this.BeginInvoke(new Action(() => { StopTask(t1, webcts); }));
- break;
- }
- }
-
- }
-
- ///
- /// 定时器事件,过时
- ///
- ///
- ///
- private void AppTimer_Tick(object sender, EventArgs e)
- {
- //UpdateAppQueueValue(AppNameText.Text);
- //this.appchart.Series[0].Points.Clear();
- //for (int i = 0; i < AppdataList.Count; i++)
- //{
- // this.appchart.Series[0].Points.AddXY((i + 1), AppdataList.ElementAt(i));
- //}
- }
-
- ///
- /// 定时器事件,过时
- ///
- ///
- ///
- private void Timer_Tick(object sender, EventArgs e)
- {
- //UpdateQueueValue(int.Parse(pcpid.Text));
- //this.chart.Series[0].Points.Clear();
- //for (int i = 0; i < dataList.Count; i++)
- //{
- // this.chart.Series[0].Points.AddXY((i + 1), dataList[i]);
- //}
- }
-
- ///
- /// 进程监控暂停事件
- ///
- ///
- private void webstopbtn_Click(object sender, EventArgs e)
- {
- if (t1 == null)
- {
- MessageBox.Show("线程为非运行状态", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- else
- {
- StopTask(t1,webcts);
- }
- }
-
- ///
- /// 停止线程并释放线程资源
- ///
- ///
- private void StopTask(Task t,CancellationTokenSource cts) {
- cts.Cancel();
- while (true)
- {
- Console.WriteLine("线程状态:" + t.Status);
- if (t.IsCompleted)
- {
- try
- {
- t.Dispose();
- Console.WriteLine(t.Status);
- break;
- }
- catch (Exception e1)
- {
- Console.WriteLine(e1);
- //throw e1;
- }
- }
- }
-
- }
-
- ///
- /// app监控暂停事件
- ///
- ///
- private void appstopbtn_Click(object sender, EventArgs e)
- {
- //MessageBox.Show("功能暂未开放,敬请期待!");
- //return;
- if (t2 == null)
- {
- MessageBox.Show("线程为非运行状态", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- return;
- }
- else
- {
- StopTask(t2, appcts);
- }
- }
-
- ///
- /// 进程监控表格清除事件
- ///
- ///
- private void webclearbtn_Click(object sender, EventArgs e)
- {
- dataList.Clear();
- this.BeginInvoke(new Action(() => { this.chart.Series[0].Points.Clear(); }));
- }
-
- ///
- /// app监控表格清除事件
- ///
- ///
- private void appclearbtn_Click(object sender, EventArgs e)
- {
- AppdataList.Clear();
- this.BeginInvoke(new Action(() => { this.appchart.Series[0].Points.Clear(); }));
- }
-
- private void MainForm_Load(object sender, EventArgs e)
- {
-
- }
-
- ///
- /// Top占满点击事件
- ///
- private void TopToolStripMenuItem_Click(object sender, EventArgs e)
- {
- this.chart.Visible = true;
- SingleCheck(sender);
- this.appchart.Visible = false;
- setChartSize();
- }
-
- ///
- /// Down占满点击事件
- ///
- private void DownToolStripMenuItem_Click(object sender, EventArgs e)
- {
- this.appchart.Visible = true;
- SingleCheck(sender);
- this.chart.Visible = false;
- setChartSize();
- }
-
- ///
- /// 上下各占一半点击事件
- ///
- private void AllToolStripMenuItem_Click(object sender, EventArgs e)
- {
- this.appchart.Visible = true;
- this.chart.Visible = true;
- SingleCheck(sender);
- setChartSize();
- }
-
- ///
- /// 工具栏选中焦点切换
- ///
- ///
- private void SingleCheck(object sender)
- {
- foreach (ToolStripMenuItem sdc in this.ShowToolStripMenuItem.DropDownItems)
- {
- sdc.Checked = false;
- }
- ((ToolStripMenuItem)sender).Checked = true;
- }
-
- ///
- /// 关于
- ///
- private void AboutToolStripMenuItem_Click(object sender, EventArgs e)
- {
- MessageBox.Show("本程序可用于PC进程内存及CPU占用监控,还可通过电脑连接Android手机监控App内存及CPU占用监控,并且可绘制出变化折线图;","关于");
- }
-
- ///
- /// 退出程序
- ///
- private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
- {
- logger.Info(GetType(), "--------------------------退出程序--------------------------");
- System.Environment.Exit(0);
- }
-
- ///
- /// 设置点击事件
- ///
- private void SettingToolStripMenuItem_Click(object sender, EventArgs e)
- {
- MySetting ms = new MySetting();
- ms.ShowDialog();
- }
-
- ///
- /// '打开'点击事件
- ///
- ///
- ///
- private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (t1 != null && t2 != null)
- {
- if (!t1.Status.Equals("RanToCompletion") && !t2.Status.Equals("RanToCompletion"))
- {
- MessageBox.Show("表格绘制忙碌中,请停止后再来吧!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- return;
- }
-
- }
- SQLiteHelper opendb;
- openFileDialogDB.InitialDirectory = Properties.Settings.Default.DatabasePath;
- openFileDialogDB.Filter = "数据库文件|*.db";
- if (openFileDialogDB.ShowDialog() == DialogResult.OK)
- {
- try
- {
- opendb = new SQLiteHelper(openFileDialogDB.FileName);
- logger.Info(this.GetType(), "选择的文件:" + openFileDialogDB.FileName);
- //opendb = new SQLiteHelper("C:\\Users\\xinzhibin\\Desktop\\monitoring.db");
- string[] tables = new string[1];
- //tables = opendb.getTables();
- tables[0] = "memory_info";
- Console.WriteLine("tables.len:" + tables.Length + ":" + tables[0]);
- string[][] taglist = new string[tables.Length][];
- for (int i = 0; i < tables.Length; i++)
- {
- if (tables[i] != null)
- {
-
- //Console.WriteLine(opendb.getTag(tables[i]));
- taglist[i] = opendb.getTag(tables[i]);
- if (taglist[i] ==null)
- {
- MessageBox.Show("获取tag为空", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- logger.Info(this.GetType(), taglist.Count()+"Tag为空!");
- return;
- }
- }
- }
- OpenData opendata = new OpenData(tables, taglist);
- //opendata.ShowInTaskbar
- if (opendata.ShowDialog() == DialogResult.OK)
- {
- string[] ReturnValueTag = opendata.ReturnValueTag; //获得返回值
- List ChatList1 = new List();
- List ChatList2 = new List();
- for (int j = 0; j < ReturnValueTag.Length; j++)
- {
- if (ReturnValueTag[j].Length != 0)
- {
- String parameter= ";";
- if (!ReturnValueTag[j].Equals("All"))
- {
- parameter = " where tag = '" + ReturnValueTag[j] + "';";
- }
- DataSet ds = opendb.ExecuteDataset("select id,tag,pid,name,cpu,private_ss,add_time from memory_info" + parameter);
- if (ds != null)
- {
- for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
- {
- //Console.WriteLine("ItemArray[1]:" + ds.Tables[0].Rows[i].ItemArray[1]);
- object[] tempArray = ds.Tables[0].Rows[i].ItemArray;
- SelectMemoryInfo tempInfo = new SelectMemoryInfo();
- tempInfo.Id = int.Parse(tempArray[0].ToString());
- tempInfo.Tag = tempArray[1].ToString();
- tempInfo.Pid = int.Parse(tempArray[2].ToString());
- tempInfo.Name = tempArray[3].ToString();
- tempInfo.Cpu = float.Parse(tempArray[4].ToString());
- tempInfo.Private_ss = int.Parse(tempArray[5].ToString());
- tempInfo.Add_time = tempArray[6].ToString();
- if (j == 0)
- {
- ChatList1.Add(tempInfo);
- }
- else
- {
- ChatList2.Add(tempInfo);
- }
-
- }
- }
- }
- }
- setDataToChat(ChatList1,ChatList2,ReturnValueTag,opendata.ReturnValueData);
- }
- }
- catch (Exception opene)
- {
- Console.WriteLine("打开文件错误! ErrorMessage:" + opene.Data + opene.Message);
- logger.Info(this.GetType(),"打开文件错误! ErrorMessage:" + opene.Data + opene.Message);
- MessageBox.Show("文件错误:" + openFileDialogDB.FileName,"警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- }
-
- ///
- /// 设置打开的数据至对应的Chat中
- ///
- ///
- ///
- ///
- private void setDataToChat(List ChatList1, List ChatList2,string[] Tag,string[] Data)
- {
- if (ChatList1.Count != 0)
- {
- InitChart("Tag:"+Tag[0]);
- if (Data[0].Equals("PSS"))
- {
- for (int i = 0; i < ChatList1.Count; i++)
- {
- this.chart.Series[0].Points.AddXY(i, ChatList1.ElementAt(i).Private_ss);
- }
- }
- else if (Data[0].Equals("CPU"))
- {
- for (int i = 0; i < ChatList1.Count; i++)
- {
- this.chart.Series[0].Points.AddXY(i, ChatList1.ElementAt(i).Cpu);
- }
- }
- else
- {
- logger.Info(this.GetType(), "Data Error! Data[0] = " + Data[0]);
- }
- }
- if (ChatList2.Count != 0)
- {
- InitAppChart("Tag:"+Tag[1]);
- if (Data[1].Equals("PSS"))
- {
- for (int i = 0; i < ChatList2.Count; i++)
- {
- this.appchart.Series[0].Points.AddXY(i, ChatList2.ElementAt(i).Private_ss);
- }
- }
- else if (Data[1].Equals("CPU"))
- {
- for (int i = 0; i < ChatList2.Count; i++)
- {
- this.appchart.Series[0].Points.AddXY(i, ChatList2.ElementAt(i).Cpu);
- }
- }
- else
- {
- logger.Info(this.GetType(), "Data Error! Data[1] = " + Data[1]);
- }
- }
- }
-
- ///
- /// Pc进程pid选择按钮点击事件
- ///
- ///
- ///
- private void pidchoosebtn_Click(object sender, EventArgs e)
- {
- MainChooseForm mainchooseform = new MainChooseForm("PC");
- if (mainchooseform.ShowDialog() == DialogResult.OK)
- {
- String pid = mainchooseform.ReturnValue;
- pidtext.Text = pid;
- }
- }
-
- ///
- /// app进程pid选择按钮点击事件
- ///
- ///
- ///
- private void appchoosebtn_Click(object sender, EventArgs e)
- {
- MainChooseForm mainchooseform = new MainChooseForm("APP");
- if (mainchooseform.ShowDialog() == DialogResult.OK)
- {
- String pid = mainchooseform.ReturnValue;
- packagenametext.Text = pid;
- }
- }
-
- private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- logger.Info(this.GetType(), "-------------------退出程序--------------------");
- }
- }
-}
\ No newline at end of file
diff --git a/RAMMonitoringTools/MemoryInfo.cs b/RAMMonitoringTools/MemoryInfo.cs
deleted file mode 100644
index 21857dcdfe88f88541262aa6231d516804896688..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/MemoryInfo.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace RAMMonitoringTools
-{
- class MemoryInfo
- {
- private string tag;
-
- public string Tag
- {
- get { return tag; }
- set { tag = value; }
- }
- private int pid;
-
- public int Pid
- {
- get { return pid; }
- set { pid = value; }
- }
- private String name;
-
- public String Name
- {
- get { return name; }
- set { name = value; }
- }
- private float cpu;
-
- public float Cpu
- {
- get { return cpu; }
- set { cpu = value; }
- }
- private int private_ss;
-
- public int Private_ss
- {
- get { return private_ss; }
- set { private_ss = value; }
- }
-
- public String GetString()
- {
- return "TAG:" + tag + "\nPID:" + pid + "\nName:" + name + "\nCPU:" + cpu + "\nPSS:" + private_ss;
- }
- public new void ToString()
- {
- Console.WriteLine("TAG:" + tag + "\nPID:" + pid + "\nName:" + name + "\nCPU:" + cpu + "\nPSS:" + private_ss);
- }
- }
-}
diff --git a/RAMMonitoringTools/MySetting.cs b/RAMMonitoringTools/MySetting.cs
deleted file mode 100644
index 54371678735f6e95d206b792bd736534f20999ab..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/MySetting.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace RAMMonitoringTools
-{
- public partial class MySetting : Form
- {
- public MySetting()
- {
- InitializeComponent();
- InitData();
- }
- private void InitData()
- {
- this.ProcessSleepTimeList.Text = Properties.Settings.Default.ProcessSleepTime.ToString();
- this.AppSleepTimeList.Text = Properties.Settings.Default.AppSleepTime.ToString();
- this.ProcessShowOffsetList.Text = Properties.Settings.Default.ProcessShowOffset.ToString();
- this.AppShowOffsetList.Text = Properties.Settings.Default.AppShowOffset.ToString();
- this.ProcessSaveOffsetList.Text = Properties.Settings.Default.ProcessSaveOffset.ToString();
- this.AppSaveOffsetList.Text = Properties.Settings.Default.AppSaveOffset.ToString();
-
- this.textBoxDBPath.Text = Properties.Settings.Default.DatabasePath;
- this.textBoxDBName.Text = Properties.Settings.Default.DatabaseName;
-
- this.folderBrowserDialog1.SelectedPath = Properties.Settings.Default.DatabasePath;
-
- if (Properties.Settings.Default.isSave)
- {
- this.radioButtonYes.Checked = true;
- }
- else
- {
- this.radioButtonNo.Checked = true;
- }
- }
- private void MySetting_Load(object sender, EventArgs e)
- {
-
- }
-
- private void SetApply_Click(object sender, EventArgs e)
- {
- Properties.Settings.Default.ProcessSleepTime = int.Parse(this.ProcessSleepTimeList.Text);
- Properties.Settings.Default.AppSleepTime = int.Parse(this.AppSleepTimeList.Text);
-
- Properties.Settings.Default.ProcessShowOffset = int.Parse(this.ProcessShowOffsetList.Text);
- Properties.Settings.Default.AppShowOffset = int.Parse(this.AppShowOffsetList.Text);
- Properties.Settings.Default.ProcessSaveOffset = int.Parse(this.ProcessSaveOffsetList.Text);
- Properties.Settings.Default.AppSaveOffset = int.Parse(this.AppSaveOffsetList.Text);
-
- Properties.Settings.Default.DatabasePath = this.textBoxDBPath.Text;
- Properties.Settings.Default.DatabaseName = this.textBoxDBName.Text;
-
- if (this.radioButtonYes.Checked)
- {
- Properties.Settings.Default.isSave = true;
- }
- else
- {
- Properties.Settings.Default.isSave = false;
- }
-
- Properties.Settings.Default.Save();//使用Save方法保存更改
- MessageBox.Show("应用成功");
- }
-
- private void SetClose_Click(object sender, EventArgs e)
- {
- this.Close();
- }
-
- private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
- {
-
- }
-
- private void setbtnfolder_Click(object sender, EventArgs e)
- {
- if(folderBrowserDialog1.ShowDialog()==DialogResult.OK)
- {
- textBoxDBPath.Text = folderBrowserDialog1.SelectedPath;
- }
-
- }
- }
-}
diff --git a/RAMMonitoringTools/SelectMemoryInfo.cs b/RAMMonitoringTools/SelectMemoryInfo.cs
deleted file mode 100644
index 9317e6a44c2bb83d9beafc42be20de4d61714c32..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/SelectMemoryInfo.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace RAMMonitoringTools
-{
- class SelectMemoryInfo
- {
- private int id;
-
- public int Id
- {
- get { return id; }
- set { id = value; }
- }
-
- private string tag;
-
- public string Tag
- {
- get { return tag; }
- set { tag = value; }
- }
-
- private int pid;
-
- public int Pid
- {
- get { return pid; }
- set { pid = value; }
- }
- private String name;
-
- public String Name
- {
- get { return name; }
- set { name = value; }
- }
- private float cpu;
-
- public float Cpu
- {
- get { return cpu; }
- set { cpu = value; }
- }
- private int private_ss;
-
- public int Private_ss
- {
- get { return private_ss; }
- set { private_ss = value; }
- }
-
- private string add_time;
-
- public string Add_time
- {
- get { return add_time; }
- set { add_time = value; }
- }
-
- public new void ToString()
- {
- Console.WriteLine("ID:" + id + "\nTAG:" + tag + "\nPID:" + pid + "\nName:" + name + "\nCPU:" + cpu + "\nPSS:" + private_ss + "\nAdd_Time:" + add_time);
- }
- }
-}
diff --git a/RAMMonitoringTools/utils/tools.cs b/RAMMonitoringTools/utils/tools.cs
deleted file mode 100644
index b27d9115eb97afa5c8d915ae0528755c07189f11..0000000000000000000000000000000000000000
--- a/RAMMonitoringTools/utils/tools.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Management;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace RAMMonitoringTools.utils
-{
- class Utils
- {
-
- ///
- /// 通过WMI获取进程所有者名称
- ///
- /// 等于-1时一次返回所有进程信息
- ///
- public static List GetProcessUserName(int pid)
- {
- string sql;
- if (pid < 0)
- {
- sql = "Select * from Win32_Process";
- }
- else
- {
- sql = "Select * from Win32_Process WHERE processID=" + pid;
- }
- List chooseList = new List();
- SelectQuery query = new SelectQuery(sql);
- ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(query);
- logger.Info(searcher1.GetType(),"searchar长度:"+searcher1.Get().Count);
- foreach (ManagementObject disk in searcher1.Get())
- {
- ChooseList choose = new ChooseList();
- try
- {
- ManagementBaseObject inPar = null;
- ManagementBaseObject outPar = null;
- //Console.WriteLine("disk.tostring:" + disk.GetPropertyValue("ProcessId").ToString());
- //Console.WriteLine("disk.tostring:" + disk.GetPropertyValue("Name").ToString());
- choose.Pid = int.Parse(disk.GetPropertyValue("ProcessId").ToString());
- choose.Name = disk.GetPropertyValue("Name").ToString();
- inPar = disk.GetMethodParameters("GetOwner");
- outPar = disk.InvokeMethod("GetOwner", inPar, null);
- //Console.WriteLine("username============"+outPar["User"].ToString());
- choose.Username = outPar["User"].ToString();
- if (pid > 0)
- {
- break;
- }
- }
- catch
- {
- choose.Username = "SYSTEM";
- }
- choose.ToString();
- chooseList.Add(choose);
- }
- return chooseList;
- }
-
- ///
- /// 输出日志到log文件
- ///
- ///
- public void WriteLog(string msg)
- {
- string filePath = AppDomain.CurrentDomain.BaseDirectory + "Log";
- if (!Directory.Exists(filePath))
- {
- Directory.CreateDirectory(filePath);
- }
- string logPath = AppDomain.CurrentDomain.BaseDirectory + "Log\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
- try
- {
- using (StreamWriter sw = File.AppendText(logPath))
- {
- sw.WriteLine("消息:" + msg);
- sw.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
- sw.WriteLine("**************************************************");
- sw.WriteLine();
- sw.Flush();
- sw.Close();
- sw.Dispose();
- }
- }
- catch (IOException e)
- {
- using (StreamWriter sw = File.AppendText(logPath))
- {
- sw.WriteLine("异常:" + e.Message);
- sw.WriteLine("时间:" + DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"));
- sw.WriteLine("**************************************************");
- sw.WriteLine();
- sw.Flush();
- sw.Close();
- sw.Dispose();
- }
- }
- }
-
- ///
- /// 获取当前本地时间戳
- ///
- ///
- public int GetCurrentTimeUnix()
- {
- TimeSpan cha = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)));
- long t = (long)cha.TotalSeconds;
- return (int)t;
- }
- }
-}
diff --git a/ResourceMonitorTools.sln b/ResourceMonitorTools.sln
new file mode 100644
index 0000000000000000000000000000000000000000..18d6f818e9c6c35c38cfc4b49a57bd647018a830
--- /dev/null
+++ b/ResourceMonitorTools.sln
@@ -0,0 +1,94 @@
+
+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}") = "Model", "Model\Model.csproj", "{44385E63-C4A7-49C7-99AC-E38C14341F03}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DAL", "DAL\DAL.csproj", "{7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLL", "BLL\BLL.csproj", "{70B1938F-969A-4F59-8CCD-59FC5EB769C0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceMonitorTools", "ResourceMonitorTools\ResourceMonitorTools.csproj", "{B157E5C3-2082-4F2E-BF8C-A3065DC130AF}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|Win32 = Debug|Win32
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|Mixed Platforms = Release|Mixed Platforms
+ Release|Win32 = Release|Win32
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|Win32.ActiveCfg = Debug|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|Win32.Build.0 = Debug|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|x86.ActiveCfg = Debug|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Debug|x86.Build.0 = Debug|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|Any CPU.Build.0 = Release|Any CPU
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|Mixed Platforms.Build.0 = Release|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|Win32.ActiveCfg = Release|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|Win32.Build.0 = Release|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|x86.ActiveCfg = Release|x86
+ {44385E63-C4A7-49C7-99AC-E38C14341F03}.Release|x86.Build.0 = Release|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|Win32.ActiveCfg = Debug|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|Win32.Build.0 = Debug|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|x86.ActiveCfg = Debug|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Debug|x86.Build.0 = Debug|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|Mixed Platforms.Build.0 = Release|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|Win32.ActiveCfg = Release|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|Win32.Build.0 = Release|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|x86.ActiveCfg = Release|x86
+ {7A7862F6-70C3-4B4C-B7A0-ACCC2C0EA311}.Release|x86.Build.0 = Release|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|Win32.ActiveCfg = Debug|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|Win32.Build.0 = Debug|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|x86.ActiveCfg = Debug|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Debug|x86.Build.0 = Debug|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|Mixed Platforms.Build.0 = Release|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|Win32.ActiveCfg = Release|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|Win32.Build.0 = Release|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|x86.ActiveCfg = Release|x86
+ {70B1938F-969A-4F59-8CCD-59FC5EB769C0}.Release|x86.Build.0 = Release|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Mixed Platforms.Build.0 = Debug|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Win32.ActiveCfg = Debug|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|Win32.Build.0 = Debug|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|x86.ActiveCfg = Debug|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Debug|x86.Build.0 = Debug|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Mixed Platforms.ActiveCfg = Release|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Mixed Platforms.Build.0 = Release|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Win32.ActiveCfg = Release|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|Win32.Build.0 = Release|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|x86.ActiveCfg = Release|x86
+ {B157E5C3-2082-4F2E-BF8C-A3065DC130AF}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/ResourceMonitorTools/App.config b/ResourceMonitorTools/App.config
new file mode 100644
index 0000000000000000000000000000000000000000..167f5bbf008fe69a88994c1d240ce9f41ba6149e
--- /dev/null
+++ b/ResourceMonitorTools/App.config
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1000
+
+
+ 1000
+
+
+ monitoring
+
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ True
+
+
+
+
diff --git a/ResourceMonitorTools/LoadingForm.Designer.cs b/ResourceMonitorTools/LoadingForm.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8bf925499bfa5c1e8181a5be265a34d49313e7b3
--- /dev/null
+++ b/ResourceMonitorTools/LoadingForm.Designer.cs
@@ -0,0 +1,80 @@
+namespace ResourceMonitorTools
+{
+ partial class LoadingForm
+ {
+ ///
+ /// 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()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoadingForm));
+ this.pictureBox = new System.Windows.Forms.PictureBox();
+ this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // pictureBox
+ //
+ this.pictureBox.ErrorImage = ((System.Drawing.Image)(resources.GetObject("pictureBox.ErrorImage")));
+ this.pictureBox.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox.Image")));
+ this.pictureBox.InitialImage = ((System.Drawing.Image)(resources.GetObject("pictureBox.InitialImage")));
+ this.pictureBox.Location = new System.Drawing.Point(0, 0);
+ this.pictureBox.Name = "pictureBox";
+ this.pictureBox.Size = new System.Drawing.Size(85, 81);
+ this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox.TabIndex = 0;
+ this.pictureBox.TabStop = false;
+ //
+ // LoadingForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.AutoSize = true;
+ this.BackColor = System.Drawing.SystemColors.Control;
+ this.ClientSize = new System.Drawing.Size(235, 243);
+ this.ControlBox = false;
+ this.Controls.Add(this.pictureBox);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.MinimizeBox = false;
+ this.Name = "LoadingForm";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "LoadingForm";
+ this.TopMost = true;
+ this.TransparencyKey = System.Drawing.SystemColors.Control;
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LoadingForm_FormClosing);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.BindingSource bindingSource1;
+ private System.Windows.Forms.PictureBox pictureBox;
+ }
+}
\ No newline at end of file
diff --git a/ResourceMonitorTools/LoadingForm.cs b/ResourceMonitorTools/LoadingForm.cs
new file mode 100644
index 0000000000000000000000000000000000000000..406e7c990a212a1ed92a1d57074f621f5452ba87
--- /dev/null
+++ b/ResourceMonitorTools/LoadingForm.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ResourceMonitorTools
+{
+ ///
+ /// loading窗口
+ ///
+ public partial class LoadingForm : Form
+ {
+ ///
+ /// loading窗口构造方法
+ ///
+ public LoadingForm()
+ {
+ InitializeComponent();
+ }
+
+ ///
+ /// 关闭命令
+ ///
+ public void closeOrder()
+ {
+ if (this.InvokeRequired)
+ {
+ //这里利用委托进行窗体的操作,避免跨线程调用时抛异常,后面给出具体定义
+ CONSTANTDEFINE.SetUISomeInfo UIinfo = new CONSTANTDEFINE.SetUISomeInfo(new Action(() =>
+ {
+ while (!this.IsHandleCreated)
+ {
+ ;
+ }
+ if (this.IsDisposed)
+ return;
+ if (!this.IsDisposed)
+ {
+ this.Dispose();
+ }
+
+ }));
+ this.Invoke(UIinfo);
+ }
+ else
+ {
+ if (this.IsDisposed)
+ return;
+ if (!this.IsDisposed)
+ {
+ this.Dispose();
+ }
+ }
+ }
+
+ private void LoadingForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (!this.IsDisposed)
+ {
+ this.Dispose(true);
+ }
+
+ }
+ }
+ class CONSTANTDEFINE
+ {
+ public delegate void SetUISomeInfo();
+ }
+}
diff --git a/ResourceMonitorTools/LoadingForm.resx b/ResourceMonitorTools/LoadingForm.resx
new file mode 100644
index 0000000000000000000000000000000000000000..00b532d2aeabee3957329b5aac8d13fc092e7403
--- /dev/null
+++ b/ResourceMonitorTools/LoadingForm.resx
@@ -0,0 +1,859 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+ R0lGODlhVQBRAPf/AP3ajfLy8vf399HR0eHeuoyTiLGtj9Lg0tbIpunp6Zq3xcnUyvDw8Lnj+e7cperq
+ 6pGqtN7evpSPdNHc08DAwMnJye7u7tbEk/raksTFxNncyezs7N7e3urRmMfh5L7i8b2+vca5j6uYavbb
+ mcPc48Di7ufn58iwedzc3OPj48O9rcvc29/g33ySmrnN1eTk5NTfzundrvDcotTMtbvR2eLcyszCp7zb
+ 687g2c7OzvPbntnfxtra2rvi98zb1NjY2Pfbl8rh3ufdsbmlc8jh4d3b0tLSytTU1MvS093ewdLb3NTe
+ 4rjd8LrCvOHNmtbW1ufMjLm5o8LMy8PDusLi67zCwtffysvLw7y6srm5ueLUq+He1MzMzNvUuvnblMPU
+ 09vQq8zc4tPTw83LvN3TssHd6dTUvKfH17zi9KmsqevWoeXSo/PVk6C1udXaxcXKw+TdtcLP0ercq8PA
+ s7bg+bzW4MXa3ePVs5mhlcrEsrTS4cLV2qjAxtLOwrS6vLnGyuzcqL3JzeXarenaqd3g4tvew6eyqNnU
+ wenas77Z5crW2uLg2sTh6KaRYc3Qu/TbnLPDybe3toWdp+Hbt8/JsuPdt7++t7m+v+nardHU1cjGus7N
+ yLG+tqzT6LbAxNXUz+bYscfGwLbZ6+HWu9jd3cPIyNrZv9bQssfHxsnOz9Hcz7zJwd3d2NjVyuHYsNna
+ xc/g1vPZmu/Wm87Yzd7Yt5yLYbu7uufWqdHYyL7f7t7YyNjd2L/GxrTJ0cDGv57A0tXa0Ly8vOTZttLU
+ 0dfYy7PV5+fbvcbIvt/f3NnY0du/gMTHsu3ZpsfOx6rN3cjd5/zaj+DZwNbX09va1+vZrc/X19PX1tve
+ 36+3taOdf8LX4dfb293bxbvf8ri2rr/g8dze2+DOodfb1uLi3tbYwLjX57m7u/DOhr/e7szQztTcy8PD
+ wfz8/Pv7+/n5+fr6+vj4+PT09PX19bjj/Mzg3PLcn+bl5NrZ2MjY1uXl5dnZ2cPDw9rb2+Hh4f39/f//
+ /yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBgD/ACwAAAAAVQBRAAAI/wD/CRxIsKDBgwj/+VvIsOHChBAj
+ Spwo0R87du3evXPnDp7Hjx45amzH7iHFkygrYuwoQF68ADBjyowZL54AAfDekfSXsmdKi+3ctYTJwMKD
+ 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
+ OEUXXMFXOHQSDFo4xSnuZYn1lY4gUP0HCG4VEAA7
+
+
+
+
+ R0lGODlhVQBRAPf/AP3ajfLy8vf399HR0eHeuoyTiLGtj9Lg0tbIpunp6Zq3xcnUyvDw8Lnj+e7cperq
+ 6pGqtN7evpSPdNHc08DAwMnJye7u7tbEk/raksTFxNncyezs7N7e3urRmMfh5L7i8b2+vca5j6uYavbb
+ mcPc48Di7ufn58iwedzc3OPj48O9rcvc29/g33ySmrnN1eTk5NTfzundrvDcotTMtbvR2eLcyszCp7zb
+ 687g2c7OzvPbntnfxtra2rvi98zb1NjY2Pfbl8rh3ufdsbmlc8jh4d3b0tLSytTU1MvS093ewdLb3NTe
+ 4rjd8LrCvOHNmtbW1ufMjLm5o8LMy8PDusLi67zCwtffysvLw7y6srm5ueLUq+He1MzMzNvUuvnblMPU
+ 09vQq8zc4tPTw83LvN3TssHd6dTUvKfH17zi9KmsqevWoeXSo/PVk6C1udXaxcXKw+TdtcLP0ercq8PA
+ s7bg+bzW4MXa3ePVs5mhlcrEsrTS4cLV2qjAxtLOwrS6vLnGyuzcqL3JzeXarenaqd3g4tvew6eyqNnU
+ wenas77Z5crW2uLg2sTh6KaRYc3Qu/TbnLPDybe3toWdp+Hbt8/JsuPdt7++t7m+v+nardHU1cjGus7N
+ yLG+tqzT6LbAxNXUz+bYscfGwLbZ6+HWu9jd3cPIyNrZv9bQssfHxsnOz9Hcz7zJwd3d2NjVyuHYsNna
+ xc/g1vPZmu/Wm87Yzd7Yt5yLYbu7uufWqdHYyL7f7t7YyNjd2L/GxrTJ0cDGv57A0tXa0Ly8vOTZttLU
+ 0dfYy7PV5+fbvcbIvt/f3NnY0du/gMTHsu3ZpsfOx6rN3cjd5/zaj+DZwNbX09va1+vZrc/X19PX1tve
+ 36+3taOdf8LX4dfb293bxbvf8ri2rr/g8dze2+DOodfb1uLi3tbYwLjX57m7u/DOhr/e7szQztTcy8PD
+ wfz8/Pv7+/n5+fr6+vj4+PT09PX19bjj/Mzg3PLcn+bl5NrZ2MjY1uXl5dnZ2cPDw9rb2+Hh4f39/f//
+ /yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBgD/ACwAAAAAVQBRAAAI/wD/CRxIsKDBgwj/+VvIsOHChBAj
+ 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
+ f/h0dT89hhlocVGibpSmQviHBLQg0pzKYRBaoIQlQKBBk41hBl2ghUw52lGHJnWkg3AFGCjhU8uFYgyU
+ OEUXXMFXOHQSDFo4xSnuZYn1lY4gUP0HCG4VEAA7
+
+
+
+
+ R0lGODlhVQBRAPf/AP3ajfLy8vf399HR0eHeuoyTiLGtj9Lg0tbIpunp6Zq3xcnUyvDw8Lnj+e7cperq
+ 6pGqtN7evpSPdNHc08DAwMnJye7u7tbEk/raksTFxNncyezs7N7e3urRmMfh5L7i8b2+vca5j6uYavbb
+ mcPc48Di7ufn58iwedzc3OPj48O9rcvc29/g33ySmrnN1eTk5NTfzundrvDcotTMtbvR2eLcyszCp7zb
+ 687g2c7OzvPbntnfxtra2rvi98zb1NjY2Pfbl8rh3ufdsbmlc8jh4d3b0tLSytTU1MvS093ewdLb3NTe
+ 4rjd8LrCvOHNmtbW1ufMjLm5o8LMy8PDusLi67zCwtffysvLw7y6srm5ueLUq+He1MzMzNvUuvnblMPU
+ 09vQq8zc4tPTw83LvN3TssHd6dTUvKfH17zi9KmsqevWoeXSo/PVk6C1udXaxcXKw+TdtcLP0ercq8PA
+ s7bg+bzW4MXa3ePVs5mhlcrEsrTS4cLV2qjAxtLOwrS6vLnGyuzcqL3JzeXarenaqd3g4tvew6eyqNnU
+ wenas77Z5crW2uLg2sTh6KaRYc3Qu/TbnLPDybe3toWdp+Hbt8/JsuPdt7++t7m+v+nardHU1cjGus7N
+ yLG+tqzT6LbAxNXUz+bYscfGwLbZ6+HWu9jd3cPIyNrZv9bQssfHxsnOz9Hcz7zJwd3d2NjVyuHYsNna
+ xc/g1vPZmu/Wm87Yzd7Yt5yLYbu7uufWqdHYyL7f7t7YyNjd2L/GxrTJ0cDGv57A0tXa0Ly8vOTZttLU
+ 0dfYy7PV5+fbvcbIvt/f3NnY0du/gMTHsu3ZpsfOx6rN3cjd5/zaj+DZwNbX09va1+vZrc/X19PX1tve
+ 36+3taOdf8LX4dfb293bxbvf8ri2rr/g8dze2+DOodfb1uLi3tbYwLjX57m7u/DOhr/e7szQztTcy8PD
+ wfz8/Pv7+/n5+fr6+vj4+PT09PX19bjj/Mzg3PLcn+bl5NrZ2MjY1uXl5dnZ2cPDw9rb2+Hh4f39/f//
+ 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
+
+
+
+ 17, 17
+
+
\ No newline at end of file
diff --git a/ResourceMonitorTools/LoadingHelper.cs b/ResourceMonitorTools/LoadingHelper.cs
new file mode 100644
index 0000000000000000000000000000000000000000..39e91d40ccfa7b08ae926003a16946d4b34761ba
--- /dev/null
+++ b/ResourceMonitorTools/LoadingHelper.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace ResourceMonitorTools
+{
+ class LoadingHelper
+ {
+ ///
+ /// 定义委托进行窗口关闭
+ ///
+ private delegate void CloseDelegate();
+ private static LoadingForm loadingForm;
+ private static readonly Object syncLock = new Object(); //加锁使用
+ public static bool IsOpen = false;//窗口显示状态
+
+ ///
+ /// 显示loading框
+ ///
+ public static void ShowLoadingScreen()
+ {
+ // Make sure it is only launched once.
+ if (loadingForm != null)
+ return;
+ Thread thread = new Thread(new ThreadStart(LoadingHelper.ShowForm));
+ thread.IsBackground = true;
+ thread.SetApartmentState(ApartmentState.STA);
+ thread.Start();
+ }
+
+ ///
+ /// 显示窗口
+ ///
+ private static void ShowForm()
+ {
+ if (loadingForm != null)
+ {
+ loadingForm.closeOrder();
+ loadingForm = null;
+ }
+ loadingForm = new LoadingForm();
+ loadingForm.TopMost = true;
+ loadingForm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ loadingForm.TopMost = true;
+ IsOpen = true;
+ loadingForm.ShowDialog();
+ }
+
+ ///
+ /// 关闭窗口
+ ///
+ public static void CloseForm()
+ {
+ Thread.Sleep(50); //可能到这里线程还未起来,所以进行延时,可以确保线程起来,彻底关闭窗口
+ if (loadingForm != null)
+ {
+ lock (syncLock)
+ {
+ Thread.Sleep(50);
+ if (loadingForm != null)
+ {
+ Thread.Sleep(50); //通过三次延时,确保可以彻底关闭窗口
+ IsOpen = false;
+ loadingForm.Invoke(new CloseDelegate(LoadingHelper.CloseFormInternal));
+ }
+ }
+ }
+ }
+
+ ///
+ /// 关闭窗口,委托中使用
+ ///
+ private static void CloseFormInternal()
+ {
+ loadingForm.closeOrder();
+ loadingForm = null;
+ }
+ }
+}
diff --git a/RAMMonitoringTools/MainChooseForm.Designer.cs b/ResourceMonitorTools/MainChooseForm.Designer.cs
similarity index 30%
rename from RAMMonitoringTools/MainChooseForm.Designer.cs
rename to ResourceMonitorTools/MainChooseForm.Designer.cs
index d2f3c5610b7105226b11b99ce8e9938ece6babe4..dbe2e8c43d1d40881d92809cdd4a0d53401537aa 100644
--- a/RAMMonitoringTools/MainChooseForm.Designer.cs
+++ b/ResourceMonitorTools/MainChooseForm.Designer.cs
@@ -1,4 +1,4 @@
-namespace RAMMonitoringTools
+namespace ResourceMonitorTools
{
partial class MainChooseForm
{
@@ -28,79 +28,42 @@
///
private void InitializeComponent()
{
- this.MainChooseDGV = new System.Windows.Forms.DataGridView();
- this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
- this.btnchooseclose = new System.Windows.Forms.Button();
- this.btnchooseok = new System.Windows.Forms.Button();
- this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainChooseForm));
+ this.viewMainChooseDGV = new System.Windows.Forms.DataGridView();
this.Pid = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.PsName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.UserName = new System.Windows.Forms.DataGridViewTextBoxColumn();
- ((System.ComponentModel.ISupportInitialize)(this.MainChooseDGV)).BeginInit();
- this.flowLayoutPanel1.SuspendLayout();
- this.flowLayoutPanel2.SuspendLayout();
+ this.listViewFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
+ this.viewChooseCloseBtn = new System.Windows.Forms.Button();
+ this.viewChooseOkBtn = new System.Windows.Forms.Button();
+ this.btnFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
+ this.viewMsgLabel = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.viewMainChooseDGV)).BeginInit();
+ this.listViewFlowLayoutPanel.SuspendLayout();
+ this.btnFlowLayoutPanel.SuspendLayout();
this.SuspendLayout();
//
- // MainChooseDGV
+ // viewMainChooseDGV
//
- this.MainChooseDGV.AllowUserToAddRows = false;
- this.MainChooseDGV.AllowUserToDeleteRows = false;
- this.MainChooseDGV.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
- this.MainChooseDGV.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.viewMainChooseDGV.AllowUserToAddRows = false;
+ this.viewMainChooseDGV.AllowUserToDeleteRows = false;
+ this.viewMainChooseDGV.BackgroundColor = System.Drawing.SystemColors.Window;
+ this.viewMainChooseDGV.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.viewMainChooseDGV.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Pid,
this.PsName,
this.UserName});
- this.MainChooseDGV.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
- this.MainChooseDGV.Location = new System.Drawing.Point(4, 4);
- this.MainChooseDGV.Margin = new System.Windows.Forms.Padding(4);
- this.MainChooseDGV.MultiSelect = false;
- this.MainChooseDGV.Name = "MainChooseDGV";
- this.MainChooseDGV.RowTemplate.Height = 23;
- this.MainChooseDGV.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
- this.MainChooseDGV.Size = new System.Drawing.Size(710, 330);
- this.MainChooseDGV.TabIndex = 0;
- this.MainChooseDGV.SizeChanged += new System.EventHandler(this.MainChooseDGV_SizeChanged);
- //
- // flowLayoutPanel1
- //
- this.flowLayoutPanel1.Controls.Add(this.MainChooseDGV);
- this.flowLayoutPanel1.Location = new System.Drawing.Point(4, 6);
- this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(4);
- this.flowLayoutPanel1.Name = "flowLayoutPanel1";
- this.flowLayoutPanel1.Size = new System.Drawing.Size(724, 334);
- this.flowLayoutPanel1.TabIndex = 1;
- //
- // btnchooseclose
- //
- this.btnchooseclose.Location = new System.Drawing.Point(124, 4);
- this.btnchooseclose.Margin = new System.Windows.Forms.Padding(4);
- this.btnchooseclose.Name = "btnchooseclose";
- this.btnchooseclose.Size = new System.Drawing.Size(112, 34);
- this.btnchooseclose.TabIndex = 2;
- this.btnchooseclose.Text = "关闭";
- this.btnchooseclose.UseVisualStyleBackColor = true;
- this.btnchooseclose.Click += new System.EventHandler(this.btnchooseclose_Click);
- //
- // btnchooseok
- //
- this.btnchooseok.Location = new System.Drawing.Point(4, 4);
- this.btnchooseok.Margin = new System.Windows.Forms.Padding(4);
- this.btnchooseok.Name = "btnchooseok";
- this.btnchooseok.Size = new System.Drawing.Size(112, 34);
- this.btnchooseok.TabIndex = 3;
- this.btnchooseok.Text = "确定";
- this.btnchooseok.UseVisualStyleBackColor = true;
- this.btnchooseok.Click += new System.EventHandler(this.btnchooseok_Click);
- //
- // flowLayoutPanel2
- //
- this.flowLayoutPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.flowLayoutPanel2.Controls.Add(this.btnchooseok);
- this.flowLayoutPanel2.Controls.Add(this.btnchooseclose);
- this.flowLayoutPanel2.Location = new System.Drawing.Point(482, 357);
- this.flowLayoutPanel2.Name = "flowLayoutPanel2";
- this.flowLayoutPanel2.Size = new System.Drawing.Size(246, 44);
- this.flowLayoutPanel2.TabIndex = 4;
+ this.viewMainChooseDGV.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
+ this.viewMainChooseDGV.Location = new System.Drawing.Point(4, 4);
+ this.viewMainChooseDGV.Margin = new System.Windows.Forms.Padding(4);
+ this.viewMainChooseDGV.MultiSelect = false;
+ this.viewMainChooseDGV.Name = "viewMainChooseDGV";
+ this.viewMainChooseDGV.RowTemplate.Height = 23;
+ this.viewMainChooseDGV.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+ this.viewMainChooseDGV.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
+ this.viewMainChooseDGV.Size = new System.Drawing.Size(700, 330);
+ this.viewMainChooseDGV.TabIndex = 0;
+ this.viewMainChooseDGV.SizeChanged += new System.EventHandler(this.MainChooseDGV_SizeChanged);
//
// Pid
//
@@ -117,37 +80,95 @@
this.UserName.HeaderText = "UserName";
this.UserName.Name = "UserName";
//
+ // listViewFlowLayoutPanel
+ //
+ this.listViewFlowLayoutPanel.Controls.Add(this.viewMainChooseDGV);
+ this.listViewFlowLayoutPanel.Location = new System.Drawing.Point(4, 6);
+ this.listViewFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(4);
+ this.listViewFlowLayoutPanel.Name = "listViewFlowLayoutPanel";
+ this.listViewFlowLayoutPanel.Size = new System.Drawing.Size(724, 334);
+ this.listViewFlowLayoutPanel.TabIndex = 1;
+ //
+ // viewChooseCloseBtn
+ //
+ this.viewChooseCloseBtn.Location = new System.Drawing.Point(124, 4);
+ this.viewChooseCloseBtn.Margin = new System.Windows.Forms.Padding(4);
+ this.viewChooseCloseBtn.Name = "viewChooseCloseBtn";
+ this.viewChooseCloseBtn.Size = new System.Drawing.Size(112, 34);
+ this.viewChooseCloseBtn.TabIndex = 2;
+ this.viewChooseCloseBtn.Text = "关闭";
+ this.viewChooseCloseBtn.UseVisualStyleBackColor = true;
+ this.viewChooseCloseBtn.Click += new System.EventHandler(this.ViewChooseCloseBtn_Click);
+ //
+ // viewChooseOkBtn
+ //
+ this.viewChooseOkBtn.Location = new System.Drawing.Point(4, 4);
+ this.viewChooseOkBtn.Margin = new System.Windows.Forms.Padding(4);
+ this.viewChooseOkBtn.Name = "viewChooseOkBtn";
+ this.viewChooseOkBtn.Size = new System.Drawing.Size(112, 34);
+ this.viewChooseOkBtn.TabIndex = 3;
+ this.viewChooseOkBtn.Text = "确定";
+ this.viewChooseOkBtn.UseVisualStyleBackColor = true;
+ this.viewChooseOkBtn.Click += new System.EventHandler(this.ViewChooseOkBtn_Click);
+ //
+ // btnFlowLayoutPanel
+ //
+ this.btnFlowLayoutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnFlowLayoutPanel.Controls.Add(this.viewChooseOkBtn);
+ this.btnFlowLayoutPanel.Controls.Add(this.viewChooseCloseBtn);
+ this.btnFlowLayoutPanel.Location = new System.Drawing.Point(482, 357);
+ this.btnFlowLayoutPanel.Name = "btnFlowLayoutPanel";
+ this.btnFlowLayoutPanel.Size = new System.Drawing.Size(246, 44);
+ this.btnFlowLayoutPanel.TabIndex = 4;
+ //
+ // viewMsgLabel
+ //
+ this.viewMsgLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.viewMsgLabel.AutoSize = true;
+ this.viewMsgLabel.Location = new System.Drawing.Point(196, 370);
+ this.viewMsgLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.viewMsgLabel.Name = "viewMsgLabel";
+ this.viewMsgLabel.Size = new System.Drawing.Size(0, 18);
+ this.viewMsgLabel.TabIndex = 5;
+ //
// MainChooseForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(728, 402);
- this.Controls.Add(this.flowLayoutPanel2);
- this.Controls.Add(this.flowLayoutPanel1);
+ this.Controls.Add(this.viewMsgLabel);
+ this.Controls.Add(this.btnFlowLayoutPanel);
+ this.Controls.Add(this.listViewFlowLayoutPanel);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(4);
- this.MaximumSize = new System.Drawing.Size(1000, 2000);
- this.MinimumSize = new System.Drawing.Size(600, 56);
+ this.MaximumSize = new System.Drawing.Size(994, 1997);
+ this.MinimumSize = new System.Drawing.Size(739, 422);
this.Name = "MainChooseForm";
- this.Text = "MainChooseForm";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "选择";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainChooseForm_FormClosing);
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainChooseForm_FormClosed);
this.Load += new System.EventHandler(this.MainChooseForm_Load);
this.SizeChanged += new System.EventHandler(this.MainChooseForm_SizeChanged);
- ((System.ComponentModel.ISupportInitialize)(this.MainChooseDGV)).EndInit();
- this.flowLayoutPanel1.ResumeLayout(false);
- this.flowLayoutPanel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.viewMainChooseDGV)).EndInit();
+ this.listViewFlowLayoutPanel.ResumeLayout(false);
+ this.btnFlowLayoutPanel.ResumeLayout(false);
this.ResumeLayout(false);
+ this.PerformLayout();
}
#endregion
- private System.Windows.Forms.DataGridView MainChooseDGV;
- private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
- private System.Windows.Forms.Button btnchooseclose;
- private System.Windows.Forms.Button btnchooseok;
- private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2;
+ private System.Windows.Forms.DataGridView viewMainChooseDGV;
+ private System.Windows.Forms.FlowLayoutPanel listViewFlowLayoutPanel;
+ private System.Windows.Forms.Button viewChooseCloseBtn;
+ private System.Windows.Forms.Button viewChooseOkBtn;
+ private System.Windows.Forms.FlowLayoutPanel btnFlowLayoutPanel;
private System.Windows.Forms.DataGridViewTextBoxColumn Pid;
private System.Windows.Forms.DataGridViewTextBoxColumn PsName;
private System.Windows.Forms.DataGridViewTextBoxColumn UserName;
+ private System.Windows.Forms.Label viewMsgLabel;
}
}
\ No newline at end of file
diff --git a/ResourceMonitorTools/MainChooseForm.cs b/ResourceMonitorTools/MainChooseForm.cs
new file mode 100644
index 0000000000000000000000000000000000000000..49a89d2c81b536cda1021b99bbfe7fce32b3b41d
--- /dev/null
+++ b/ResourceMonitorTools/MainChooseForm.cs
@@ -0,0 +1,480 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using BLL.utils;
+using System.Management;
+using System.Threading;
+using Model;
+using BLL;
+
+namespace ResourceMonitorTools
+{
+ ///
+ /// 进程选择界面
+ ///
+ public partial class MainChooseForm : Form
+ {
+ CancellationTokenSource cts;
+ Task task;
+ String scene;
+ List deviceInfoList = new List { };
+ ///
+ /// 进程选择界面构造方法
+ ///
+ ///
+ ///
+ public MainChooseForm(string scene, string deviceId)
+ {
+ InitializeComponent();
+ cts = new CancellationTokenSource();
+ this.scene = scene;
+ if (scene.Equals("Device"))
+ {
+ SetDeviceInfoColumns();
+ }
+ else
+ {
+ Init();
+ }
+ this.viewMsgLabel.Text = "数据获取中。。。";
+ task = Task.Factory.StartNew(() => SetData(scene,cts.Token,deviceId),cts.Token);
+ SetSize();
+ }
+
+ ///
+ /// 初始化表格大小
+ ///
+ public void Init()
+ {
+ if (this.viewMainChooseDGV.Columns.Count == 3)
+ {
+ this.viewMainChooseDGV.Columns[0].Width = 100;
+ this.viewMainChooseDGV.Columns[1].Width = this.viewMainChooseDGV.Width - 250;
+ this.viewMainChooseDGV.Columns[2].Width = 100;
+ }
+ }
+
+ ///
+ /// 设置表格大小
+ ///
+ private void SetSize()
+ {
+ this.listViewFlowLayoutPanel.Height = this.Height - 80;
+ this.listViewFlowLayoutPanel.Width = this.Width - 4;
+ this.viewMainChooseDGV.Height = this.Height - 80;
+ this.viewMainChooseDGV.Width = this.Width - 4;
+ //Init() ;
+ }
+
+ ///
+ /// 设置设备列表列名
+ ///
+ private void SetDeviceInfoColumns()
+ {
+ DataGridViewTextBoxColumn dgvtbcDeviceId = new DataGridViewTextBoxColumn();
+ DataGridViewTextBoxColumn dgvtbcDeviceBrand = new DataGridViewTextBoxColumn();
+ DataGridViewTextBoxColumn dgvtbcDeviceModel = new DataGridViewTextBoxColumn();
+ DataGridViewTextBoxColumn dgvtbcDeviceSDKVersion = new DataGridViewTextBoxColumn();
+ DataGridViewTextBoxColumn dgvtbcDeviceReleaseVersion = new DataGridViewTextBoxColumn();
+ DataGridViewTextBoxColumn dgvtbcDeviceResolutionW = new DataGridViewTextBoxColumn();
+ DataGridViewTextBoxColumn dgvtbcDeviceResolutionH = new DataGridViewTextBoxColumn();
+ dgvtbcDeviceId.HeaderText = "设备ID";
+ dgvtbcDeviceId.Name = "DeviceId";
+
+ dgvtbcDeviceBrand.HeaderText = "设备品牌";
+ dgvtbcDeviceBrand.Name = "DeviceBrand";
+
+ dgvtbcDeviceModel.HeaderText = "设备型号";
+ dgvtbcDeviceModel.Name = "DeviceModel";
+
+ dgvtbcDeviceSDKVersion.HeaderText = "设备系统SDK版本";
+ dgvtbcDeviceSDKVersion.Name = "DeviceSDKVersion";
+
+ dgvtbcDeviceReleaseVersion.HeaderText = "设备系统API版本";
+ dgvtbcDeviceReleaseVersion.Name = "DeviceReleaseVersion";
+
+ dgvtbcDeviceResolutionW.HeaderText = "设备屏幕分辨率宽";
+ dgvtbcDeviceResolutionW.Name = "DeviceResolutionW";
+
+ dgvtbcDeviceResolutionH.HeaderText = "设备屏幕分辨率高";
+ dgvtbcDeviceResolutionH.Name = "DeviceResolutionH";
+
+ this.viewMainChooseDGV.Columns.Clear();
+ this.viewMainChooseDGV.Columns.AddRange(new DataGridViewColumn[] { dgvtbcDeviceId, dgvtbcDeviceBrand, dgvtbcDeviceModel, dgvtbcDeviceSDKVersion, dgvtbcDeviceReleaseVersion, dgvtbcDeviceResolutionW, dgvtbcDeviceResolutionH });
+ }
+
+
+ ///
+ /// 获取并设置表格数据
+ ///
+ ///
+ ///
+ ///
+ private void SetData(string scene, CancellationToken ct,string deviceId)
+ {
+ switch (scene)
+ {
+ case "APP":
+ List> appPsList = GetAppInfo.GetPs(deviceId);
+ List appChooseList = new List();
+
+ if (appPsList != null && appPsList.Count > 1)
+ {
+ Debug.WriteLine("pslist.count:" + appPsList.Count);
+ for (int i = 0; i < appPsList.Count; i++)
+ {
+ if (ct.IsCancellationRequested)
+ {
+ Debug.WriteLine("IsCancellationRequested");
+ return;
+ }
+ List itemList = appPsList.ElementAt(i);
+ if (itemList.Count > 0)
+ {
+ try
+ {
+ ChooseInfo chooseInfo = new ChooseInfo();
+ chooseInfo.Pid = int.Parse(itemList.ElementAt(0));
+ chooseInfo.ChooseName = itemList.ElementAt(itemList.Count - 1);
+ chooseInfo.UserName = itemList.ElementAt(1);
+ appChooseList.Add(chooseInfo);
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ int index = this.viewMainChooseDGV.Rows.Add();
+ this.viewMainChooseDGV.Rows[index].Cells[0].Value = chooseInfo.Pid;
+ this.viewMainChooseDGV.Rows[index].Cells[1].Value = chooseInfo.ChooseName;
+ this.viewMainChooseDGV.Rows[index].Cells[2].Value = chooseInfo.UserName;
+ Init();
+ }));
+ }
+ else
+ {
+ return;
+ }
+ }
+ catch (Exception)
+ {
+ //解决部分情况下出现的乱码问题
+ continue;
+ }
+ }
+ }
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ this.viewMsgLabel.Text = "数据获取完成!";
+ }));
+ }
+ }
+ else
+ {
+ Debug.WriteLine("App pslist null!");
+ logger.Info(this.GetType(),"App pslist is null!");
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() => {
+ this.viewMsgLabel.Text = "无数据";
+ }));
+ }
+ }
+ break;
+ case "PC":
+ List pcPsList = null;
+ try
+ {
+ pcPsList = GetPsInfo.GetPCPsList();
+ }
+ catch (Exception pse)
+ {
+ logger.Info(pse.GetType(), "获取PC所有进程信息出错!ErrorMessage:" ,pse);
+ MessageBox.Show("获取PC所有进程信息出错!详细信息见工作目录下日志文件", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ this.viewMsgLabel.Text = "获取PC所有进程信息出错";
+ }));
+ }
+ return;
+ }
+ //List chooseList = Utils.GetProcessUserName(-1);
+ if (pcPsList== null )
+ {
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ this.viewMsgLabel.Text = "无数据";
+ }));
+ }
+ }
+ List pcChooseList = new List();
+ for (int i = 0; i < pcPsList.Count; i++)
+ {
+ if (ct.IsCancellationRequested)
+ {
+ Debug.WriteLine("IsCancellationRequested");
+ return;
+ }
+ Process process = pcPsList.ElementAt(i);
+ ChooseInfo chooseInfo = new ChooseInfo();
+ chooseInfo.Pid = process.Id;
+ chooseInfo.ChooseName = process.ProcessName;
+ List userNameList = Utils.GetProcessUserName(process.Id);
+ string userName = "";
+ if (userNameList != null && userNameList.Count > 0)
+ {
+ userName = userNameList.ElementAt(0).UserName;
+ }
+ chooseInfo.UserName = userName;
+ Debug.WriteLine("进程所有者:" + chooseInfo.UserName);
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ int index = this.viewMainChooseDGV.Rows.Add();
+ this.viewMainChooseDGV.Rows[index].Cells[0].Value = chooseInfo.Pid;
+ this.viewMainChooseDGV.Rows[index].Cells[1].Value = chooseInfo.ChooseName;
+ this.viewMainChooseDGV.Rows[index].Cells[2].Value = chooseInfo.UserName;
+ Init();
+ }));
+ }
+ else
+ {
+ return;
+ }
+ pcChooseList.Add(chooseInfo);
+ }
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ this.viewMsgLabel.Text = "数据获取完成!";
+ }));
+ }
+ break;
+ case "Device":
+ deviceInfoList = new GetDeviceInfo().GetDeviceInfoList();
+
+ if (deviceInfoList != null && deviceInfoList.Count > 0)
+ {
+ Debug.WriteLine("deviceInfoList.count:" + deviceInfoList.Count);
+ for (int i = 0; i < deviceInfoList.Count; i++)
+ {
+ if (ct.IsCancellationRequested)
+ {
+ Debug.WriteLine("IsCancellationRequested");
+ return;
+ }
+ DeviceInfo deviceInfo = deviceInfoList.ElementAt(i);
+ try
+ {
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ int index = this.viewMainChooseDGV.Rows.Add();
+ this.viewMainChooseDGV.Rows[index].Cells[0].Value = deviceInfo.DeviceId;
+ this.viewMainChooseDGV.Rows[index].Cells[1].Value = deviceInfo.DeviceBrand;
+ this.viewMainChooseDGV.Rows[index].Cells[2].Value = deviceInfo.DeviceModel;
+ this.viewMainChooseDGV.Rows[index].Cells[3].Value = deviceInfo.DeviceSDKVersion;
+ this.viewMainChooseDGV.Rows[index].Cells[4].Value = deviceInfo.DeviceReleaseVersion;
+ this.viewMainChooseDGV.Rows[index].Cells[5].Value = deviceInfo.DeviceResolutionW;
+ this.viewMainChooseDGV.Rows[index].Cells[6].Value = deviceInfo.DeviceResolutionH;
+ }));
+ }
+ else
+ {
+ Debug.WriteLine("无句柄!");
+ return;
+ }
+ }
+ catch (Exception devicee)
+ {
+ logger.Info(this.GetType(), "deviceInfo填充数据出错,", devicee);
+ //解决部分情况下出现的乱码问题
+ continue;
+ }
+ }
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ this.viewMsgLabel.Text = "数据获取完成!";
+ }));
+ }
+ }
+ else
+ {
+ Debug.WriteLine("App deviceInfoList null!");
+ logger.Info(this.GetType(), "App deviceInfoList is null!");
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() =>
+ {
+ this.viewMsgLabel.Text = "无数据";
+ }));
+ }
+ }
+ break;
+ default:
+ logger.Info(this.GetType(),"场景标识错误----Scene:"+ scene);
+ MessageBox.Show("场景标识错误!scene:" +scene,"警告",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
+ break;
+ }
+ }
+
+ ///
+ /// 关闭按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewChooseCloseBtn_Click(object sender, EventArgs e)
+ {
+ if (task.IsCompleted)
+ {
+ this.Close();
+ }
+ else
+ {
+ StopTask(task, cts);
+ }
+ }
+
+ ///
+ /// 返回选择的进程信息
+ ///
+ public ChooseInfo ReturnChooseInfoValue { get; protected set; } //用这个公开属性传值
+
+ ///
+ /// 返回选择的设备信息
+ ///
+ public DeviceInfo ReturnDeviceInfo { get; protected set; } //用这个公开属性传值
+
+ ///
+ /// 选择按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewChooseOkBtn_Click(object sender, EventArgs e)
+ {
+ if (scene.Equals("Device"))
+ {
+ if (deviceInfoList.Count > 0 )
+ {
+ ReturnDeviceInfo = deviceInfoList.ElementAt(this.viewMainChooseDGV.SelectedRows[0].Index);
+ Debug.WriteLine("选择的设备信息:\n" + deviceInfoList.ElementAt(this.viewMainChooseDGV.SelectedRows[0].Index).GetString());
+ }
+ else
+ {
+ logger.Info(deviceInfoList.GetType(),"获取到的设备列表为空!");
+ }
+ }
+ else
+ {
+ ReturnChooseInfoValue = new ChooseInfo();
+ ReturnChooseInfoValue.Pid = int.Parse(this.viewMainChooseDGV.SelectedRows[0].Cells[0].Value.ToString());
+ ReturnChooseInfoValue.ChooseName = this.viewMainChooseDGV.SelectedRows[0].Cells[1].Value.ToString();
+ ReturnChooseInfoValue.UserName = this.viewMainChooseDGV.SelectedRows[0].Cells[2].Value.ToString();
+ }
+ if (ReturnChooseInfoValue == null && ReturnDeviceInfo == null)
+ {
+ MessageBox.Show("请选择你想要使用的项!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ }
+ else
+ {
+ DialogResult = DialogResult.OK;
+ if (task.IsCompleted)
+ {
+ this.Close();
+ }
+ else
+ {
+ StopTask(task, cts);
+ }
+ }
+ }
+
+ private void MainChooseForm_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ private void MainChooseDGV_SizeChanged(object sender, EventArgs e)
+ {
+
+ }
+
+ ///
+ /// 窗口大小改变事件
+ ///
+ ///
+ ///
+ private void MainChooseForm_SizeChanged(object sender, EventArgs e)
+ {
+ SetSize();
+ }
+
+ ///
+ /// 停止线程并释放线程资源
+ ///
+ ///
+ private void StopTask(Task t, CancellationTokenSource cts)
+ {
+ cts.Cancel();
+ while (true)
+ {
+ Debug.WriteLine("线程状态:" + t.Status);
+ if (t.IsCompleted)
+ {
+ try
+ {
+ t.Dispose();
+ Debug.WriteLine(t.Status);
+ this.Close();
+ break;
+ }
+ catch (Exception e1)
+ {
+ Debug.WriteLine("ChooseForm-线程停止失败-ErrorMessage:" , e1);
+ logger.Info(e1.GetType(),"ChooseForm-线程停止失败-ErrorMessage:" ,e1);
+ }
+ }
+ }
+ }
+
+ ///
+ /// 点击右上角关闭按钮时事件
+ ///
+ ///
+ ///
+ private void MainChooseForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ logger.Info(this.GetType(),"右上角关闭按钮被点击!");
+ if (!task.IsCompleted)
+ {
+ StopTask(task, cts);
+ }
+ }
+
+ ///
+ /// 窗口关闭完成后触发事件,释放窗口资源。
+ ///
+ ///
+ ///
+ private void MainChooseForm_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ //this.Dispose();
+ }
+ }
+}
\ No newline at end of file
diff --git a/ResourceMonitorTools/MainChooseForm.resx b/ResourceMonitorTools/MainChooseForm.resx
new file mode 100644
index 0000000000000000000000000000000000000000..65549b552302065e774810ad9abf21ee7f2d1246
--- /dev/null
+++ b/ResourceMonitorTools/MainChooseForm.resx
@@ -0,0 +1,1268 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+
+
+ AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABABAnAAAQJwAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAMAAAAgAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAA
+ ADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAA
+ ADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAA
+ ADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAA
+ ADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAA
+ ADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAA
+ ADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAA
+ ADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAgAAAAAwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAjQAAAN8AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAA
+ AO4AAADuAAAA7gAAAN8AAACNAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAwAAAI0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACNAAAAAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA3wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN8AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAACwAAADsAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6wAA
+ ACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAMkAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADJAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAOkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6QAA
+ AFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAPgAA
+ AJEAAACqAAAAqwAAAKoAAAC5AAAA+AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA5gAAAKwAAACqAAAAqwAA
+ AKsAAACrAAAAqQAAANIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAAqQAAAKsAAACrAAAAqwAA
+ AKoAAACvAAAA7AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8wAAALQAAACqAAAAqwAAAKsAAACrAAAAqQAA
+ AMEAAAD8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADcAAAAqgAAAKsAAACrAAAAqwAAAKsAAACqAAAA3AAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAMEAAACpAAAAqwAAAKsAAACrAAAAqgAAALQAAADzAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADsAAAArwAAAKoAAACrAAAAqwAAAKsAAACpAAAAygAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAANIAAACpAAAAqwAAAKsAAACrAAAAqgAAAKwAAADmAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD4AAAAuQAAAKoAAACrAAAAqgAAAJEAAAA+AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAC0AAADqAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAACzAAAACAAAAAMAAAADAAAAAwAAAAMAAAAAAAAAeAAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAGEAAAAAAAAAAwAAAAMAAAADAAAAAgAAABAAAADHAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADdAAAAHwAAAAEAAAADAAAAAwAAAAMAAAAAAAAARQAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AJYAAAACAAAAAwAAAAMAAAADAAAAAwAAAAIAAACWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAARQAA
+ AAAAAAADAAAAAwAAAAMAAAABAAAAHwAAAN0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMcAAAAQAAAAAgAA
+ AAMAAAADAAAAAwAAAAAAAABhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAeAAAAAAAAAADAAAAAwAA
+ AAMAAAADAAAACAAAALMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAtAAAAAAAAAAMAAAADAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALIAAAAFAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAADQAAAMYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAANwAAAAcAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABCAAAA9wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAxgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA3AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAD3AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAA
+ AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACyAAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAA0AAADGAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADcAAAAHAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAQgAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAA
+ ANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAA
+ AOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAMYAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAANwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAA9wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ APcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAA
+ AA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAA
+ AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAANAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3AAAABwAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAEIAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACyAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAADGAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAPcAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ ALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAMYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAANwAAAAcAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABCAAAA9wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAxgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA3AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAD3AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADqAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAACyAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAADGAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADcAAAAHAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA
+ ALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
+ AMYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAANwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAA9wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAA
+ ACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3AAA
+ ABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACVAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACyAAAABQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AA0AAADGAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAA
+ APcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAMYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ ANwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAA9wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAANAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA3AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AEIAAAD3AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADqAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAACyAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAADGAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADcAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALIAAAAFAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAADQAAAMYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAANwAAAAcAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABCAAAA9wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAxgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA3AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEIAAAD3AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAA
+ AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACyAAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAA0AAADGAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADcAAAAHAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAQgAAAPcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAA
+ ANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAA
+ AOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAMYAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAANwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAA9wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAlQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ APcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAA
+ AA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAA
+ AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAANAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6wAAAH4AAABtAAAAbgAA
+ AG4AAABuAAAAbAAAAJQAAAD7AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACyAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAADGAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ ALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAMYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAxgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAACVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADqAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAACyAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAC7AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA
+ ALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AHUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADyAAAARQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAA
+ ACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAJsAAAD0AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6QAAAHUAAAAEAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAACyAAAABQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAACQAAAEAAAABkAAAAZwAAAGYAAABmAAAAZgAAAGYAAABmAAAAZgAAAGYAAABmAAAAZgAA
+ AGYAAABmAAAAZwAAAGAAAAAxAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAALIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAAAUAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADqAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAACyAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALIAAAAFAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAA
+ AEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC1AAAADgAA
+ AAkAAAAKAAAACgAAAAoAAAAGAAAAewAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAA
+ ANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAA
+ AOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOwAAADAAAAAvwAAAL8AAAC/AAAAvwAAAL4AAADdAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ APcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAA
+ AA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ACoAAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAAAOoAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAYAAAA1gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPYAAABDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5AAAA/QAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArQAA
+ AA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA
+ ALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAsAAAB0AAAAzgAAAOEAAADhAAAA4QAAAOEAAADhAAAA4QAAAOEAAADhAAAA4QAA
+ AOEAAADhAAAA4QAAAOEAAADhAAAA2AAAAJUAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAABgAAAAdAAAAFQAAAAcAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAPcAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAA
+ ACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAIAAA
+ ACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAhAAAAIQAAACEAAAAYAAAAAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAARAAA
+ AI4AAADAAAAA1wAAAN0AAADUAAAAtgAAAH0AAAAyAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAK0AAAD0AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AOkAAACSAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAFoAAADjAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADLAAAAOAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABCAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAcAAAA3AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABXAAAA7gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADWAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAN4AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC6AAAAEwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAAQgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAANwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAUAAACgAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAABtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAA3AAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAOwAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD8AAAA2QAAAMgAAADjAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AMsAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAA
+ AG4AAAA4AAAAOwAAADsAAAA7AAAAOgAAAFEAAADkAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAB2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAAAHEAAAAbAAAADQAA
+ ACcAAACUAAAA+gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9QAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACVAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAPQAAAD0AAAA9AAAAPQAAAD0AAAA9QAA
+ AP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAKgAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP4AAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAoAAACsAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJUAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxgAA
+ AA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAKAAAAwAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6AAAACsAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAFgAAAD8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACNAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADGAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAADCAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADhAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASQAAAPkAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AMEAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAADAAAAPQAAANgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPYAAABLAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAB+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAFoAAAD8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAOQAAAJ0AAADsAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMIAAAAlAAAAAAAAAAAAAAAAAAAAQwAAAOEAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP0AAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAJ8AAAD8AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AMMAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAFAAAAIgAAAEUAAABcAAAAXwAAAE0AAAArAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAADAAAAOQAAAJ0AAADsAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ ANMAAACBAAAAZwAAAJIAAADlAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA4gAAACcAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAF4AAACWAAAAngAAAJ0AAACdAAAAnQAAAJ0AAACdAAAAnQAA
+ AJ0AAACdAAAAnQAAAJ0AAACdAAAAngAAAJoAAABxAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA
+ ALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAASwAAAKgAAADhAAAA9wAAAP4AAAD/AAAA+gAA
+ AOkAAAC6AAAAZAAAABIAAAAAAAAAAAAAAAAAAAADAAAAOQAAAJ0AAADsAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAC+AAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAA
+ ACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAA
+ AJwAAAD0AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAAvgAAADsAAAAEAAAAOAAA
+ AJ0AAADsAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPUAAAB6AAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAADCAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA4AAAAK0AAADqAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAvAAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA1wAAAMUAAAD+AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ APcAAAB6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAIgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA2AAAAHsAAAAgAAAAFQAAAIkAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB6AAAABQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA5wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2AAAAHoAAAAgAAAAAAAAAAAAAAAAAAAAAwAA
+ AEEAAAChAAAA4AAAAPkAAAD/AAAA/wAAAP8AAAD2AAAA1QAAAJ8AAADfAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAPcAAAB6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAAywAA
+ AIUAAAB8AAAAtQAAAPgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2AAA
+ AHoAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAjAAAATAAAAGkAAABxAAAAYwAA
+ AEMAAAAaAAAAAAAAAEgAAADhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB6AAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAvgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKYAAAAZAAAAAAAAAAAAAAAJAAAAdgAAAPgAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD+AAAA2AAAAHoAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADgAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAUAAACyAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAADdAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADhAAAAKAAA
+ AAAAAAAAAAAAAAAAAAAAAAAKAAAAtgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJcAAAAfAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADgAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ APcAAAB6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAA
+ AOgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAALoAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD+AAAAWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AEgAAADgAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB6AAAABQAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB2AAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAFAAAAsgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAAA5gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAwgAA
+ AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAABZAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADgAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAPcAAAB6AAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAACyAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADqAAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ABgAAADWAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAzgAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA9gAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAEgAAADhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB6AAAABQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAdgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAALIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAK8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADPAAAARQAAAAwAAAAIAAAAKwAAAKoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADeAAAAIAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADhAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPcAAAB6AAAABQAAAAAAAAAAAAAAAAAAAAIAAAAFAAAAAwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB5AAAAAQAAAAUAAAAFAAAABQAAAAUAAAAKAAAAtAAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAaQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAxAAAAL0AAADkAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKMAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADhAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ APcAAAB6AAAAGQAAAEoAAACDAAAApgAAALMAAACsAAAAjgAAAFkAAAAeAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ ANcAAACzAAAAtAAAALQAAAC0AAAAtAAAALYAAADoAAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKgAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdAAAA0wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADyAAAARwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AEgAAADgAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPYAAADXAAAA9gAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/AAAANkAAAB8AAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOoAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABhAAAA+AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAJgAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADgAAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADCAAAANQAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA6gAA
+ ACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACPAAAA/gAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC+AAAAHAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAEgAAADgAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADWAAAANgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAXgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADqAAAAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAACPAAAA+AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAuAAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADgAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADFAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFAAAA9wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ ANgAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAcAAABgAAAA0gAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA5QAAAIQAAAAWAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADiAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACEAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAA8AAAC0AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAfwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAZwAAAK0AAADVAAAA5AAA
+ AOYAAADbAAAAuwAAAHwAAAAtAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAA
+ AMEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAOsAAAD0AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAN8AAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAACgAAAA3wAA
+ AOcAAADnAAAA5wAAAOcAAADnAAAA5wAAAOcAAADnAAAA5wAAAOcAAADnAAAA5wAAAOcAAADnAAAA1gAA
+ AH4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAABYAAAAkAAAAJgAAABsAAAAJAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3AAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AL4AAABRAAAAKwAAAEEAAAChAAAA+gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGcAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAfAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
+ ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACcAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AGgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADFAAAAHQAAAAAAAAAAAAAAAAAAAAkAAACbAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAAngAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAA
+ AGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADuAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC8AAAACAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAACTAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAA
+ AN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAABqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAugAA
+ AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAZgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMsAAAAjAAAAAAAAAAAAAAAAAAAADQAA
+ AKMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA7QAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAMcAAABeAAAANgAAAE0AAACsAAAA/AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AJUAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAoAAAC1AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPwAAADxAAAA+QAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA9gAAAJkAAAAbAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE4AAAD0AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAMQAAAA9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAJIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOUAAABpAAAABwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAA
+ AKsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPkAAACZAAAAGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAJYAAAD2AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAPQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADEAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAABwAAAFUAAAC+AAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+AAAAM8AAABvAAAASQAA
+ AMQAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADlAAAAaAAAAAcAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAA/AAAAdQAA
+ AJkAAACmAAAAngAAAIAAAABMAAAAFwAAAAAAAAAAAAAAHAAAAJkAAAD5AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD4AAAAmAAAABsAAAAAAAAAAAAAAAAAAAAHAAAAJAAAAEMAAABTAAAAUQAA
+ ADwAAAAbAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAABwAAAGkAAADlAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxAAA
+ ADwAAAAQAAAAWgAAALEAAADjAAAA9gAAAPwAAAD7AAAA8wAAANkAAACcAAAAQAAAAAQAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AAADFAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA5AAAAMUAAAD5AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADwAAAAkgAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAACZAAAA+AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAugAA
+ ACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAcAAABpAAAA5QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAtQAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9AAAAxQAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAbAAAAmQAAAPgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADkAAAALAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAbQAA
+ APIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD6AAAAvgAAAIcAAACRAAAA0wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAAAA5wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAA
+ AH8AAAANAAAAAAAAAAAAAAAfAAAArgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALsAAAAJAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AEkAAAD4AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC6AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAA5AAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA3AAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWwAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAC7AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADoAAAAKAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAABaAAAA/gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAA
+ AMEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOcAAAAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAD3AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAADKAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAA/AAAA7QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA1wAA
+ ABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAIgAAAOAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAChAAAAJAAAAAUAAAAIAAAAPAAA
+ AMkAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACxAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAqAAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAADdAAAAswAAALsAAADrAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAABMAAAA9QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADXAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAACfAAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+gAA
+ AGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAADFAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACXAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ACsAAADAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD7AAAAmAAA
+ ABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAACOAAAA6wAAAP8AAAD/AAAA/wAA
+ AP8AAAD/AAAA/wAAAP8AAAD/AAAA2QAAAGsAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAIAAAA2AAAAiAAAAMQAAADiAAAA7QAAAOsAAADcAAAAtwAAAHIAAAAiAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAA
+ ACIAAAAuAAAALAAAABwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////
+ //////////////////////////////gAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAA
+ AAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AA
+ AAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAA
+ AB/8AAAAAAAAAAAAAAAAAAA//+ADgBwAcAGADgA4AcAH///gA4AcAHABgA4AOAHAB///4AOAHABwAYAO
+ ADgBwAf//+ADgBwAcAGADgA4AcAH///gA4AcAHABgA4AOAHAB///4AOAHABwAYAOADgBwAf//+ADgBwA
+ cAGADgA4AcAH///gA4AcAHABgA4AOAHAB///4AOAHABwAYAOADgBwAf//+ADgBwAcAGADgA4AcAH///g
+ A4AcAHABgA4AOAHAB///4AOAHABwAYAOADgBwAf//+ADgBwAcAGADgA4AcAH///gA4AcAHABgA4AOAHA
+ B///4AOAHABwAYAOADgBwAf//+ADgBwAcAGADgA4AcAH///gA4AcAHABgA4AOAHAB///4AOAHAAAAYAO
+ ADgBwAf//+ADgBwAAAGADgA4AcAH///gA4AcAAABgA4AOAHAB///4AOAHAAAAYAOADgBwAf//+ADgBwA
+ AAGADgA4AcAH///gA4AcAAABgA4AOAHAB///4AOAHAAAAYAOADgBwAf//+ADgBwAAAGADgA4AcAH///g
+ A4AeAAADgA4AOAHAB///4AOAHgAAB4AOADgBwAf//+ADgB////+ADgA4AcAH///gA4Af////gA4AOAHA
+ B///4AOAH////4AOADgBwAf//+AAAB////+ADgA4AcAH///gAAAf////gA4AOAHAB///4AAAH////4AO
+ ADgBwAf//+AAAB////+ADgA4AcAH///gAAAf////gA4AOAHAB///4AAAH////4AOADgBwAf//+AAAB//
+ //+ADgA4AcAH///gAAAf+AH/gA4AOAHAB///4AAAH+AAP4AOADgBwAf//+AAAB/AAB+ADgA4AcAH///w
+ AAA/gAAPgA4AOAHAB////////wAAB4AOADgBwAf///////4AAAeADgA4AcAH///////+AAADgA4AOAHA
+ B////////gAAA4AAADgBwAf///////wAAAOAAAA4AcAH///////8AAABgAAAOAHAB////////AAAAYAA
+ ADgBwAf///////wAAAGAAAA4AcAH///////wACABgAAAOAHAB///////wAAAAYAAADgBwAf///+ABwAA
+ AAGAAAA4AcAH///+AAAAAAABwAAAOAHAB////AAAAAAAAcAAAHgBwAf///gAAAAAAADwAAH4AcAH///w
+ AAAAAAAAf///+AHAB///8AAAAAAAAD////gBwAf//+AAAAAAAAAf///4AcAH///gAAAAAAAAD///+AHA
+ B///4AAAAAAAAAf///gBwAf//+AAAABwAAAD///4AcAH///gAAAB//wAAf//+AHAB///4AEAB//+AAD/
+ //gBwAf//+AAAB///wAAf//4AcAH///gAAAf//+AAAA/+AAAB///4AAAH///wAAAB/gAAAf//+AAAB//
+ /+AAAAP4AAAH///gAAAf///wAAAB+AAAB///8AAAH///+AAAAPgAAAf///AAAD////wAAAB4AAAH///4
+ AAA////+AAAAeAAAB///+AAAf////wAAAHgAAAf///wAAP////+AAAA4AAAH////AAH/////gAAAOAAA
+ B////8AH/////4AAADwAAA////////////+AAAA/////////////////gAQAP////////////////4AA
+ AD////////////////+AAAAf////////////////gAAAD////////////////8AAAAf/////////////
+ ///AAAAB////////////////wAAAAP///////////////+AAAAB////////////////gAAAAH///////
+ ////////8AAAAAAB//////////////gAAAAAAH/////////////+AAAAAAA//////////////8BgAAAA
+ H///////////////+AAAAA////////////////wAAAAP///////////////+AAAAB///////////////
+ /4AAAAf////////////////AAAAH////////////////4AAAB/////////////////gAAAf/////////
+ ///////4AIAH////////////////+AAAB/////////////////gAAAf////////////////4AAAH////
+ ////////////+AAAB/////////////////gAAAf////////////////4AAAP/////////////////AAA
+ D/////////////////wAAB/////////////////+AAAf/////////////////wAAP///////////////
+ //+AAP//////////////////4AP/////////////////////////////////////////////////////
+ //////////////////////////////////8=
+
+
+
\ No newline at end of file
diff --git a/ResourceMonitorTools/MainForm.Designer.cs b/ResourceMonitorTools/MainForm.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..53b5623653e03ff8fa079997d8cfd3e83d8f7c69
--- /dev/null
+++ b/ResourceMonitorTools/MainForm.Designer.cs
@@ -0,0 +1,903 @@
+namespace ResourceMonitorTools
+{
+ partial class MainForm
+ {
+ ///
+ /// 必需的设计器变量。
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 清理所有正在使用的资源。
+ ///
+ /// 如果应释放托管资源,为 true;否则为 false。
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 窗体设计器生成的代码
+
+ ///
+ /// 设计器支持所需的方法 - 不要
+ /// 使用代码编辑器修改此方法的内容。
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ 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.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+ System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+ System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea3 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+ System.Windows.Forms.DataVisualization.Charting.Legend legend3 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+ System.Windows.Forms.DataVisualization.Charting.Series series3 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea4 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+ System.Windows.Forms.DataVisualization.Charting.Legend legend4 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+ System.Windows.Forms.DataVisualization.Charting.Series series4 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea5 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+ System.Windows.Forms.DataVisualization.Charting.Legend legend5 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+ System.Windows.Forms.DataVisualization.Charting.Series series5 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea6 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+ System.Windows.Forms.DataVisualization.Charting.Legend legend6 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+ System.Windows.Forms.DataVisualization.Charting.Series series6 = new System.Windows.Forms.DataVisualization.Charting.Series();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+ this.viewAppCpuChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.viewChartFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
+ this.viewAppRadBtnPanel = new System.Windows.Forms.Panel();
+ this.ViewAppXYLabel = new System.Windows.Forms.Label();
+ this.viewAppFlowRadBtn = new System.Windows.Forms.RadioButton();
+ this.viewAppCpuRadBtn = new System.Windows.Forms.RadioButton();
+ this.viewAppMemoryRadBtn = new System.Windows.Forms.RadioButton();
+ this.viewAppMemoryChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.viewAppFlowChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.viewProcessRadBtnPanel = new System.Windows.Forms.Panel();
+ this.ViewProcessXYLabel = new System.Windows.Forms.Label();
+ this.viewProcessFlowRadBtn = new System.Windows.Forms.RadioButton();
+ this.viewProcessCpuRadBtn = new System.Windows.Forms.RadioButton();
+ this.viewProcessMemoryRadBtn = new System.Windows.Forms.RadioButton();
+ this.viewProcessMemoryChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.viewProcessCpuChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.viewProcessFlowChart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+ this.viewProcessStartBtn = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.viewControlBtnPanel = new System.Windows.Forms.Panel();
+ this.viewAppUninstallBtn = new System.Windows.Forms.Button();
+ this.viewAppInstallBtn = new System.Windows.Forms.Button();
+ this.viewApkChooseBtn = new System.Windows.Forms.Button();
+ this.label6 = new System.Windows.Forms.Label();
+ this.viewApkPathTextBox = new System.Windows.Forms.TextBox();
+ this.viewAppClearCacheBtn = new System.Windows.Forms.Button();
+ this.viewDeviceIdChooseBtn = new System.Windows.Forms.Button();
+ this.label5 = new System.Windows.Forms.Label();
+ this.viewDeviceIdTextBox = new System.Windows.Forms.TextBox();
+ this.viewAppChooseBtn = new System.Windows.Forms.Button();
+ this.viewProcessChooseBtn = new System.Windows.Forms.Button();
+ this.label4 = new System.Windows.Forms.Label();
+ this.viewAppTagTextBox = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.viewProcessTagTextBox = new System.Windows.Forms.TextBox();
+ this.viewAppClearBtn = new System.Windows.Forms.Button();
+ this.viewProcessClearBtn = new System.Windows.Forms.Button();
+ this.viewAppPauseBtn = new System.Windows.Forms.Button();
+ this.viewProcessPauseBtn = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.viewAppStartBtn = new System.Windows.Forms.Button();
+ this.viewAppTextBox = new System.Windows.Forms.TextBox();
+ this.viewProcessPidTextBox = new System.Windows.Forms.TextBox();
+ this.menuStrip = new System.Windows.Forms.MenuStrip();
+ this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.settingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.showToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.topToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.downToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.allToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.openFileDialogDB = new System.Windows.Forms.OpenFileDialog();
+ this.viewToolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.openFileDialogApk = new System.Windows.Forms.OpenFileDialog();
+ ((System.ComponentModel.ISupportInitialize)(this.viewAppCpuChart)).BeginInit();
+ this.viewChartFlowLayoutPanel.SuspendLayout();
+ this.viewAppRadBtnPanel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.viewAppMemoryChart)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.viewAppFlowChart)).BeginInit();
+ this.viewProcessRadBtnPanel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.viewProcessMemoryChart)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.viewProcessCpuChart)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.viewProcessFlowChart)).BeginInit();
+ this.viewControlBtnPanel.SuspendLayout();
+ this.menuStrip.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // viewAppCpuChart
+ //
+ chartArea1.Name = "ChartArea1";
+ this.viewAppCpuChart.ChartAreas.Add(chartArea1);
+ legend1.Enabled = false;
+ legend1.Name = "Legend1";
+ this.viewAppCpuChart.Legends.Add(legend1);
+ this.viewAppCpuChart.Location = new System.Drawing.Point(3, 176);
+ this.viewAppCpuChart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppCpuChart.Name = "viewAppCpuChart";
+ series1.ChartArea = "ChartArea1";
+ series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
+ series1.Legend = "Legend1";
+ series1.Name = "Series1";
+ this.viewAppCpuChart.Series.Add(series1);
+ this.viewAppCpuChart.Size = new System.Drawing.Size(1258, 108);
+ this.viewAppCpuChart.TabIndex = 3;
+ this.viewAppCpuChart.Text = "ViewAppCpuChart";
+ this.viewAppCpuChart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ViewAppCpuChart_MouseMove);
+ //
+ // viewChartFlowLayoutPanel
+ //
+ this.viewChartFlowLayoutPanel.AutoSize = true;
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewAppRadBtnPanel);
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewAppMemoryChart);
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewAppCpuChart);
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewAppFlowChart);
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewProcessRadBtnPanel);
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewProcessMemoryChart);
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewProcessCpuChart);
+ this.viewChartFlowLayoutPanel.Controls.Add(this.viewProcessFlowChart);
+ this.viewChartFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.viewChartFlowLayoutPanel.Location = new System.Drawing.Point(0, 174);
+ this.viewChartFlowLayoutPanel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewChartFlowLayoutPanel.Name = "viewChartFlowLayoutPanel";
+ this.viewChartFlowLayoutPanel.Size = new System.Drawing.Size(1264, 753);
+ this.viewChartFlowLayoutPanel.TabIndex = 5;
+ this.viewChartFlowLayoutPanel.SizeChanged += new System.EventHandler(this.ViewChartFlowLayoutPanel_SizeChanged);
+ //
+ // viewAppRadBtnPanel
+ //
+ this.viewAppRadBtnPanel.Controls.Add(this.ViewAppXYLabel);
+ this.viewAppRadBtnPanel.Controls.Add(this.viewAppFlowRadBtn);
+ this.viewAppRadBtnPanel.Controls.Add(this.viewAppCpuRadBtn);
+ this.viewAppRadBtnPanel.Controls.Add(this.viewAppMemoryRadBtn);
+ this.viewAppRadBtnPanel.Location = new System.Drawing.Point(3, 3);
+ this.viewAppRadBtnPanel.Name = "viewAppRadBtnPanel";
+ this.viewAppRadBtnPanel.Size = new System.Drawing.Size(1262, 36);
+ this.viewAppRadBtnPanel.TabIndex = 5;
+ //
+ // ViewAppXYLabel
+ //
+ this.ViewAppXYLabel.AutoSize = true;
+ this.ViewAppXYLabel.Location = new System.Drawing.Point(544, 9);
+ this.ViewAppXYLabel.Name = "ViewAppXYLabel";
+ this.ViewAppXYLabel.Size = new System.Drawing.Size(71, 18);
+ this.ViewAppXYLabel.TabIndex = 3;
+ this.ViewAppXYLabel.Text = "X:0,Y:0";
+ //
+ // viewAppFlowRadBtn
+ //
+ this.viewAppFlowRadBtn.AutoSize = true;
+ this.viewAppFlowRadBtn.Location = new System.Drawing.Point(346, 8);
+ this.viewAppFlowRadBtn.Name = "viewAppFlowRadBtn";
+ this.viewAppFlowRadBtn.Size = new System.Drawing.Size(69, 22);
+ this.viewAppFlowRadBtn.TabIndex = 2;
+ this.viewAppFlowRadBtn.Text = "流量";
+ this.viewAppFlowRadBtn.UseVisualStyleBackColor = true;
+ this.viewAppFlowRadBtn.CheckedChanged += new System.EventHandler(this.ViewAppFlowRadBtn_CheckedChanged);
+ //
+ // viewAppCpuRadBtn
+ //
+ this.viewAppCpuRadBtn.AutoSize = true;
+ this.viewAppCpuRadBtn.Location = new System.Drawing.Point(178, 8);
+ this.viewAppCpuRadBtn.Name = "viewAppCpuRadBtn";
+ this.viewAppCpuRadBtn.Size = new System.Drawing.Size(60, 22);
+ this.viewAppCpuRadBtn.TabIndex = 1;
+ this.viewAppCpuRadBtn.Text = "CPU";
+ this.viewAppCpuRadBtn.UseVisualStyleBackColor = true;
+ this.viewAppCpuRadBtn.CheckedChanged += new System.EventHandler(this.ViewAppCpuRadBtn_CheckedChanged);
+ //
+ // viewAppMemoryRadBtn
+ //
+ this.viewAppMemoryRadBtn.AutoSize = true;
+ this.viewAppMemoryRadBtn.Checked = true;
+ this.viewAppMemoryRadBtn.Location = new System.Drawing.Point(10, 8);
+ this.viewAppMemoryRadBtn.Name = "viewAppMemoryRadBtn";
+ this.viewAppMemoryRadBtn.Size = new System.Drawing.Size(69, 22);
+ this.viewAppMemoryRadBtn.TabIndex = 0;
+ this.viewAppMemoryRadBtn.TabStop = true;
+ this.viewAppMemoryRadBtn.Text = "内存";
+ this.viewAppMemoryRadBtn.UseVisualStyleBackColor = true;
+ this.viewAppMemoryRadBtn.CheckedChanged += new System.EventHandler(this.ViewAppMemoryRadBtn_CheckedChanged);
+ //
+ // viewAppMemoryChart
+ //
+ this.viewAppMemoryChart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ chartArea2.Name = "ChartArea1";
+ this.viewAppMemoryChart.ChartAreas.Add(chartArea2);
+ legend2.Enabled = false;
+ legend2.Name = "Legend1";
+ this.viewAppMemoryChart.Legends.Add(legend2);
+ this.viewAppMemoryChart.Location = new System.Drawing.Point(3, 44);
+ this.viewAppMemoryChart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppMemoryChart.Name = "viewAppMemoryChart";
+ series2.ChartArea = "ChartArea1";
+ series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
+ series2.Legend = "Legend1";
+ series2.Name = "Series1";
+ this.viewAppMemoryChart.Series.Add(series2);
+ this.viewAppMemoryChart.Size = new System.Drawing.Size(1258, 128);
+ this.viewAppMemoryChart.TabIndex = 4;
+ this.viewAppMemoryChart.Text = "ViewAppMemoryChart";
+ this.viewAppMemoryChart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ViewAppMemoryChart_MouseMove);
+ //
+ // viewAppFlowChart
+ //
+ this.viewAppFlowChart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ chartArea3.Name = "ChartArea1";
+ this.viewAppFlowChart.ChartAreas.Add(chartArea3);
+ legend3.Enabled = false;
+ legend3.Name = "Legend1";
+ this.viewAppFlowChart.Legends.Add(legend3);
+ this.viewAppFlowChart.Location = new System.Drawing.Point(3, 288);
+ this.viewAppFlowChart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppFlowChart.Name = "viewAppFlowChart";
+ series3.ChartArea = "ChartArea1";
+ series3.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
+ series3.Legend = "Legend1";
+ series3.Name = "Series1";
+ this.viewAppFlowChart.Series.Add(series3);
+ this.viewAppFlowChart.Size = new System.Drawing.Size(1258, 105);
+ this.viewAppFlowChart.TabIndex = 7;
+ this.viewAppFlowChart.Text = "ViewAppFlowChart";
+ this.viewAppFlowChart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ViewAppFlowChart_MouseMove);
+ //
+ // viewProcessRadBtnPanel
+ //
+ this.viewProcessRadBtnPanel.Controls.Add(this.ViewProcessXYLabel);
+ this.viewProcessRadBtnPanel.Controls.Add(this.viewProcessFlowRadBtn);
+ this.viewProcessRadBtnPanel.Controls.Add(this.viewProcessCpuRadBtn);
+ this.viewProcessRadBtnPanel.Controls.Add(this.viewProcessMemoryRadBtn);
+ this.viewProcessRadBtnPanel.Location = new System.Drawing.Point(3, 398);
+ this.viewProcessRadBtnPanel.Name = "viewProcessRadBtnPanel";
+ this.viewProcessRadBtnPanel.Size = new System.Drawing.Size(1258, 36);
+ this.viewProcessRadBtnPanel.TabIndex = 6;
+ //
+ // ViewProcessXYLabel
+ //
+ this.ViewProcessXYLabel.AutoSize = true;
+ this.ViewProcessXYLabel.Location = new System.Drawing.Point(544, 9);
+ this.ViewProcessXYLabel.Name = "ViewProcessXYLabel";
+ this.ViewProcessXYLabel.Size = new System.Drawing.Size(71, 18);
+ this.ViewProcessXYLabel.TabIndex = 4;
+ this.ViewProcessXYLabel.Text = "X:0,Y:0";
+ //
+ // viewProcessFlowRadBtn
+ //
+ this.viewProcessFlowRadBtn.AutoSize = true;
+ this.viewProcessFlowRadBtn.Location = new System.Drawing.Point(346, 8);
+ this.viewProcessFlowRadBtn.Name = "viewProcessFlowRadBtn";
+ this.viewProcessFlowRadBtn.Size = new System.Drawing.Size(69, 22);
+ this.viewProcessFlowRadBtn.TabIndex = 2;
+ this.viewProcessFlowRadBtn.Text = "流量";
+ this.viewProcessFlowRadBtn.UseVisualStyleBackColor = true;
+ this.viewProcessFlowRadBtn.CheckedChanged += new System.EventHandler(this.ViewProcessFlowRadBtn_CheckedChanged);
+ //
+ // viewProcessCpuRadBtn
+ //
+ this.viewProcessCpuRadBtn.AutoSize = true;
+ this.viewProcessCpuRadBtn.Location = new System.Drawing.Point(178, 8);
+ this.viewProcessCpuRadBtn.Name = "viewProcessCpuRadBtn";
+ this.viewProcessCpuRadBtn.Size = new System.Drawing.Size(60, 22);
+ this.viewProcessCpuRadBtn.TabIndex = 1;
+ this.viewProcessCpuRadBtn.Text = "CPU";
+ this.viewProcessCpuRadBtn.UseVisualStyleBackColor = true;
+ this.viewProcessCpuRadBtn.CheckedChanged += new System.EventHandler(this.ViewProcessCpuRadBtn_CheckedChanged);
+ //
+ // viewProcessMemoryRadBtn
+ //
+ this.viewProcessMemoryRadBtn.AutoSize = true;
+ this.viewProcessMemoryRadBtn.Checked = true;
+ this.viewProcessMemoryRadBtn.Location = new System.Drawing.Point(10, 8);
+ this.viewProcessMemoryRadBtn.Name = "viewProcessMemoryRadBtn";
+ this.viewProcessMemoryRadBtn.Size = new System.Drawing.Size(69, 22);
+ this.viewProcessMemoryRadBtn.TabIndex = 0;
+ this.viewProcessMemoryRadBtn.TabStop = true;
+ this.viewProcessMemoryRadBtn.Text = "内存";
+ this.viewProcessMemoryRadBtn.UseVisualStyleBackColor = true;
+ this.viewProcessMemoryRadBtn.CheckedChanged += new System.EventHandler(this.ViewProcessMemoryRadBtn_CheckedChanged);
+ //
+ // viewProcessMemoryChart
+ //
+ this.viewProcessMemoryChart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ chartArea4.Name = "ChartArea1";
+ this.viewProcessMemoryChart.ChartAreas.Add(chartArea4);
+ legend4.Enabled = false;
+ legend4.Name = "Legend1";
+ this.viewProcessMemoryChart.Legends.Add(legend4);
+ this.viewProcessMemoryChart.Location = new System.Drawing.Point(3, 439);
+ this.viewProcessMemoryChart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessMemoryChart.Name = "viewProcessMemoryChart";
+ series4.ChartArea = "ChartArea1";
+ series4.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
+ series4.Legend = "Legend1";
+ series4.Name = "Series1";
+ this.viewProcessMemoryChart.Series.Add(series4);
+ this.viewProcessMemoryChart.Size = new System.Drawing.Size(1258, 102);
+ this.viewProcessMemoryChart.TabIndex = 8;
+ this.viewProcessMemoryChart.Text = "ViewProcessMemoryChart";
+ this.viewProcessMemoryChart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ViewProcessMemoryChart_MouseMove);
+ //
+ // viewProcessCpuChart
+ //
+ this.viewProcessCpuChart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ chartArea5.Name = "ChartArea1";
+ this.viewProcessCpuChart.ChartAreas.Add(chartArea5);
+ legend5.Enabled = false;
+ legend5.Name = "Legend1";
+ this.viewProcessCpuChart.Legends.Add(legend5);
+ this.viewProcessCpuChart.Location = new System.Drawing.Point(3, 545);
+ this.viewProcessCpuChart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessCpuChart.Name = "viewProcessCpuChart";
+ series5.ChartArea = "ChartArea1";
+ series5.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
+ series5.Legend = "Legend1";
+ series5.Name = "Series1";
+ this.viewProcessCpuChart.Series.Add(series5);
+ this.viewProcessCpuChart.Size = new System.Drawing.Size(1258, 104);
+ this.viewProcessCpuChart.TabIndex = 9;
+ this.viewProcessCpuChart.Text = "ViewProcessCpuChart";
+ this.viewProcessCpuChart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ViewProcessCpuChart_MouseMove);
+ //
+ // viewProcessFlowChart
+ //
+ this.viewProcessFlowChart.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ chartArea6.Name = "ChartArea1";
+ this.viewProcessFlowChart.ChartAreas.Add(chartArea6);
+ legend6.Enabled = false;
+ legend6.Name = "Legend1";
+ this.viewProcessFlowChart.Legends.Add(legend6);
+ this.viewProcessFlowChart.Location = new System.Drawing.Point(3, 653);
+ this.viewProcessFlowChart.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessFlowChart.Name = "viewProcessFlowChart";
+ series6.ChartArea = "ChartArea1";
+ series6.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
+ series6.Legend = "Legend1";
+ series6.Name = "Series1";
+ this.viewProcessFlowChart.Series.Add(series6);
+ this.viewProcessFlowChart.Size = new System.Drawing.Size(1258, 104);
+ this.viewProcessFlowChart.TabIndex = 10;
+ this.viewProcessFlowChart.Text = "ViewProcessFlowChart";
+ this.viewProcessFlowChart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ViewProcessFlowChart_MouseMove);
+ //
+ // viewProcessStartBtn
+ //
+ this.viewProcessStartBtn.AutoSize = true;
+ this.viewProcessStartBtn.Location = new System.Drawing.Point(712, 129);
+ this.viewProcessStartBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessStartBtn.Name = "viewProcessStartBtn";
+ this.viewProcessStartBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewProcessStartBtn.TabIndex = 0;
+ this.viewProcessStartBtn.Text = "启动";
+ this.viewProcessStartBtn.UseVisualStyleBackColor = true;
+ this.viewProcessStartBtn.Click += new System.EventHandler(this.ProcessStartBtn_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(69, 136);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(71, 18);
+ this.label1.TabIndex = 2;
+ this.label1.Text = "PC-PID:";
+ this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewControlBtnPanel
+ //
+ this.viewControlBtnPanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
+ this.viewControlBtnPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.viewControlBtnPanel.Controls.Add(this.viewAppUninstallBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppInstallBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewApkChooseBtn);
+ this.viewControlBtnPanel.Controls.Add(this.label6);
+ this.viewControlBtnPanel.Controls.Add(this.viewApkPathTextBox);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppClearCacheBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewDeviceIdChooseBtn);
+ this.viewControlBtnPanel.Controls.Add(this.label5);
+ this.viewControlBtnPanel.Controls.Add(this.viewDeviceIdTextBox);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppChooseBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewProcessChooseBtn);
+ this.viewControlBtnPanel.Controls.Add(this.label4);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppTagTextBox);
+ this.viewControlBtnPanel.Controls.Add(this.label3);
+ this.viewControlBtnPanel.Controls.Add(this.viewProcessTagTextBox);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppClearBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewProcessClearBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppPauseBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewProcessPauseBtn);
+ this.viewControlBtnPanel.Controls.Add(this.label2);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppStartBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewAppTextBox);
+ this.viewControlBtnPanel.Controls.Add(this.label1);
+ this.viewControlBtnPanel.Controls.Add(this.viewProcessStartBtn);
+ this.viewControlBtnPanel.Controls.Add(this.viewProcessPidTextBox);
+ this.viewControlBtnPanel.Controls.Add(this.menuStrip);
+ this.viewControlBtnPanel.Dock = System.Windows.Forms.DockStyle.Top;
+ this.viewControlBtnPanel.Location = new System.Drawing.Point(0, 0);
+ this.viewControlBtnPanel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewControlBtnPanel.Name = "viewControlBtnPanel";
+ this.viewControlBtnPanel.Size = new System.Drawing.Size(1264, 174);
+ this.viewControlBtnPanel.TabIndex = 6;
+ //
+ // viewAppUninstallBtn
+ //
+ this.viewAppUninstallBtn.AutoSize = true;
+ this.viewAppUninstallBtn.Location = new System.Drawing.Point(1128, 85);
+ this.viewAppUninstallBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppUninstallBtn.Name = "viewAppUninstallBtn";
+ this.viewAppUninstallBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewAppUninstallBtn.TabIndex = 25;
+ this.viewAppUninstallBtn.Text = "卸载";
+ this.viewAppUninstallBtn.UseVisualStyleBackColor = true;
+ this.viewAppUninstallBtn.Click += new System.EventHandler(this.ViewAppUninstallBtn_Click);
+ //
+ // viewAppInstallBtn
+ //
+ this.viewAppInstallBtn.AutoSize = true;
+ this.viewAppInstallBtn.Location = new System.Drawing.Point(814, 45);
+ this.viewAppInstallBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppInstallBtn.Name = "viewAppInstallBtn";
+ this.viewAppInstallBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewAppInstallBtn.TabIndex = 24;
+ this.viewAppInstallBtn.Text = "安装";
+ this.viewAppInstallBtn.UseVisualStyleBackColor = true;
+ this.viewAppInstallBtn.Click += new System.EventHandler(this.ViewAppInstallBtn_Click);
+ //
+ // viewApkChooseBtn
+ //
+ this.viewApkChooseBtn.AutoSize = true;
+ this.viewApkChooseBtn.Location = new System.Drawing.Point(712, 43);
+ this.viewApkChooseBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewApkChooseBtn.Name = "viewApkChooseBtn";
+ this.viewApkChooseBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewApkChooseBtn.TabIndex = 23;
+ this.viewApkChooseBtn.Text = "选择";
+ this.viewApkChooseBtn.UseVisualStyleBackColor = true;
+ this.viewApkChooseBtn.Click += new System.EventHandler(this.ViewApkChooseBtn_Click);
+ //
+ // label6
+ //
+ this.label6.Location = new System.Drawing.Point(459, 45);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(51, 30);
+ this.label6.TabIndex = 22;
+ this.label6.Text = "Apk:";
+ this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewApkPathTextBox
+ //
+ this.viewApkPathTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
+ this.viewApkPathTextBox.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.viewApkPathTextBox.Location = new System.Drawing.Point(514, 46);
+ this.viewApkPathTextBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewApkPathTextBox.MaxLength = 6;
+ this.viewApkPathTextBox.Name = "viewApkPathTextBox";
+ this.viewApkPathTextBox.Size = new System.Drawing.Size(170, 28);
+ this.viewApkPathTextBox.TabIndex = 21;
+ //
+ // viewAppClearCacheBtn
+ //
+ this.viewAppClearCacheBtn.AutoSize = true;
+ this.viewAppClearCacheBtn.Location = new System.Drawing.Point(1014, 85);
+ this.viewAppClearCacheBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppClearCacheBtn.Name = "viewAppClearCacheBtn";
+ this.viewAppClearCacheBtn.Size = new System.Drawing.Size(90, 30);
+ this.viewAppClearCacheBtn.TabIndex = 20;
+ this.viewAppClearCacheBtn.Text = "清除缓存";
+ this.viewAppClearCacheBtn.UseVisualStyleBackColor = true;
+ this.viewAppClearCacheBtn.Click += new System.EventHandler(this.ViewAppClearCacheBtn_Click);
+ //
+ // viewDeviceIdChooseBtn
+ //
+ this.viewDeviceIdChooseBtn.AutoSize = true;
+ this.viewDeviceIdChooseBtn.Location = new System.Drawing.Point(352, 45);
+ this.viewDeviceIdChooseBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewDeviceIdChooseBtn.Name = "viewDeviceIdChooseBtn";
+ this.viewDeviceIdChooseBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewDeviceIdChooseBtn.TabIndex = 19;
+ this.viewDeviceIdChooseBtn.Text = "选择";
+ this.viewDeviceIdChooseBtn.UseVisualStyleBackColor = true;
+ this.viewDeviceIdChooseBtn.Click += new System.EventHandler(this.ViewDeviceIdChooseBtn_Click);
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(51, 51);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(89, 18);
+ this.label5.TabIndex = 18;
+ this.label5.Text = "DeviceId:";
+ this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewDeviceIdTextBox
+ //
+ this.viewDeviceIdTextBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.viewDeviceIdTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
+ this.viewDeviceIdTextBox.Location = new System.Drawing.Point(146, 48);
+ this.viewDeviceIdTextBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewDeviceIdTextBox.Name = "viewDeviceIdTextBox";
+ this.viewDeviceIdTextBox.ReadOnly = true;
+ this.viewDeviceIdTextBox.Size = new System.Drawing.Size(184, 28);
+ this.viewDeviceIdTextBox.TabIndex = 17;
+ this.viewDeviceIdTextBox.TabStop = false;
+ //
+ // viewAppChooseBtn
+ //
+ this.viewAppChooseBtn.AutoSize = true;
+ this.viewAppChooseBtn.Location = new System.Drawing.Point(352, 85);
+ this.viewAppChooseBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppChooseBtn.Name = "viewAppChooseBtn";
+ this.viewAppChooseBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewAppChooseBtn.TabIndex = 16;
+ this.viewAppChooseBtn.Text = "选择";
+ this.viewAppChooseBtn.UseVisualStyleBackColor = true;
+ this.viewAppChooseBtn.Click += new System.EventHandler(this.AppChooseBtn_Click);
+ //
+ // viewProcessChooseBtn
+ //
+ this.viewProcessChooseBtn.AutoSize = true;
+ this.viewProcessChooseBtn.Location = new System.Drawing.Point(352, 129);
+ this.viewProcessChooseBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessChooseBtn.Name = "viewProcessChooseBtn";
+ this.viewProcessChooseBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewProcessChooseBtn.TabIndex = 15;
+ this.viewProcessChooseBtn.Text = "选择";
+ this.viewProcessChooseBtn.UseVisualStyleBackColor = true;
+ this.viewProcessChooseBtn.Click += new System.EventHandler(this.ProcessChooseBtn_Click);
+ //
+ // label4
+ //
+ this.label4.Location = new System.Drawing.Point(459, 86);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(51, 30);
+ this.label4.TabIndex = 14;
+ this.label4.Text = "Tag:";
+ this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewAppTagTextBox
+ //
+ this.viewAppTagTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
+ this.viewAppTagTextBox.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.viewAppTagTextBox.Location = new System.Drawing.Point(514, 87);
+ this.viewAppTagTextBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppTagTextBox.MaxLength = 6;
+ this.viewAppTagTextBox.Name = "viewAppTagTextBox";
+ this.viewAppTagTextBox.Size = new System.Drawing.Size(170, 28);
+ this.viewAppTagTextBox.TabIndex = 13;
+ //
+ // label3
+ //
+ this.label3.Location = new System.Drawing.Point(459, 126);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(51, 30);
+ this.label3.TabIndex = 12;
+ this.label3.Text = "Tag:";
+ this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewProcessTagTextBox
+ //
+ this.viewProcessTagTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
+ this.viewProcessTagTextBox.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.viewProcessTagTextBox.Location = new System.Drawing.Point(514, 128);
+ this.viewProcessTagTextBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessTagTextBox.MaxLength = 6;
+ this.viewProcessTagTextBox.Name = "viewProcessTagTextBox";
+ this.viewProcessTagTextBox.Size = new System.Drawing.Size(170, 28);
+ this.viewProcessTagTextBox.TabIndex = 11;
+ //
+ // viewAppClearBtn
+ //
+ this.viewAppClearBtn.AutoSize = true;
+ this.viewAppClearBtn.Location = new System.Drawing.Point(915, 85);
+ this.viewAppClearBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppClearBtn.Name = "viewAppClearBtn";
+ this.viewAppClearBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewAppClearBtn.TabIndex = 9;
+ this.viewAppClearBtn.Text = "清除";
+ this.viewAppClearBtn.UseVisualStyleBackColor = true;
+ this.viewAppClearBtn.Click += new System.EventHandler(this.AppClearBtn_Click);
+ //
+ // viewProcessClearBtn
+ //
+ this.viewProcessClearBtn.AutoSize = true;
+ this.viewProcessClearBtn.Location = new System.Drawing.Point(915, 129);
+ this.viewProcessClearBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessClearBtn.Name = "viewProcessClearBtn";
+ this.viewProcessClearBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewProcessClearBtn.TabIndex = 8;
+ this.viewProcessClearBtn.Text = "清除";
+ this.viewProcessClearBtn.UseVisualStyleBackColor = true;
+ this.viewProcessClearBtn.Click += new System.EventHandler(this.ProcessClearBtn_Click);
+ //
+ // viewAppPauseBtn
+ //
+ this.viewAppPauseBtn.AutoSize = true;
+ this.viewAppPauseBtn.Location = new System.Drawing.Point(814, 85);
+ this.viewAppPauseBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppPauseBtn.Name = "viewAppPauseBtn";
+ this.viewAppPauseBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewAppPauseBtn.TabIndex = 7;
+ this.viewAppPauseBtn.Text = "暂停";
+ this.viewAppPauseBtn.UseVisualStyleBackColor = true;
+ this.viewAppPauseBtn.Click += new System.EventHandler(this.AppPauseBtn_Click);
+ //
+ // viewProcessPauseBtn
+ //
+ this.viewProcessPauseBtn.AutoSize = true;
+ this.viewProcessPauseBtn.Location = new System.Drawing.Point(814, 129);
+ this.viewProcessPauseBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessPauseBtn.Name = "viewProcessPauseBtn";
+ this.viewProcessPauseBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewProcessPauseBtn.TabIndex = 6;
+ this.viewProcessPauseBtn.Text = "暂停";
+ this.viewProcessPauseBtn.UseVisualStyleBackColor = true;
+ this.viewProcessPauseBtn.Click += new System.EventHandler(this.ProcessPauseBtn_Click);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(15, 92);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(125, 18);
+ this.label2.TabIndex = 5;
+ this.label2.Text = "APP-PID/包名:";
+ this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // viewAppStartBtn
+ //
+ this.viewAppStartBtn.AutoSize = true;
+ this.viewAppStartBtn.Location = new System.Drawing.Point(712, 85);
+ this.viewAppStartBtn.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppStartBtn.Name = "viewAppStartBtn";
+ this.viewAppStartBtn.Size = new System.Drawing.Size(80, 30);
+ this.viewAppStartBtn.TabIndex = 4;
+ this.viewAppStartBtn.Text = "启动";
+ this.viewAppStartBtn.UseVisualStyleBackColor = true;
+ this.viewAppStartBtn.Click += new System.EventHandler(this.AppStartBtn_Click);
+ //
+ // viewAppTextBox
+ //
+ this.viewAppTextBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
+ this.viewAppTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
+ this.viewAppTextBox.Location = new System.Drawing.Point(146, 88);
+ this.viewAppTextBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewAppTextBox.Name = "viewAppTextBox";
+ this.viewAppTextBox.Size = new System.Drawing.Size(184, 28);
+ this.viewAppTextBox.TabIndex = 3;
+ this.viewAppTextBox.TextChanged += new System.EventHandler(this.ViewAppTextBox_TextChanged);
+ //
+ // viewProcessPidTextBox
+ //
+ this.viewProcessPidTextBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.HistoryList;
+ this.viewProcessPidTextBox.ImeMode = System.Windows.Forms.ImeMode.NoControl;
+ this.viewProcessPidTextBox.Location = new System.Drawing.Point(146, 132);
+ this.viewProcessPidTextBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.viewProcessPidTextBox.MaxLength = 6;
+ this.viewProcessPidTextBox.Name = "viewProcessPidTextBox";
+ this.viewProcessPidTextBox.Size = new System.Drawing.Size(184, 28);
+ this.viewProcessPidTextBox.TabIndex = 1;
+ //
+ // menuStrip
+ //
+ this.menuStrip.BackColor = System.Drawing.Color.Gray;
+ this.menuStrip.ImageScalingSize = new System.Drawing.Size(24, 24);
+ this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fileToolStripMenuItem,
+ this.showToolStripMenuItem,
+ this.helpToolStripMenuItem});
+ this.menuStrip.Location = new System.Drawing.Point(0, 0);
+ this.menuStrip.Name = "menuStrip";
+ this.menuStrip.Padding = new System.Windows.Forms.Padding(9, 2, 0, 2);
+ this.menuStrip.Size = new System.Drawing.Size(1260, 32);
+ this.menuStrip.TabIndex = 10;
+ this.menuStrip.Text = "menuStrip1";
+ //
+ // fileToolStripMenuItem
+ //
+ this.fileToolStripMenuItem.BackColor = System.Drawing.Color.Gray;
+ this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.openToolStripMenuItem,
+ this.settingToolStripMenuItem,
+ this.exitToolStripMenuItem});
+ this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+ this.fileToolStripMenuItem.Size = new System.Drawing.Size(58, 28);
+ this.fileToolStripMenuItem.Text = "文件";
+ //
+ // openToolStripMenuItem
+ //
+ this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+ this.openToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
+ this.openToolStripMenuItem.Text = "打开";
+ this.openToolStripMenuItem.Click += new System.EventHandler(this.OpenToolStripMenuItem_Click);
+ //
+ // settingToolStripMenuItem
+ //
+ this.settingToolStripMenuItem.Name = "settingToolStripMenuItem";
+ this.settingToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
+ this.settingToolStripMenuItem.Text = "设置";
+ this.settingToolStripMenuItem.Click += new System.EventHandler(this.SettingToolStripMenuItem_Click);
+ //
+ // exitToolStripMenuItem
+ //
+ this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+ this.exitToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
+ this.exitToolStripMenuItem.Text = "退出";
+ this.exitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click);
+ //
+ // showToolStripMenuItem
+ //
+ this.showToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.topToolStripMenuItem,
+ this.downToolStripMenuItem,
+ this.allToolStripMenuItem});
+ this.showToolStripMenuItem.Name = "showToolStripMenuItem";
+ this.showToolStripMenuItem.Size = new System.Drawing.Size(58, 28);
+ this.showToolStripMenuItem.Text = "显示";
+ //
+ // topToolStripMenuItem
+ //
+ this.topToolStripMenuItem.CheckOnClick = true;
+ this.topToolStripMenuItem.Name = "topToolStripMenuItem";
+ this.topToolStripMenuItem.Size = new System.Drawing.Size(200, 30);
+ this.topToolStripMenuItem.Text = "上半部分铺满";
+ this.topToolStripMenuItem.Click += new System.EventHandler(this.TopToolStripMenuItem_Click);
+ //
+ // downToolStripMenuItem
+ //
+ this.downToolStripMenuItem.CheckOnClick = true;
+ this.downToolStripMenuItem.Name = "downToolStripMenuItem";
+ this.downToolStripMenuItem.Size = new System.Drawing.Size(200, 30);
+ this.downToolStripMenuItem.Text = "下半部分铺满";
+ this.downToolStripMenuItem.Click += new System.EventHandler(this.DownToolStripMenuItem_Click);
+ //
+ // allToolStripMenuItem
+ //
+ this.allToolStripMenuItem.CheckOnClick = true;
+ this.allToolStripMenuItem.Name = "allToolStripMenuItem";
+ this.allToolStripMenuItem.Size = new System.Drawing.Size(200, 30);
+ this.allToolStripMenuItem.Text = "各占一半";
+ this.allToolStripMenuItem.Click += new System.EventHandler(this.AllToolStripMenuItem_Click);
+ //
+ // helpToolStripMenuItem
+ //
+ this.helpToolStripMenuItem.BackColor = System.Drawing.Color.Gray;
+ this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.aboutToolStripMenuItem});
+ this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+ this.helpToolStripMenuItem.Size = new System.Drawing.Size(58, 28);
+ this.helpToolStripMenuItem.Text = "帮助";
+ //
+ // aboutToolStripMenuItem
+ //
+ this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+ this.aboutToolStripMenuItem.Size = new System.Drawing.Size(128, 30);
+ this.aboutToolStripMenuItem.Text = "关于";
+ this.aboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItem_Click);
+ //
+ // openFileDialogDB
+ //
+ this.openFileDialogDB.DefaultExt = "db";
+ //
+ // viewToolTip
+ //
+ this.viewToolTip.IsBalloon = true;
+ //
+ // MainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1264, 927);
+ this.Controls.Add(this.viewChartFlowLayoutPanel);
+ this.Controls.Add(this.viewControlBtnPanel);
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MainMenuStrip = this.menuStrip;
+ this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.MinimumSize = new System.Drawing.Size(1176, 647);
+ this.Name = "MainForm";
+ this.Text = "资源监控工具";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
+ this.Load += new System.EventHandler(this.MainForm_Load);
+ ((System.ComponentModel.ISupportInitialize)(this.viewAppCpuChart)).EndInit();
+ this.viewChartFlowLayoutPanel.ResumeLayout(false);
+ this.viewAppRadBtnPanel.ResumeLayout(false);
+ this.viewAppRadBtnPanel.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.viewAppMemoryChart)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.viewAppFlowChart)).EndInit();
+ this.viewProcessRadBtnPanel.ResumeLayout(false);
+ this.viewProcessRadBtnPanel.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.viewProcessMemoryChart)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.viewProcessCpuChart)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.viewProcessFlowChart)).EndInit();
+ this.viewControlBtnPanel.ResumeLayout(false);
+ this.viewControlBtnPanel.PerformLayout();
+ this.menuStrip.ResumeLayout(false);
+ this.menuStrip.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DataVisualization.Charting.Chart viewAppCpuChart;
+ private System.Windows.Forms.FlowLayoutPanel viewChartFlowLayoutPanel;
+ private System.Windows.Forms.DataVisualization.Charting.Chart viewAppMemoryChart;
+ private System.Windows.Forms.Button viewProcessStartBtn;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Panel viewControlBtnPanel;
+ private System.Windows.Forms.TextBox viewAppTextBox;
+ private System.Windows.Forms.TextBox viewProcessPidTextBox;
+ private System.Windows.Forms.Button viewAppStartBtn;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button viewAppPauseBtn;
+ private System.Windows.Forms.Button viewProcessPauseBtn;
+ private System.Windows.Forms.Button viewAppClearBtn;
+ private System.Windows.Forms.Button viewProcessClearBtn;
+ private System.Windows.Forms.MenuStrip menuStrip;
+ private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem settingToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem showToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem topToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem downToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem allToolStripMenuItem;
+ private System.Windows.Forms.OpenFileDialog openFileDialogDB;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.TextBox viewAppTagTextBox;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.TextBox viewProcessTagTextBox;
+ private System.Windows.Forms.Button viewAppChooseBtn;
+ private System.Windows.Forms.Button viewProcessChooseBtn;
+ private System.Windows.Forms.Button viewDeviceIdChooseBtn;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.TextBox viewDeviceIdTextBox;
+ private System.Windows.Forms.Panel viewAppRadBtnPanel;
+ private System.Windows.Forms.RadioButton viewAppFlowRadBtn;
+ private System.Windows.Forms.RadioButton viewAppCpuRadBtn;
+ private System.Windows.Forms.RadioButton viewAppMemoryRadBtn;
+ private System.Windows.Forms.Panel viewProcessRadBtnPanel;
+ private System.Windows.Forms.RadioButton viewProcessFlowRadBtn;
+ private System.Windows.Forms.RadioButton viewProcessCpuRadBtn;
+ private System.Windows.Forms.RadioButton viewProcessMemoryRadBtn;
+ private System.Windows.Forms.DataVisualization.Charting.Chart viewAppFlowChart;
+ private System.Windows.Forms.DataVisualization.Charting.Chart viewProcessMemoryChart;
+ private System.Windows.Forms.DataVisualization.Charting.Chart viewProcessCpuChart;
+ private System.Windows.Forms.DataVisualization.Charting.Chart viewProcessFlowChart;
+ private System.Windows.Forms.ToolTip viewToolTip;
+ private System.Windows.Forms.Label ViewAppXYLabel;
+ private System.Windows.Forms.Label ViewProcessXYLabel;
+ private System.Windows.Forms.Button viewAppClearCacheBtn;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.TextBox viewApkPathTextBox;
+ private System.Windows.Forms.Button viewAppInstallBtn;
+ private System.Windows.Forms.Button viewApkChooseBtn;
+ private System.Windows.Forms.Button viewAppUninstallBtn;
+ private System.Windows.Forms.OpenFileDialog openFileDialogApk;
+
+ //private System.Collections.Generic.List radBtnAppList;
+ //private System.Collections.Generic.List radBtnProcessList;
+ //private System.Collections.Generic.List chartAppList;
+ //private System.Collections.Generic.List chartProcessList;
+ }
+}
+
diff --git a/ResourceMonitorTools/MainForm.cs b/ResourceMonitorTools/MainForm.cs
new file mode 100644
index 0000000000000000000000000000000000000000..17d8c2f591250dbf63e5a7f003ac549507417b09
--- /dev/null
+++ b/ResourceMonitorTools/MainForm.cs
@@ -0,0 +1,1292 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+using Model;
+using BLL;
+using BLL.utils;
+using ResourceMonitorTools.Properties;
+using DAL;
+using System.IO;
+
+
+namespace ResourceMonitorTools
+
+{
+ ///
+ /// 主界面
+ ///
+ public partial class MainForm : Form
+ {
+ private List processDataList = new List();
+ private List appDataList = new List();
+ private Task taskProcessInfo;
+ private Task taskAppInfo;
+ private Task taskDeviceInfo;
+ private double processOldSaveValue = 0;
+ private double appOldSaveValue = 0;
+
+ private CancellationTokenSource processCts;
+ private CancellationTokenSource appCts;
+ private CancellationTokenSource deviceCts;
+
+ private List deviceInfoList;
+ private DeviceInfo deviceInfo = new DeviceInfo();
+ private List colorList = new List {Color.Red,Color.Yellow,Color.Green ,Color.AliceBlue};
+
+ private List radioBtnAppList;
+ private List radioBtnProcessList;
+ private List appChartList;
+ private List processChartList;
+
+ //是否获取流量
+ private bool getTcpFlag { get; set; }
+
+ //private int num = 5;//每次删除增加几个点
+
+ ///
+ /// 主界面构造方法
+ ///
+ public MainForm()
+ {
+ logger.Info(this.GetType(),"开始执行主界面构造方法!");
+ InitializeComponent();
+ //设置Process中流量选项为未选中
+ this.viewProcessFlowRadBtn.Checked = false;
+ //设置Process中流量选项无法选择
+ this.viewProcessFlowRadBtn.Enabled = false;
+ //设置Process中流量表格不展示
+ this.viewProcessFlowChart.Visible = false;
+
+ //设置当前显示模式为上下模式
+ this.allToolStripMenuItem.Checked = true;
+ this.allToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
+
+ radioBtnAppList = new List { this.viewAppMemoryRadBtn, this.viewAppCpuRadBtn, this.viewAppFlowRadBtn };
+ radioBtnProcessList = new List { this.viewProcessMemoryRadBtn, this.viewProcessCpuRadBtn };
+
+ appChartList = new List { this.viewAppMemoryChart, this.viewAppCpuChart, this.viewAppFlowChart };
+ processChartList = new List { this.viewProcessMemoryChart, this.viewProcessCpuChart };
+
+ //Debug.WriteLine("初始化表格大小");
+ ////初始化表格大小
+ SetChartSize();
+ deviceCts = new CancellationTokenSource();
+ //设置设备ID无法手动输入
+ //this.viewDeviceIdTextBox.Enabled = false;
+ try
+ {
+ DataBaseBLL.DataBaseInit(Properties.Settings.Default.DatabasePath, Properties.Settings.Default.DatabaseName);
+ }
+ catch (Exception)
+ {
+ MessageBox.Show("初始化数据库出错!,详细信息见工作目录下日志文件。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ taskDeviceInfo = Task.Factory.StartNew(() => UpdateDeviceInfoList(), deviceCts.Token);
+ Debug.WriteLine("taskDeviceInfo_id:" + taskDeviceInfo.Id);
+ }
+
+ ///
+ /// 获取系统连接的设备,并显示在TextBox中
+ ///
+ private void UpdateDeviceInfoList()
+ {
+ GetDeviceInfo getDeviceInfo = new GetDeviceInfo();
+ deviceInfoList = getDeviceInfo.GetDeviceInfoList();
+ if (deviceInfoList != null && deviceInfoList.Count > 0)
+ {
+ deviceInfo = deviceInfoList.ElementAt(0);
+ if (this.IsHandleCreated)
+ {
+ this.Invoke(new Action(() =>
+ {
+ this.viewDeviceIdTextBox.Text = deviceInfo.DeviceId.ToString();
+ }));
+ }
+ else
+ {
+ logger.Info(this.GetType(), "句柄未创建");
+ Debug.WriteLine("句柄未创建");
+ }
+ }
+ else
+ {
+ logger.Info(this.GetType(), "检测到当前系统未连接Android设备!");
+ Debug.WriteLine("检测到当前系统未连接Android设备!");
+ }
+ }
+
+ ///
+ /// 进程监控启动按钮事件
+ ///
+ ///
+ ///
+ private void ProcessStartBtn_Click(object sender, EventArgs e)
+ {
+ String strProcessPid = "";
+ String processTag = "";
+ strProcessPid = viewProcessPidTextBox.Text;
+ processTag = viewProcessTagTextBox.Text;
+ if (strProcessPid.Length == 0)
+ {
+ MessageBox.Show("错误!请输入PID!","警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ else if(processTag.Length ==0)
+ {
+ MessageBox.Show("错误!Tag未输入!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ else if (processTag.Equals("All"))
+ {
+ MessageBox.Show("错误!Tag被占用!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ try
+ {
+ int pid = int.Parse(viewProcessPidTextBox.Text);
+ //初始化图表
+ InitChart("内存占用情况(MB)",this.viewProcessMemoryChart,1);
+ InitChart("CPU占用情况(%)", this.viewProcessCpuChart, 1);
+ taskProcessInfo = null;
+ processCts = new CancellationTokenSource();
+ //创建并启动线程
+ taskProcessInfo = Task.Factory.StartNew(() => UpdateProcessChart(pid, processTag, processCts.Token), processCts.Token);
+ Debug.WriteLine("taskProcessInfo_id:" + taskProcessInfo.Id);
+ }
+ catch (Exception)
+ {
+ MessageBox.Show("请检查PID!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// App监控启动按钮事件
+ ///
+ ///
+ ///
+ private void AppStartBtn_Click(object sender, EventArgs e)
+ {
+ String appText = "";
+ String appTag = "";
+ appText = viewAppTextBox.Text;
+ appTag = viewAppTagTextBox.Text;
+ if (appText.Length == 0)
+ {
+ MessageBox.Show("错误!请输入App包名或PID!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ else if (appTag.Length == 0)
+ {
+ MessageBox.Show("错误!Tag未输入!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ else if (appTag.Equals("All"))
+ {
+ MessageBox.Show("错误!Tag被占用!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ int pid = -1;
+ string packageName = null;
+ getTcpFlag = true;
+ try
+ {
+ pid = int.Parse(appText);
+ if (pid < 0)
+ {
+ MessageBox.Show("输入错误!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+ catch (Exception)
+ {
+ packageName = appText;
+ }
+ if (deviceInfo == null)
+ {
+ logger.Info(this.GetType(), "请先选择设备!");
+ MessageBox.Show("请先选择设备!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ try
+ {
+ //初始化图表
+ InitChart("App内存占用情况(MB)",this.viewAppMemoryChart,1);
+ InitChart("AppCPU占用情况(%)",this.viewAppCpuChart,1);
+ InitChart("App流量消耗情况(MB)", this.viewAppFlowChart, 1);
+ taskAppInfo = null;
+ int sdkVersion = deviceInfo.DeviceSDKVersion;
+ if (sdkVersion == 0)
+ {
+ logger.Info(sdkVersion.GetType(),"系统api版本获取失败。SDK Version =" + sdkVersion);
+ MessageBox.Show("系统api版本获取失败,请检查设备连接情况,详细信息见日志logs文件夹下info日志文件。SDK Version =" + sdkVersion, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ appCts = new CancellationTokenSource();
+ //创建并启动线程
+ taskAppInfo = Task.Factory.StartNew(() => UpdateAPPChart(deviceInfo.DeviceId,pid, packageName, appTag, sdkVersion,appCts.Token), appCts.Token);
+ Debug.WriteLine("taskAppInfo_id:" + taskAppInfo.Id);
+ }
+ catch (Exception appStarte)
+ {
+ logger.Info(appStarte.GetType(),"App内存监控线程启动失败:",appStarte);
+ MessageBox.Show("请检查App包名或PID并确认App已经启动!!!!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// 初始化Chart
+ ///
+ ///
+ ///
+ /// 对应表格需要生成的线条数
+ private void InitChart(string ChartShowName ,Chart chart , int seriesNumber)
+ {
+ //定义图表区域
+ chart.ChartAreas.Clear();
+ ChartArea chartArea1 = new ChartArea("C1");
+ chart.ChartAreas.Add(chartArea1);
+ //定义存储和显示点的容器
+ chart.Series.Clear();
+ //设置标题
+ chart.Titles.Clear();
+ chart.Titles.Add("S01");
+ chart.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
+ chart.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
+ chart.Titles[0].Text = ChartShowName;
+ chart.Titles[0].ForeColor = Color.RoyalBlue;
+ chart.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
+ for (int i = 0; i < seriesNumber; i++)
+ {
+ Series series = new Series("S"+i);
+ series.ChartArea = "C1";
+ chart.Series.Add(series);
+ //设置图表显示样式
+ //chart.ChartAreas[0].AxisY.Minimum = 0;
+ //chart.ChartAreas[0].AxisY.Maximum = 100;
+ //chart.ChartAreas[0].AxisX.Interval = 5;
+ //chart.ChartAreas[0].AxisX.Title = "X轴";
+ //chart.ChartAreas[0].AxisY.Title = "Y轴";
+ //设置图表显示样式
+ chart.Series[i].Color = colorList.ElementAt(i % colorList.Count);
+ chart.Series[i].ChartType = SeriesChartType.Line;
+ chart.Series[i].Points.Clear();
+ }
+ }
+
+ ///
+ /// ViewChartFlowLayoutPanel大小变化事件
+ ///
+ private void ViewChartFlowLayoutPanel_SizeChanged(object sender, EventArgs e)
+ {
+ SetChartSize();
+ }
+
+ ///
+ /// 设置折线图大小
+ ///
+ private void SetChartSize()
+ {
+ Debug.WriteLine("-setChartSize---" + (new StackTrace()).GetFrame(1).GetMethod().Name);
+ foreach (ToolStripMenuItem toolStripMenuItem in this.showToolStripMenuItem.DropDownItems)
+ {
+ if(toolStripMenuItem.Checked){
+ switch(toolStripMenuItem.Name){
+ case "topToolStripMenuItem":
+ Debug.WriteLine("-------------------topToolStripMenuItem-----------------------");
+ this.viewProcessRadBtnPanel.Visible = false;
+ this.viewAppRadBtnPanel.Visible = true;
+
+ for (int i = 0; i < radioBtnProcessList.Count; i++)
+ {
+ processChartList.ElementAt(i).Visible = false;
+ }
+ for (int j = 0; j < radioBtnAppList.Count; j++)
+ {
+ if (radioBtnAppList.ElementAt(j).Checked)
+ {
+ appChartList.ElementAt(j).Visible = true;
+ appChartList.ElementAt(j).Height = this.viewChartFlowLayoutPanel.Height - this.viewAppRadBtnPanel.Height;
+ appChartList.ElementAt(j).Width = this.viewChartFlowLayoutPanel.Width;
+ }
+ else
+ {
+ appChartList.ElementAt(j).Visible = false;
+ }
+ }
+ break;
+ case "downToolStripMenuItem":
+ Debug.WriteLine("-------------------downToolStripMenuItem-----------------------");
+ this.viewProcessRadBtnPanel.Visible = true;
+ this.viewAppRadBtnPanel.Visible = false;
+
+ for (int i = 0; i < radioBtnAppList.Count; i++)
+ {
+ appChartList.ElementAt(i).Visible = false;
+ }
+ for (int j = 0; j < radioBtnProcessList.Count; j++)
+ {
+ if (radioBtnProcessList.ElementAt(j).Checked)
+ {
+ processChartList.ElementAt(j).Visible = true;
+ processChartList.ElementAt(j).Height = this.viewChartFlowLayoutPanel.Height - this.viewProcessRadBtnPanel.Height;
+ processChartList.ElementAt(j).Width = this.viewChartFlowLayoutPanel.Width;
+ }
+ else
+ {
+ processChartList.ElementAt(j).Visible = false;
+ }
+ }
+ break;
+ case "allToolStripMenuItem":
+ Debug.WriteLine("-------------------allToolStripMenuItem-----------------------");
+ this.viewProcessRadBtnPanel.Visible = true;
+ this.viewAppRadBtnPanel.Visible = true;
+ for (int z = 0; z < radioBtnAppList.Count; z++)
+ {
+ if (radioBtnAppList.ElementAt(z).Checked)
+ {
+ appChartList.ElementAt(z).Visible = true;
+ appChartList.ElementAt(z).Height = (this.viewChartFlowLayoutPanel.Height - this.viewProcessRadBtnPanel.Height - this.viewAppRadBtnPanel.Height) / 2;
+ appChartList.ElementAt(z).Width = this.viewChartFlowLayoutPanel.Width;
+ }
+ else
+ {
+ appChartList.ElementAt(z).Visible = false;
+ }
+ }
+ for (int y = 0; y < radioBtnProcessList.Count; y++)
+ {
+ if (radioBtnProcessList.ElementAt(y).Checked)
+ {
+ processChartList.ElementAt(y).Visible = true;
+ processChartList.ElementAt(y).Height = (this.viewChartFlowLayoutPanel.Height - this.viewProcessRadBtnPanel.Height - this.viewAppRadBtnPanel.Height) / 2;
+ processChartList.ElementAt(y).Width = this.viewChartFlowLayoutPanel.Width;
+ }
+ else
+ {
+ processChartList.ElementAt(y).Visible = false;
+ }
+ }
+ break;
+ };
+ }
+ }
+ }
+
+ ///
+ /// 获取APP信息并更新折线图
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void UpdateAPPChart(string deviceId,int pid,string packageName,string appTag,int sdkVersion,CancellationToken ct)
+ {
+ if (appDataList.Count > 0)
+ {
+ //AppdataList.Clear();
+ for (int i = 0; i < appDataList.Count; i++)
+ {
+ this.Invoke(new Action(() => {
+ this.viewAppMemoryChart.Series[0].Points.AddXY(i + 1, appDataList.ElementAt(i).PrivateSS);
+ this.viewAppCpuChart.Series[0].Points.AddXY(i + 1, appDataList.ElementAt(i).Cpu);
+ if (getTcpFlag && sdkVersion < 26)
+ {
+ this.viewAppFlowChart.Series[0].Points.AddXY(i + 1, appDataList.ElementAt(i).TcpRcvFlow);
+ }
+ }));
+ //this.Invoke(new Action(() => { this.viewAppCpuChart.Series[0].Points.AddXY(i + 1, appDataList.ElementAt(i).Cpu); }));
+ //if (getTcpFlag && sdkVersion < 26)
+ //{
+ //this.Invoke(new Action(() => { this.viewAppFlowChart.Series[0].Points.AddXY(i + 1, appDataList.ElementAt(i).TcpRcvFlow); }));
+ //this.Invoke(new Action(() => { this.viewAppFlowChart.Series[1].Points.AddXY(i + 1, appDataList.ElementAt(i).TcpSndFlow); }));
+ //}
+ }
+ }
+ while (true)
+ {
+ if(ct.IsCancellationRequested){
+ Debug.WriteLine("IsCancellationRequested");
+ return;
+ }
+ //AppdataList.Add(ran());
+ ProcessInfo appProcessInfo = GetAppInfo.GetInfo(deviceId,pid, packageName, sdkVersion,getTcpFlag);
+ if (appProcessInfo != null)
+ {
+ if (appProcessInfo.TcpRcvFlow == -1 && appProcessInfo.TcpSndFlow == -1)
+ {
+ getTcpFlag = false;
+ this.BeginInvoke(new Action(() => {
+ this.viewToolTip.SetToolTip(this.viewAppFlowRadBtn, "已停止获取流量信息");
+ this.viewToolTip.Show("已停止获取流量信息", this.viewAppFlowRadBtn);
+ }));
+ logger.Info(appProcessInfo.GetType(),"流量使用信息获取失败!设置TcpFlag为false!");
+ }
+ appDataList.Add(appProcessInfo);
+ appProcessInfo.Tag = appTag;
+ List processInfoList = new List { };
+ processInfoList.Add(appProcessInfo);
+ //Debug.WriteLine("queue.len:" + AppdataList.Count());
+ if (Math.Abs(appProcessInfo.PrivateSS - processOldSaveValue) >= Properties.Settings.Default.AppSaveOffset)
+ {
+ //调用数据保存方法
+ try
+ {
+ DataBaseBLL.SaveData(processInfoList,Properties.Settings.Default.IsSave);
+ }
+ catch (Exception savee)
+ {
+ //异步调用写入日志
+ this.BeginInvoke(new Action(() => { logger.Info(this.GetType(), "processInfoList:" + processInfoList.ElementAt(0).GetString() + ",ErrorMessage:", savee); }));
+ }
+ appOldSaveValue = appProcessInfo.PrivateSS;
+ }
+ int chartCount = this.viewAppMemoryChart.Series[0].Points.Count;
+ int appOldShowValue = 0;
+ if (chartCount>0)
+ {
+ appOldShowValue = (int)this.viewAppMemoryChart.Series[0].Points.ElementAt(chartCount - 1).YValues[0];
+ }
+ if (Math.Abs(appProcessInfo.PrivateSS - appOldShowValue )>= Properties.Settings.Default.AppShowOffset)
+ {
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() => {
+ this.viewAppMemoryChart.Series[0].Points.AddXY(appDataList.Count, appProcessInfo.PrivateSS);
+ this.viewAppCpuChart.Series[0].Points.AddXY(appDataList.Count, appProcessInfo.Cpu);
+ if (getTcpFlag && sdkVersion < 26)
+ {
+ if (appDataList.Count == 1)
+ {
+ this.viewAppFlowChart.ChartAreas[0].AxisY.Minimum = appProcessInfo.TcpRcvFlow / 1024;
+ }
+ this.viewAppFlowChart.Series[0].Points.AddXY(appDataList.Count, appProcessInfo.TcpRcvFlow / 1024);
+ }
+ }));
+ //this.BeginInvoke(new Action(() => { this.viewAppCpuChart.Series[0].Points.AddXY(appDataList.Count, appProcessInfo.Cpu); }));
+ //if (getTcpFlag && sdkVersion < 26)
+ //{
+ // this.BeginInvoke(new Action(() => {
+ // this.viewAppFlowChart.ChartAreas[0].AxisX.Minimum = appProcessInfo.TcpRcvFlow / 1024;
+ // this.viewAppFlowChart.Series[0].Points.AddXY(appDataList.Count, appProcessInfo.TcpRcvFlow/1024);
+ // }));
+ // //this.BeginInvoke(new Action(() => { this.viewAppFlowChart.Series[1].Points.AddXY(appDataList.Count, appProcessInfo.TcpSndFlow/1024); }));
+ //}
+ }
+ }
+ //实时获取配置控制获取信息循环间隔时间
+ Thread.Sleep(Properties.Settings.Default.AppSleepTime);
+ }
+ else
+ {
+ logger.Info(this.GetType(), "获取App信息出错,请检查包名及连接状态! PID=" + pid + "App包名:" + packageName);
+ this.BeginInvoke(new Action(() => { StopTask(taskAppInfo, appCts); }));
+ MessageBox.Show("获取App信息出错,请检查包名及连接状态!详细信息见工作目录下日志文件!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ break;
+ }
+ //this.BeginInvoke(new Action(() => { this.appchart.Series[0].Points.Clear(); }));
+ }
+ }
+
+ ///
+ /// 每两秒产生一个50-100的随机数
+ ///
+ ///
+ private int ran() {
+ Thread.Sleep(2000);
+ return new Random().Next(50, 100);
+ }
+
+ ///
+ /// 获取进程信息并更新折线图
+ ///
+ ///
+ ///
+ ///
+ private void UpdateProcessChart(int pid,string processTag,CancellationToken ct)
+ {
+ if (processDataList.Count > 0)
+ {
+ //dataList.Clear();
+ for (int i = 0; i < processDataList.Count; i++)
+ {
+ this.Invoke(new Action(() => { this.viewProcessMemoryChart.Series[0].Points.AddXY(i + 1, processDataList.ElementAt(i).PrivateSS); }));
+ this.Invoke(new Action(() => { this.viewProcessCpuChart.Series[0].Points.AddXY(i + 1, processDataList.ElementAt(i).Cpu); }));
+ }
+ }
+ //上次记录的CPU时间
+ var prevCpuTime = TimeSpan.Zero;
+ bool firstFlag = true;
+ while(true){
+ if(ct.IsCancellationRequested){
+ Debug.WriteLine("IsCancellationRequested");
+ return;
+ }
+ float cpu = 0;
+ var curTime = prevCpuTime;
+ //获取进程信息,需要传入间隔时间
+ ProcessInfo processInfo = GetPsInfo.GetProcessInfo(out cpu, out curTime, pid, Properties.Settings.Default.ProcessSleepTime, prevCpuTime);
+ prevCpuTime = curTime;
+ if (processInfo != null)
+ {
+ //首次记录不准确,丢弃
+ if (firstFlag)
+ {
+ processInfo.Cpu = 0;
+ firstFlag = false;
+ }
+ processInfo.Tag = processTag;
+ processDataList.Add(processInfo);
+ List processInfoList = new List{};
+ processInfoList.Add(processInfo);
+ if (Math.Abs(processInfo.PrivateSS - processOldSaveValue)>= Properties.Settings.Default.ProcessSaveOffset)
+ {
+ //调用数据保存方法
+ try
+ {
+ DataBaseBLL.SaveData(processInfoList, Properties.Settings.Default.IsSave);
+ }
+ catch (Exception savee)
+ {
+ //异步调用写入日志
+ this.BeginInvoke(new Action(() => { logger.Info(this.GetType(), "processInfoList:" + processInfoList.ElementAt(0).GetString() + ",ErrorMessage:", savee); }));
+ }
+ processOldSaveValue = processInfo.PrivateSS;
+ }
+ //this.BeginInvoke(new Action(() => { this.chart.Series[0].Points.Clear(); }));
+ int chartCount = this.viewProcessMemoryChart.Series[0].Points.Count;
+ int processOldShowValue = 0;
+ if (chartCount > 0)
+ {
+ processOldShowValue = (int)this.viewProcessMemoryChart.Series[0].Points.ElementAt(chartCount - 1).YValues[0];
+ }
+ if (Math.Abs(processInfo.PrivateSS - processOldShowValue) >= Properties.Settings.Default.ProcessShowOffset)
+ {
+ if (this.IsHandleCreated)
+ {
+ this.BeginInvoke(new Action(() => { this.viewProcessMemoryChart.Series[0].Points.AddXY(processDataList.Count, processInfo.PrivateSS); }));
+ this.BeginInvoke(new Action(() => { this.viewProcessCpuChart.Series[0].Points.AddXY(processDataList.Count, processInfo.Cpu); }));
+ }
+ }
+ //实时获取配置控制获取信息循环间隔时间
+ Thread.Sleep(Properties.Settings.Default.ProcessSleepTime);
+ }
+ else
+ {
+ logger.Info(this.GetType(),"获取进程信息出错,请检查PID! PID =" + pid);
+ MessageBox.Show("获取进程信息出错,请检查PID!详细信息见工作目录下日志文件", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ this.BeginInvoke(new Action(() => { StopTask(taskProcessInfo, processCts); }));
+ break;
+ }
+ }
+ }
+
+ ///
+ /// 进程监控暂停事件
+ ///
+ ///
+ private void ProcessPauseBtn_Click(object sender, EventArgs e)
+ {
+ if (taskProcessInfo == null)
+ {
+ MessageBox.Show("线程为非运行状态", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ else
+ {
+ StopTask(taskProcessInfo, processCts);
+ }
+ }
+
+ ///
+ /// 停止线程并释放线程资源
+ ///
+ ///
+ private void StopTask(Task t,CancellationTokenSource cts) {
+ cts.Cancel();
+ while (true)
+ {
+ Debug.WriteLine("线程状态:" + t.Status);
+ if (t.IsCompleted)
+ {
+ try
+ {
+ t.Dispose();
+ Debug.WriteLine(t.Status);
+ break;
+ }
+ catch (Exception e1)
+ {
+ Debug.WriteLine(e1);
+ //throw e1;
+ }
+ }
+ }
+ }
+
+ ///
+ /// app监控暂停事件
+ ///
+ ///
+ private void AppPauseBtn_Click(object sender, EventArgs e)
+ {
+ //MessageBox.Show("功能暂未开放,敬请期待!");
+ //return;
+ if (taskAppInfo == null)
+ {
+ MessageBox.Show("线程为非运行状态", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ else
+ {
+ StopTask(taskAppInfo, appCts);
+ }
+ }
+
+ ///
+ /// 进程监控表格清除事件
+ ///
+ ///
+ private void ProcessClearBtn_Click(object sender, EventArgs e)
+ {
+ Debug.WriteLine("点击了进程表格清除事件");
+ processDataList.Clear();
+ this.viewProcessMemoryChart.Series[0].Points.Clear();
+ this.viewProcessCpuChart.Series[0].Points.Clear();
+ }
+
+ ///
+ /// app监控表格清除事件
+ ///
+ ///
+ private void AppClearBtn_Click(object sender, EventArgs e)
+ {
+ Debug.WriteLine("点击了APP表格清除事件");
+ appDataList.Clear();
+ this.viewAppMemoryChart.Series[0].Points.Clear();
+ this.viewAppCpuChart.Series[0].Points.Clear();
+ this.viewAppFlowChart.Series[0].Points.Clear();
+ //this.viewAppFlowChart.Series[1].Points.Clear();
+ }
+
+ private void MainForm_Load(object sender, EventArgs e)
+ {
+
+ }
+
+ ///
+ /// Top占满点击事件
+ ///
+ private void TopToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ SingleCheck(sender);
+ SetChartSize();
+ }
+
+ ///
+ /// Down占满点击事件
+ ///
+ private void DownToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ SingleCheck(sender);
+ SetChartSize();
+ }
+
+ ///
+ /// 上下各占一半点击事件
+ ///
+ private void AllToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ SingleCheck(sender);
+ SetChartSize();
+ }
+
+ ///
+ /// 工具栏选中焦点切换
+ ///
+ ///
+ private void SingleCheck(object sender)
+ {
+ foreach (ToolStripMenuItem sdc in this.showToolStripMenuItem.DropDownItems)
+ {
+ sdc.Checked = false;
+ }
+ ((ToolStripMenuItem)sender).Checked = true;
+ }
+
+ ///
+ /// 关于
+ ///
+ private void AboutToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ MessageBox.Show("本程序可用于PC和Android进程内存/CPU/占用及流量监控,并且可绘制出变化折线图。\n注:\n1 .目前流量监控只支持部分Android8.0设备(SDK版本小于26),PC进程目前不支持流量监控!\n2 .流量显示为累积量!","关于");
+ }
+
+ ///
+ /// 退出程序
+ ///
+ private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ logger.Info(GetType(), "--------------------------退出程序--------------------------");
+ System.Environment.Exit(0);
+ }
+
+ ///
+ /// 设置点击事件
+ ///
+ private void SettingToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ MySettingForm ms = new MySettingForm();
+ ms.ShowDialog();
+ ms.Dispose();
+ }
+
+ ///
+ /// '打开'点击事件
+ ///
+ ///
+ ///
+ private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (taskProcessInfo != null && taskAppInfo != null)
+ {
+ if (!taskProcessInfo.Status.Equals("RanToCompletion") && !taskAppInfo.Status.Equals("RanToCompletion"))
+ {
+ MessageBox.Show("表格绘制忙碌中,请停止后再来吧!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ return;
+ }
+ }
+ openFileDialogDB.InitialDirectory = Properties.Settings.Default.DatabasePath;
+ openFileDialogDB.Filter = "数据库文件|*.db";
+ DialogResult dialogResultDB = openFileDialogDB.ShowDialog();
+ openFileDialogDB.Dispose();
+ if (dialogResultDB == DialogResult.OK)
+ {
+ try
+ {
+ logger.Info(this.GetType(), "选择的文件:" + openFileDialogDB.FileName);
+ string[] tables = null;
+ tables = DataBaseBLL.getTables(openFileDialogDB.FileName);
+ //tables[0] = "memory_info";
+ if (tables == null || tables.Length <= 0)
+ {
+ MessageBox.Show("数据库中无表:" + openFileDialogDB.FileName + "详细信息见工作目录下日志文件。","警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ Debug.WriteLine("tables.len:" + tables.Length + ":" + tables[0]);
+ string[][] tagList = new string[tables.Length][];
+ for (int i = 0; i < tables.Length; i++)
+ {
+ if (tables[i] != null)
+ {
+ //Debug.WriteLine(opendb.getTag(tables[i]));
+ tagList[i] = DataBaseBLL.getTag(openFileDialogDB.FileName, tables[i]);
+ if (tagList[i] ==null)
+ {
+ logger.Info(this.GetType(), tagList.Count() + "Tag为空!");
+ MessageBox.Show("获取tag为空", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+ }
+ OpenDataForm openDataForm = new OpenDataForm(tables, tagList);
+ DialogResult dialogResult = openDataForm.ShowDialog();
+ DisposeForm(openDataForm);
+ if (dialogResult == DialogResult.OK)
+ {
+ string[] returnValueTag = openDataForm.ReturnValueTag; //获得返回值
+ List chartList1 = new List();
+ List chartList2 = new List();
+ for (int j = 0; j < returnValueTag.Length; j++)
+ {
+ if (returnValueTag[j].Length != 0)
+ {
+ //表名暂时写死为tables[0],即memory_info
+ DataSet ds = DataBaseBLL.GetProcessInfoByTag(openFileDialogDB.FileName,tables[0],returnValueTag[j]);
+ if (ds != null)
+ {
+ for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
+ {
+ //Debug.WriteLine("ItemArray[1]:" + ds.Tables[0].Rows[i].ItemArray[1]);
+ object[] tempArray = ds.Tables[0].Rows[i].ItemArray;
+ SelectProcessInfo tempInfo = new SelectProcessInfo();
+ tempInfo.Id = int.Parse(tempArray[0].ToString());
+ tempInfo.Tag = tempArray[1].ToString();
+ tempInfo.Pid = int.Parse(tempArray[2].ToString());
+ tempInfo.ProcessName = tempArray[3].ToString();
+ tempInfo.Cpu = float.Parse(tempArray[4].ToString());
+ tempInfo.PrivateSS = int.Parse(tempArray[5].ToString());
+ tempInfo.AddTime = tempArray[6].ToString();
+ if (j == 0)
+ {
+ chartList1.Add(tempInfo);
+ }
+ else
+ {
+ chartList2.Add(tempInfo);
+ }
+
+ }
+ }
+ }
+ }
+ setDataToChat(chartList1,chartList2,returnValueTag);
+ }
+ }
+ catch (Exception opene)
+ {
+ Debug.WriteLine("打开文件错误! ErrorMessage:" ,opene);
+ logger.Info(this.GetType(),"打开文件错误! ErrorMessage:" ,opene);
+ MessageBox.Show("文件错误:" + openFileDialogDB.FileName + "详细信息见工作目录下日志文件。","警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+
+ ///
+ /// 设置打开的数据至对应的Chat中
+ ///
+ ///
+ ///
+ ///
+ private void setDataToChat(List chartList1, List chartList2,string[] Tag)
+ {
+ if (chartList1.Count != 0)
+ {
+ InitChart("Tag:" + Tag[0] + "内存(MB)", this.viewAppMemoryChart, 1);
+ InitChart("Tag:" + Tag[0] + "CPU(%)", this.viewAppCpuChart, 1);
+ InitChart("Tag:" + Tag[0] + "流量(MB)", this.viewAppFlowChart, 1);
+ for (int i = 0; i < chartList1.Count; i++)
+ {
+ this.viewAppMemoryChart.Series[0].Points.AddXY(i, chartList1.ElementAt(i).PrivateSS);
+ this.viewAppCpuChart.Series[0].Points.AddXY(i, chartList1.ElementAt(i).Cpu);
+ List appTcpRcvFlow = new List { };
+ for (int j = 0; j < appDataList.Count; j++)
+ {
+ appTcpRcvFlow.Add(appDataList.ElementAt(i).TcpRcvFlow);
+ }
+ this.viewAppFlowChart.ChartAreas[0].AxisY.Minimum = appTcpRcvFlow.Min() / 1024;
+ this.viewAppFlowChart.Series[0].Points.AddXY(i, chartList1.ElementAt(i).TcpRcvFlow/1024);
+ //this.viewAppFlowChart.Series[1].Points.AddXY(i, chartList1.ElementAt(i).TcpSndFlow/1024);
+ }
+ }
+ if (chartList2.Count != 0)
+ {
+ InitChart("Tag:" + Tag[1] + "内存(MB)",this.viewProcessMemoryChart,1);
+ InitChart("Tag:" + Tag[1] + "CPU(%)", this.viewProcessCpuChart, 1);
+ for (int i = 0; i < chartList2.Count; i++)
+ {
+ this.viewProcessMemoryChart.Series[0].Points.AddXY(i, chartList2.ElementAt(i).PrivateSS);
+ this.viewProcessCpuChart.Series[0].Points.AddXY(i, chartList2.ElementAt(i).Cpu);
+ }
+ }
+ }
+
+ ///
+ /// 释放窗口资源。
+ ///
+ ///
+ private void DisposeForm(Form form)
+ {
+ if (!form.IsDisposed)
+ {
+ form.Dispose();
+ Debug.WriteLine(form.GetType() + "释放资源完成。");
+ }
+ }
+
+ ///
+ /// Pc进程pid选择按钮点击事件
+ ///
+ ///
+ ///
+ private void ProcessChooseBtn_Click(object sender, EventArgs e)
+ {
+ MainChooseForm mainChooseForm = new MainChooseForm("PC",null);
+ DialogResult dialogResult = mainChooseForm.ShowDialog();
+ DisposeForm(mainChooseForm);
+ if (dialogResult == DialogResult.OK)
+ {
+ string pid = mainChooseForm.ReturnChooseInfoValue.Pid.ToString();
+ this.viewProcessPidTextBox.Text = pid;
+ }
+ }
+
+ ///
+ /// app进程pid选择按钮点击事件
+ ///
+ ///
+ ///
+ private void AppChooseBtn_Click(object sender, EventArgs e)
+ {
+ if (deviceInfo.DeviceId == null & this.viewDeviceIdTextBox.Text.Trim().Length <=0 )
+ {
+ logger.Info(this.GetType(), "deviceInfo为空,请先选择设备");
+ MessageBox.Show("请先选择设备", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ MainChooseForm mainChooseForm = new MainChooseForm("APP",deviceInfo.DeviceId);
+ DialogResult dialogResult = mainChooseForm.ShowDialog();
+ DisposeForm(mainChooseForm);
+ if (dialogResult == DialogResult.OK)
+ {
+ string packageName = mainChooseForm.ReturnChooseInfoValue.ChooseName;
+ this.viewAppTextBox.Text = packageName;
+ }
+ }
+
+ ///
+ /// 设备选择按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewDeviceIdChooseBtn_Click(object sender, EventArgs e)
+ {
+ MainChooseForm mainChooseForm = new MainChooseForm("Device", null);
+ DialogResult dialogResult = mainChooseForm.ShowDialog();
+ DisposeForm(mainChooseForm);
+ if (dialogResult == DialogResult.OK)
+ {
+ deviceInfo = mainChooseForm.ReturnDeviceInfo;
+ this.viewDeviceIdTextBox.Text = deviceInfo.DeviceId;
+ }
+ }
+
+ ///
+ /// 点击X按钮关闭窗口时事件
+ ///
+ ///
+ ///
+ private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ logger.Info(this.GetType(), "-------------------退出程序--------------------");
+ }
+
+ ///
+ /// App内存按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewAppMemoryRadBtn_CheckedChanged(object sender, EventArgs e)
+ {
+ if (((RadioButton)sender).Checked)
+ {
+ SetChartSize();
+ }
+ }
+
+ ///
+ /// AppCpu按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewAppCpuRadBtn_CheckedChanged(object sender, EventArgs e)
+ {
+ if (((RadioButton)sender).Checked)
+ {
+ SetChartSize();
+ }
+ }
+
+ ///
+ /// App流量按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewAppFlowRadBtn_CheckedChanged(object sender, EventArgs e)
+ {
+ if (((RadioButton)sender).Checked)
+ {
+ SetChartSize();
+ }
+ }
+
+ ///
+ /// Process内存按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewProcessMemoryRadBtn_CheckedChanged(object sender, EventArgs e)
+ {
+ if (((RadioButton)sender).Checked)
+ {
+ SetChartSize();
+ }
+ }
+
+ ///
+ /// Process Cpu按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewProcessCpuRadBtn_CheckedChanged(object sender, EventArgs e)
+ {
+ if (((RadioButton)sender).Checked)
+ {
+ SetChartSize();
+ }
+ }
+
+ ///
+ /// Process流量按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewProcessFlowRadBtn_CheckedChanged(object sender, EventArgs e)
+ {
+ if (((RadioButton)sender).Checked)
+ {
+ SetChartSize();
+ }
+ }
+
+ ///
+ /// 进程内存表格鼠标移过事件
+ ///
+ ///
+ ///
+ private void ViewProcessMemoryChart_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (processDataList.Count > 0 && viewProcessMemoryChart.ChartAreas.Count > 0 )
+ {
+ var area = viewProcessMemoryChart.ChartAreas[0];
+ double xValue = area.AxisX.PixelPositionToValue(e.X);
+ //double yValue = area.AxisY.PixelPositionToValue(e.Y);
+ if ((processDataList.Count > (int)xValue) && ((int)xValue > 0))
+ {
+ double yValue = processDataList.ElementAt((int)xValue-1).PrivateSS;
+ this.ViewProcessXYLabel.Text = string.Format("X:{0:F0},Y:{1:F0}(MB)", xValue, yValue);
+ Debug.WriteLine(string.Format("X:{0:F0}, Y:{1:F0}(MB)", xValue, yValue));
+ }
+ }
+ }
+
+ ///
+ /// 进程CPU表格鼠标移过事件
+ ///
+ ///
+ ///
+ private void ViewProcessCpuChart_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (processDataList.Count > 0 && viewProcessCpuChart.ChartAreas.Count > 0)
+ {
+ var area = viewProcessCpuChart.ChartAreas[0];
+ double xValue = area.AxisX.PixelPositionToValue(e.X);
+ //double yValue = area.AxisY.PixelPositionToValue(e.Y);
+ if ((processDataList.Count > (int)xValue) && ((int)xValue > 0))
+ {
+ double yValue = processDataList.ElementAt((int)xValue - 1).Cpu;
+ this.ViewProcessXYLabel.Text = string.Format("X:{0:F0},Y:{1:F0}(%)", xValue, yValue);
+ Debug.WriteLine(string.Format("X:{0:F0}, Y:{1:F0}(%)", xValue, yValue));
+ }
+ }
+ }
+
+ ///
+ /// 进程流量表格鼠标移过事件
+ ///
+ ///
+ ///
+ private void ViewProcessFlowChart_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (processDataList.Count > 0 && viewProcessFlowChart.ChartAreas.Count > 0)
+ {
+ var area = viewProcessFlowChart.ChartAreas[0];
+ double xValue = area.AxisX.PixelPositionToValue(e.X);
+ //double yValue = area.AxisY.PixelPositionToValue(e.Y);
+ if ((processDataList.Count > (int)xValue) && ((int)xValue > 0))
+ {
+ double yValue = processDataList.ElementAt((int)xValue - 1).TcpRcvFlow / 1024;
+ this.ViewProcessXYLabel.Text = string.Format("X:{0:F0}, Y:{1:F0}(MB)", xValue, yValue);
+ Debug.WriteLine(string.Format("X:{0:F0}, Y:{1:F0}(MB)", xValue, yValue));
+ }
+ }
+ }
+
+ ///
+ /// App内存表格鼠标移过事件
+ ///
+ ///
+ ///
+ private void ViewAppMemoryChart_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (appDataList.Count > 0 && viewAppMemoryChart.ChartAreas.Count > 0)
+ {
+ var area = viewAppMemoryChart.ChartAreas[0];
+ double xValue = area.AxisX.PixelPositionToValue(e.X);
+ //double yValue = area.AxisY.PixelPositionToValue(e.Y);
+ if ((appDataList.Count > (int)xValue) && ((int)xValue > 0))
+ {
+ double yValue = appDataList.ElementAt((int)xValue - 1).PrivateSS;
+ this.ViewAppXYLabel.Text = string.Format("X:{0:F0},Y:{1:F0}(MB)", xValue, yValue);
+ Debug.WriteLine(string.Format("X:{0:F0}, Y:{1:F0}(MB)", xValue, yValue));
+ }
+ }
+ }
+
+ ///
+ /// AppCPU表格鼠标移过事件
+ ///
+ ///
+ ///
+ private void ViewAppCpuChart_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (appDataList.Count > 0 && viewAppCpuChart.ChartAreas.Count > 0)
+ {
+ var area = viewAppCpuChart.ChartAreas[0];
+ double xValue = area.AxisX.PixelPositionToValue(e.X);
+ //double yValue = area.AxisY.PixelPositionToValue(e.Y);
+ if ((appDataList.Count > (int)xValue) && ((int)xValue > 0))
+ {
+ double yValue = appDataList.ElementAt((int)xValue - 1).Cpu;
+ this.ViewAppXYLabel.Text = string.Format("X:{0:F0},Y:{1:F0}(%)", xValue, yValue);
+ Debug.WriteLine(string.Format("X:{0:F0}, Y:{1:F0}(MB)", xValue, yValue));
+ }
+ }
+ }
+
+ ///
+ /// App流量表格移过事件
+ ///
+ ///
+ ///
+ private void ViewAppFlowChart_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (appDataList.Count > 0 && viewAppFlowChart.ChartAreas.Count > 0)
+ {
+ var area = viewAppFlowChart.ChartAreas[0];
+ double xValue = area.AxisX.PixelPositionToValue(e.X);
+ //double yValue = area.AxisY.PixelPositionToValue(e.Y);
+ if ((appDataList.Count > (int)xValue) && ((int)xValue > 0))
+ {
+ double yValue = appDataList.ElementAt((int)xValue - 1).TcpRcvFlow / 1024;
+ this.ViewAppXYLabel.Text = string.Format("X:{0:F0},Y:{1:F0}(MB)", xValue, yValue);
+ Debug.WriteLine(string.Format("X:{0:F0}, Y:{1:F0}(MB)", xValue, yValue));
+ }
+ }
+ }
+
+ ///
+ /// apk文件选择按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewApkChooseBtn_Click(object sender, EventArgs e)
+ {
+ openFileDialogApk.Filter = "apk文件|*.apk";
+ DialogResult dialogResult = openFileDialogApk.ShowDialog();
+ openFileDialogApk.Dispose();
+ if (dialogResult == DialogResult.OK)
+ {
+ this.viewApkPathTextBox.Text = openFileDialogApk.FileName;
+ }
+ }
+
+ ///
+ /// apk安装按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewAppInstallBtn_Click(object sender, EventArgs e)
+ {
+ if (deviceInfo == null)
+ {
+ logger.Info(this.GetType(), "请先选择设备!");
+ MessageBox.Show("请先选择设备!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ string apkFileName = this.viewApkPathTextBox.Text;
+ if (apkFileName.Length > 0 && File.Exists(apkFileName))
+ {
+ AppOperation appOperation = new AppOperation();
+ if (appOperation.InstallApp(deviceInfo.DeviceId, apkFileName))
+ {
+ logger.Info(this.GetType(), "App安装成功!");
+ MessageBox.Show("App安装成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ }
+ appOperation = null;
+ }
+ else
+ {
+ logger.Info(this.GetType(), "请选择正确的文件!");
+ MessageBox.Show("请选择正确的文件!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+
+ ///
+ /// App缓存清除按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewAppClearCacheBtn_Click(object sender, EventArgs e)
+ {
+ if (deviceInfo == null)
+ {
+ logger.Info(this.GetType(), "请先选择设备!");
+ MessageBox.Show("请先选择设备!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ string packageName = this.viewAppTextBox.Text;
+ if (packageName != null && !packageName.Equals(""))
+ {
+ AppOperation appOperation = new AppOperation();
+ if (appOperation.ClearAppCaches(deviceInfo.DeviceId, packageName))
+ {
+ logger.Info(this.GetType(), "App缓存清除成功!");
+ MessageBox.Show("App缓存清除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
+ }
+ appOperation = null;
+ }
+ else
+ {
+ logger.Info(this.GetType(), "请输入正确的App包名!");
+ MessageBox.Show("请输入正确的App包名!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+
+ ///
+ /// App卸载按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewAppUninstallBtn_Click(object sender, EventArgs e)
+ {
+ //LoadingForm loadingForm = new LoadingForm();
+ //loadingForm.Show();
+ //Debug.WriteLine("窗口状态:"+loadingForm.IsDisposed);
+ ////loadingForm.Close();
+ //Debug.WriteLine("窗口状态:" + loadingForm.IsDisposed);
+ if (LoadingHelper.IsOpen)
+ {
+ LoadingHelper.CloseForm();//关闭
+ }
+ else
+ {
+ LoadingHelper.ShowLoadingScreen();//显示
+ }
+ }
+
+ ///
+ /// AppTextBox文字发生更改时出发事件
+ ///
+ ///
+ ///
+ private void ViewAppTextBox_TextChanged(object sender, EventArgs e)
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/RAMMonitoringTools/MainForm.resx b/ResourceMonitorTools/MainForm.resx
similarity index 99%
rename from RAMMonitoringTools/MainForm.resx
rename to ResourceMonitorTools/MainForm.resx
index b1a187f480faf2c5e131981cd11cb34f55f4da55..df17f6e70792de369908b62d1f3a91e157487aa4 100644
--- a/RAMMonitoringTools/MainForm.resx
+++ b/ResourceMonitorTools/MainForm.resx
@@ -117,20 +117,20 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- 17, 17
-
214, 15
-
- 115, 18
-
379, 15
+
+ 600, 15
+
+
+ 17, 17
+
- 48
+ 38
diff --git a/RAMMonitoringTools/MySetting.Designer.cs b/ResourceMonitorTools/MySettingForm.Designer.cs
similarity index 62%
rename from RAMMonitoringTools/MySetting.Designer.cs
rename to ResourceMonitorTools/MySettingForm.Designer.cs
index 0563824058f6ca523f524479c785f749764b4d62..55c7279528a9fff10910947caef791e4a6367d9b 100644
--- a/RAMMonitoringTools/MySetting.Designer.cs
+++ b/ResourceMonitorTools/MySettingForm.Designer.cs
@@ -1,6 +1,6 @@
-namespace RAMMonitoringTools
+namespace ResourceMonitorTools
{
- partial class MySetting
+ partial class MySettingForm
{
///
/// Required designer variable.
@@ -28,44 +28,44 @@
///
private void InitializeComponent()
{
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MySetting));
- this.SetClose = new System.Windows.Forms.Button();
- this.SetApply = new System.Windows.Forms.Button();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MySettingForm));
+ this.viewClose = new System.Windows.Forms.Button();
+ this.viewApply = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
- this.ProcessSleepTimeList = new System.Windows.Forms.ComboBox();
+ this.viewProcessSleepTimeList = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.panel2 = new System.Windows.Forms.Panel();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
- this.AppSleepTimeList = new System.Windows.Forms.ComboBox();
+ this.viewAppSleepTimeList = new System.Windows.Forms.ComboBox();
this.panel3 = new System.Windows.Forms.Panel();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
- this.ProcessShowOffsetList = new System.Windows.Forms.ComboBox();
+ this.viewProcessShowOffsetList = new System.Windows.Forms.ComboBox();
this.panel4 = new System.Windows.Forms.Panel();
this.label7 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
- this.AppShowOffsetList = new System.Windows.Forms.ComboBox();
+ this.viewAppShowOffsetList = new System.Windows.Forms.ComboBox();
this.panel5 = new System.Windows.Forms.Panel();
this.label9 = new System.Windows.Forms.Label();
this.label10 = new System.Windows.Forms.Label();
- this.ProcessSaveOffsetList = new System.Windows.Forms.ComboBox();
+ this.viewProcessSaveOffsetList = new System.Windows.Forms.ComboBox();
this.panel6 = new System.Windows.Forms.Panel();
this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
- this.AppSaveOffsetList = new System.Windows.Forms.ComboBox();
+ this.viewAppSaveOffsetList = new System.Windows.Forms.ComboBox();
this.panel7 = new System.Windows.Forms.Panel();
- this.textBoxDBPath = new System.Windows.Forms.TextBox();
- this.setbtnfolder = new System.Windows.Forms.Button();
+ this.viewTextBoxDBPath = new System.Windows.Forms.TextBox();
+ this.viewSetBtnfolder = new System.Windows.Forms.Button();
this.label13 = new System.Windows.Forms.Label();
this.panel8 = new System.Windows.Forms.Panel();
- this.textBoxDBName = new System.Windows.Forms.TextBox();
+ this.viewTextBoxDBName = new System.Windows.Forms.TextBox();
this.label14 = new System.Windows.Forms.Label();
this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();
this.panel9 = new System.Windows.Forms.Panel();
- this.radioButtonYes = new System.Windows.Forms.RadioButton();
- this.radioButtonNo = new System.Windows.Forms.RadioButton();
+ this.viewRadioButtonYes = new System.Windows.Forms.RadioButton();
+ this.viewRadioButtonNo = new System.Windows.Forms.RadioButton();
this.label15 = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
@@ -78,27 +78,27 @@
this.panel9.SuspendLayout();
this.SuspendLayout();
//
- // SetClose
+ // viewClose
//
- this.SetClose.Location = new System.Drawing.Point(446, 480);
- this.SetClose.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
- this.SetClose.Name = "SetClose";
- this.SetClose.Size = new System.Drawing.Size(112, 35);
- this.SetClose.TabIndex = 0;
- this.SetClose.Text = "关闭";
- this.SetClose.UseVisualStyleBackColor = true;
- this.SetClose.Click += new System.EventHandler(this.SetClose_Click);
+ this.viewClose.Location = new System.Drawing.Point(446, 480);
+ this.viewClose.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.viewClose.Name = "viewClose";
+ this.viewClose.Size = new System.Drawing.Size(112, 35);
+ this.viewClose.TabIndex = 0;
+ this.viewClose.Text = "关闭";
+ this.viewClose.UseVisualStyleBackColor = true;
+ this.viewClose.Click += new System.EventHandler(this.ViewSetClose_Click);
//
- // SetApply
+ // viewApply
//
- this.SetApply.Location = new System.Drawing.Point(324, 480);
- this.SetApply.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
- this.SetApply.Name = "SetApply";
- this.SetApply.Size = new System.Drawing.Size(112, 35);
- this.SetApply.TabIndex = 1;
- this.SetApply.Text = "应用";
- this.SetApply.UseVisualStyleBackColor = true;
- this.SetApply.Click += new System.EventHandler(this.SetApply_Click);
+ this.viewApply.Location = new System.Drawing.Point(324, 480);
+ this.viewApply.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.viewApply.Name = "viewApply";
+ this.viewApply.Size = new System.Drawing.Size(112, 35);
+ this.viewApply.TabIndex = 1;
+ this.viewApply.Text = "应用";
+ this.viewApply.UseVisualStyleBackColor = true;
+ this.viewApply.Click += new System.EventHandler(this.ViewSettingApply_Click);
//
// label1
//
@@ -110,22 +110,22 @@
this.label1.TabIndex = 2;
this.label1.Text = "进程内存获取间隔时间:";
//
- // ProcessSleepTimeList
+ // viewProcessSleepTimeList
//
- this.ProcessSleepTimeList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.ProcessSleepTimeList.FormattingEnabled = true;
- this.ProcessSleepTimeList.Items.AddRange(new object[] {
+ this.viewProcessSleepTimeList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewProcessSleepTimeList.FormattingEnabled = true;
+ this.viewProcessSleepTimeList.Items.AddRange(new object[] {
"0",
"500",
"1000",
"1500",
"2000",
"2500"});
- this.ProcessSleepTimeList.Location = new System.Drawing.Point(215, 8);
- this.ProcessSleepTimeList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.ProcessSleepTimeList.Name = "ProcessSleepTimeList";
- this.ProcessSleepTimeList.Size = new System.Drawing.Size(91, 26);
- this.ProcessSleepTimeList.TabIndex = 3;
+ this.viewProcessSleepTimeList.Location = new System.Drawing.Point(215, 8);
+ this.viewProcessSleepTimeList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewProcessSleepTimeList.Name = "viewProcessSleepTimeList";
+ this.viewProcessSleepTimeList.Size = new System.Drawing.Size(91, 26);
+ this.viewProcessSleepTimeList.TabIndex = 3;
//
// label2
//
@@ -140,7 +140,7 @@
//
this.panel1.Controls.Add(this.label1);
this.panel1.Controls.Add(this.label2);
- this.panel1.Controls.Add(this.ProcessSleepTimeList);
+ this.panel1.Controls.Add(this.viewProcessSleepTimeList);
this.panel1.Location = new System.Drawing.Point(3, 1);
this.panel1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panel1.Name = "panel1";
@@ -151,7 +151,7 @@
//
this.panel2.Controls.Add(this.label3);
this.panel2.Controls.Add(this.label4);
- this.panel2.Controls.Add(this.AppSleepTimeList);
+ this.panel2.Controls.Add(this.viewAppSleepTimeList);
this.panel2.Location = new System.Drawing.Point(3, 54);
this.panel2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panel2.Name = "panel2";
@@ -177,28 +177,28 @@
this.label4.TabIndex = 4;
this.label4.Text = "毫秒";
//
- // AppSleepTimeList
+ // viewAppSleepTimeList
//
- this.AppSleepTimeList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.AppSleepTimeList.FormattingEnabled = true;
- this.AppSleepTimeList.Items.AddRange(new object[] {
+ this.viewAppSleepTimeList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewAppSleepTimeList.FormattingEnabled = true;
+ this.viewAppSleepTimeList.Items.AddRange(new object[] {
"0",
"500",
"1000",
"1500",
"2000",
"2500"});
- this.AppSleepTimeList.Location = new System.Drawing.Point(215, 8);
- this.AppSleepTimeList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.AppSleepTimeList.Name = "AppSleepTimeList";
- this.AppSleepTimeList.Size = new System.Drawing.Size(91, 26);
- this.AppSleepTimeList.TabIndex = 3;
+ this.viewAppSleepTimeList.Location = new System.Drawing.Point(215, 8);
+ this.viewAppSleepTimeList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewAppSleepTimeList.Name = "viewAppSleepTimeList";
+ this.viewAppSleepTimeList.Size = new System.Drawing.Size(91, 26);
+ this.viewAppSleepTimeList.TabIndex = 3;
//
// panel3
//
this.panel3.Controls.Add(this.label5);
this.panel3.Controls.Add(this.label6);
- this.panel3.Controls.Add(this.ProcessShowOffsetList);
+ this.panel3.Controls.Add(this.viewProcessShowOffsetList);
this.panel3.Location = new System.Drawing.Point(3, 107);
this.panel3.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panel3.Name = "panel3";
@@ -224,28 +224,28 @@
this.label6.TabIndex = 4;
this.label6.Text = "MB";
//
- // ProcessShowOffsetList
+ // viewProcessShowOffsetList
//
- this.ProcessShowOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.ProcessShowOffsetList.FormattingEnabled = true;
- this.ProcessShowOffsetList.Items.AddRange(new object[] {
+ this.viewProcessShowOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewProcessShowOffsetList.FormattingEnabled = true;
+ this.viewProcessShowOffsetList.Items.AddRange(new object[] {
"0",
"5",
"10",
"15",
"20",
"25"});
- this.ProcessShowOffsetList.Location = new System.Drawing.Point(215, 8);
- this.ProcessShowOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.ProcessShowOffsetList.Name = "ProcessShowOffsetList";
- this.ProcessShowOffsetList.Size = new System.Drawing.Size(91, 26);
- this.ProcessShowOffsetList.TabIndex = 3;
+ this.viewProcessShowOffsetList.Location = new System.Drawing.Point(215, 8);
+ this.viewProcessShowOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewProcessShowOffsetList.Name = "viewProcessShowOffsetList";
+ this.viewProcessShowOffsetList.Size = new System.Drawing.Size(91, 26);
+ this.viewProcessShowOffsetList.TabIndex = 3;
//
// panel4
//
this.panel4.Controls.Add(this.label7);
this.panel4.Controls.Add(this.label8);
- this.panel4.Controls.Add(this.AppShowOffsetList);
+ this.panel4.Controls.Add(this.viewAppShowOffsetList);
this.panel4.Location = new System.Drawing.Point(3, 160);
this.panel4.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panel4.Name = "panel4";
@@ -271,28 +271,28 @@
this.label8.TabIndex = 4;
this.label8.Text = "MB";
//
- // AppShowOffsetList
+ // viewAppShowOffsetList
//
- this.AppShowOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.AppShowOffsetList.FormattingEnabled = true;
- this.AppShowOffsetList.Items.AddRange(new object[] {
+ this.viewAppShowOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewAppShowOffsetList.FormattingEnabled = true;
+ this.viewAppShowOffsetList.Items.AddRange(new object[] {
"0",
"5",
"10",
"15",
"20",
"25"});
- this.AppShowOffsetList.Location = new System.Drawing.Point(215, 8);
- this.AppShowOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.AppShowOffsetList.Name = "AppShowOffsetList";
- this.AppShowOffsetList.Size = new System.Drawing.Size(91, 26);
- this.AppShowOffsetList.TabIndex = 3;
+ this.viewAppShowOffsetList.Location = new System.Drawing.Point(215, 8);
+ this.viewAppShowOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewAppShowOffsetList.Name = "viewAppShowOffsetList";
+ this.viewAppShowOffsetList.Size = new System.Drawing.Size(91, 26);
+ this.viewAppShowOffsetList.TabIndex = 3;
//
// panel5
//
this.panel5.Controls.Add(this.label9);
this.panel5.Controls.Add(this.label10);
- this.panel5.Controls.Add(this.ProcessSaveOffsetList);
+ this.panel5.Controls.Add(this.viewProcessSaveOffsetList);
this.panel5.Location = new System.Drawing.Point(3, 212);
this.panel5.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panel5.Name = "panel5";
@@ -318,28 +318,28 @@
this.label10.TabIndex = 4;
this.label10.Text = "MB";
//
- // ProcessSaveOffsetList
+ // viewProcessSaveOffsetList
//
- this.ProcessSaveOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.ProcessSaveOffsetList.FormattingEnabled = true;
- this.ProcessSaveOffsetList.Items.AddRange(new object[] {
+ this.viewProcessSaveOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewProcessSaveOffsetList.FormattingEnabled = true;
+ this.viewProcessSaveOffsetList.Items.AddRange(new object[] {
"0",
"5",
"10",
"15",
"20",
"25"});
- this.ProcessSaveOffsetList.Location = new System.Drawing.Point(215, 8);
- this.ProcessSaveOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.ProcessSaveOffsetList.Name = "ProcessSaveOffsetList";
- this.ProcessSaveOffsetList.Size = new System.Drawing.Size(91, 26);
- this.ProcessSaveOffsetList.TabIndex = 3;
+ this.viewProcessSaveOffsetList.Location = new System.Drawing.Point(215, 8);
+ this.viewProcessSaveOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewProcessSaveOffsetList.Name = "viewProcessSaveOffsetList";
+ this.viewProcessSaveOffsetList.Size = new System.Drawing.Size(91, 26);
+ this.viewProcessSaveOffsetList.TabIndex = 3;
//
// panel6
//
this.panel6.Controls.Add(this.label11);
this.panel6.Controls.Add(this.label12);
- this.panel6.Controls.Add(this.AppSaveOffsetList);
+ this.panel6.Controls.Add(this.viewAppSaveOffsetList);
this.panel6.Location = new System.Drawing.Point(3, 265);
this.panel6.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.panel6.Name = "panel6";
@@ -365,27 +365,27 @@
this.label12.TabIndex = 4;
this.label12.Text = "MB";
//
- // AppSaveOffsetList
+ // viewAppSaveOffsetList
//
- this.AppSaveOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.AppSaveOffsetList.FormattingEnabled = true;
- this.AppSaveOffsetList.Items.AddRange(new object[] {
+ this.viewAppSaveOffsetList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewAppSaveOffsetList.FormattingEnabled = true;
+ this.viewAppSaveOffsetList.Items.AddRange(new object[] {
"0",
"5",
"10",
"15",
"20",
"25"});
- this.AppSaveOffsetList.Location = new System.Drawing.Point(215, 8);
- this.AppSaveOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.AppSaveOffsetList.Name = "AppSaveOffsetList";
- this.AppSaveOffsetList.Size = new System.Drawing.Size(91, 26);
- this.AppSaveOffsetList.TabIndex = 3;
+ this.viewAppSaveOffsetList.Location = new System.Drawing.Point(215, 8);
+ this.viewAppSaveOffsetList.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewAppSaveOffsetList.Name = "viewAppSaveOffsetList";
+ this.viewAppSaveOffsetList.Size = new System.Drawing.Size(91, 26);
+ this.viewAppSaveOffsetList.TabIndex = 3;
//
// panel7
//
- this.panel7.Controls.Add(this.textBoxDBPath);
- this.panel7.Controls.Add(this.setbtnfolder);
+ this.panel7.Controls.Add(this.viewTextBoxDBPath);
+ this.panel7.Controls.Add(this.viewSetBtnfolder);
this.panel7.Controls.Add(this.label13);
this.panel7.Location = new System.Drawing.Point(3, 318);
this.panel7.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
@@ -393,26 +393,26 @@
this.panel7.Size = new System.Drawing.Size(568, 46);
this.panel7.TabIndex = 10;
//
- // textBoxDBPath
+ // viewTextBoxDBPath
//
- this.textBoxDBPath.Location = new System.Drawing.Point(153, 8);
- this.textBoxDBPath.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.textBoxDBPath.Name = "textBoxDBPath";
- this.textBoxDBPath.ReadOnly = true;
- this.textBoxDBPath.Size = new System.Drawing.Size(282, 28);
- this.textBoxDBPath.TabIndex = 5;
- this.textBoxDBPath.TabStop = false;
+ this.viewTextBoxDBPath.Location = new System.Drawing.Point(153, 8);
+ this.viewTextBoxDBPath.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewTextBoxDBPath.Name = "viewTextBoxDBPath";
+ this.viewTextBoxDBPath.ReadOnly = true;
+ this.viewTextBoxDBPath.Size = new System.Drawing.Size(282, 28);
+ this.viewTextBoxDBPath.TabIndex = 5;
+ this.viewTextBoxDBPath.TabStop = false;
//
- // setbtnfolder
+ // viewSetBtnfolder
//
- this.setbtnfolder.Location = new System.Drawing.Point(442, 0);
- this.setbtnfolder.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.setbtnfolder.Name = "setbtnfolder";
- this.setbtnfolder.Size = new System.Drawing.Size(112, 46);
- this.setbtnfolder.TabIndex = 4;
- this.setbtnfolder.Text = "选择文件夹";
- this.setbtnfolder.UseVisualStyleBackColor = true;
- this.setbtnfolder.Click += new System.EventHandler(this.setbtnfolder_Click);
+ this.viewSetBtnfolder.Location = new System.Drawing.Point(451, 6);
+ this.viewSetBtnfolder.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewSetBtnfolder.Name = "viewSetBtnfolder";
+ this.viewSetBtnfolder.Size = new System.Drawing.Size(112, 30);
+ this.viewSetBtnfolder.TabIndex = 4;
+ this.viewSetBtnfolder.Text = "选择文件夹";
+ this.viewSetBtnfolder.UseVisualStyleBackColor = true;
+ this.viewSetBtnfolder.Click += new System.EventHandler(this.SetBtnFolder_Click);
//
// label13
//
@@ -426,7 +426,7 @@
//
// panel8
//
- this.panel8.Controls.Add(this.textBoxDBName);
+ this.panel8.Controls.Add(this.viewTextBoxDBName);
this.panel8.Controls.Add(this.label14);
this.panel8.Location = new System.Drawing.Point(3, 371);
this.panel8.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
@@ -434,14 +434,14 @@
this.panel8.Size = new System.Drawing.Size(568, 46);
this.panel8.TabIndex = 11;
//
- // textBoxDBName
+ // viewTextBoxDBName
//
- this.textBoxDBName.Location = new System.Drawing.Point(153, 8);
- this.textBoxDBName.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.textBoxDBName.Name = "textBoxDBName";
- this.textBoxDBName.Size = new System.Drawing.Size(282, 28);
- this.textBoxDBName.TabIndex = 3;
- this.textBoxDBName.Text = "monitoring";
+ this.viewTextBoxDBName.Location = new System.Drawing.Point(153, 8);
+ this.viewTextBoxDBName.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewTextBoxDBName.Name = "viewTextBoxDBName";
+ this.viewTextBoxDBName.Size = new System.Drawing.Size(282, 28);
+ this.viewTextBoxDBName.TabIndex = 3;
+ this.viewTextBoxDBName.Text = "monitoring";
//
// label14
//
@@ -455,8 +455,8 @@
//
// panel9
//
- this.panel9.Controls.Add(this.radioButtonYes);
- this.panel9.Controls.Add(this.radioButtonNo);
+ this.panel9.Controls.Add(this.viewRadioButtonYes);
+ this.panel9.Controls.Add(this.viewRadioButtonNo);
this.panel9.Controls.Add(this.label15);
this.panel9.Location = new System.Drawing.Point(3, 424);
this.panel9.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
@@ -464,30 +464,30 @@
this.panel9.Size = new System.Drawing.Size(568, 46);
this.panel9.TabIndex = 12;
//
- // radioButtonYes
- //
- this.radioButtonYes.AutoSize = true;
- this.radioButtonYes.Checked = true;
- this.radioButtonYes.Location = new System.Drawing.Point(270, 10);
- this.radioButtonYes.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.radioButtonYes.Name = "radioButtonYes";
- this.radioButtonYes.Size = new System.Drawing.Size(51, 22);
- this.radioButtonYes.TabIndex = 6;
- this.radioButtonYes.TabStop = true;
- this.radioButtonYes.Text = "是";
- this.radioButtonYes.UseVisualStyleBackColor = true;
- //
- // radioButtonNo
- //
- this.radioButtonNo.AutoSize = true;
- this.radioButtonNo.Location = new System.Drawing.Point(215, 10);
- this.radioButtonNo.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
- this.radioButtonNo.Name = "radioButtonNo";
- this.radioButtonNo.Size = new System.Drawing.Size(51, 22);
- this.radioButtonNo.TabIndex = 5;
- this.radioButtonNo.TabStop = true;
- this.radioButtonNo.Text = "否";
- this.radioButtonNo.UseVisualStyleBackColor = true;
+ // viewRadioButtonYes
+ //
+ this.viewRadioButtonYes.AutoSize = true;
+ this.viewRadioButtonYes.Checked = true;
+ this.viewRadioButtonYes.Location = new System.Drawing.Point(270, 10);
+ this.viewRadioButtonYes.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewRadioButtonYes.Name = "viewRadioButtonYes";
+ this.viewRadioButtonYes.Size = new System.Drawing.Size(51, 22);
+ this.viewRadioButtonYes.TabIndex = 6;
+ this.viewRadioButtonYes.TabStop = true;
+ this.viewRadioButtonYes.Text = "是";
+ this.viewRadioButtonYes.UseVisualStyleBackColor = true;
+ //
+ // viewRadioButtonNo
+ //
+ this.viewRadioButtonNo.AutoSize = true;
+ this.viewRadioButtonNo.Location = new System.Drawing.Point(215, 10);
+ this.viewRadioButtonNo.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.viewRadioButtonNo.Name = "viewRadioButtonNo";
+ this.viewRadioButtonNo.Size = new System.Drawing.Size(51, 22);
+ this.viewRadioButtonNo.TabIndex = 5;
+ this.viewRadioButtonNo.TabStop = true;
+ this.viewRadioButtonNo.Text = "否";
+ this.viewRadioButtonNo.UseVisualStyleBackColor = true;
//
// label15
//
@@ -499,7 +499,7 @@
this.label15.TabIndex = 2;
this.label15.Text = "是否存储数据到数据库:";
//
- // MySetting
+ // MySettingForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
@@ -513,17 +513,18 @@
this.Controls.Add(this.panel3);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
- this.Controls.Add(this.SetApply);
- this.Controls.Add(this.SetClose);
+ this.Controls.Add(this.viewApply);
+ this.Controls.Add(this.viewClose);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(598, 586);
this.MinimumSize = new System.Drawing.Size(598, 586);
- this.Name = "MySetting";
+ this.Name = "MySettingForm";
this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "设置";
- this.Load += new System.EventHandler(this.MySetting_Load);
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MySetting_FormClosed);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.panel2.ResumeLayout(false);
@@ -548,43 +549,43 @@
#endregion
- private System.Windows.Forms.Button SetClose;
- private System.Windows.Forms.Button SetApply;
+ private System.Windows.Forms.Button viewClose;
+ private System.Windows.Forms.Button viewApply;
private System.Windows.Forms.Label label1;
- private System.Windows.Forms.ComboBox ProcessSleepTimeList;
+ private System.Windows.Forms.ComboBox viewProcessSleepTimeList;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
- private System.Windows.Forms.ComboBox AppSleepTimeList;
+ private System.Windows.Forms.ComboBox viewAppSleepTimeList;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
- private System.Windows.Forms.ComboBox ProcessShowOffsetList;
+ private System.Windows.Forms.ComboBox viewProcessShowOffsetList;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label8;
- private System.Windows.Forms.ComboBox AppShowOffsetList;
+ private System.Windows.Forms.ComboBox viewAppShowOffsetList;
private System.Windows.Forms.Panel panel5;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label label10;
- private System.Windows.Forms.ComboBox ProcessSaveOffsetList;
+ private System.Windows.Forms.ComboBox viewProcessSaveOffsetList;
private System.Windows.Forms.Panel panel6;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label12;
- private System.Windows.Forms.ComboBox AppSaveOffsetList;
+ private System.Windows.Forms.ComboBox viewAppSaveOffsetList;
private System.Windows.Forms.Panel panel7;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Panel panel8;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;
- private System.Windows.Forms.Button setbtnfolder;
- private System.Windows.Forms.TextBox textBoxDBName;
+ private System.Windows.Forms.Button viewSetBtnfolder;
+ private System.Windows.Forms.TextBox viewTextBoxDBName;
private System.Windows.Forms.Panel panel9;
- private System.Windows.Forms.RadioButton radioButtonYes;
- private System.Windows.Forms.RadioButton radioButtonNo;
+ private System.Windows.Forms.RadioButton viewRadioButtonYes;
+ private System.Windows.Forms.RadioButton viewRadioButtonNo;
private System.Windows.Forms.Label label15;
- private System.Windows.Forms.TextBox textBoxDBPath;
+ private System.Windows.Forms.TextBox viewTextBoxDBPath;
}
}
\ No newline at end of file
diff --git a/ResourceMonitorTools/MySettingForm.cs b/ResourceMonitorTools/MySettingForm.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7ce9c43a60b1b23cded600c99f8d72cb9765b2a5
--- /dev/null
+++ b/ResourceMonitorTools/MySettingForm.cs
@@ -0,0 +1,123 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Model;
+using BLL;
+using ResourceMonitorTools.Properties;
+using System.Diagnostics;
+
+namespace ResourceMonitorTools
+{
+ ///
+ /// 设置界面
+ ///
+ public partial class MySettingForm : Form
+ {
+ ///
+ /// 设置界面构造方法
+ ///
+ public MySettingForm()
+ {
+ InitializeComponent();
+ InitData();
+ }
+
+ ///
+ /// 初始化数据
+ ///
+ private void InitData()
+ {
+ this.viewProcessSleepTimeList.Text = Properties.Settings.Default.ProcessSleepTime.ToString();
+ this.viewAppSleepTimeList.Text = Properties.Settings.Default.AppSleepTime.ToString();
+ this.viewProcessShowOffsetList.Text = Properties.Settings.Default.ProcessShowOffset.ToString();
+ this.viewAppShowOffsetList.Text = Properties.Settings.Default.AppShowOffset.ToString();
+ this.viewProcessSaveOffsetList.Text = Properties.Settings.Default.ProcessSaveOffset.ToString();
+ this.viewAppSaveOffsetList.Text = Properties.Settings.Default.AppSaveOffset.ToString();
+
+ this.viewTextBoxDBPath.Text = Properties.Settings.Default.DatabasePath.ToString();
+ this.viewTextBoxDBName.Text = Properties.Settings.Default.DatabaseName.ToString();
+
+ this.folderBrowserDialog1.SelectedPath = Properties.Settings.Default.DatabasePath.ToString();
+
+ if (Properties.Settings.Default.IsSave)
+ {
+ this.viewRadioButtonYes.Checked = true;
+ }
+ else
+ {
+ this.viewRadioButtonNo.Checked = true;
+ }
+ }
+
+ ///
+ /// 应用按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewSettingApply_Click(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.ProcessSleepTime = int.Parse(this.viewProcessSleepTimeList.Text);
+ Properties.Settings.Default.AppSleepTime = int.Parse(this.viewAppSleepTimeList.Text);
+
+ Properties.Settings.Default.ProcessShowOffset = int.Parse(this.viewProcessShowOffsetList.Text);
+ Properties.Settings.Default.AppShowOffset = int.Parse(this.viewAppShowOffsetList.Text);
+ Properties.Settings.Default.ProcessSaveOffset = int.Parse(this.viewProcessSaveOffsetList.Text);
+ Properties.Settings.Default.AppSaveOffset = int.Parse(this.viewAppSaveOffsetList.Text);
+
+ Properties.Settings.Default.DatabasePath = this.viewTextBoxDBPath.Text;
+ Properties.Settings.Default.DatabaseName = this.viewTextBoxDBName.Text;
+
+ if (this.viewRadioButtonYes.Checked)
+ {
+ Properties.Settings.Default.IsSave = true;
+ }
+ else
+ {
+ Properties.Settings.Default.IsSave = false;
+ }
+
+ Properties.Settings.Default.Save();//使用Save方法保存更改
+ MessageBox.Show("应用成功", "成功", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
+ }
+
+ ///
+ /// 关闭按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewSetClose_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ ///
+ /// 数据库存储路径选择窗口
+ ///
+ ///
+ ///
+ private void SetBtnFolder_Click(object sender, EventArgs e)
+ {
+ if(folderBrowserDialog1.ShowDialog()==DialogResult.OK)
+ {
+ viewTextBoxDBPath.Text = folderBrowserDialog1.SelectedPath;
+ }
+ }
+
+ ///
+ /// 窗口关闭完成后触发事件,不能在此处释放窗口资源,会导致窗口闪烁。
+ ///
+ ///
+ ///
+ private void MySetting_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ //this.Dispose();
+ Debug.WriteLine("窗口关闭完成!");
+ }
+ }
+}
diff --git a/RAMMonitoringTools/MySetting.resx b/ResourceMonitorTools/MySettingForm.resx
similarity index 100%
rename from RAMMonitoringTools/MySetting.resx
rename to ResourceMonitorTools/MySettingForm.resx
diff --git a/RAMMonitoringTools/OpenData.Designer.cs b/ResourceMonitorTools/OpenDataForm.Designer.cs
similarity index 52%
rename from RAMMonitoringTools/OpenData.Designer.cs
rename to ResourceMonitorTools/OpenDataForm.Designer.cs
index 27fa8fcacb5c33fd714f225894a39c37affacb8e..1f45e2434062f7938574ecbdd40639b73aa85da2 100644
--- a/RAMMonitoringTools/OpenData.Designer.cs
+++ b/ResourceMonitorTools/OpenDataForm.Designer.cs
@@ -1,6 +1,6 @@
-namespace RAMMonitoringTools
+namespace ResourceMonitorTools
{
- partial class OpenData
+ partial class OpenDataForm
{
///
/// Required designer variable.
@@ -28,41 +28,37 @@
///
private void InitializeComponent()
{
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OpenData));
- this.TagList1 = new System.Windows.Forms.ComboBox();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OpenDataForm));
+ this.viewTagList1 = new System.Windows.Forms.ComboBox();
this.label1 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
- this.label7 = new System.Windows.Forms.Label();
- this.DataList1 = new System.Windows.Forms.ComboBox();
- this.TableList1 = new System.Windows.Forms.ComboBox();
+ this.viewTableList1 = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label();
this.panel2 = new System.Windows.Forms.Panel();
this.label2 = new System.Windows.Forms.Label();
this.panel3 = new System.Windows.Forms.Panel();
this.label4 = new System.Windows.Forms.Label();
this.panel4 = new System.Windows.Forms.Panel();
- this.label8 = new System.Windows.Forms.Label();
- this.DataList2 = new System.Windows.Forms.ComboBox();
- this.TableList2 = new System.Windows.Forms.ComboBox();
+ this.viewTableList2 = new System.Windows.Forms.ComboBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
- this.TagList2 = new System.Windows.Forms.ComboBox();
- this.OpenFileCancel = new System.Windows.Forms.Button();
- this.OpenFileOK = new System.Windows.Forms.Button();
+ this.viewTagList2 = new System.Windows.Forms.ComboBox();
+ this.viewOpenFileCancelBin = new System.Windows.Forms.Button();
+ this.viewOpenFileOKBtn = new System.Windows.Forms.Button();
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
this.panel3.SuspendLayout();
this.panel4.SuspendLayout();
this.SuspendLayout();
//
- // TagList1
+ // viewTagList1
//
- this.TagList1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.TagList1.FormattingEnabled = true;
- this.TagList1.Location = new System.Drawing.Point(338, 13);
- this.TagList1.Name = "TagList1";
- this.TagList1.Size = new System.Drawing.Size(121, 26);
- this.TagList1.TabIndex = 0;
+ this.viewTagList1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewTagList1.FormattingEnabled = true;
+ this.viewTagList1.Location = new System.Drawing.Point(338, 13);
+ this.viewTagList1.Name = "viewTagList1";
+ this.viewTagList1.Size = new System.Drawing.Size(121, 26);
+ this.viewTagList1.TabIndex = 0;
//
// label1
//
@@ -76,47 +72,24 @@
// panel1
//
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
- this.panel1.Controls.Add(this.label7);
- this.panel1.Controls.Add(this.DataList1);
- this.panel1.Controls.Add(this.TableList1);
+ this.panel1.Controls.Add(this.viewTableList1);
this.panel1.Controls.Add(this.label3);
this.panel1.Controls.Add(this.label1);
- this.panel1.Controls.Add(this.TagList1);
+ this.panel1.Controls.Add(this.viewTagList1);
this.panel1.Location = new System.Drawing.Point(0, 37);
this.panel1.Margin = new System.Windows.Forms.Padding(0);
this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(681, 52);
+ this.panel1.Size = new System.Drawing.Size(486, 52);
this.panel1.TabIndex = 2;
//
- // label7
+ // viewTableList1
//
- this.label7.AutoSize = true;
- this.label7.Location = new System.Drawing.Point(476, 15);
- this.label7.Name = "label7";
- this.label7.Size = new System.Drawing.Size(53, 18);
- this.label7.TabIndex = 5;
- this.label7.Text = "Data:";
- //
- // DataList1
- //
- this.DataList1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.DataList1.FormattingEnabled = true;
- this.DataList1.Items.AddRange(new object[] {
- "PSS",
- "CPU"});
- this.DataList1.Location = new System.Drawing.Point(538, 13);
- this.DataList1.Name = "DataList1";
- this.DataList1.Size = new System.Drawing.Size(121, 26);
- this.DataList1.TabIndex = 4;
- //
- // TableList1
- //
- this.TableList1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.TableList1.FormattingEnabled = true;
- this.TableList1.Location = new System.Drawing.Point(120, 13);
- this.TableList1.Name = "TableList1";
- this.TableList1.Size = new System.Drawing.Size(136, 26);
- this.TableList1.TabIndex = 3;
+ this.viewTableList1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewTableList1.FormattingEnabled = true;
+ this.viewTableList1.Location = new System.Drawing.Point(120, 13);
+ this.viewTableList1.Name = "viewTableList1";
+ this.viewTableList1.Size = new System.Drawing.Size(136, 26);
+ this.viewTableList1.TabIndex = 3;
//
// label3
//
@@ -134,7 +107,7 @@
this.panel2.Location = new System.Drawing.Point(0, 1);
this.panel2.Margin = new System.Windows.Forms.Padding(0);
this.panel2.Name = "panel2";
- this.panel2.Size = new System.Drawing.Size(684, 33);
+ this.panel2.Size = new System.Drawing.Size(486, 33);
this.panel2.TabIndex = 3;
//
// label2
@@ -153,7 +126,7 @@
this.panel3.Location = new System.Drawing.Point(0, 92);
this.panel3.Margin = new System.Windows.Forms.Padding(0);
this.panel3.Name = "panel3";
- this.panel3.Size = new System.Drawing.Size(681, 33);
+ this.panel3.Size = new System.Drawing.Size(486, 33);
this.panel3.TabIndex = 4;
//
// label4
@@ -168,47 +141,24 @@
// panel4
//
this.panel4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
- this.panel4.Controls.Add(this.label8);
- this.panel4.Controls.Add(this.DataList2);
- this.panel4.Controls.Add(this.TableList2);
+ this.panel4.Controls.Add(this.viewTableList2);
this.panel4.Controls.Add(this.label5);
this.panel4.Controls.Add(this.label6);
- this.panel4.Controls.Add(this.TagList2);
+ this.panel4.Controls.Add(this.viewTagList2);
this.panel4.Location = new System.Drawing.Point(0, 128);
this.panel4.Margin = new System.Windows.Forms.Padding(0);
this.panel4.Name = "panel4";
- this.panel4.Size = new System.Drawing.Size(681, 52);
+ this.panel4.Size = new System.Drawing.Size(486, 52);
this.panel4.TabIndex = 4;
//
- // label8
- //
- this.label8.AutoSize = true;
- this.label8.Location = new System.Drawing.Point(478, 15);
- this.label8.Name = "label8";
- this.label8.Size = new System.Drawing.Size(53, 18);
- this.label8.TabIndex = 5;
- this.label8.Text = "Data:";
- //
- // DataList2
- //
- this.DataList2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.DataList2.FormattingEnabled = true;
- this.DataList2.Items.AddRange(new object[] {
- "PSS",
- "CPU"});
- this.DataList2.Location = new System.Drawing.Point(538, 14);
- this.DataList2.Name = "DataList2";
- this.DataList2.Size = new System.Drawing.Size(121, 26);
- this.DataList2.TabIndex = 4;
- //
- // TableList2
+ // viewTableList2
//
- this.TableList2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.TableList2.FormattingEnabled = true;
- this.TableList2.Location = new System.Drawing.Point(120, 14);
- this.TableList2.Name = "TableList2";
- this.TableList2.Size = new System.Drawing.Size(136, 26);
- this.TableList2.TabIndex = 3;
+ this.viewTableList2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewTableList2.FormattingEnabled = true;
+ this.viewTableList2.Location = new System.Drawing.Point(120, 14);
+ this.viewTableList2.Name = "viewTableList2";
+ this.viewTableList2.Size = new System.Drawing.Size(136, 26);
+ this.viewTableList2.TabIndex = 3;
//
// label5
//
@@ -228,54 +178,55 @@
this.label6.TabIndex = 1;
this.label6.Text = "Tag:";
//
- // TagList2
+ // viewTagList2
//
- this.TagList2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.TagList2.FormattingEnabled = true;
- this.TagList2.Location = new System.Drawing.Point(338, 14);
- this.TagList2.Name = "TagList2";
- this.TagList2.Size = new System.Drawing.Size(121, 26);
- this.TagList2.TabIndex = 0;
+ this.viewTagList2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.viewTagList2.FormattingEnabled = true;
+ this.viewTagList2.Location = new System.Drawing.Point(338, 14);
+ this.viewTagList2.Name = "viewTagList2";
+ this.viewTagList2.Size = new System.Drawing.Size(121, 26);
+ this.viewTagList2.TabIndex = 0;
//
- // OpenFileCancel
+ // viewOpenFileCancelBin
//
- this.OpenFileCancel.Location = new System.Drawing.Point(582, 213);
- this.OpenFileCancel.Name = "OpenFileCancel";
- this.OpenFileCancel.Size = new System.Drawing.Size(75, 38);
- this.OpenFileCancel.TabIndex = 5;
- this.OpenFileCancel.Text = "取消";
- this.OpenFileCancel.UseVisualStyleBackColor = true;
- this.OpenFileCancel.Click += new System.EventHandler(this.OpenFileCancel_Click);
+ this.viewOpenFileCancelBin.Location = new System.Drawing.Point(383, 191);
+ this.viewOpenFileCancelBin.Name = "viewOpenFileCancelBin";
+ this.viewOpenFileCancelBin.Size = new System.Drawing.Size(75, 38);
+ this.viewOpenFileCancelBin.TabIndex = 5;
+ this.viewOpenFileCancelBin.Text = "取消";
+ this.viewOpenFileCancelBin.UseVisualStyleBackColor = true;
+ this.viewOpenFileCancelBin.Click += new System.EventHandler(this.ViewOpenFileCancelBtn_Click);
//
- // OpenFileOK
+ // viewOpenFileOKBtn
//
- this.OpenFileOK.Location = new System.Drawing.Point(480, 213);
- this.OpenFileOK.Name = "OpenFileOK";
- this.OpenFileOK.Size = new System.Drawing.Size(75, 38);
- this.OpenFileOK.TabIndex = 6;
- this.OpenFileOK.Text = "确定";
- this.OpenFileOK.UseVisualStyleBackColor = true;
- this.OpenFileOK.Click += new System.EventHandler(this.OpenFileOK_Click);
+ this.viewOpenFileOKBtn.Location = new System.Drawing.Point(281, 191);
+ this.viewOpenFileOKBtn.Name = "viewOpenFileOKBtn";
+ this.viewOpenFileOKBtn.Size = new System.Drawing.Size(75, 38);
+ this.viewOpenFileOKBtn.TabIndex = 6;
+ this.viewOpenFileOKBtn.Text = "确定";
+ this.viewOpenFileOKBtn.UseVisualStyleBackColor = true;
+ this.viewOpenFileOKBtn.Click += new System.EventHandler(this.ViewOpenFileOKBtn_Click);
//
- // OpenData
+ // OpenDataForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(683, 244);
- this.Controls.Add(this.OpenFileOK);
- this.Controls.Add(this.OpenFileCancel);
+ this.ClientSize = new System.Drawing.Size(490, 244);
+ this.Controls.Add(this.viewOpenFileOKBtn);
+ this.Controls.Add(this.viewOpenFileCancelBin);
this.Controls.Add(this.panel4);
this.Controls.Add(this.panel3);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
- this.MaximumSize = new System.Drawing.Size(705, 300);
- this.MinimumSize = new System.Drawing.Size(705, 300);
- this.Name = "OpenData";
+ this.MaximumSize = new System.Drawing.Size(512, 300);
+ this.MinimumSize = new System.Drawing.Size(512, 300);
+ this.Name = "OpenDataForm";
this.ShowInTaskbar = false;
- this.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultBounds;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "打开";
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.OpenData_FormClosed);
this.Load += new System.EventHandler(this.OpenData_Load);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
@@ -291,25 +242,21 @@
#endregion
- private System.Windows.Forms.ComboBox TagList1;
+ private System.Windows.Forms.ComboBox viewTagList1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
- private System.Windows.Forms.ComboBox TableList1;
+ private System.Windows.Forms.ComboBox viewTableList1;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Panel panel4;
- private System.Windows.Forms.ComboBox TableList2;
+ private System.Windows.Forms.ComboBox viewTableList2;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
- private System.Windows.Forms.ComboBox TagList2;
- private System.Windows.Forms.Button OpenFileCancel;
- private System.Windows.Forms.Button OpenFileOK;
- private System.Windows.Forms.Label label7;
- private System.Windows.Forms.ComboBox DataList1;
- private System.Windows.Forms.Label label8;
- private System.Windows.Forms.ComboBox DataList2;
+ private System.Windows.Forms.ComboBox viewTagList2;
+ private System.Windows.Forms.Button viewOpenFileCancelBin;
+ private System.Windows.Forms.Button viewOpenFileOKBtn;
}
}
\ No newline at end of file
diff --git a/RAMMonitoringTools/OpenData.cs b/ResourceMonitorTools/OpenDataForm.cs
similarity index 40%
rename from RAMMonitoringTools/OpenData.cs
rename to ResourceMonitorTools/OpenDataForm.cs
index 6d8a0959dadd4fee7e7f06b6489edf966919d37b..bd646c14a52cdda34ff4ca89ef334de63af4894f 100644
--- a/RAMMonitoringTools/OpenData.cs
+++ b/ResourceMonitorTools/OpenDataForm.cs
@@ -7,18 +7,25 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
-using RAMMonitoringTools.utils;
+using BLL.utils;
+using Model;
+using BLL;
+using System.Diagnostics;
+using System.Threading;
-namespace RAMMonitoringTools
+namespace ResourceMonitorTools
{
- public partial class OpenData : Form
+ ///
+ /// 打开数据界面
+ ///
+ public partial class OpenDataForm : Form
{
///
/// OpenData构造方法
///
///
///
- public OpenData(string[] TableList,string[][] TagList)
+ public OpenDataForm(string[] TableList,string[][] TagList)
{
InitializeComponent();
InitData(TableList,TagList);
@@ -31,20 +38,18 @@ namespace RAMMonitoringTools
///
private void InitData(string[] TableList, string[][] TagList)
{
- Console.WriteLine(TableList.Length + TableList[0]);
- Console.WriteLine(TagList.Length + TagList[0][0]);
+ Debug.WriteLine(TableList.Length + TableList[0]);
+ Debug.WriteLine(TagList.Length + TagList[0][0]);
logger.Info(this.GetType(),TableList.Length + TableList[0]);
logger.Info(this.GetType(), TagList.Length + TagList[0][0]);
- this.TableList1.Items.AddRange(TableList);
- this.TableList2.Items.AddRange(TableList);
- this.TableList1.Text = TableList.ElementAt(0);
- this.TableList2.Text = TableList.ElementAt(0);
- this.TagList1.Items.Add("All");
- this.TagList1.Items.AddRange(TagList[0]);
- this.TagList2.Items.Add("All");
- this.TagList2.Items.AddRange(TagList[0]);
- this.DataList1.Text = "PSS";
- this.DataList2.Text = "PSS";
+ this.viewTableList1.Items.AddRange(TableList);
+ this.viewTableList2.Items.AddRange(TableList);
+ this.viewTableList1.Text = TableList.ElementAt(0);
+ this.viewTableList2.Text = TableList.ElementAt(0);
+ this.viewTagList1.Items.Add("All");
+ this.viewTagList1.Items.AddRange(TagList[0]);
+ this.viewTagList2.Items.Add("All");
+ this.viewTagList2.Items.AddRange(TagList[0]);
}
private void OpenData_Load(object sender, EventArgs e)
@@ -52,34 +57,52 @@ namespace RAMMonitoringTools
}
- private void OpenFileCancel_Click(object sender, EventArgs e)
+ ///
+ /// 取消按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewOpenFileCancelBtn_Click(object sender, EventArgs e)
{
this.Close();
+ DialogResult = DialogResult.Cancel;
}
+ ///
+ /// 返回选择的Tag
+ ///
public string[] ReturnValueTag { get; protected set; } //用这个公开属性传值
- public string[] ReturnValueData { get; protected set; } //用这个公开属性传值
-
- private void OpenFileOK_Click(object sender, EventArgs e)
+ ///
+ /// 确定按钮点击事件
+ ///
+ ///
+ ///
+ private void ViewOpenFileOKBtn_Click(object sender, EventArgs e)
{
- string[] taglist = new string[2];
- string[] datalist = new string[2];
- taglist[0] = this.TagList1.Text;
- taglist[1] = this.TagList2.Text;
- datalist[0] = this.DataList1.Text;
- datalist[1] = this.DataList2.Text;
- if (taglist[0].Length == 0 && taglist[1].Length ==0)
+ string[] tagList = new string[2];
+ tagList[0] = this.viewTagList1.Text;
+ tagList[1] = this.viewTagList2.Text;
+ if (tagList[0].Length == 0 && tagList[1].Length ==0)
{
- taglist = null;
+ tagList = null;
MessageBox.Show("请至少选择一个Tag!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
- ReturnValueTag = taglist; //在窗体关闭之前给返回值赋值
- ReturnValueData = datalist;
+ ReturnValueTag = tagList; //在窗体关闭之前给返回值赋值
DialogResult = DialogResult.OK;
this.Close();
}
+
+ ///
+ /// 窗口关闭完成事件,不能在此释放窗口资源,会导致窗口闪烁。
+ ///
+ ///
+ ///
+ private void OpenData_FormClosed(object sender, FormClosedEventArgs e)
+ {
+ //this.Dispose();
+ }
}
}
diff --git a/RAMMonitoringTools/OpenData.resx b/ResourceMonitorTools/OpenDataForm.resx
similarity index 100%
rename from RAMMonitoringTools/OpenData.resx
rename to ResourceMonitorTools/OpenDataForm.resx
diff --git a/RAMMonitoringTools/Program.cs b/ResourceMonitorTools/Program.cs
similarity index 90%
rename from RAMMonitoringTools/Program.cs
rename to ResourceMonitorTools/Program.cs
index c48e343ee172b0b3f9cc32d2a071076fd7ae24f7..0b592bbbe1f71dc1cf594c75512eae6c58f96240 100644
--- a/RAMMonitoringTools/Program.cs
+++ b/ResourceMonitorTools/Program.cs
@@ -1,22 +1,22 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace RAMMonitoringTools
-{
- static class Program
- {
- ///
- /// 应用程序的主入口点。
- ///
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new MainForm());
- }
- }
-}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ResourceMonitorTools
+{
+ static class Program
+ {
+ ///
+ /// 应用程序的主入口点。
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForm());
+ }
+ }
+}
diff --git a/RAMMonitoringTools/Properties/AssemblyInfo.cs b/ResourceMonitorTools/Properties/AssemblyInfo.cs
similarity index 77%
rename from RAMMonitoringTools/Properties/AssemblyInfo.cs
rename to ResourceMonitorTools/Properties/AssemblyInfo.cs
index 8f46e968c0ed6d084a32195a7e434d5058539de3..e5a410c58da9cd28ddad5fa8a655190e77711d63 100644
--- a/RAMMonitoringTools/Properties/AssemblyInfo.cs
+++ b/ResourceMonitorTools/Properties/AssemblyInfo.cs
@@ -1,38 +1,37 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// 有关程序集的常规信息通过以下
-// 特性集控制。更改这些特性值可修改
-// 与程序集关联的信息。
-[assembly: AssemblyTitle("RAMMonitoringTools")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("RAMMonitoringTools")]
-[assembly: AssemblyCopyright("Copyright © 2018")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// 将 ComVisible 设置为 false 使此程序集中的类型
-// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
-// 则将该类型上的 ComVisible 特性设置为 true。
-[assembly: ComVisible(false)]
-
-// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
-[assembly: Guid("f0f780f0-b64d-4f21-a1c7-ace57bf0dbbb")]
-
-// 程序集的版本信息由下面四个值组成:
-//
-// 主版本
-// 次版本
-// 生成号
-// 修订号
-//
-// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
-// 方法是按如下所示使用“*”:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
-//log4配置
-[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Config/log4net.config", Watch = true)]
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的常规信息通过以下
+// 特性集控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("ResourceMonitorTools")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ResourceMonitorTools")]
+[assembly: AssemblyCopyright("Copyright © 2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 使此程序集中的类型
+// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
+// 则将该类型上的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("f0f780f0-b64d-4f21-a1c7-ace57bf0dbbb")]
+
+// 程序集的版本信息由下面四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.1")]
+[assembly: AssemblyFileVersion("1.1")]
+
diff --git a/RAMMonitoringTools/Properties/Resources.Designer.cs b/ResourceMonitorTools/Properties/Resources.Designer.cs
similarity index 58%
rename from RAMMonitoringTools/Properties/Resources.Designer.cs
rename to ResourceMonitorTools/Properties/Resources.Designer.cs
index ce563ac47c37f2884f62efba98909132640da59c..ebf104036fb45a07d471710e30e254a641cf746d 100644
--- a/RAMMonitoringTools/Properties/Resources.Designer.cs
+++ b/ResourceMonitorTools/Properties/Resources.Designer.cs
@@ -1,71 +1,83 @@
-//------------------------------------------------------------------------------
-//
-// 此代码由工具生成。
-// 运行时版本: 4.0.30319.42000
-//
-// 对此文件的更改可能会导致不正确的行为,并且如果
-// 重新生成代码,这些更改将丢失。
-//
-//------------------------------------------------------------------------------
-
-namespace RAMMonitoringTools.Properties
-{
-
-
- ///
- /// 一个强类型的资源类,用于查找本地化的字符串等。
- ///
- // 此类是由 StronglyTypedResourceBuilder
- // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
- // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
- // (以 /str 作为命令选项),或重新生成 VS 项目。
- [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()
- {
- }
-
- ///
- /// 返回此类使用的、缓存的 ResourceManager 实例。
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager
- {
- get
- {
- if ((resourceMan == null))
- {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RAMMonitoringTools.Properties.Resources", typeof(Resources).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- ///
- /// 为所有资源查找重写当前线程的 CurrentUICulture 属性,
- /// 方法是使用此强类型资源类。
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture
- {
- get
- {
- return resourceCulture;
- }
- set
- {
- resourceCulture = value;
- }
- }
- }
-}
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace ResourceMonitorTools.Properties {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [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() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ResourceMonitorTools.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 使用此强类型资源类,为所有资源查找
+ /// 重写当前线程的 CurrentUICulture 属性。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// 查找 System.Drawing.Bitmap 类型的本地化资源。
+ ///
+ internal static System.Drawing.Bitmap errortupian {
+ get {
+ object obj = ResourceManager.GetObject("errortupian", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 查找 System.Drawing.Bitmap 类型的本地化资源。
+ ///
+ internal static System.Drawing.Bitmap loading {
+ get {
+ object obj = ResourceManager.GetObject("loading", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/RAMMonitoringTools/Properties/Resources.resx b/ResourceMonitorTools/Properties/Resources.resx
similarity index 81%
rename from RAMMonitoringTools/Properties/Resources.resx
rename to ResourceMonitorTools/Properties/Resources.resx
index af7dbebbacef595e3089c01c05671016c21a8304..885a031b360f7f3f6f706b6bca134fda62dbc533 100644
--- a/RAMMonitoringTools/Properties/Resources.resx
+++ b/ResourceMonitorTools/Properties/Resources.resx
@@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
- : System.Serialization.Formatters.Binary.BinaryFormatter
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
@@ -60,6 +60,7 @@
: and then encoded with base64 encoding.
-->
+
@@ -68,9 +69,10 @@
-
+
+
@@ -85,9 +87,10 @@
-
+
+
@@ -109,9 +112,16 @@
2.0
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ..\Resources\errortupian.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\loading.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/RAMMonitoringTools/Properties/Settings.Designer.cs b/ResourceMonitorTools/Properties/Settings.Designer.cs
similarity index 94%
rename from RAMMonitoringTools/Properties/Settings.Designer.cs
rename to ResourceMonitorTools/Properties/Settings.Designer.cs
index 686919a7463342f2b11a8bc64c0781f60c7ee3fa..1fe4d77b1f4a1b63bd4a0e11e5e57c41362b3c31 100644
--- a/RAMMonitoringTools/Properties/Settings.Designer.cs
+++ b/ResourceMonitorTools/Properties/Settings.Designer.cs
@@ -1,134 +1,134 @@
-//------------------------------------------------------------------------------
-//
-// 此代码由工具生成。
-// 运行时版本:4.0.30319.42000
-//
-// 对此文件的更改可能会导致不正确的行为,并且如果
-// 重新生成代码,这些更改将会丢失。
-//
-//------------------------------------------------------------------------------
-
-namespace RAMMonitoringTools.Properties {
-
-
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.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;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("1000")]
- public int ProcessSleepTime {
- get {
- return ((int)(this["ProcessSleepTime"]));
- }
- set {
- this["ProcessSleepTime"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("1000")]
- public int AppSleepTime {
- get {
- return ((int)(this["AppSleepTime"]));
- }
- set {
- this["AppSleepTime"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("monitoring")]
- public string DatabaseName {
- get {
- return ((string)(this["DatabaseName"]));
- }
- set {
- this["DatabaseName"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("")]
- public string DatabasePath {
- get {
- return ((string)(this["DatabasePath"]));
- }
- set {
- this["DatabasePath"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("0")]
- public int ProcessShowOffset {
- get {
- return ((int)(this["ProcessShowOffset"]));
- }
- set {
- this["ProcessShowOffset"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("0")]
- public int AppShowOffset {
- get {
- return ((int)(this["AppShowOffset"]));
- }
- set {
- this["AppShowOffset"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("0")]
- public int ProcessSaveOffset {
- get {
- return ((int)(this["ProcessSaveOffset"]));
- }
- set {
- this["ProcessSaveOffset"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("0")]
- public int AppSaveOffset {
- get {
- return ((int)(this["AppSaveOffset"]));
- }
- set {
- this["AppSaveOffset"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool isSave {
- get {
- return ((bool)(this["isSave"]));
- }
- set {
- this["isSave"] = value;
- }
- }
- }
-}
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace ResourceMonitorTools.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.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;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1000")]
+ public int ProcessSleepTime {
+ get {
+ return ((int)(this["ProcessSleepTime"]));
+ }
+ set {
+ this["ProcessSleepTime"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1000")]
+ public int AppSleepTime {
+ get {
+ return ((int)(this["AppSleepTime"]));
+ }
+ set {
+ this["AppSleepTime"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("monitoring")]
+ public string DatabaseName {
+ get {
+ return ((string)(this["DatabaseName"]));
+ }
+ set {
+ this["DatabaseName"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string DatabasePath {
+ get {
+ return ((string)(this["DatabasePath"]));
+ }
+ set {
+ this["DatabasePath"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int ProcessShowOffset {
+ get {
+ return ((int)(this["ProcessShowOffset"]));
+ }
+ set {
+ this["ProcessShowOffset"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int AppShowOffset {
+ get {
+ return ((int)(this["AppShowOffset"]));
+ }
+ set {
+ this["AppShowOffset"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int ProcessSaveOffset {
+ get {
+ return ((int)(this["ProcessSaveOffset"]));
+ }
+ set {
+ this["ProcessSaveOffset"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int AppSaveOffset {
+ get {
+ return ((int)(this["AppSaveOffset"]));
+ }
+ set {
+ this["AppSaveOffset"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool IsSave {
+ get {
+ return ((bool)(this["IsSave"]));
+ }
+ set {
+ this["IsSave"] = value;
+ }
+ }
+ }
+}
diff --git a/RAMMonitoringTools/Properties/Settings.settings b/ResourceMonitorTools/Properties/Settings.settings
similarity index 89%
rename from RAMMonitoringTools/Properties/Settings.settings
rename to ResourceMonitorTools/Properties/Settings.settings
index bf311f718ab2583727a533384baba0a23698a053..30d6e78b572d18e231251f022a0cbb7562e5219f 100644
--- a/RAMMonitoringTools/Properties/Settings.settings
+++ b/ResourceMonitorTools/Properties/Settings.settings
@@ -1,5 +1,5 @@
-
+
@@ -26,7 +26,7 @@
0
-
+
True
diff --git a/RAMMonitoringTools/RAMMonitoringTools.csproj b/ResourceMonitorTools/ResourceMonitorTools.csproj
similarity index 60%
rename from RAMMonitoringTools/RAMMonitoringTools.csproj
rename to ResourceMonitorTools/ResourceMonitorTools.csproj
index c20882bdc9f5b35717ea188c71d71ad2eb3a6385..9f33d15ec8788c7f9041f76866ca9a0dc6a29ef3 100644
--- a/RAMMonitoringTools/RAMMonitoringTools.csproj
+++ b/ResourceMonitorTools/ResourceMonitorTools.csproj
@@ -7,11 +7,11 @@
{B157E5C3-2082-4F2E-BF8C-A3065DC130AF}
WinExe
Properties
- RAMMonitoringTools
- RAMMonitoringTools
+ ResourceMonitorTools
+ ResourceMonitorTools
v4.5
512
- 9c3a4ebd
+ d0cc7276
false
C:\Users\John\Desktop\
true
@@ -38,6 +38,7 @@
DEBUG;TRACE
prompt
4
+ bin\Debug\ResourceMonitorTools.XML
AnyCPU
@@ -63,39 +64,34 @@
icon.ico
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE
+ bin\Debug\ResourceMonitorTools.XML
+ full
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ prompt
+ MinimumRecommendedRules.ruleset
+ true
+
-
- ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll
- True
-
-
- ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll
- True
-
-
- ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll
-
-
-
- ..\packages\System.Data.SQLite.Core.1.0.109.1\lib\net45\System.Data.SQLite.dll
- True
-
-
- ..\packages\System.Data.SQLite.EF6.1.0.109.0\lib\net45\System.Data.SQLite.EF6.dll
- True
-
-
- ..\packages\System.Data.SQLite.Linq.1.0.109.0\lib\net45\System.Data.SQLite.Linq.dll
- True
-
-
-
@@ -103,63 +99,65 @@
-
+
+ Form
+
+
+ LoadingForm.cs
+
+
Form
MainChooseForm.cs
-
-
-
+
+ Form
+
MainForm.cs
-
+
Form
-
- MySetting.cs
+
+ MySettingForm.cs
+
+
+ Form
-
-
- OpenData.cs
+
+ OpenDataForm.cs
-
-
+
+ True
+ True
+ Resources.resx
+
-
-
-
+
+ LoadingForm.cs
+
MainChooseForm.cs
MainForm.cs
-
- MySetting.cs
+
+ MySettingForm.cs
-
- OpenData.cs
+
+ OpenDataForm.cs
ResXFileCodeGenerator
- Resources.Designer.cs
Designer
+ Resources.Designer.cs
-
- True
- Resources.resx
-
-
- Always
- Designer
-
-
SettingsSingleFileGenerator
Settings.Designer.cs
@@ -169,7 +167,7 @@
Settings.settings
True
-
+
@@ -193,18 +191,29 @@
-
- PreserveNewest
-
+
+
+
+
+ {70b1938f-969a-4f59-8ccd-59fc5eb769c0}
+ BLL
+
+
+ {7a7862f6-70c3-4b4c-b7a0-accc2c0ea311}
+ DAL
+
+
+ {44385e63-c4a7-49c7-99ac-e38c14341f03}
+ Model
+
+
+
-
-
-
- This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
+
+ IF NOT EXIST $(TargetDir)\x64\SQLite.Interop.dll xcopy $(SolutionDir)\DAL\bin\Debug\x64 $(TargetDir)\x64 /S/I/E/Y/F
+IF NOT EXIST $(TargetDir)\x86\SQLite.Interop.dll xcopy $(SolutionDir)\DAL\bin\Debug\x86 $(TargetDir)\x86 /S/I/E/Y/F
+