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[?25h0.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 + BwmSmli6NGnSBxssMAhgM+dOn1gRWnwHT0CAokjzpWDBggMHFPzSqkVhlkW/FyYSPJhq093VrFm3wpMX + wKiJFISWPCuD7lsPOmyUncMADQOGWLKY3RqlaxqHfvkSbJiK8y7ek3r5WkiQL/Czbg3mqV6toNY5ALBj + Q5vtRc2dVj84pDAxN4AAuzw/T/QX1OvoF4INr14+r1OLE7Flz54OjY2aUZ9QsODNwOa7ksITbv8VEI/B + AxOC0TRYv575vF8tXkcHQH22Y8eyyHzi0c/EhgDywNNOcOERRJxQAWxgAiHPqMcee+7RIckQ89FX3333 + ydLFESikkEB3AnxX4EDEwVPeAyks8c2DLEboTC3KYMAGYxZOh6FjXuS4hhg/bPffb+CFV2I8ozHYw5Es + PkiHKMW40AskkKggZR422ICAEx2wYR+GOXYZCxkcpjCXPO4EiZc/7xiHHjpHtsniki5AcsklwVCwzz4Z + oIJKnqjsQ8EUeSAQzoz3ddklEGsYoU8/H8YD3JnteLVBPkt0g0abSK7XjR6Q+GELBRlUwEUOAxxh6hOm + mjpADhWgsk6gHWD/YKihQKhhxBMsNPqoT8RJmk8YaASL6ZGbepIFCKHmcMQPPHBAVgrQQttPWSjoc8QA + XKASCgKyzJojEEDI0scRuXZXJq/twJPgr8G2i2k5kBybARcD/KDdbnJBZcG+FmyAFGkpcMDDEaxqAgYb + tIIbbh+4fkgmOz2xY6IFJoRxRjHtCttNL34EM+8R+nDwglxSwRSPPCijXBNRfgX8xACoULLGtwoDAdm4 + 5YZI4ETsuCMPA+jd0MIvH2R8AySRUFBBvSxkZgFV8uDkjk7tVF31Rl3xxcAGCQRMcCjh1KzMCSKI4MQm + T/TzgG8DUoSmAAwkcE0JaEgCQcbleGLLPlwc/yFyAk8HqJOZBi3Ezkbk9ZVAPzwMUAECsQABRS0inHAC + FFpw8UMK/8ED8UTpBvBAP2V88MEZLUDwix7leJpBDj0C7puAhKuU5ksP5MPBEVzMEMsJjUQ+wvBg5MBP + PhY4+jlEPRP5wjOmf9CNApJUj00wqAzAg5jd5VQ7aIcblwALT+QwQ+XDD/9ILGMMwEECbO9ceKQBJLBE + CdGbjoYofpiTPQr5+NF35IeuvcStHz/gQgicAIT0DU8NFXiCmALgOea5Ix4b6Acj8me6XOgtAwMA4NN0 + NiKLIGh0CdSCA0fwiBHMwHgmYAAJERIpoC2Bg6brRRbWYTzkxUNABBRO+P9Eh8BNqCEWLHyEEtVwhQGo + jYLLK0jPEkQIRpQAf9GrQ9JyoA/OUbBtIzJQmurHgiP0IRZKTKMLuaCPfDBAHu8IYg3Rc8U6fsCDtqjA + EZ4oADCGUYxwSwAHBqAFNKbxEWoIBbnWVsGC+OOCGbRiHa/ogkiA8H3x++NBmmeBfOijD2pIow508AhK + cIEHMeyjQdjhFftRYZIlKIMfQMBG5MExiJr8h8REV0YyPGKUwFwDKva4AUfJ7x3ysEAKwgDLErggC8Nk + ASOjmEsDzZEffZABMIGpiRxgspECeaToqvjKOlLBE7REpQz9WE1HQrIfT9DCNkeJgAr84AUWUOVAapj/ + j21Q4Z//LEEdsgBCaQbgXO2kIdxMwINDALMe9ZDBGjKwyHjEMZzvIBIhwgBQgLogj/e0gDzakVDxuIOX + n2AGRFeqhm5+MzjifMASONrRc1IgByiAHzhLapB2JPMFT7jDSldqSnUK4HOstCEJakoCP1BUmhbFJU93 + aQJ+dAGiMsiqDGaAipDqM1IWeN5S/8kIKgw0gikQKUl5qpWTPoADh9CqDCAKBor2o5hrzegGUvAMRpS1 + rFT4aAX0kUpqspUgeu1HKwYhV4muYwBQfYdA9MoBD/j1sowIBAhwqlOpshWsL/gBY+V6Cwq4b23uUMhJ + BWlZzDLiDzfFpDs8O1W4/3nyFlllRlbVsFnZLmS1KGgtZmF72oMeNiFJNcE0QCGDEDQiBGq4RW/hN1tx + CrKvriVuZI+rFXVV1QYikMAJJCCCC2w2pxRciHdRsIc6XNYDdfCEabfL3cJ5lwchGIITHBAOERjgvJ21 + LgfaAAE+kIARkGgBJ+b7AIvW174BqCooAAEIBziAGWsAcHoF3Is2FMBuLWgDcTmA2gdLcaHTwISFV6yF + 6R70t6LjwAo8QAMI4KEXHohDbKlL25ImNR/JkAOFVwyGHb/4Hxl9AAvCQAIieIAEHvDAHm7KDxOk18T7 + TGYKdEHhLgOiyMVN7T98qswV2CHKaCZBFQbrxqNief+yGOxHNLxMYUo8Vm0OHrNtlYAPNKOZF8NM60jf + LGBh0HkQeaCooNe6ywSQAglRJoKkiRCHfUAWtT2uZnKnMQg638IS9sSnPmPKgkxMetJ2qAIMfWPYw5J5 + y3KItZC/TMsqy3B5yFTmE1ZwaknzAq0ivWh9Cy1rWefBtL4dCCsjzA9F9JoIX3jsN1tdUn4WIQbFlsMg + LDHMu+Y5nG4tdRAmHYRy/zqkt+TuFJUcjWzL4RTBYPM6CwLWfPwAH0Qot76/cEmdUjuXaPpZPq4dA2zL + eg7S9rcU1SXITOhb3/QohT3Tqjy29oqMkyi4xuWghXhLMHnCJlFGdY0PiNMjCPj/eB0KUhnydjZvr9wQ + gsY1Pgcqp3Kt9G4lB5AQBHr4/OdfiCb8Zqhpn1GsCHCYecHBYItuN3i2B3kkBlPwBHz8/OrNiCAf2RnG + nv3MBByYhBBkPvOaw3DeCq3fIFdwdXrgYAVSgN0EQ/RvrJjwZwlARjTGzveCzyCPe0Ttv6WuzB8g4ec4 + SPzbm8HFuQ+wQEOKGwu6AAZXCILvQnCFJSz9vnV6ln7jOwI+FE96H6Si8WMC4mfGQyQT6N0GEpBANkLA + 95prjuIIFQ8ygYaCAfiA9IlfwCoYH7sRlinTm0wXXybFimjAQQhkCIEBJOAKIeQh3otkG89MtNcfpOP3 + iofF/yoK8IUFcOEJHMjHXOoyIOQDBUGjSUERnA+H+sMBDBIIwQzMcckYprsi9DM6T/B9iQcLOIANBTAB + sDAL6aA9/bEZVTE4JkEiFrESQ2EeuqMLk1AJ9md/EmAAe5MDPOBDuVcRaSJ5R5AOsLCCUlAAEHAAMDgB + C1AqHcIdUCM1U6MRG8ESfNEXucMC80cAlTCEHQgHUbBFXcRIXBcRXgc0g5QKhoAHBVAAnAALMAiDqjCD + HNI0JDMVJrMyMQEWf8EBRfAKBHCGQ0iE9XcKtsBDm7M2RHcSnAR2R1AFaQAJVniFVwgDqmAEwzAMIcMC + +JIvR/EvJiAWLDANycANZ9iIQv9IhJVACSH4A4ziGy0HGunSehyQCc2wAHmohwcAA6IIA7OAC3/4BPrA + Fs5CFmUBDiiQDMTwCqYQARHgiI04hLRwfa9DiR9Cd3mRiRRDPlzQDBMAiqM4ilagDuqAC8TAjJ9ADNAI + ja/wCkmQBLRIi7aIhqdgCSCQPUkIICVYQOUxPj/gOAugh8coilawjuu4A+64A8vgCIVQCNVYjdeIjY6Y + i5+iRyjwAnAYjnYXFD+DIvzAO80wCzAQisdoBTDAjlbwjjtgAAVADvVoj/fYiJMwBtz4OujnH5ZYdz/R + M5ICdj/AKleAkAvpkA/5jm5QAAZAj/V4j7UYARoZDPuwNPz/ITu++EdDFH8oQDAV8AYLgAvqqJIQuQNR + UACOUJHWSItmoAnceJP1kn6pt4SQp3wJYgL9UJCsggpv0Ay4gAsOCZFm4JIwaY3k8JRTAAKgsjS54SHG + 9z1hxHrmoZUo8DLZkgEZ8AZX4Ahi4AaAqQES6ZeO4AiasJZsmSzLohuyEyAkcVgH4hV1GTADsyqtsg/r + QAEUAAIgkAZpwJmaiSeioiz2woVP4x1ymVAWWB6j8RcsUC2oMgCrkgO0WZukYirM4ixw8QCnGSJWaXEW + qDVGATDTYhYocJzHaRbOkgJwQTIwITi/OWyHkzUs4y9OcZ1PoS90ETV2kZqEthU8CIYzIkETUYMTEvhm + 4IMRGsERIAEPHDE1VVMSyIeeEOEQDHFYAQEAIfkEBQYA/wAsAwAFAE4ARgAACP8A/wkcSLCgwYNbahij + xkxGrBECnYyIFUsHM2bU7vxLdrCjx48gO75YVIOaDi8oUwI58Q8KECAjYsZ89EjHrZA4c4bcgkgHEAwY + UqaEUuvfS5gyR9CkqUPNrUM6o+LMV/InUKBCMQBRVsvly6RKl+oYq2NQF6loDS5CBATa1atCUbIRYfSr + zKVMydardzNtWmOxoAl2+zaul1hQBFKkOFOs3r31ZGgx4jfnImqDM7/V2sEJAgQ2VAicIzDPv3Br1OQd + C1mGa2ZnK3+sEQtA5sFXOyBQocLSPxDrCKL6l0EghX+U/qlh3dq1azKyOxrDYNv2bQxObGDxO+XfmubO + ZTj/0BKd4Atj0ACoV4/biejyyNeEd+7AQd/yiNKvXw+tg41I8A0UygxqhFdffYP8c0Rl9hijzDn7sYeA + NwEapIkWrh1YHzO3bCIbHY2cECEbNgg0XIUFgXEgMxcY8E824fi1RAN0/DPEflCokAWKHs3ADCBO2GhA + COFAJxUh38wzj0BDPAjFdjyClKAEg9QHCCCnRJXPP0rOU6NAIkQR5Uc/cNHHPwZcqSY1UnXppkDBjBlS + FOE4oCYgcpCXU5JuegmJOXJ+lMIT/5ChphyIypFTGH0qKdA+geKkBZ6JygEKKsOw8BGfbhYTaVSDVIpo + SGE0MI+pStYY56c4kSGqHK6A//RNA7TWqgerOd2ziSCJxuArSD3USms3uEbVhRy+JmvkQc8IS+utxeLE + gxGCJOurEB7NKmwP0ep0RBfW+jqDQS8sEayw5fjRLU4oiCFEuMsW5GwD/wC6Lk7CxCDEvkK4EopBZTjL + 7b04/dAFv/xqUtAz3/TgcLBMEJzTIQjvS0kFBDHSzcMOl2OvxB+1UrEQWRKEDhoc9wAtyB99IkzFZED6 + zwMsNJxyLyyD9MQkQsDRsxC0FGQzxzjn/BEtcCSddKwDcfANGlBDPbDRHfFAyyT/SPCPK0ETlEvUUVMN + Ujb/iJmNDasm8E85ooBdDCRiH3RPFAaAAccpZBekwD+/MP+Bxhn/8BH3QVdPUgkck5Q8kDMKtDCQAkUP + TpDhlVQ+SdcDlfGNp5I4gwYNkhdEAOWVKy7QMyej0c0HH5QT+kDEECB7JbKPS1AYibCuey6vC0QM7bLL + rvARmgqkje66/9G7KcHP3l1BiiDPOuivR9A8AbSAcCJBJUhfxuuxX29GRyRI/0Egob8iu/XCe6R7CfDX + IbPY00Rgv/0ERPAR/PzDL/kr97ufIwRyj4OQoH/xG1wSAmg/kCgCgfBDH9VescAAjm97BkQgFRJRCqMl + IwkgrGAEngeS/lHhhHvI2TQKEcIQjg8n2ijBCWdIhThILAHg0EALQ+gbnCCBETQ84ff/CMYCDRSChS0c + oE4UEUQqMKIMUlgXMojhCDMcEYnksEVUhqENGjLii2WwYQFZxQENLKMAaFTBFXsoFRKc8ItfrEMvbIgr + YOygEGYQTQHIUQiFpQUJJIDjF3vRgjp8IQcLktMuNLCDRjZyfFFQYmXKIMg2SIIEHrBDKuQEDHVYwQqO + 3IEbCpCG8qQCji6QxD+I4AEPkAAf6SBUgHbhyU+CEpSNxII31sEF2RxBCpb8Rwv40Mpi2gEJ5WGBOIAB + A1t+cge4lGSAINALTBazlUQggh3wgYRERoUfy4RBM5vpTGgeg0dH4MIXronNbGYzCPioBhIy8REUgNMa + wFCFOPdJy05buoGEUYqDNdvpziAYdAUr8EE1FspQa0zgoRM4gERhcAB+9tMKYliVnHIghS+w0p3vNGgQ + 6EFSeuAAFiddRTNgAQuJurSiFm0mLnwRLSngwwMgFWlJSYqDnuKglPho6Uthyk91vAEE97JpQQ26U5P6 + dAX/SANLh0pUdVwBqSArxRfsoNOd+vSk2PjHAqb6UlUs4KhUQ0UppBAHfKygpF/FwQJaYAiyTmAWZw1O + 7/4hBbYuwAf48AEsDMFXvDbjDTTdq0EyMD+NsiogACH5BAUGAP8ALAQABQBMAEYAAAj/AP8JHEiwoEGD + i/5FE4YJ0yAHakL8A8RskBxMoISN0nWwo8ePIA/mEyiMmox6MlLKACTQiYOXgGLGvCjsUMibOD8aY6aj + nk+fKp1ICPESpkxAcpLKEUTr35GcUEFuQSRDh1WrP1PWk+iy6FGlSWOIdWUzqlmCxmQ8Wnu1J9CUav5l + k2FUJlg5YvPSKns2Zw0ZI9ayvZo15SAn/y4MWjzIrtK8eYUI6dIXJ6IRmAUPtipjTbh/ef7NwWJJdGhK + p8DcegxZsmRhYip/ZIa5tmarawRasvWPwr4MBtf9mzIlzylXeCO7FgKHsmyDOmrbXhsrnAqCqKJSIiN2 + uWQ4cJo+/x84AggQ6ZhlfR7/TzgZ78zB09r03Jj5+9Jzszfo6nt8+Zs8cdZI/0Bxn3kjxCIQb/sNVMEx + 74EnIRyTiGdWDWzU8o8XB8riYIMFoTKDhJPYINc/p3AR1RYjeCHCPwd2ACJIY0xSCQISZPNPFKeYAdUi + MnjhhTIaFijjjDROYsA/BFRSCRwE9PEPCiG9gIiQXmBwgggveoPkTTo6ScCYBFxxUw1AYIllB1F8GVIO + KJJJpnMfjcOMmlkCoQKDbnr0wz9myEnmGCAZgwEGeCIQiXB9hmSKoASY8tEiOhyKaJYdeNnoTVdEQKan + ERDakaGWHurFnpviZAaoEbRqCirDHP8kQ6mHIpbqTfr8Y0qrvIZ6UA20YsAGFrfmJEavrfpoECLQQFOq + E5EUexMKOSSBbAShFLRILM426+x10uJEjrURJGGuqAPV4K23HRAbbkj8GFGuueYqK9AiwqzbLAJ8vvvR + EabQay456wxA5U76QmOivzeNK3ASxwyECLfrDrsPwyEZUYjAhRAqIDNAAAAAu+5i/NEnhaSssiMD6QCN + yDDbajJIr6iccmz/cDACzDAjMHNINdtMzkAh8wwAAiD8/JEbO+xQSNNuCIRC0TwvrHRHTEdRgArkRC0Q + 1TDbwOjVBi2DRwGG/IPHHEmz0sE5PJ9jNdkEoZC2IzuwnLZAJwz/oYzIyjQiEd0GuWGFFTtYoQ7L//AA + BeEh8aDO4U3vgMtA3dDRiUCdaA45QT8gfvjhYiTdTxl0zDMPHamL8vlAyYw+upkCPXOD6rjT8bpAwMh+ + +DEX/xNGIrjjvvs/vcuuji8EaVO86nq8rs/kMFhR/eUVCMRBNQ08z8TnL0gDw/jVW7GAQbcX30Avn6tC + PvnM1+38PA3U30A5kPPw/vjqBGNQNT2wn/3+QDhg7A8GzRBIrghSBgHWD39k0x8MDvA+CnjEgfUjGwcm + MMEOwuB8HrmBAAPIBF4oTRwHSGEKx2dBjygigA6sQylmxgMV2hCEH0mEA3vQAxqYbIM2VGET/27Sjfrx + kIfdiIOK3rVBWBzAiSpshv9CsocGHPGISXwXC2YRh1lA0YmzMEdOEnFFHqIhFwos1gRWMRBOOBEWQ8wJ + Em5wRTSgQRTO8OGm7EGKCeAAFl/gRBr+4QNYxC8qdOyBHdHgjH+IYg+pEJCbtuEDHFgSFoAsACeakYWz + IKEbi+yBAv4BykQgwU3VsKQq/+gDgYixL3H4Bhq6Eb1/2PEDudgDEp6yn22sAAf0WOUlOYGN8YxSEv/4 + BRo+wMwPlEGX41GCEuhBTWoKsxmvfI4n/nEGJiyzmc1MhDb+kYmzKGEFQQhCNaupSimAKBV1+CY4mVmC + ElBBG3ZQRDVCItjNFayACOlM5zqDiQ9e9KtBuZjnB+rJUHuWgQR2yKciVqBPf64gDETIqEYDOtAvgGCK + MxrAP+qQ0GY2tJ5USGlKGcHSXtCAER6IqQc0mtGAqjMIPuBFNvsUhzrQ86QqXSlLGQGBFthBpjGlKUDT + uQIpXCJccUjESe0Z1KEywg6SgABSZ0rTIKwgDk9lWCD2IFWUVtWqbWjBHpC60S8EYohj81f2xlqHMpyV + pXX4RxvYage3VuFzpeBFIOJAA20kggQkIGoLvtDXOASCF2E93kDG1kL/Jc1NAQEAIfkEBQYA/wAsAwAF + AE0ARgAACP8A/wkcSLCgwYPIinCLNqkhHFdRwDScRCBaBFOvWv3jcbCjx48gOxaJJkyISZNwhBiQAAZO + pZcEYsa82OpTyJs4P3ITFqNnjJMmwQic9BKmzJkETJnSyC+n05DRhMjx2RMonH8s4bg0ejSC1whJTBl5 + StZgtBhy0k71CVSIq2z/Jm09OvOr1yRJyI0tSxYRILVpqf48OQmBBBsTKcqMQMAu3sdi+OY0NgjQX8BU + BZE5RenfHIJTpmj656iLqcaOHycp9MrIMMkf/Vq2DFiOZkqfB647uO8fhX+aHJm6q7qQ8UJiBsA2WEPO + 7OdpBYHJLbCC03VjzBQ/vmOHmxzLB9b/cED+ueVBp8IPvKJ9tfHu3d2o/0e+/nMwKrLMHzjGzWr48H13 + hGQ1XOBEfeUN8k8kwexXkBiFAAgfLlxIpsY/IciA4C0qONiRIwAuk0YBeDjCFzMywKWhDICs8Y8tHnZ0 + RXfH/IOHIaTtldM4csggwwUCheBEOP+YE6NHMxpSgBs7WOHkAk4Z42M9zPwDF1xHfpRDM/8Y4uSX6uS0 + hQz1TOmADC7CmOVH2DjypZMw4IITNfXUWSaVRa7pUT8CGfElDFbAAAOXINVgp50y2KCfniBxgUugggoa + 5oAdscCMDjocGk4kjN7EhTqRRkpoRzU8gimmZf7TYKchGRGqoLP8/0NpQeNQc+qpCLCKUzqghnrAGx7d + iqksuua0QKQHwHBArAcZ88izmD6CwKLFgjSAKskekG0GBiHDzLPgxlJtTrMoq622owpkTxHggrsGp+Pe + dO65UBY0ygjtPhJvThPMe4AqGeTAQTz/1HDLCAiD2+G+Ic3i7wGlEGQMM/giPAKx3DL80TCwHNBxx82g + 8oNAtlqMsBNqatzRNcN4DMvLsNQrEDOxmDxCOEaq7JE1E8D8ssz/yGAyEOLq/NEPPfvsA0E6AOE0EAjb + 8JvRHfngMyxLC8RB0087TfVHPvjAyT+chM10115/3dEqArVRwD+eDITCPx10DYXaB02DDQRxwP/iAh4d + sQEE3h5ZDQsOOPjwxUAcXHBCLSIMUcsJuRJO0AqI40APDvgQxAwQUAwhgjJeEGn5QJvTszkOX0zNAiax + eCG77B1YcvoL1qiuOz1SECSMGrPLHgt1hFezu+q8EBTNLcHLbsPp/6xwPD1VEFREFxg0bzrh26wQxO6d + E8RCK817wcYUhKegRBDss0/P4gapkT0G9GOAACqEe98++8kXxM8d9aOfFzrAvSAQYX8ruMRBWgGEANIv + D3jzHhEmyL44eOQWAYQGBgj4tW1M8IMTrF5HDoEBDZYQGtConNFW4AEQEmFx1umI/FCIQgywYTQ6U0IL + XShCj5CQhjQMB/7/NLYNDxhxh0TYw03WAERoACCFDDPBNcJwxCMSoYcfEcMJaQgADMyAYSysohHjkLOQ + kAGIAEgjG744LjvQQBtitMNTmOjENKbRi/+4h67C0IsWtEASfCCCEePmFCPIwo52PIcyhMKofPwjDIxg + xB4gAYEWkMADfyhLH9iASABAoRHnqAOjSEGCSJpyDy3ggwX5MgMMIPIEjQDAPG6wyhhBkgqmNOU/ILCc + GXghjedoxBD+MY950EEbHlLCM6iAS1zmkg+cAo9kZgDLRjSCmMUsJhPUw4F/PIMRzAxnLmmwnzkMQRlo + aEA217lNRZSFFGFYZglKEE5xMiIQ5tjNfPqQ5oh1+rMBDejBDZD5D2t45BrbeOQzyjDPhtaTmST4w6o8 + RAM6+HMeAM1oA9DQDXQkQhvaCIMdRhoGEpCAod/4wAca6tBw7kGBWQJPOSyaTY1qtAc9QENOe+CMYqAB + DSoN6kpZSk8qlCGTrHLBDYpp05viNKdo+IckRAFUoQ6VpWVwQbyU2lSAPhWnOt3mP6pq1YaWgQaEZFg5 + mNADpz71p2hQwD+oatUP5KIOLlBgb3TmAj3cgAkB/apORfEPBfxUpd9IRB16gdTTucAFdSjHX5nwDYEU + oxx1oAFjoSeQJ4QEBL5ZU0AAACH5BAUGAP8ALAMABQBMAEYAAAj/AP8JHEiwoMGD/1hp0PCK4Q43/xxZ + 0aDOirqLwKRJ44ewo8ePIP8h+8cwSSGThU4aKiBxh5WXVmDEVKdq2LCQOHMWVMgtQpKfP1MWcvQvikuX + MGPCWApD1axh1nRK7ciqZ4SrPoGm3BGF5Q6kSZkyPXCg5pGpaEX2JID1KlCUhcgVwFMILEyxMMjqfZpW + Z5EkBNiyxfoW5Q5KBZa5cUMxptKlB/LqPQBr1oC+H5FxC8x5MOEkZhyNmTKlyT8spn35OtYMFy6xk8nC + gjUh3VnMBfNtidY5cATPZsZYyrmO9SzJsinProy7YBEClSr1DmyKaBZzad/Mmrx8Ng4fzQdG/4/ee5Kj + OeEzaIelvPv3dLhrRIcznvOpOZHCD8zQzEd3WDgE6AN8aXFjAxhwJDjeJJTod1ApCywXYIAr4JPWFq5I + 8A8BCdJHC3r/oOKgQQvgACAOTRgiyT9xoJXgP9l0WAkZWIzoUTMBrtKCQG188YVUkwghhA0SGPDPKafY + CFIzKwi0Aj304EAPfByBxI2QQghiZDZK5rQilFAGsUIzOGFpJhneYNclSF8EASY9QVj4UQpBmimEK3PY + sqZHKQiExJtBBNriR0LEEIOZeUSyz54h4QNnoIGuUIpHcBhqqJBgMJpTKo9CGsSgCFlqqSDDaYoTPpAS + oaodCPUjjKiGNv9oak4rqGorEVIcVEQMcogqyKw6IXGrqnIWFI0cyPYqxwzA4sRPOkEMSwQvBiGSLLKY + NKsTPh7Y6oEHoA50LbJaaJuTsN9+S8QeBekCyLiymgtSJnak+60d1AYgkDCA9JusvDlxa68HgRAESr8I + 3/LPogB/pMjA4A5kzCAI9wtGFg1/xEE1AzPyo0CIUFwxAsFkDNIzHjCSsgd7rPMPC5hUDIgD8ZrcEQkq + M6IzqwJR7MDPP9sMEgkp68wIz//IATTQeQjtEQkk8NECH1APNMjSQVPgNEK9SLJjC5JAMlA4aywdztYI + bSMQDYzQIEkbA4XwTwhqOHBBUWgfRAIVRjP/skfJHMnN5T9G5l3QNs9Qobji2gwECjNOCHSBDIYXpAQj + iyvO7r7MyOBA5zKsAULl/6SgROaK0zBQNLfI4LrrzJDuJOpUBOLyP7rc8boM9dTTNOl7o/4HQYfU43rv + 9YBxu+FllOB8CVSQcElBvCOvgxqkh/H886oXdAvyvetQ89YkbO/88ASh0EX4OrS/xvJOK2F+CeggJEP7 + +Otg+DPzd28QKPlzH9pIkYsPfGB7nuhI/h7xiFiML2PPMKAES1AHj9xCBwzMIPaEFgYJThB9CsxgBoVG + im940IB1UFNHtCDCETYsAf8owwkNmMCPGAGDjxiBDkfwCAiiAQ0npEEw/1DxhI90IYc71KEsAKaNYoii + G0A04A10ooUk7jAWAtHHrAjxjDOs6B+/+AAQp6IGKwKBDRdg1qyegYZudOIM/5AEEz7QC7TIYodAAIIy + /sEGMGyCUUtARw968EM0iAKM/pNKH2KRxzz+QwRs8IIa+tCla/zjG4McJBp6wIQvYkYHeYSCCP6BASB4 + IRZa6EMR9RPITGaykALZBxf6MoZHCkQZXshlLmUBBiM0ZwllQEMDGuBKTephRBdgQx51mUsMyEILh/hE + WsrQg2Fa05VocMHC9LOJNTCTmRgIJxue2YVDJOMeHSGFQMrQDWu6c5iDZMKaThGLb3ohnBiARj4xwLsG + NajhFncI6B1AAYoy3KCd80joO93Zg3J4YnRdGkM4TNlMfO4TGhiFBgA2CgBlnAMACQ1pSBfaACbU0VQz + 6EBF8ZnRjHIUACdoxDlEKtJ3duOYzbpCSi2az5Zq9KWNGAJNR9qAedy0YVegRDjY0FOfvhSmjfjHUOdB + h3L8I4Hwk1coEBCODrDBpS89RyNOIFI6MOGQ/5he3kKRBwQgwAleZSo0TlCLc4iiGHrQZg0rd5tZFqRk + /wDsmgICACH5BAUGAP8ALAMABQBMAEYAAAj/AP8JHEiwoMGDHHbtmsBwAiwfnOLgwLGC4gofK6xZO8ix + o8ePB1ksnHCgJKyTOARKnEivZZCX9FZUywSypk2O4MSpglGy50lYCwq0gYWDXtGW9F6+JBIEX7WbUEHm + hEG1p8+T2P4tmHgUqVIiYMGuUEQzqlmBLMRRXWvV5EkfAoOwRJp0aVgiHojYQXI2KisYVtaybftTSosm + F1escPn1rofHHvb2BckCmJXLgquWnLBgwRteVf5lAfGvShVeUuJ8WRHkLl7Ij0kgKTu5oAlW6i4HDixY + lecmwT6uE8iLVxw7YWE/ZuRhT22DrHRLX6uuWZN/tszuQ73nNWxG4CU///9XxMoO6bqrkx6/T4qd7+DB + k0j1vMiO++itLLCUZTzBUnGQ4EF8BM73xFn2iLOMI/edd546x/jX0R4ExlfGfGexQk4BUTR4nhvX/VOB + hAYBaGEvEPwjyR70QcVKIabggYeHYtjSH4kdBUiFC/9A0IYCdTh3Uz8aJFGICgJF4YgjWWSHo0dxlNFG + CyRQYSUVX9ykQSFcFmIIHgXgEcmTNcXxTxtXXilFTS8WYqSbSZiBxY1kgqRHmlSUkAhI/XCTxJ9vvmJJ + nTftcWUJiJYAUhGANqoJoTelQkKiiZbR0QP/+NloEo5AGlWelCraURERlApoIVh4CtUeoZZQRikccf9T + 6qwRjKEqVKmU0SqP0NFaqim3RsUqoh8UW8dBGvhaa7BQIYFOsdB+c1ASBPg6KLM3aQMttLwKlM801YZL + gBnYRvXNth8cO9A4xBDg7ruaBFeuTWWge8NACWxhyrvvXjtvTdqiS1AN+/JLSxYZ/GsTGsUyjIYLI2Y6 + Cb8EnKKwTYp8gMbGDKv7TwQTV0KAyDOYczFI1eTC8cZ7bvDPJJXEHDMBeZxcEzoro3GvQDDLHHMe69nc + URkbd7Pxzi/7HLPQIJXRzS///MIE0jDDYbXVcwzH9EcKCHTGQKeAcTUcYMyxNUcodN1JA53803WS2bwM + hw0SnN3RDQ30oHc3xQj/BI4N/9SdTd01223QN3onTnUlYBiQDQJCWGx4Qd0krnc5AvUTzSRwCOGKEEKQ + QcHkA4VheQ8NEKQLLaC37soUpAv0DOoN1N5AL/sM1EXrrccuUBm2194DQayIwTvoM/jeTfANMFHQJ7zH + EIMrvjPfA+YF0SL99jHkEbHd6DB/e0H8HMK99GSQTrvtdBwE/fkxPGp3GfMwr0fQBGm/vRxypL/1C0vo + wTzqZztIcKQV0uMf/wYBvgE6sAGi+AcqOEILBSpQC6HYmgM3aMCOiCEGFuQfGIQWwA0OEHseIYMFAcHC + 5J3sGyYcYAc/ggn+sZCFgxhDDv6FDGbEcB56ENER/z5yiBve0AE5nBcybnEONtBhg0y4xE3IYEQWIrFc + yKCGMhrBxX84cIY2AYURHeCANTDrBVtgBgAAcA5lDKERT+zLLaxIxgtIQA2Sg1QNdACNNa7xHLVQhhMm + MwgyOkAGIfgHM2SghTrZAxnCAIIfJ9mIIaSqL30oJDMG+Y9DyoAZ/iNRDdQAjT5Oco3K8MZzZuC4wIVA + BrCE5S1CORlk6IIaXihlKU/pBFvkTkKLjKUM6kFMNdASKkWIBjOAoMtmrhEaCLikhMggzGESsx46yOYs + /9EKaXQEGUXQxSioIQsMmBMDzdwlG2zgJBzNwJPWxGY2dfCIR8RCDczQwh3+MbgKft7hDqC4hSwe4QUv + nNOc6YRGB1TgLzKBIZ7yzGY96zmCilY0FlCAAhAKylGDHhSdpWRDNIOlBWLOk54TfYRFRwAEIAzhH2zY + aEc9ek5osMEJKpAXs7Rw0pSulKVAYIMI/jHTgtb0pki6GBjUgFKKrrSlQPhHLdhQVIN2AAFI+uXFNEGJ + f6xBDSp9qhc6IJCZyuKqNmjo2eQHhjXI4q2xEAgU1OCEcCAgrWo924FE9A+tFQR/ZAoIACH5BAUGAP8A + LAMABQBMAEYAAAj/AP8JHEiwoMGD/0gpWRFmBREidvjQYOShjIdnJMLYqaaEB8KPIEOKFEhqhcOHHlJ6 + aNNiIqOXjKjIpMKIhKJqI3PqLHhtYZAgD4OmpNHiHxGYL2fOLFHG5s6nIHvS+/kzaFBGnFrsQZpUKZUS + YJlCHUtQCb2zU6taTUlC0r8yXL1+DQs2kSKyO0nhQHuWKtC1RHr9g0SicNeldMF+KKEN70glOPbyTQs0 + yJ4vgf78q+LnUpV/mgPR0EZCZuISH1J/QLfniOODpCZEjjw5CD3MVS6ZA7lvcxXRZeiqVv1NG5LXBHfB + mj0b7Yo4n/EGSqR4uOpEyAUqh7WcOY7nl7Lz/5puPTWaDzeQb+fePfKXJpGyE3RRZjia+2jQ4c33b1Uz + 9uytsIp8BwVSh3n4odFNemPt4sM/2AAIy4MEfkTDB/d1c8ZA5XDxFDgHUAjgAubYUqGF3XzQiUAK/FNM + HU8dIGMTBaTBSTML/LPbiSB10yITdPQgJA3/oCBSPuLIGCJB2PAYEhdEKoCGkEJ2E8dI4MCgpIywLOCH + iU6G1EYxVFLJIEgpTHCAlkqqAkKYI+VQR5lUEgmSODDkuaaMvmQBZ043lNlAA0xUMEw/B/WT56J55vhn + TnFMOeigPdh5EJ6MwuDmozrV0UAPkxL6UaZ5vsHpTt2EOuiomarj56k6qf/aQDkHAWMFDFbcCoOpsI5k + ZKqh9hBIQSyok+utVqjzZq85JSKrpf/YI86xucIgBrM58aAIqJPOQytBtlJrxRtgYisSsPOkywRB4BAj + rhXm6nRDuvTOQ1AR6uxArRvx5qRNA/XaO5AGGui7g77X9jsSwPUWM/DBEO9whcIj0RGwKP888E/BEe9w + DMXnBryuQBxHrAnIITGRrsXzjIxCyRBPgfJH+nRDx0B0jPzPK4X07PMUFMyM0AUiNHJCLSIoIxAHjpjh + cyGOWCL0QaycMMQ5AJwjwgkE4RGFKYXMUcDUCMUCwNlnn/MmCstEMTYeAp1M9r1mow0AGwND/U8BlOz/ + 4MjcBOmCgd0AdPAmCxqYksTii5sB+EDRQEO4EwMRQw7ji5sS9OOgSG43AusIlMzljEcQgdyAq0E4NDYQ + ZEQSpsfuSG9zFwEENLifzYbUBMEeewSmhD73KLgXDwDlBZnyu+moT80MAMXjboPwA7XyOwEEOD71CzVg + ED00GKhwUAQEkE8+AXNT8z00yBukPPbwaz9z9xh4jzsGrR9kBPz8a8LFEyBjATPqR0BodMAWFUCIKfiH + PVrMzBgEjGD+ELI/BlbiFCCzXQTrd8CQHAJ7lSBAJUY4BoVtgRle8MIGJwgSEY5whHCYhMKoocIUEtAJ + 5QKJGF5YCTj4UIbYYsE//6DwDwykMIVswIJOugBDH/6whPeAFSL+IQKBKOOI4tPJAGjhRCeCAQElfJQ9 + WEENIHiBiAJhAwYQAJVNTKKLcGAjGBznGjgxAwhmRCJy3ujEf2RDEEIgg5P4Mwod4NGMiBRIDqHyRkEg + IBvZEIIQYiCELmziRNQYwSEPmcIQKBEvw+iDQCQgEEnG4JR3kB9eOFADUOhgBLDcJB4FsjnHWMIANgDk + JE95Sjm4ogsJGws1ZADLYsryH7ag3muu0AVT8rKXcpADJn55iJCAQyDRAAUzdPCIRxTTmECQBZzg8MwY + RPOcgADEIAbhijuMogv/GEU8RyEMUAxim9zsZje/CbDLNfxjWQRC1D+uQAZB8PKc0UxnOh3A0IZewAky + qIdEdUDRfO6zmOI81RjIYE6EKnShDXWADP4hAVlEtB4Vteg+ZREO3sFqo4NA50dDKgMHqEEgJ02pRWPB + xn8oE1aaIIMW5PBRQIRUpDIIwT/WIFGUVjQW/pxDMEAWin+cQgu3MOpRR0rKpqJUDeH4Rx4e9w9KzOAf + WL2FGhwwBAk4YQ1gAINYpfq4OgokAwSp5Z8CAgAh+QQFBgD/ACwEAAUATABGAAAI/wD/CRxIsKBBg9eW + LHn2rEyZEjd+6flG8VsuhyTCHNzIsaNHjkvCPCxB8oNJBf/0fEDDkmWPl93KaPtIs2bHMM+okNxZwmSx + fwpWrmyJ5qXRbjdsKqVJKgwjKlB58vz1r9hQokWN9mjAFd3MpWAHEgrjAapZnTxNJoXA5KpLrVzjNrix + J+zSJR4YPT2LVmouZ//O5MrVrdtbo3Lj9khq9+PYvHr3miWJLhENF//+ePq3efMfzOWYIE4ct1tjj0Qi + Rz5bpo6LzTV59aojmnSDebgTnTaIlxFk1VQY0fBkrrELUVvj4l7OeHc+JR7y/o78erfADMeVL8fNBMlu + vNGjq//eA9v6QF40mGzfziRO4yWQaIQXTyKQH/Mby63HTYdJn7Ck2NECJ/N5YEd5+B2kx23z0AHUPyJ0 + sMlS1xBBwj8QzLfHfQl6RMc8AklywgnnrLEUPUQQwUcLEPxDw4a2dOgRDQ42wgYAOAIAhk1KpEgEPW38 + I4kkMtokwgk54ojBDDRdE4SPPu4RSZE1hXBOkjjK8lE/9AThpY8rXEIlTU9wsQaWAECzY0ekeOlmin/8 + s86YNG0iC5pshHIECwex0KWbXn5Bp1IzYJAkNDpytE0Q9PzJqJiD2rQGotBUCk2eG+HQ6KZBSBGpUn2w + YamlCBxEyqabrsDhpzVpMWqlHRz/pASqjXrKqk19YPAqNJoUxAEOwKbaxK02PTEpNLpWWupA+WwD7LM4 + CEqsTV0kqysGsQ7UjzXQAltKcdPS9EksGJRbLhu9CnSND93iAGm4Hz1xi7nlQkPJQLuwC60Pq8LrERn0 + llvqE/lM4AMsCMOCwwL+1nRIwBiEM1DCFEsRTMMftUIuBl503ME+/3BAccKlYExTLB13jIGWAk0wMiy+ + UGCyR2pwzLEXLHPg8si+zNwRD2qwoUwjyrDB8j8THACL0kr37DNYKCywwAFUH7DAsE8fNE0I/0DhBRQF + YfMPJ6ocMGy/WRMkS8peANHBxaysIjYe/xRgiNNpD2TPNDoA/+F320dPAEMzafyzygHN5G3QI343bmLL + qpRNNQyzKE6QLiM07rfEAgEzCwwHgA6DKpYPJIzmfv8D8j/ifA7D66/jrfgtqAORx0Ao/AM77M3MabkO + I2Tut5aoDDTM7q/jUno0wTcPBOcE4YK8FaEUn/cgzTf/j8y4Hw+DFd9bwXDa9hTxSPYjxGKJQcOA774V + 1OcNCvojhHOxQbjAr78VYmSdzz86eIQAm6eCjbRvf/A7RgV+4DNqCPCBj1iDJayHv/3twApuyIDPogHB + B35EfxfcwQ76NwyTyUAHAXwg9DiSvxCKcAdXwBgrqIFCFD6wgB4ZgAZe+MJCXIEL/gJFPf9qWMMVdsQI + PHzhK2I4LQ6AwgkdIKIO1GCTI+AiiYXIYgz1cSthXKAREArBI1AIFjeIMItZNMMymPgpYchABk64gEBk + UQ8bgCUHbkBjFpdRADOIAYh0KgIm3kjIWIVAYhS0ySZeocco/MMUESDHhKgUjUEQUgb1kAEg/mGA02wC + jffCQwRGGYH+yUgYDnDAJQn5j0hQIAd2OcIVCleAAkSBlKM0hSlPg4wiCAMQqUzlKnfkO+vMgRa4HCUB + CGCKQxjBLroQhhyCSU1WJigTmxBDEpIZgWUucxLNFMMn/sHFg+QuGdEEhRwAwU5gUtMBarhdkfqwTVJ6 + 05uVqMQkaDHHii408xC6OIQpohENWggjBnJIaDvZ+U4t/ON+CeKTQMxgz3sSIJ+VgING4SAEIQgCAWCI + gUgRmlCFLtQBgFDDvT51BTNYdJn53KhGOyqETt5ipCU1aTsHgYA5EKsC/3ApPmMqU5oOQgIGwGlO2ymH + 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// + /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// + /yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBgD/ACwAAAAAVQBRAAAI/wD/CRxIsKDBgwj/+VvIsOHChBAj + Spwo0R87du3evXPnDp7Hjx45amzH7iHFkygrYuwoQF68ADBjyowZL54AAfDekfSXsmdKi+3ctYTJwMKD + BwmSmli6NGnSBxssMAhgM+dOn1gRWnwHT0CAokjzpWDBggMHFPzSqkVhlkW/FyYSPJhq093VrFm3wpMX + wKiJFISWPCuD7lsPOmyUncMADQOGWLKY3RqlaxqHfvkSbJiK8y7ek3r5WkiQL/Czbg3mqV6toNY5ALBj + Q5vtRc2dVj84pDAxN4AAuzw/T/QX1OvoF4INr14+r1OLE7Flz54OjY2aUZ9QsODNwOa7ksITbv8VEI/B + AxOC0TRYv575vF8tXkcHQH22Y8eyyHzi0c/EhgDywNNOcOERRJxQAWxgAiHPqMcee+7RIckQ89FX3333 + ydLFESikkEB3AnxX4EDEwVPeAyks8c2DLEboTC3KYMAGYxZOh6FjXuS4hhg/bPffb+CFV2I8ozHYw5Es + PkiHKMW40AskkKggZR422ICAEx2wYR+GOXYZCxkcpjCXPO4EiZc/7xiHHjpHtsniki5AcsklwVCwzz4Z + oIJKnqjsQ8EUeSAQzoz3ddklEGsYoU8/H8YD3JnteLVBPkt0g0abSK7XjR6Q+GELBRlUwEUOAxxh6hOm + mjpADhWgsk6gHWD/YKihQKhhxBMsNPqoT8RJmk8YaASL6ZGbepIFCKHmcMQPPHBAVgrQQttPWSjoc8QA + XKASCgKyzJojEEDI0scRuXZXJq/twJPgr8G2i2k5kBybARcD/KDdbnJBZcG+FmyAFGkpcMDDEaxqAgYb + tIIbbh+4fkgmOz2xY6IFJoRxRjHtCttNL34EM+8R+nDwglxSwRSPPCijXBNRfgX8xACoULLGtwoDAdm4 + 5YZI4ETsuCMPA+jd0MIvH2R8AySRUFBBvSxkZgFV8uDkjk7tVF31Rl3xxcAGCQRMcCjh1KzMCSKI4MQm + T/TzgG8DUoSmAAwkcE0JaEgCQcbleGLLPlwc/yFyAk8HqJOZBi3Ezkbk9ZVAPzwMUAECsQABRS0inHAC + FFpw8UMK/8ED8UTpBvBAP2V88MEZLUDwix7leJpBDj0C7puAhKuU5ksP5MPBEVzMEMsJjUQ+wvBg5MBP + PhY4+jlEPRP5wjOmf9CNApJUj00wqAzAg5jd5VQ7aIcblwALT+QwQ+XDD/9ILGMMwEECbO9ceKQBJLBE + CdGbjoYofpiTPQr5+NF35IeuvcStHz/gQgicAIT0DU8NFXiCmALgOea5Ix4b6Acj8me6XOgtAwMA4NN0 + NiKLIGh0CdSCA0fwiBHMwHgmYAAJERIpoC2Bg6brRRbWYTzkxUNABBRO+P9Eh8BNqCEWLHyEEtVwhQGo + jYLLK0jPEkQIRpQAf9GrQ9JyoA/OUbBtIzJQmurHgiP0IRZKTKMLuaCPfDBAHu8IYg3Rc8U6fsCDtqjA + EZ4oADCGUYxwSwAHBqAFNKbxEWoIBbnWVsGC+OOCGbRiHa/ogkiA8H3x++NBmmeBfOijD2pIow508AhK + cIEHMeyjQdjhFftRYZIlKIMfQMBG5MExiJr8h8REV0YyPGKUwFwDKva4AUfJ7x3ysEAKwgDLErggC8Nk + ASOjmEsDzZEffZABMIGpiRxgspECeaToqvjKOlLBE7REpQz9WE1HQrIfT9DCNkeJgAr84AUWUOVAapj/ + j21Q4Z//LEEdsgBCaQbgXO2kIdxMwINDALMe9ZDBGjKwyHjEMZzvIBIhwgBQgLogj/e0gDzakVDxuIOX + n2AGRFeqhm5+MzjifMASONrRc1IgByiAHzhLapB2JPMFT7jDSldqSnUK4HOstCEJakoCP1BUmhbFJU93 + aQJ+dAGiMsiqDGaAipDqM1IWeN5S/8kIKgw0gikQKUl5qpWTPoADh9CqDCAKBor2o5hrzegGUvAMRpS1 + rFT4aAX0kUpqspUgeu1HKwYhV4muYwBQfYdA9MoBD/j1sowIBAhwqlOpshWsL/gBY+V6Cwq4b23uUMhJ + BWlZzDLiDzfFpDs8O1W4/3nyFlllRlbVsFnZLmS1KGgtZmF72oMeNiFJNcE0QCGDEDQiBGq4RW/hN1tx + CrKvriVuZI+rFXVV1QYikMAJJCCCC2w2pxRciHdRsIc6XNYDdfCEabfL3cJ5lwchGIITHBAOERjgvJ21 + LgfaAAE+kIARkGgBJ+b7AIvW174BqCooAAEIBziAGWsAcHoF3Is2FMBuLWgDcTmA2gdLcaHTwISFV6yF + 6R70t6LjwAo8QAMI4KEXHohDbKlL25ImNR/JkAOFVwyGHb/4Hxl9AAvCQAIieIAEHvDAHm7KDxOk18T7 + TGYKdEHhLgOiyMVN7T98qswV2CHKaCZBFQbrxqNief+yGOxHNLxMYUo8Vm0OHrNtlYAPNKOZF8NM60jf + LGBh0HkQeaCooNe6ywSQAglRJoKkiRCHfUAWtT2uZnKnMQg638IS9sSnPmPKgkxMetJ2qAIMfWPYw5J5 + y3KItZC/TMsqy3B5yFTmE1ZwaknzAq0ivWh9Cy1rWefBtL4dCCsjzA9F9JoIX3jsN1tdUn4WIQbFlsMg + LDHMu+Y5nG4tdRAmHYRy/zqkt+TuFJUcjWzL4RTBYPM6CwLWfPwAH0Qot76/cEmdUjuXaPpZPq4dA2zL + eg7S9rcU1SXITOhb3/QohT3Tqjy29oqMkyi4xuWghXhLMHnCJlFGdY0PiNMjCPj/eB0KUhnydjZvr9wQ + gsY1Pgcqp3Kt9G4lB5AQBHr4/OdfiCb8Zqhpn1GsCHCYecHBYItuN3i2B3kkBlPwBHz8/OrNiCAf2RnG + nv3MBByYhBBkPvOaw3DeCq3fIFdwdXrgYAVSgN0EQ/RvrJjwZwlARjTGzveCzyCPe0Ttv6WuzB8g4ec4 + SPzbm8HFuQ+wQEOKGwu6AAZXCILvQnCFJSz9vnV6ln7jOwI+FE96H6Si8WMC4mfGQyQT6N0GEpBANkLA + 95prjuIIFQ8ygYaCAfiA9IlfwCoYH7sRlinTm0wXXybFimjAQQhkCIEBJOAKIeQh3otkG89MtNcfpOP3 + iofF/yoK8IUFcOEJHMjHXOoyIOQDBUGjSUERnA+H+sMBDBIIwQzMcckYprsi9DM6T/B9iQcLOIANBTAB + sDAL6aA9/bEZVTE4JkEiFrESQ2EeuqMLk1AJ9md/EmAAe5MDPOBDuVcRaSJ5R5AOsLCCUlAAEHAAMDgB + C1AqHcIdUCM1U6MRG8ESfNEXucMC80cAlTCEHQgHUbBFXcRIXBcRXgc0g5QKhoAHBVAAnAALMAiDqjCD + HNI0JDMVJrMyMQEWf8EBRfAKBHCGQ0iE9XcKtsBDm7M2RHcSnAR2R1AFaQAJVniFVwgDqmAEwzAMIcMC + +JIvR/EvJiAWLDANycANZ9iIQv9IhJVACSH4A4ziGy0HGunSehyQCc2wAHmohwcAA6IIA7OAC3/4BPrA + Fs5CFmUBDiiQDMTwCqYQARHgiI04hLRwfa9DiR9Cd3mRiRRDPlzQDBMAiqM4ilagDuqAC8TAjJ9ADNAI + ja/wCkmQBLRIi7aIhqdgCSCQPUkIICVYQOUxPj/gOAugh8coilawjuu4A+64A8vgCIVQCNVYjdeIjY6Y + i5+iRyjwAnAYjnYXFD+DIvzAO80wCzAQisdoBTDAjlbwjjtgAAVADvVoj/fYiJMwBtz4OujnH5ZYdz/R + M5ICdj/AKleAkAvpkA/5jm5QAAZAj/V4j7UYARoZDPuwNPz/ITu++EdDFH8oQDAV8AYLgAvqqJIQuQNR + UACOUJHWSItmoAnceJP1kn6pt4SQp3wJYgL9UJCsggpv0Ay4gAsOCZFm4JIwaY3k8JRTAAKgsjS54SHG + 9z1hxHrmoZUo8DLZkgEZ8AZX4Ahi4AaAqQES6ZeO4AiasJZsmSzLohuyEyAkcVgH4hV1GTADsyqtsg/r + QAEUAAIgkAZpwJmaiSeioiz2woVP4x1ymVAWWB6j8RcsUC2oMgCrkgO0WZukYirM4ixw8QCnGSJWaXEW + qDVGATDTYhYocJzHaRbOkgJwQTIwITi/OWyHkzUs4y9OcZ1PoS90ETV2kZqEthU8CIYzIkETUYMTEvhm + 4IMRGsERIAEPHDE1VVMSyIeeEOEQDHFYAQEAIfkEBQYA/wAsAwAFAE4ARgAACP8A/wkcSLCgwYNbahij + xkxGrBECnYyIFUsHM2bU7vxLdrCjx48gO75YVIOaDi8oUwI58Q8KECAjYsZ89EjHrZA4c4bcgkgHEAwY + UqaEUuvfS5gyR9CkqUPNrUM6o+LMV/InUKBCMQBRVsvly6RKl+oYq2NQF6loDS5CBATa1atCUbIRYfSr + zKVMydardzNtWmOxoAl2+zaul1hQBFKkOFOs3r31ZGgx4jfnImqDM7/V2sEJAgQ2VAicIzDPv3Br1OQd + C1mGa2ZnK3+sEQtA5sFXOyBQocLSPxDrCKL6l0EghX+U/qlh3dq1azKyOxrDYNv2bQxObGDxO+XfmubO + ZTj/0BKd4Atj0ACoV4/biejyyNeEd+7AQd/yiNKvXw+tg41I8A0UygxqhFdffYP8c0Rl9hijzDn7sYeA + NwEapIkWrh1YHzO3bCIbHY2cECEbNgg0XIUFgXEgMxcY8E824fi1RAN0/DPEflCokAWKHs3ADCBO2GhA + COFAJxUh38wzj0BDPAjFdjyClKAEg9QHCCCnRJXPP0rOU6NAIkQR5Uc/cNHHPwZcqSY1UnXppkDBjBlS + FOE4oCYgcpCXU5JuegmJOXJ+lMIT/5ChphyIypFTGH0qKdA+geKkBZ6JygEKKsOw8BGfbhYTaVSDVIpo + SGE0MI+pStYY56c4kSGqHK6A//RNA7TWqgerOd2ziSCJxuArSD3USms3uEbVhRy+JmvkQc8IS+utxeLE + gxGCJOurEB7NKmwP0ep0RBfW+jqDQS8sEayw5fjRLU4oiCFEuMsW5GwD/wC6Lk7CxCDEvkK4EopBZTjL + 7b04/dAFv/xqUtAz3/TgcLBMEJzTIQjvS0kFBDHSzcMOl2OvxB+1UrEQWRKEDhoc9wAtyB99IkzFZED6 + zwMsNJxyLyyD9MQkQsDRsxC0FGQzxzjn/BEtcCSddKwDcfANGlBDPbDRHfFAyyT/SPCPK0ETlEvUUVMN + Ujb/iJmNDasm8E85ooBdDCRiH3RPFAaAAccpZBekwD+/MP+Bxhn/8BH3QVdPUgkck5Q8kDMKtDCQAkUP + TpDhlVQ+SdcDlfGNp5I4gwYNkhdEAOWVKy7QMyej0c0HH5QT+kDEECB7JbKPS1AYibCuey6vC0QM7bLL + rvARmgqkje66/9G7KcHP3l1BiiDPOuivR9A8AbSAcCJBJUhfxuuxX29GRyRI/0Egob8iu/XCe6R7CfDX + IbPY00Rgv/0ERPAR/PzDL/kr97ufIwRyj4OQoH/xG1wSAmg/kCgCgfBDH9VescAAjm97BkQgFRJRCqMl + IwkgrGAEngeS/lHhhHvI2TQKEcIQjg8n2ijBCWdIhThILAHg0EALQ+gbnCCBETQ84ff/CMYCDRSChS0c + oE4UEUQqMKIMUlgXMojhCDMcEYnksEVUhqENGjLii2WwYQFZxQENLKMAaFTBFXsoFRKc8ItfrEMvbIgr + YOygEGYQTQHIUQiFpQUJJIDjF3vRgjp8IQcLktMuNLCDRjZyfFFQYmXKIMg2SIIEHrBDKuQEDHVYwQqO + 3IEbCpCG8qQCji6QxD+I4AEPkAAf6SBUgHbhyU+CEpSNxII31sEF2RxBCpb8Rwv40Mpi2gEJ5WGBOIAB + A1t+cge4lGSAINALTBazlUQggh3wgYRERoUfy4RBM5vpTGgeg0dH4MIXronNbGYzCPioBhIy8REUgNMa + wFCFOPdJy05buoGEUYqDNdvpziAYdAUr8EE1FspQa0zgoRM4gERhcAB+9tMKYliVnHIghS+w0p3vNGgQ + 6EFSeuAAFiddRTNgAQuJurSiFm0mLnwRLSngwwMgFWlJSYqDnuKglPho6Uthyk91vAEE97JpQQ26U5P6 + dAX/SANLh0pUdVwBqSArxRfsoNOd+vSk2PjHAqb6UlUs4KhUQ0UppBAHfKygpF/FwQJaYAiyTmAWZw1O + 7/4hBbYuwAf48AEsDMFXvDbjDTTdq0EyMD+NsiogACH5BAUGAP8ALAQABQBMAEYAAAj/AP8JHEiwoEGD + i/5FE4YJ0yAHakL8A8RskBxMoISN0nWwo8ePIA/mEyiMmox6MlLKACTQiYOXgGLGvCjsUMibOD8aY6aj + nk+fKp1ICPESpkxAcpLKEUTr35GcUEFuQSRDh1WrP1PWk+iy6FGlSWOIdWUzqlmCxmQ8Wnu1J9CUav5l + k2FUJlg5YvPSKns2Zw0ZI9ayvZo15SAn/y4MWjzIrtK8eYUI6dIXJ6IRmAUPtipjTbh/ef7NwWJJdGhK + p8DcegxZsmRhYip/ZIa5tmarawRasvWPwr4MBtf9mzIlzylXeCO7FgKHsmyDOmrbXhsrnAqCqKJSIiN2 + uWQ4cJo+/x84AggQ6ZhlfR7/TzgZ78zB09r03Jj5+9Jzszfo6nt8+Zs8cdZI/0Bxn3kjxCIQb/sNVMEx + 74EnIRyTiGdWDWzU8o8XB8riYIMFoTKDhJPYINc/p3AR1RYjeCHCPwd2ACJIY0xSCQISZPNPFKeYAdUi + MnjhhTIaFijjjDROYsA/BFRSCRwE9PEPCiG9gIiQXmBwgggveoPkTTo6ScCYBFxxUw1AYIllB1F8GVIO + KJJJpnMfjcOMmlkCoQKDbnr0wz9myEnmGCAZgwEGeCIQiXB9hmSKoASY8tEiOhyKaJYdeNnoTVdEQKan + ERDakaGWHurFnpviZAaoEbRqCirDHP8kQ6mHIpbqTfr8Y0qrvIZ6UA20YsAGFrfmJEavrfpoECLQQFOq + E5EUexMKOSSBbAShFLRILM426+x10uJEjrURJGGuqAPV4K23HRAbbkj8GFGuueYqK9AiwqzbLAJ8vvvR + EabQay456wxA5U76QmOivzeNK3ASxwyECLfrDrsPwyEZUYjAhRAqIDNAAAAAu+5i/NEnhaSssiMD6QCN + yDDbajJIr6iccmz/cDACzDAjMHNINdtMzkAh8wwAAiD8/JEbO+xQSNNuCIRC0TwvrHRHTEdRgArkRC0Q + 1TDbwOjVBi2DRwGG/IPHHEmz0sE5PJ9jNdkEoZC2IzuwnLZAJwz/oYzIyjQiEd0GuWGFFTtYoQ7L//AA + BeEh8aDO4U3vgMtA3dDRiUCdaA45QT8gfvjhYiTdTxl0zDMPHamL8vlAyYw+upkCPXOD6rjT8bpAwMh+ + +DEX/xNGIrjjvvs/vcuuji8EaVO86nq8rs/kMFhR/eUVCMRBNQ08z8TnL0gDw/jVW7GAQbcX30Avn6tC + PvnM1+38PA3U30A5kPPw/vjqBGNQNT2wn/3+QDhg7A8GzRBIrghSBgHWD39k0x8MDvA+CnjEgfUjGwcm + MMEOwuB8HrmBAAPIBF4oTRwHSGEKx2dBjygigA6sQylmxgMV2hCEH0mEA3vQAxqYbIM2VGET/27Sjfrx + kIfdiIOK3rVBWBzAiSpshv9CsocGHPGISXwXC2YRh1lA0YmzMEdOEnFFHqIhFwos1gRWMRBOOBEWQ8wJ + Em5wRTSgQRTO8OGm7EGKCeAAFl/gRBr+4QNYxC8qdOyBHdHgjH+IYg+pEJCbtuEDHFgSFoAsACeakYWz + IKEbi+yBAv4BykQgwU3VsKQq/+gDgYixL3H4Bhq6Eb1/2PEDudgDEp6yn22sAAf0WOUlOYGN8YxSEv/4 + BRo+wMwPlEGX41GCEuhBTWoKsxmvfI4n/nEGJiyzmc1MhDb+kYmzKGEFQQhCNaupSimAKBV1+CY4mVmC + ElBBG3ZQRDVCItjNFayACOlM5zqDiQ9e9KtBuZjnB+rJUHuWgQR2yKciVqBPf64gDETIqEYDOtAvgGCK + MxrAP+qQ0GY2tJ5USGlKGcHSXtCAER6IqQc0mtGAqjMIPuBFNvsUhzrQ86QqXSlLGQGBFthBpjGlKUDT + uQIpXCJccUjESe0Z1KEywg6SgABSZ0rTIKwgDk9lWCD2IFWUVtWqbWjBHpC60S8EYohj81f2xlqHMpyV + pXX4RxvYage3VuFzpeBFIOJAA20kggQkIGoLvtDXOASCF2E93kDG1kL/Jc1NAQEAIfkEBQYA/wAsAwAF + AE0ARgAACP8A/wkcSLCgwYPIinCLNqkhHFdRwDScRCBaBFOvWv3jcbCjx48gOxaJJkyISZNwhBiQAAZO + pZcEYsa82OpTyJs4P3ITFqNnjJMmwQic9BKmzJkETJnSyC+n05DRhMjx2RMonH8s4bg0ejSC1whJTBl5 + StZgtBhy0k71CVSIq2z/Jm09OvOr1yRJyI0tSxYRILVpqf48OQmBBBsTKcqMQMAu3sdi+OY0NgjQX8BU + BZE5RenfHIJTpmj656iLqcaOHycp9MrIMMkf/Vq2DFiOZkqfB647uO8fhX+aHJm6q7qQ8UJiBsA2WEPO + 7OdpBYHJLbCC03VjzBQ/vmOHmxzLB9b/cED+ueVBp8IPvKJ9tfHu3d2o/0e+/nMwKrLMHzjGzWr48H13 + hGQ1XOBEfeUN8k8kwexXkBiFAAgfLlxIpsY/IciA4C0qONiRIwAuk0YBeDjCFzMywKWhDICs8Y8tHnZ0 + RXfH/IOHIaTtldM4csggwwUCheBEOP+YE6NHMxpSgBs7WOHkAk4Z42M9zPwDF1xHfpRDM/8Y4uSX6uS0 + hQz1TOmADC7CmOVH2DjypZMw4IITNfXUWSaVRa7pUT8CGfElDFbAAAOXINVgp50y2KCfniBxgUugggoa + 5oAdscCMDjocGk4kjN7EhTqRRkpoRzU8gimmZf7TYKchGRGqoLP8/0NpQeNQc+qpCLCKUzqghnrAGx7d + iqksuua0QKQHwHBArAcZ88izmD6CwKLFgjSAKskekG0GBiHDzLPgxlJtTrMoq622owpkTxHggrsGp+Pe + dO65UBY0ygjtPhJvThPMe4AqGeTAQTz/1HDLCAiD2+G+Ic3i7wGlEGQMM/giPAKx3DL80TCwHNBxx82g + 8oNAtlqMsBNqatzRNcN4DMvLsNQrEDOxmDxCOEaq7JE1E8D8ssz/yGAyEOLq/NEPPfvsA0E6AOE0EAjb + 8JvRHfngMyxLC8RB0087TfVHPvjAyT+chM10115/3dEqArVRwD+eDITCPx10DYXaB02DDQRxwP/iAh4d + sQEE3h5ZDQsOOPjwxUAcXHBCLSIMUcsJuRJO0AqI40APDvgQxAwQUAwhgjJeEGn5QJvTszkOX0zNAiax + eCG77B1YcvoL1qiuOz1SECSMGrPLHgt1hFezu+q8EBTNLcHLbsPp/6xwPD1VEFREFxg0bzrh26wQxO6d + E8RCK817wcYUhKegRBDss0/P4gapkT0G9GOAACqEe98++8kXxM8d9aOfFzrAvSAQYX8ruMRBWgGEANIv + D3jzHhEmyL44eOQWAYQGBgj4tW1M8IMTrF5HDoEBDZYQGtConNFW4AEQEmFx1umI/FCIQgywYTQ6U0IL + XShCj5CQhjQMB/7/NLYNDxhxh0TYw03WAERoACCFDDPBNcJwxCMSoYcfEcMJaQgADMyAYSysohHjkLOQ + kAGIAEgjG744LjvQQBtitMNTmOjENKbRi/+4h67C0IsWtEASfCCCEePmFCPIwo52PIcyhMKofPwjDIxg + xB4gAYEWkMADfyhLH9iASABAoRHnqAOjSEGCSJpyDy3ggwX5MgMMIPIEjQDAPG6wyhhBkgqmNOU/ILCc + GXghjedoxBD+MY950EEbHlLCM6iAS1zmkg+cAo9kZgDLRjSCmMUsJhPUw4F/PIMRzAxnLmmwnzkMQRlo + aEA217lNRZSFFGFYZglKEE5xMiIQ5tjNfPqQ5oh1+rMBDejBDZD5D2t45BrbeOQzyjDPhtaTmST4w6o8 + RAM6+HMeAM1oA9DQDXQkQhvaCIMdRhoGEpCAod/4wAca6tBw7kGBWQJPOSyaTY1qtAc9QENOe+CMYqAB + DSoN6kpZSk8qlCGTrHLBDYpp05viNKdo+IckRAFUoQ6VpWVwQbyU2lSAPhWnOt3mP6pq1YaWgQaEZFg5 + mNADpz71p2hQwD+oatUP5KIOLlBgb3TmAj3cgAkB/apORfEPBfxUpd9IRB16gdTTucAFdSjHX5nwDYEU + oxx1oAFjoSeQJ4QEBL5ZU0AAACH5BAUGAP8ALAMABQBMAEYAAAj/AP8JHEiwoMGD/1hp0PCK4Q43/xxZ + 0aDOirqLwKRJ44ewo8ePIP8h+8cwSSGThU4aKiBxh5WXVmDEVKdq2LCQOHMWVMgtQpKfP1MWcvQvikuX + MGPCWApD1axh1nRK7ciqZ4SrPoGm3BGF5Q6kSZkyPXCg5pGpaEX2JID1KlCUhcgVwFMILEyxMMjqfZpW + Z5EkBNiyxfoW5Q5KBZa5cUMxptKlB/LqPQBr1oC+H5FxC8x5MOEkZhyNmTKlyT8spn35OtYMFy6xk8nC + gjUh3VnMBfNtidY5cATPZsZYyrmO9SzJsinProy7YBEClSr1DmyKaBZzad/Mmrx8Ng4fzQdG/4/ee5Kj + OeEzaIelvPv3dLhrRIcznvOpOZHCD8zQzEd3WDgE6AN8aXFjAxhwJDjeJJTod1ApCywXYIAr4JPWFq5I + 8A8BCdJHC3r/oOKgQQvgACAOTRgiyT9xoJXgP9l0WAkZWIzoUTMBrtKCQG188YVUkwghhA0SGPDPKafY + CFIzKwi0Aj304EAPfByBxI2QQghiZDZK5rQilFAGsUIzOGFpJhneYNclSF8EASY9QVj4UQpBmimEK3PY + sqZHKQiExJtBBNriR0LEEIOZeUSyz54h4QNnoIGuUIpHcBhqqJBgMJpTKo9CGsSgCFlqqSDDaYoTPpAS + oaodCPUjjKiGNv9oak4rqGorEVIcVEQMcogqyKw6IXGrqnIWFI0cyPYqxwzA4sRPOkEMSwQvBiGSLLKY + NKsTPh7Y6oEHoA50LbJaaJuTsN9+S8QeBekCyLiymgtSJnak+60d1AYgkDCA9JusvDlxa68HgRAESr8I + 3/LPogB/pMjA4A5kzCAI9wtGFg1/xEE1AzPyo0CIUFwxAsFkDNIzHjCSsgd7rPMPC5hUDIgD8ZrcEQkq + M6IzqwJR7MDPP9sMEgkp68wIz//IATTQeQjtEQkk8NECH1APNMjSQVPgNEK9SLJjC5JAMlA4aywdztYI + bSMQDYzQIEkbA4XwTwhqOHBBUWgfRAIVRjP/skfJHMnN5T9G5l3QNs9Qobji2gwECjNOCHSBDIYXpAQj + iyvO7r7MyOBA5zKsAULl/6SgROaK0zBQNLfI4LrrzJDuJOpUBOLyP7rc8boM9dTTNOl7o/4HQYfU43rv + 9YBxu+FllOB8CVSQcElBvCOvgxqkh/H886oXdAvyvetQ89YkbO/88ASh0EX4OrS/xvJOK2F+CeggJEP7 + +Otg+DPzd28QKPlzH9pIkYsPfGB7nuhI/h7xiFiML2PPMKAES1AHj9xCBwzMIPaEFgYJThB9CsxgBoVG + im940IB1UFNHtCDCETYsAf8owwkNmMCPGAGDjxiBDkfwCAiiAQ0npEEw/1DxhI90IYc71KEsAKaNYoii + G0A04A10ooUk7jAWAtHHrAjxjDOs6B+/+AAQp6IGKwKBDRdg1qyegYZudOIM/5AEEz7QC7TIYodAAIIy + /sEGMGyCUUtARw968EM0iAKM/pNKH2KRxzz+QwRs8IIa+tCla/zjG4McJBp6wIQvYkYHeYSCCP6BASB4 + IRZa6EMR9RPITGaykALZBxf6MoZHCkQZXshlLmUBBiM0ZwllQEMDGuBKTephRBdgQx51mUsMyEILh/hE + WsrQg2Fa05VocMHC9LOJNTCTmRgIJxue2YVDJOMeHSGFQMrQDWu6c5iDZMKaThGLb3ohnBiARj4xwLsG + NajhFncI6B1AAYoy3KCd80joO93Zg3J4YnRdGkM4TNlMfO4TGhiFBgA2CgBlnAMACQ1pSBfaACbU0VQz + 6EBF8ZnRjHIUACdoxDlEKtJ3duOYzbpCSi2az5Zq9KWNGAJNR9qAedy0YVegRDjY0FOfvhSmjfjHUOdB + h3L8I4Hwk1coEBCODrDBpS89RyNOIFI6MOGQ/5he3kKRBwQgwAleZSo0TlCLc4iiGHrQZg0rd5tZFqRk + /wDsmgICACH5BAUGAP8ALAMABQBMAEYAAAj/AP8JHEiwoMGDHHbtmsBwAiwfnOLgwLGC4gofK6xZO8ix + o8ePB1ksnHCgJKyTOARKnEivZZCX9FZUywSypk2O4MSpglGy50lYCwq0gYWDXtGW9F6+JBIEX7WbUEHm + hEG1p8+T2P4tmHgUqVIiYMGuUEQzqlmBLMRRXWvV5EkfAoOwRJp0aVgiHojYQXI2KisYVtaybftTSosm + F1escPn1rofHHvb2BckCmJXLgquWnLBgwRteVf5lAfGvShVeUuJ8WRHkLl7Ij0kgKTu5oAlW6i4HDixY + lecmwT6uE8iLVxw7YWE/ZuRhT22DrHRLX6uuWZN/tszuQ73nNWxG4CU///9XxMoO6bqrkx6/T4qd7+DB + k0j1vMiO++itLLCUZTzBUnGQ4EF8BM73xFn2iLOMI/edd546x/jX0R4ExlfGfGexQk4BUTR4nhvX/VOB + hAYBaGEvEPwjyR70QcVKIabggYeHYtjSH4kdBUiFC/9A0IYCdTh3Uz8aJFGICgJF4YgjWWSHo0dxlNFG + CyRQYSUVX9ykQSFcFmIIHgXgEcmTNcXxTxtXXilFTS8WYqSbSZiBxY1kgqRHmlSUkAhI/XCTxJ9vvmJJ + nTftcWUJiJYAUhGANqoJoTelQkKiiZbR0QP/+NloEo5AGlWelCraURERlApoIVh4CtUeoZZQRikccf9T + 6qwRjKEqVKmU0SqP0NFaqim3RsUqoh8UW8dBGvhaa7BQIYFOsdB+c1ASBPg6KLM3aQMttLwKlM801YZL + gBnYRvXNth8cO9A4xBDg7ruaBFeuTWWge8NACWxhyrvvXjtvTdqiS1AN+/JLSxYZ/GsTGsUyjIYLI2Y6 + Cb8EnKKwTYp8gMbGDKv7TwQTV0KAyDOYczFI1eTC8cZ7bvDPJJXEHDMBeZxcEzoro3GvQDDLHHMe69nc + URkbd7Pxzi/7HLPQIJXRzS///MIE0jDDYbXVcwzH9EcKCHTGQKeAcTUcYMyxNUcodN1JA53803WS2bwM + hw0SnN3RDQ30oHc3xQj/BI4N/9SdTd01223QN3onTnUlYBiQDQJCWGx4Qd0krnc5AvUTzSRwCOGKEEKQ + QcHkA4VheQ8NEKQLLaC37soUpAv0DOoN1N5AL/sM1EXrrccuUBm2194DQayIwTvoM/jeTfANMFHQJ7zH + EIMrvjPfA+YF0SL99jHkEbHd6DB/e0H8HMK99GSQTrvtdBwE/fkxPGp3GfMwr0fQBGm/vRxypL/1C0vo + wTzqZztIcKQV0uMf/wYBvgE6sAGi+AcqOEILBSpQC6HYmgM3aMCOiCEGFuQfGIQWwA0OEHseIYMFAcHC + 5J3sGyYcYAc/ggn+sZCFgxhDDv6FDGbEcB56ENER/z5yiBve0AE5nBcybnEONtBhg0y4xE3IYEQWIrFc + yKCGMhrBxX84cIY2AYURHeCANTDrBVtgBgAAcA5lDKERT+zLLaxIxgtIQA2Sg1QNdACNNa7xHLVQhhMm + MwgyOkAGIfgHM2SghTrZAxnCAIIfJ9mIIaSqL30oJDMG+Y9DyoAZ/iNRDdQAjT5Oco3K8MZzZuC4wIVA + BrCE5S1CORlk6IIaXihlKU/pBFvkTkKLjKUM6kFMNdASKkWIBjOAoMtmrhEaCLikhMggzGESsx46yOYs + /9EKaXQEGUXQxSioIQsMmBMDzdwlG2zgJBzNwJPWxGY2dfCIR8RCDczQwh3+MbgKft7hDqC4hSwe4QUv + nNOc6YRGB1TgLzKBIZ7yzGY96zmCilY0FlCAAhAKylGDHhSdpWRDNIOlBWLOk54TfYRFRwAEIAzhH2zY + aEc9ek5osMEJKpAXs7Rw0pSulKVAYIMI/jHTgtb0pki6GBjUgFKKrrSlQPhHLdhQVIN2AAFI+uXFNEGJ + f6xBDSp9qhc6IJCZyuKqNmjo2eQHhjXI4q2xEAgU1OCEcCAgrWo924FE9A+tFQR/ZAoIACH5BAUGAP8A + LAMABQBMAEYAAAj/AP8JHEiwoMGD/0gpWRFmBREidvjQYOShjIdnJMLYqaaEB8KPIEOKFEhqhcOHHlJ6 + aNNiIqOXjKjIpMKIhKJqI3PqLHhtYZAgD4OmpNHiHxGYL2fOLFHG5s6nIHvS+/kzaFBGnFrsQZpUKZUS + YJlCHUtQCb2zU6taTUlC0r8yXL1+DQs2kSKyO0nhQHuWKtC1RHr9g0SicNeldMF+KKEN70glOPbyTQs0 + yJ4vgf78q+LnUpV/mgPR0EZCZuISH1J/QLfniOODpCZEjjw5CD3MVS6ZA7lvcxXRZeiqVv1NG5LXBHfB + mj0b7Yo4n/EGSqR4uOpEyAUqh7WcOY7nl7Lz/5puPTWaDzeQb+fePfKXJpGyE3RRZjia+2jQ4c33b1Uz + 9uytsIp8BwVSh3n4odFNemPt4sM/2AAIy4MEfkTDB/d1c8ZA5XDxFDgHUAjgAubYUqGF3XzQiUAK/FNM + HU8dIGMTBaTBSTML/LPbiSB10yITdPQgJA3/oCBSPuLIGCJB2PAYEhdEKoCGkEJ2E8dI4MCgpIywLOCH + iU6G1EYxVFLJIEgpTHCAlkqqAkKYI+VQR5lUEgmSODDkuaaMvmQBZ043lNlAA0xUMEw/B/WT56J55vhn + TnFMOeigPdh5EJ6MwuDmozrV0UAPkxL6UaZ5vsHpTt2EOuiomarj56k6qf/aQDkHAWMFDFbcCoOpsI5k + ZKqh9hBIQSyok+utVqjzZq85JSKrpf/YI86xucIgBrM58aAIqJPOQytBtlJrxRtgYisSsPOkywRB4BAj + rhXm6nRDuvTOQ1AR6uxArRvx5qRNA/XaO5AGGui7g77X9jsSwPUWM/DBEO9whcIj0RGwKP888E/BEe9w + DMXnBryuQBxHrAnIITGRrsXzjIxCyRBPgfJH+nRDx0B0jPzPK4X07PMUFMyM0AUiNHJCLSIoIxAHjpjh + cyGOWCL0QaycMMQ5AJwjwgkE4RGFKYXMUcDUCMUCwNlnn/MmCstEMTYeAp1M9r1mow0AGwND/U8BlOz/ + 4MjcBOmCgd0AdPAmCxqYksTii5sB+EDRQEO4EwMRQw7ji5sS9OOgSG43AusIlMzljEcQgdyAq0E4NDYQ + ZEQSpsfuSG9zFwEENLifzYbUBMEeewSmhD73KLgXDwDlBZnyu+moT80MAMXjboPwA7XyOwEEOD71CzVg + ED00GKhwUAQEkE8+AXNT8z00yBukPPbwaz9z9xh4jzsGrR9kBPz8a8LFEyBjATPqR0BodMAWFUCIKfiH + PVrMzBgEjGD+ELI/BlbiFCCzXQTrd8CQHAJ7lSBAJUY4BoVtgRle8MIGJwgSEY5whHCYhMKoocIUEtAJ + 5QKJGF5YCTj4UIbYYsE//6DwDwykMIVswIJOugBDH/6whPeAFSL+IQKBKOOI4tPJAGjhRCeCAQElfJQ9 + WEENIHiBiAJhAwYQAJVNTKKLcGAjGBznGjgxAwhmRCJy3ujEf2RDEEIgg5P4Mwod4NGMiBRIDqHyRkEg + IBvZEIIQYiCELmziRNQYwSEPmcIQKBEvw+iDQCQgEEnG4JR3kB9eOFADUOhgBLDcJB4FsjnHWMIANgDk + JE95Sjm4ogsJGws1ZADLYsryH7ag3muu0AVT8rKXcpADJn55iJCAQyDRAAUzdPCIRxTTmECQBZzg8MwY + RPOcgADEIAbhijuMogv/GEU8RyEMUAxim9zsZje/CbDLNfxjWQRC1D+uQAZB8PKc0UxnOh3A0IZewAky + qIdEdUDRfO6zmOI81RjIYE6EKnShDXWADP4hAVlEtB4Vteg+ZREO3sFqo4NA50dDKgMHqEEgJ02pRWPB + xn8oE1aaIIMW5PBRQIRUpDIIwT/WIFGUVjQW/pxDMEAWin+cQgu3MOpRR0rKpqJUDeH4Rx4e9w9KzOAf + WL2FGhwwBAk4YQ1gAINYpfq4OgokAwSp5Z8CAgAh+QQFBgD/ACwEAAUATABGAAAI/wD/CRxIsKBBg9eW + LHn2rEyZEjd+6flG8VsuhyTCHNzIsaNHjkvCPCxB8oNJBf/0fEDDkmWPl93KaPtIs2bHMM+okNxZwmSx + fwpWrmyJ5qXRbjdsKqVJKgwjKlB58vz1r9hQokWN9mjAFd3MpWAHEgrjAapZnTxNJoXA5KpLrVzjNrix + J+zSJR4YPT2LVmouZ//O5MrVrdtbo3Lj9khq9+PYvHr3miWJLhENF//+ePq3efMfzOWYIE4ct1tjj0Qi + Rz5bpo6LzTV59aojmnSDebgTnTaIlxFk1VQY0fBkrrELUVvj4l7OeHc+JR7y/o78erfADMeVL8fNBMlu + vNGjq//eA9v6QF40mGzfziRO4yWQaIQXTyKQH/Mby63HTYdJn7Ck2NECJ/N5YEd5+B2kx23z0AHUPyJ0 + sMlS1xBBwj8QzLfHfQl6RMc8AklywgnnrLEUPUQQwUcLEPxDw4a2dOgRDQ42wgYAOAIAhk1KpEgEPW38 + I4kkMtokwgk54ojBDDRdE4SPPu4RSZE1hXBOkjjK8lE/9AThpY8rXEIlTU9wsQaWAECzY0ekeOlmin/8 + s86YNG0iC5pshHIECwex0KWbXn5Bp1IzYJAkNDpytE0Q9PzJqJiD2rQGotBUCk2eG+HQ6KZBSBGpUn2w + YamlCBxEyqabrsDhpzVpMWqlHRz/pASqjXrKqk19YPAqNJoUxAEOwKbaxK02PTEpNLpWWupA+WwD7LM4 + CEqsTV0kqysGsQ7UjzXQAltKcdPS9EksGJRbLhu9CnSND93iAGm4Hz1xi7nlQkPJQLuwC60Pq8LrERn0 + llvqE/lM4AMsCMOCwwL+1nRIwBiEM1DCFEsRTMMftUIuBl503ME+/3BAccKlYExTLB13jIGWAk0wMiy+ + UGCyR2pwzLEXLHPg8si+zNwRD2qwoUwjyrDB8j8THACL0kr37DNYKCywwAFUH7DAsE8fNE0I/0DhBRQF + YfMPJ6ocMGy/WRMkS8peANHBxaysIjYe/xRgiNNpD2TPNDoA/+F320dPAEMzafyzygHN5G3QI343bmLL + qpRNNQyzKE6QLiM07rfEAgEzCwwHgA6DKpYPJIzmfv8D8j/ifA7D66/jrfgtqAORx0Ao/AM77M3MabkO + I2Tut5aoDDTM7q/jUno0wTcPBOcE4YK8FaEUn/cgzTf/j8y4Hw+DFd9bwXDa9hTxSPYjxGKJQcOA774V + 1OcNCvojhHOxQbjAr78VYmSdzz86eIQAm6eCjbRvf/A7RgV+4DNqCPCBj1iDJayHv/3twApuyIDPogHB + B35EfxfcwQ76NwyTyUAHAXwg9DiSvxCKcAdXwBgrqIFCFD6wgB4ZgAZe+MJCXIEL/gJFPf9qWMMVdsQI + PHzhK2I4LQ6AwgkdIKIO1GCTI+AiiYXIYgz1cSthXKAREArBI1AIFjeIMItZNMMymPgpYchABk64gEBk + UQ8bgCUHbkBjFpdRADOIAYh0KgIm3kjIWIVAYhS0ySZeocco/MMUESDHhKgUjUEQUgb1kAEg/mGA02wC + jffCQwRGGYH+yUgYDnDAJQn5j0hQIAd2OcIVCleAAkSBlKM0hSlPg4wiCAMQqUzlKnfkO+vMgRa4HCUB + CGCKQxjBLroQhhyCSU1WJigTmxBDEpIZgWUucxLNFMMn/sHFg+QuGdEEhRwAwU5gUtMBarhdkfqwTVJ6 + 05uVqMQkaDHHii408xC6OIQpohENWggjBnJIaDvZ+U4t/ON+CeKTQMxgz3sSIJ+VgING4SAEIQgCAWCI + gUgRmlCFLtQBgFDDvT51BTNYdJn53KhGOyqETt5ipCU1aTsHgYA5EKsC/3ApPmMqU5oOQgIGwGlO2ymH + f/h0dT89hhlocVGibpSmQviHBLQg0pzKYRBaoIQlQKBBk41hBl2ghUw52lGHJnWkg3AFGCjhU8uFYgyU + OEUXXMFXOHQSDFo4xSnuZYn1lY4gUP0HCG4VEAA7 + + + + 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 +