diff --git a/.github/issue_template.md b/.github/issue_template.md index b538ab52..79efbbc9 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,4 +1,4 @@ -在提出问题前请先自行排除服务器端问题,同时也请通过搜索确认是否有人提出过相同问题。 +在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。 ### 预期行为 描述你认为应该发生什么 @@ -19,7 +19,7 @@ ``` -### 环境信息 +### 环境信息(客户端请升级至最新正式版) ### 额外信息(可选) diff --git a/.gitignore b/.gitignore index b416e378..afeea2ed 100644 --- a/.gitignore +++ b/.gitignore @@ -5,11 +5,14 @@ /v2rayN/.vs/ /v2rayN/v2rayN/bin/Debug/app.publish /v2rayN/v2rayN/bin/Debug -/v2rayN/v2rayN/obj/Debug -/v2rayN/.vs/v2rayN/DesignTimeBuild /v2rayN/v2rayN/bin/Release -/v2rayN/v2rayN/obj/Release +/v2rayN/v2rayN/obj/ +/v2rayN/.vs/v2rayN/DesignTimeBuild /v2rayN/packages .vs/ProjectSettings.json .vs/slnx.sqlite .vs/VSWorkspaceState.json +/v2rayN/v2rayUpgrade/bin/Debug +/v2rayN/v2rayUpgrade/obj/Debug +/v2rayN/v2rayUpgrade/bin/Release +/v2rayN/v2rayUpgrade/obj/Release \ No newline at end of file diff --git a/README.md b/README.md index bb10c507..c1197a8b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # v2rayN ### How to use -- Download exe from release download -- Also need to download v2ray core in the same folder +- If you are newbie please download v2rayN-Core.zip from releases +- Otherwise please download v2rayN.zip (Also need to download v2ray core in the same folder) - Run v2rayN.exe ### Requirements - Microsoft [.NET Framework 4.6](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) or higher -- Project V core [https://github.com/v2ray/v2ray-core/releases](https://github.com/v2ray/v2ray-core/releases) +- Project V core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases) diff --git a/v2rayN/v2rayN.sln b/v2rayN/v2rayN.sln index 02f175e5..64cf71f4 100644 --- a/v2rayN/v2rayN.sln +++ b/v2rayN/v2rayN.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 15.0.28010.2050 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayUpgrade", "v2rayUpgrade\v2rayUpgrade.csproj", "{F82BE52A-155C-492C-9E0A-1E917EC62C78}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -20,11 +22,20 @@ Global {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.Build.0 = Release|Any CPU {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|x86.ActiveCfg = Release|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|x86.ActiveCfg = Debug|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|x86.Build.0 = Debug|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|Any CPU.Build.0 = Release|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|x86.ActiveCfg = Release|Any CPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution + RESX_SortFileContentOnSave = True SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E} EndGlobalSection EndGlobal diff --git a/v2rayN/v2rayN/Base/HttpWebServer.cs b/v2rayN/v2rayN/Base/HttpWebServer.cs index bbf26c53..9fa72495 100644 --- a/v2rayN/v2rayN/Base/HttpWebServer.cs +++ b/v2rayN/v2rayN/Base/HttpWebServer.cs @@ -57,7 +57,7 @@ namespace v2rayN.Base { ThreadPool.QueueUserWorkItem((c) => { - var ctx = c as HttpListenerContext; + HttpListenerContext ctx = c as HttpListenerContext; try { string address = ctx.Request.LocalEndPoint.Address.ToString(); diff --git a/v2rayN/v2rayN/Base/HttpWebServerB.cs b/v2rayN/v2rayN/Base/HttpWebServerB.cs index a440efec..fcbca1dd 100644 --- a/v2rayN/v2rayN/Base/HttpWebServerB.cs +++ b/v2rayN/v2rayN/Base/HttpWebServerB.cs @@ -17,8 +17,10 @@ namespace v2rayN.Base this.port = port; this._responderMethod = method; - Thread thread = new Thread(StartListen); - thread.IsBackground = true; + Thread thread = new Thread(StartListen) + { + IsBackground = true + }; thread.Start(); } @@ -33,42 +35,51 @@ namespace v2rayN.Base private void StartListen() { - listener = new TcpListener(IPAddress.Any, port); - listener.Start(); - Utils.SaveLog("WebserverB running..."); - - while (true) + try { - if (!listener.Pending()) - { - Thread.Sleep(100); - continue; - } + listener = new TcpListener(IPAddress.Any, port); + listener.Start(); + Utils.SaveLog("WebserverB running..."); - TcpClient socket = listener.AcceptTcpClient(); - Thread thread = new Thread(new ParameterizedThreadStart(ProcessThread)); - thread.IsBackground = true; - thread.Start(socket); - Thread.Sleep(1); + while (true) + { + if (!listener.Pending()) + { + Thread.Sleep(100); + continue; + } + + TcpClient socket = listener.AcceptTcpClient(); + Thread thread = new Thread(new ParameterizedThreadStart(ProcessThread)) + { + IsBackground = true + }; + thread.Start(socket); + Thread.Sleep(1); + } + } + catch + { + Utils.SaveLog("WebserverB start fail."); } } private void ProcessThread(object obj) { try { - var socket = obj as TcpClient; + TcpClient socket = obj as TcpClient; - var inputStream = new BufferedStream(socket.GetStream()); - var outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); + BufferedStream inputStream = new BufferedStream(socket.GetStream()); + StreamWriter outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); if (inputStream.CanRead) { - var data = ReadStream(inputStream); + string data = ReadStream(inputStream); if (data.Contains("/pac/")) { if (_responderMethod != null) { - var address = ((IPEndPoint)socket.Client.LocalEndPoint).Address.ToString(); + string address = ((IPEndPoint)socket.Client.LocalEndPoint).Address.ToString(); Utils.SaveLog("WebserverB Request " + address); string pac = _responderMethod(address); @@ -118,7 +129,7 @@ namespace v2rayN.Base private void WriteStream(StreamWriter outputStream, string pac) { - var content_type = "application/x-ns-proxy-autoconfig"; + string content_type = "application/x-ns-proxy-autoconfig"; outputStream.WriteLine("HTTP/1.1 200 OK"); outputStream.WriteLine(String.Format("Content-Type:{0}", content_type)); outputStream.WriteLine("Connection: close"); diff --git a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs index 7fc58205..a113a7bc 100644 --- a/v2rayN/v2rayN/Base/ListViewFlickerFree.cs +++ b/v2rayN/v2rayN/Base/ListViewFlickerFree.cs @@ -18,37 +18,31 @@ namespace v2rayN.Base { try { - int count = this.Columns.Count; - int MaxWidth = 0; + this.SuspendLayout(); Graphics graphics = this.CreateGraphics(); - Font font = this.Font; - ListView.ListViewItemCollection items = this.Items; - - string str; - int width; + // 原生 ColumnHeaderAutoResizeStyle.ColumnContent 将忽略列头宽度 this.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); - for (int i = 0; i < count; i++) + for (int i = 0; i < this.Columns.Count; i++) { - str = this.Columns[i].Text; - MaxWidth = this.Columns[i].Width; + ColumnHeader c = this.Columns[i]; + int cWidth = c.Width; + string MaxStr = ""; + Font font = this.Items[0].SubItems[0].Font; - foreach (ListViewItem item in items) + foreach (ListViewItem item in this.Items) { - str = item.SubItems[i].Text; - width = (int)graphics.MeasureString(str, font).Width; - if (width > MaxWidth) - { - MaxWidth = width; - } + // 整行视作相同字形,不单独计算每个单元格 + font = item.SubItems[i].Font; + string str = item.SubItems[i].Text; + if (str.Length > MaxStr.Length) // 未考虑非等宽问题 + MaxStr = str; } - if (i == 0) - { - this.Columns[i].Width = MaxWidth; - } - this.Columns[i].Width = MaxWidth; + int strWidth = (int)graphics.MeasureString(MaxStr, font).Width; + c.Width = System.Math.Max(cWidth, strWidth); } + this.ResumeLayout(); } catch { } } diff --git a/v2rayN/v2rayN/Base/StringEx.cs b/v2rayN/v2rayN/Base/StringEx.cs index e7f87a44..40544106 100644 --- a/v2rayN/v2rayN/Base/StringEx.cs +++ b/v2rayN/v2rayN/Base/StringEx.cs @@ -24,7 +24,7 @@ namespace v2rayN.Base public static bool IsWhiteSpace(this string value) { - foreach (var c in value) + foreach (char c in value) { if (char.IsWhiteSpace(c)) continue; diff --git a/v2rayN/v2rayN/Base/WebClientEx.cs b/v2rayN/v2rayN/Base/WebClientEx.cs index 0a435692..096826cc 100644 --- a/v2rayN/v2rayN/Base/WebClientEx.cs +++ b/v2rayN/v2rayN/Base/WebClientEx.cs @@ -17,17 +17,7 @@ namespace v2rayN.Base protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest request; - if (address.Scheme == "https") - { - ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => { return true; }; - request = (HttpWebRequest)base.GetWebRequest(address); - request.ProtocolVersion = HttpVersion.Version10; - } - else - { - request = (HttpWebRequest)base.GetWebRequest(address); - } - + request = (HttpWebRequest)base.GetWebRequest(address); request.Timeout = Timeout; request.ReadWriteTimeout = Timeout; //request.AllowAutoRedirect = false; diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs index a88afb44..999b0c25 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -5,10 +5,8 @@ using v2rayN.Mode; namespace v2rayN.Forms { - public partial class AddServer2Form : BaseForm - { - public int EditIndex { get; set; } - VmessItem vmessItem; + public partial class AddServer2Form : BaseServerForm + { public AddServer2Form() { @@ -63,7 +61,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx index c98d40e0..969bc410 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.resx @@ -117,274 +117,148 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - txtAddress - - - Address - - - 0 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bottom - - - True - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - btnOK - - - txtRemarks - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AddServer2Form - - - label1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - panel2 - - - 12, 27 - - - Fill - - - True - - - 313, 21 - - - groupBox1 - 6, 12 - - True - - - Alias (remarks) - - - 127, 23 - - - 6 - - - 7 - - - groupBox1 - - - 113, 12 - - - 4 - - - Server - - - 23 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - 611, 60 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Edit custom configuration server - - - 432, 104 - - - 611, 10 - - - groupBox1 - - - * Fill in manually - - - 11 - - - 10 - - - panel1 - - - 75, 23 - - - 2 - - - btnClose - - - 303, 17 - - - 0, 211 - - - 75, 23 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - Top - - - 0, 10 - - - 3 - - - 611, 201 - - - 2 - - - 4 - - - 3 - - - 127, 62 - - - groupBox1 - - - True - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 83, 12 - - - &Cancel - - - 12, 62 - - - &OK - - - 0 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 446, 26 - - - groupBox1 - - - label6 - - - $this - - - 1 - - - 0, 0 - - - panel2 - - - label13 - - - 83, 12 - - - 22 - - - 1 - - - panel2 - - - 5 - 611, 271 - - 0 + + True - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - $this + + Edit custom configuration server 396, 17 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 75, 23 - - 1 + + 4 - + + &Cancel + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + Fill + + + 0, 10 + + + 611, 201 + + + 3 + + + Server + + True - + + + 12, 62 + + + 83, 12 + + + 0 + + + Address + + + True + + + 446, 26 + + + 113, 12 + + + 22 + + + * Fill in manually + + + True + + + 12, 27 + + + 83, 12 + + + 10 + + + Alias (remarks) + + + Top + + + 0, 0 + + + 611, 10 + + + 6 + + + Bottom + + + 0, 211 + + + 611, 60 + + + 7 + + + 127, 62 + + + True + + + 432, 104 + + + 23 + + + 127, 23 + + + 313, 21 + + + 11 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx index a01d4dfa..482593c4 100644 --- a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx @@ -117,25 +117,25 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 编辑自定义配置服务器 + 取消(&C) + + 确定(&O) + + + 服务器 + + + 地址(address) + *手填,方便识别管理 别名(remarks) - - 地址(address) - - - 服务器 - - - 确定(&O) - - - 编辑自定义配置服务器 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs index 3515e6b9..06312421 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs @@ -55,14 +55,15 @@ // // btnClose // - this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.btnClose.Name = "btnClose"; this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // groupBox1 // + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.cmbSecurity); this.groupBox1.Controls.Add(this.txtRemarks); @@ -74,7 +75,6 @@ this.groupBox1.Controls.Add(this.label2); this.groupBox1.Controls.Add(this.txtAddress); this.groupBox1.Controls.Add(this.label1); - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -85,6 +85,7 @@ // // cmbSecurity // + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbSecurity.FormattingEnabled = true; this.cmbSecurity.Items.AddRange(new object[] { @@ -96,7 +97,6 @@ resources.GetString("cmbSecurity.Items5"), resources.GetString("cmbSecurity.Items6"), resources.GetString("cmbSecurity.Items7")}); - resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); this.cmbSecurity.Name = "cmbSecurity"; // // txtRemarks @@ -146,9 +146,9 @@ // // panel2 // + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // btnOK @@ -165,22 +165,22 @@ // // menuServer // + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItem1}); - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // MenuItem1 // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuItemImportClipboard}); this.MenuItem1.Name = "MenuItem1"; - resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // menuItemImportClipboard // - this.menuItemImportClipboard.Name = "menuItemImportClipboard"; resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); + this.menuItemImportClipboard.Name = "menuItemImportClipboard"; this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); // // AddServer3Form diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs index c39f2cfe..8113a784 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -5,10 +5,8 @@ using v2rayN.Mode; namespace v2rayN.Forms { - public partial class AddServer3Form : BaseForm - { - public int EditIndex { get; set; } - VmessItem vmessItem = null; + public partial class AddServer3Form : BaseServerForm + { public AddServer3Form() { @@ -96,7 +94,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } private void btnClose_Click(object sender, EventArgs e) @@ -121,11 +119,10 @@ namespace v2rayN.Forms { ClearServer(); - string msg; - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx index f2f23bba..272c310f 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -118,489 +118,489 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 396, 17 - - - 75, 23 - - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - True - - - 337, 158 - 113, 12 - - 22 + + 53, 12 - - * Fill in manually + + label6 - - label13 + + groupBox1 - + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 547, 25 + + + + 11 + + + $this + groupBox1 + + 8 + + + + Bottom + + + Import configuration file + + + groupBox1 + + + panel1 + + + 3 + + + Password + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuItemImportClipboard + + + Fill + + + groupBox1 + + + 8 + + + 89, 12 + + + 127, 27 + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 0 aes-256-cfb - - aes-128-cfb - - - chacha20 - - - chacha20-ietf - - - aes-256-gcm - - - aes-128-gcm - - - chacha20-poly1305 - - - chacha20-ietf-poly1305 - - - 127, 120 - - - 194, 20 - 6 - - cmbSecurity + + 5 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 303, 17 - - groupBox1 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + 4 - - 127, 154 + + MenuItem1 - - 194, 21 + + 0 - - 11 + + 359, 21 - - txtRemarks - - + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 + + 396, 17 - - 2 - - - True - - - 12, 158 - - - 95, 12 - - - 10 - - - Alias (remarks) - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - True - - - 12, 124 - - - 65, 12 - - + 8 + + 0, 0 + + + label1 + + + 547, 60 + + + 0, 25 + Encryption - - label5 + + groupBox1 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True + + + 22 + + + 162, 21 + + + 127, 123 + + + 127, 91 groupBox1 - - 4 + + panel2 - - 127, 85 - - - * - - - 278, 21 - - + 5 + + 2 + + + Alias (remarks) + + + groupBox1 + + + True + + + label5 + txtId System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - - - 5 - - - True - - - 12, 89 - - - 53, 12 - - - 4 - - - Password - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - - - 127, 56 - - - 194, 21 - - - 3 - - - txtPort - - + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - - - 7 - - - True - - - 12, 60 - - - 71, 12 - - - 2 - - - Server port - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - 127, 27 - - - 359, 21 - - - 1 - - - txtAddress - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - True - 12, 31 - - 89, 12 + + groupBox1 + + + 1 + + + AddServer3Form + + + 194, 21 + + + groupBox1 + + + 127, 59 + + + 0 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 71, 12 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 12, 124 + + + 2 + + + 10 + + + txtPort + + + aes-128-cfb + + + 547, 10 + + + 0, 35 + + + 5 + + + 235, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit or add a [Shadowsocks] server + + + &OK + + + chacha20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnClose + + + panel2 0 - - Server address + + 3 - - label1 + + 12, 93 - + + 194, 20 + + + 10 + + + chacha20-ietf + + + True + + + panel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 194, 21 + + + 1 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6 + + + 1 + + + 7 + + + label13 + + + aes-256-gcm + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - 10 + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - Fill + + label3 - - 0, 35 - - - 547, 196 - - - 3 - - - Server - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - 303, 17 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Bottom - - - 0, 231 - - - 547, 60 - - - 7 - - - panel2 + + Server port System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + 0, 231 - - 1 + + 9 - - Top + + aes-128-gcm - - 0, 25 + + 4 - - 547, 10 + + &Cancel - - 6 + + True - - panel1 + + 6, 12 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - $this - - - 2 - - - 17, 17 - - - 235, 22 - - - Import URL from clipboard - - - 162, 21 - - - Import configuration file - - - 0, 0 - - - 547, 25 - - - 8 + + Server address menuServer - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtAddress - + + 127, 154 + + + chacha20-poly1305 + + + 95, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + * Fill in manually + + + 7 + + + label2 + + + 12, 62 + + + 547, 291 + + + chacha20-ietf-poly1305 + + + btnOK + + + cmbSecurity + + $this - + + 547, 196 + + + 3 + + + 75, 23 + + + 6 + + + 337, 158 + + + 65, 12 + + + 4 + + + 2 + + + 1 + + + * + + + 75, 23 + + + Import URL from clipboard + + + groupBox1 + + + Server + + + txtRemarks + + + 12, 155 + + + True + + + 278, 21 + + + Top + + 3 True - - 6, 12 - - - 547, 291 - - - Edit or add a [Shadowsocks] server - - - MenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuItemImportClipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AddServer3Form - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + + 17, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx index 2a5968ca..e2cbcede 100644 --- a/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx @@ -120,39 +120,58 @@ 取消(&C) + + 服务器 + *手填,方便识别管理 + + + 83, 12 + 别名(remarks) + + 53, 12 + 加密方式 + + 29, 12 + 密码 + + 65, 12 + 服务器端口 + + 65, 12 + 服务器地址 - - 服务器 - 确定(&O) - - 从剪贴板导入URL - - - 扫描屏幕上的二维码 + + 92, 21 导入配置文件 + + 171, 22 + + + 从剪贴板导入URL + 编辑或添加[Shadowsocks]服务器 diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs index 3ae98f0b..bdcd694a 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs @@ -55,14 +55,15 @@ // // btnClose // - this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.btnClose.Name = "btnClose"; this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // groupBox1 // + resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Controls.Add(this.txtSecurity); this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.txtId); @@ -74,7 +75,6 @@ this.groupBox1.Controls.Add(this.label2); this.groupBox1.Controls.Add(this.txtAddress); this.groupBox1.Controls.Add(this.label1); - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // @@ -135,9 +135,9 @@ // // panel2 // + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // btnOK @@ -154,22 +154,22 @@ // // menuServer // + resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuItem1}); - resources.ApplyResources(this.menuServer, "menuServer"); this.menuServer.Name = "menuServer"; // // MenuItem1 // + resources.ApplyResources(this.MenuItem1, "MenuItem1"); this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuItemImportClipboard}); this.MenuItem1.Name = "MenuItem1"; - resources.ApplyResources(this.MenuItem1, "MenuItem1"); // // menuItemImportClipboard // - this.menuItemImportClipboard.Name = "menuItemImportClipboard"; resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); + this.menuItemImportClipboard.Name = "menuItemImportClipboard"; this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); // // AddServer4Form diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs index d331bec2..23ec6aaa 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.cs +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -5,10 +5,8 @@ using v2rayN.Mode; namespace v2rayN.Forms { - public partial class AddServer4Form : BaseForm - { - public int EditIndex { get; set; } - VmessItem vmessItem = null; + public partial class AddServer4Form : BaseServerForm + { public AddServer4Form() { @@ -85,7 +83,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } private void btnClose_Click(object sender, EventArgs e) @@ -110,11 +108,10 @@ namespace v2rayN.Forms { ClearServer(); - string msg; - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx index 566de4b3..d245b984 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -118,471 +118,471 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 396, 17 - - - 75, 23 - - - - 4 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - 127, 84 - - - 278, 21 - - - 26 - - - txtSecurity - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - True - - - - NoControl - - - 12, 88 - - - 89, 12 - - - 25 - - - User(Optional) - - - label4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - 127, 117 - - - * - - - 278, 21 - - - 24 - - - txtId - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - True - - - NoControl - - - 12, 121 + + 113, 12 113, 12 - - 23 + + label6 - - Password(Optional) - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + groupBox1 - - 3 - - + + True - - 337, 158 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 113, 12 + + panel2 - - 22 - - - * Fill in manually - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - 127, 154 - - - 194, 21 + + 547, 25 11 - - txtRemarks + + + Bottom - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Import configuration file - - groupBox1 + + panel1 - - 5 + + 3 - - True + + Password(Optional) - - 12, 158 - - - 95, 12 - - - 10 - - - Alias (remarks) - - - label6 - - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 groupBox1 - - 6 - - - 127, 56 - - - 194, 21 - - - 3 - - - txtPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - 12, 60 - - - 71, 12 - - - 2 - - - Server port - - - label2 - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - groupBox1 - - - 8 - - - 127, 27 - - - 359, 21 - - - 1 - - - txtAddress - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - True - - - 12, 31 - - - 89, 12 - - - 0 - - - Server address - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 + + menuItemImportClipboard Fill - - 0, 35 - - - 547, 196 - - - 3 - - - Server - - + groupBox1 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - 303, 17 - - - 75, 23 - - - 5 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Bottom - - - 0, 231 - - - 547, 60 - - - 7 - - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - Top - - - 0, 25 - - - 547, 10 - - - 6 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 2 - - - 17, 17 - - - 235, 22 - - - Import URL from clipboard - - - 162, 21 - - - Import configuration file - - - 0, 0 - - - 547, 25 - 8 - - menuServer + + 89, 12 + + + 127, 27 System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4 + + + Edit or add a [Socks] server + + + NoControl + + + 10 + + + 24 + + + Import URL from clipboard + + + 303, 17 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 23 + + + MenuItem1 + + + 0 + + + 359, 21 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 396, 17 + + + 8 + + + 0, 0 + + + label1 + + + 547, 60 + + + 0, 25 + + + groupBox1 + + + True + + + 22 + + + 162, 21 + + + True + + + Server + + + 127, 120 + + + panel2 + + + groupBox1 + + + 5 + + + 2 + + + 26 + + + groupBox1 + + + menuServer + + + groupBox1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + txtId + + + 235, 22 + + + 12, 93 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 12, 31 + + + groupBox1 + + + 1 + + + AddServer4Form + + + 194, 21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 127, 58 + + + 1 + + + 0 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 71, 12 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + groupBox1 + + + txtPort + + + panel2 + + + 547, 10 + + + * + + + 2 + + + txtSecurity + $this + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label4 + + + &OK + + + btnClose + + + 278, 21 + + + 0 + 3 + + 12, 124 + + + 2 + + + 10 + + + btnOK + + + 194, 21 + + + 1 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6 + + + 1 + + + 7 + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + label3 + + + Server port + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 231 + + + 9 + + + &Cancel + + + True + + + 6, 12 + + + Server address + + + 25 + + + txtAddress + + + 127, 151 + + + 95, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Alias (remarks) + + + * Fill in manually + + + 7 + + + label2 + + + 12, 62 + + + 547, 291 + + + $this + + + 547, 196 + + + 6 + + + 0 + + + 75, 23 + + + 3 + + + 127, 89 + + + 337, 155 + + + True + + + 4 + + + 5 + + + 75, 23 + + + 89, 12 + + + groupBox1 + + + groupBox1 + + + 0, 35 + + + txtRemarks + + + 12, 155 + + + True + + + User(Optional) + + + 278, 21 + + + Top + + + 3 + True - - 6, 12 - - - 547, 291 - - - Edit or add a [Socks] server - - - MenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuItemImportClipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - AddServer4Form - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + + 17, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx index 6a3cc081..2e8e0912 100644 --- a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx @@ -124,11 +124,8 @@ 服务器 - - 127, 85 - - - 12, 89 + + 194, 21 77, 12 @@ -136,11 +133,8 @@ 用户名(可选) - - 127, 115 - - - 12, 119 + + 194, 21 65, 12 diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs new file mode 100644 index 00000000..423b7386 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer5Form.Designer.cs @@ -0,0 +1,513 @@ +namespace v2rayN.Forms +{ + partial class AddServer5Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer5Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.cmbFlow = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.btnGUID = new System.Windows.Forms.Button(); + this.label13 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label24 = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.panTlsMore = new System.Windows.Forms.Panel(); + this.label21 = new System.Windows.Forms.Label(); + this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.cmbNetwork = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label19 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.txtRequestHost = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.cmbHeaderType = new System.Windows.Forms.ComboBox(); + this.label8 = new System.Windows.Forms.Label(); + this.cmbSecurity = new System.Windows.Forms.ComboBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtId = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemImportClient = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.panTlsMore.SuspendLayout(); + this.panel2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.cmbFlow); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.btnGUID); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.groupBox2); + this.groupBox1.Controls.Add(this.label8); + this.groupBox1.Controls.Add(this.cmbSecurity); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtId); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // cmbFlow + // + this.cmbFlow.FormattingEnabled = true; + this.cmbFlow.Items.AddRange(new object[] { + resources.GetString("cmbFlow.Items"), + resources.GetString("cmbFlow.Items1"), + resources.GetString("cmbFlow.Items2"), + resources.GetString("cmbFlow.Items3"), + resources.GetString("cmbFlow.Items4")}); + resources.ApplyResources(this.cmbFlow, "cmbFlow"); + this.cmbFlow.Name = "cmbFlow"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // btnGUID + // + resources.ApplyResources(this.btnGUID, "btnGUID"); + this.btnGUID.Name = "btnGUID"; + this.btnGUID.UseVisualStyleBackColor = true; + this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click); + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.label24); + this.groupBox2.Controls.Add(this.label23); + this.groupBox2.Controls.Add(this.panTlsMore); + this.groupBox2.Controls.Add(this.label9); + this.groupBox2.Controls.Add(this.label20); + this.groupBox2.Controls.Add(this.txtPath); + this.groupBox2.Controls.Add(this.cmbNetwork); + this.groupBox2.Controls.Add(this.label7); + this.groupBox2.Controls.Add(this.label19); + this.groupBox2.Controls.Add(this.label18); + this.groupBox2.Controls.Add(this.label17); + this.groupBox2.Controls.Add(this.label16); + this.groupBox2.Controls.Add(this.label14); + this.groupBox2.Controls.Add(this.label15); + this.groupBox2.Controls.Add(this.cmbStreamSecurity); + this.groupBox2.Controls.Add(this.label12); + this.groupBox2.Controls.Add(this.txtRequestHost); + this.groupBox2.Controls.Add(this.label11); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.cmbHeaderType); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // label24 + // + resources.ApplyResources(this.label24, "label24"); + this.label24.Name = "label24"; + // + // label23 + // + resources.ApplyResources(this.label23, "label23"); + this.label23.Name = "label23"; + // + // panTlsMore + // + this.panTlsMore.Controls.Add(this.label21); + this.panTlsMore.Controls.Add(this.cmbAllowInsecure); + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Name = "panTlsMore"; + // + // label21 + // + resources.ApplyResources(this.label21, "label21"); + this.label21.Name = "label21"; + // + // cmbAllowInsecure + // + this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbAllowInsecure.FormattingEnabled = true; + this.cmbAllowInsecure.Items.AddRange(new object[] { + resources.GetString("cmbAllowInsecure.Items"), + resources.GetString("cmbAllowInsecure.Items1"), + resources.GetString("cmbAllowInsecure.Items2")}); + resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); + this.cmbAllowInsecure.Name = "cmbAllowInsecure"; + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // label20 + // + resources.ApplyResources(this.label20, "label20"); + this.label20.Name = "label20"; + // + // txtPath + // + resources.ApplyResources(this.txtPath, "txtPath"); + this.txtPath.Name = "txtPath"; + // + // cmbNetwork + // + this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbNetwork.FormattingEnabled = true; + this.cmbNetwork.Items.AddRange(new object[] { + resources.GetString("cmbNetwork.Items"), + resources.GetString("cmbNetwork.Items1"), + resources.GetString("cmbNetwork.Items2"), + resources.GetString("cmbNetwork.Items3"), + resources.GetString("cmbNetwork.Items4")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); + this.cmbNetwork.Name = "cmbNetwork"; + this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // label19 + // + resources.ApplyResources(this.label19, "label19"); + this.label19.Name = "label19"; + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // cmbStreamSecurity + // + this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbStreamSecurity.FormattingEnabled = true; + this.cmbStreamSecurity.Items.AddRange(new object[] { + resources.GetString("cmbStreamSecurity.Items"), + resources.GetString("cmbStreamSecurity.Items1"), + resources.GetString("cmbStreamSecurity.Items2")}); + resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); + this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // txtRequestHost + // + resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); + this.txtRequestHost.Name = "txtRequestHost"; + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // cmbHeaderType + // + this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbHeaderType.FormattingEnabled = true; + this.cmbHeaderType.Items.AddRange(new object[] { + resources.GetString("cmbHeaderType.Items"), + resources.GetString("cmbHeaderType.Items1"), + resources.GetString("cmbHeaderType.Items2"), + resources.GetString("cmbHeaderType.Items3"), + resources.GetString("cmbHeaderType.Items4"), + resources.GetString("cmbHeaderType.Items5"), + resources.GetString("cmbHeaderType.Items6")}); + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); + this.cmbHeaderType.Name = "cmbHeaderType"; + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // cmbSecurity + // + this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.Simple; + this.cmbSecurity.FormattingEnabled = true; + this.cmbSecurity.Items.AddRange(new object[] { + resources.GetString("cmbSecurity.Items")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); + this.cmbSecurity.Name = "cmbSecurity"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // MenuItem1 + // + this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItemImportClient, + this.MenuItemImportServer, + this.toolStripSeparator1, + this.MenuItemImportClipboard}); + this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + // + // MenuItemImportClient + // + this.MenuItemImportClient.Name = "MenuItemImportClient"; + resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); + this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); + // + // MenuItemImportServer + // + this.MenuItemImportServer.Name = "MenuItemImportServer"; + resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); + this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // + // MenuItemImportClipboard + // + this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; + resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); + this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); + // + // AddServer5Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AddServer5Form"; + this.Load += new System.EventHandler(this.AddServer5Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.panTlsMore.ResumeLayout(false); + this.panTlsMore.PerformLayout(); + this.panel2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtId; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbSecurity; + private System.Windows.Forms.ComboBox cmbNetwork; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.ComboBox cmbHeaderType; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportClient; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportServer; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.ComboBox cmbStreamSecurity; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard; + private System.Windows.Forms.Button btnGUID; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.ComboBox cmbAllowInsecure; + private System.Windows.Forms.Panel panTlsMore; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.ComboBox cmbFlow; + private System.Windows.Forms.Label label4; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.cs b/v2rayN/v2rayN/Forms/AddServer5Form.cs new file mode 100644 index 00000000..d426e5c6 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer5Form.cs @@ -0,0 +1,286 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer5Form : BaseServerForm + { + + public AddServer5Form() + { + InitializeComponent(); + } + + private void AddServer5Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + cmbFlow.Text = vmessItem.flow; + cmbSecurity.Text = vmessItem.security; + cmbNetwork.Text = vmessItem.network; + txtRemarks.Text = vmessItem.remarks; + + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + cmbAllowInsecure.Text = vmessItem.allowInsecure; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtId.Text = ""; + cmbFlow.Text = ""; + cmbSecurity.Text = Global.None; + cmbNetwork.Text = Global.DefaultNetwork; + txtRemarks.Text = ""; + + cmbHeaderType.Text = Global.None; + txtRequestHost.Text = ""; + cmbStreamSecurity.Text = ""; + cmbAllowInsecure.Text = ""; + txtPath.Text = ""; + } + + + private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) + { + SetHeaderType(); + } + + /// + /// 设置伪装选项 + /// + private void SetHeaderType() + { + cmbHeaderType.Items.Clear(); + + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + cmbHeaderType.Items.Add(Global.None); + return; + } + + cmbHeaderType.Items.Add(Global.None); + if (network.Equals(Global.DefaultNetwork)) + { + cmbHeaderType.Items.Add(Global.TcpHeaderHttp); + } + else if (network.Equals("kcp") || network.Equals("quic")) + { + cmbHeaderType.Items.Add("srtp"); + cmbHeaderType.Items.Add("utp"); + cmbHeaderType.Items.Add("wechat-video"); + cmbHeaderType.Items.Add("dtls"); + cmbHeaderType.Items.Add("wireguard"); + } + else + { + } + cmbHeaderType.Text = Global.None; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string id = txtId.Text; + string flow = cmbFlow.Text; + string security = cmbSecurity.Text; + string network = cmbNetwork.Text; + string remarks = txtRemarks.Text; + + string headerType = cmbHeaderType.Text; + string requestHost = txtRequestHost.Text; + string path = txtPath.Text; + string streamSecurity = cmbStreamSecurity.Text; + string allowInsecure = cmbAllowInsecure.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillUUID")); + return; + } + + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.id = id; + vmessItem.flow = flow; + vmessItem.security = security; + vmessItem.network = network; + vmessItem.remarks = remarks; + + vmessItem.headerType = headerType; + vmessItem.requestHost = requestHost.Replace(" ", ""); + vmessItem.path = path.Replace(" ", ""); + vmessItem.streamSecurity = streamSecurity; + vmessItem.allowInsecure = allowInsecure; + + if (ConfigHandler.AddVlessServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + } + + private void btnGUID_Click(object sender, EventArgs e) + { + txtId.Text = Utils.GetGUID(); + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) + { + string security = cmbStreamSecurity.Text; + if (Utils.IsNullOrEmpty(security)) + { + panTlsMore.Hide(); + } + else + { + panTlsMore.Show(); + } + } + + #region 导入客户端/服务端配置 + + /// + /// 导入客户端 + /// + /// + /// + private void MenuItemImportClient_Click(object sender, EventArgs e) + { + MenuItemImport(1); + } + + /// + /// 导入服务端 + /// + /// + /// + private void MenuItemImportServer_Click(object sender, EventArgs e) + { + MenuItemImport(2); + } + + private void MenuItemImport(int type) + { + ClearServer(); + + OpenFileDialog fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = "Config|*.json|All|*.*" + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + string msg; + VmessItem vmessItem; + if (type.Equals(1)) + { + vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); + } + else + { + vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); + } + if (vmessItem == null) + { + UI.ShowWarning(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtRemarks.Text = vmessItem.remarks; + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + } + + /// + /// 从剪贴板导入URL + /// + /// + /// + private void MenuItemImportClipboard_Click(object sender, EventArgs e) + { + ClearServer(); + + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); + if (vmessItem == null) + { + UI.ShowWarning(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtRemarks.Text = vmessItem.remarks; + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + } + #endregion + + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.resx b/v2rayN/v2rayN/Forms/AddServer5Form.resx new file mode 100644 index 00000000..e4c57a41 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer5Form.resx @@ -0,0 +1,1386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + 396, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + + + + xtls-rprx-origin + + + xtls-rprx-origin-udp443 + + + xtls-rprx-direct + + + xtls-rprx-direct-udp443 + + + 127, 123 + + + 211, 20 + + + 24 + + + cmbFlow + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + + NoControl + + + 12, 127 + + + 29, 12 + + + 25 + + + Flow + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 411, 91 + + + 75, 23 + + + 23 + + + &Generate + + + btnGUID + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 353, 189 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + NoControl + + + 529, 207 + + + 119, 12 + + + 35 + + + 3)QUIC key/Kcp seed + + + label24 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + NoControl + + + 465, 140 + + + 89, 12 + + + 34 + + + 4)QUIC securty + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + True + + + NoControl + + + 12, 11 + + + 83, 12 + + + 31 + + + allowInsecure + + + label21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + + + + true + + + false + + + 107, 7 + + + 91, 20 + + + 30 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + + 284, 232 + + + 338, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + True + + + 353, 32 + + + 113, 12 + + + 15 + + + *Default value tcp + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + True + + + 464, 124 + + + 203, 12 + + + 29 + + + 3)h2 host Separated by commas (,) + + + label20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 4 + + + 127, 169 + + + True + + + 396, 54 + + + 28 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 5 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + 192, 28 + + + 143, 20 + + + 12 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 6 + + + True + + + 9, 32 + + + 167, 12 + + + 13 + + + Transport protocol(network) + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 7 + + + True + + + 9, 169 + + + 29, 12 + + + 27 + + + Path + + + label19 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 8 + + + True + + + 529, 189 + + + 59, 12 + + + 26 + + + 2)h2 path + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 9 + + + True + + + 464, 109 + + + 59, 12 + + + 25 + + + 2)ws host + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 10 + + + True + + + 529, 172 + + + 59, 12 + + + 24 + + + 1)ws path + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 11 + + + True + + + 464, 94 + + + 215, 12 + + + 23 + + + 1)http host Separated by commas (,) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 12 + + + True + + + 9, 243 + + + 23, 12 + + + 22 + + + TLS + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 13 + + + + + + tls + + + xtls + + + 127, 239 + + + 143, 20 + + + 21 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 14 + + + True + + + 282, 68 + + + 299, 12 + + + 20 + + + *tcp or kcp or QUIC camouflage type, default none + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 15 + + + 158, 100 + + + True + + + 300, 53 + + + 16 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 16 + + + True + + + 9, 68 + + + 95, 12 + + + 19 + + + Camouflage type + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 17 + + + True + + + 9, 100 + + + 143, 12 + + + 17 + + + Camouflage domain(host) + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 18 + + + none + + + http + + + srtp + + + utp + + + wechat-video + + + dtls + + + wireguard + + + 127, 64 + + + 143, 20 + + + 18 + + + cmbHeaderType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 19 + + + Bottom + + + 3, 215 + + + 723, 281 + + + 21 + + + Transport + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + True + + + NoControl + + + 353, 157 + + + 119, 12 + + + 14 + + + *Recommended (none) + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + none + + + 127, 154 + + + 211, 20 + + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + 127, 185 + + + 211, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 189 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + True + + + 12, 158 + + + 65, 12 + + + 8 + + + Encryption + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + 127, 91 + + + 278, 21 + + + 5 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + True + + + 12, 95 + + + 53, 12 + + + 4 + + + UUID(id) + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + 127, 59 + + + 143, 21 + + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + True + + + 12, 63 + + + 29, 12 + + + 2 + + + Port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + 127, 27 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + True + + + 12, 31 + + + 47, 12 + + + 0 + + + Address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + Fill + + + 0, 35 + + + 729, 499 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 534 + + + 729, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 25 + + + 729, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 237, 22 + + + Import client configuration + + + 237, 22 + + + Import server configuration + + + 234, 6 + + + 237, 22 + + + Import URL from clipboard + + + 162, 21 + + + Import configuration file + + + 0, 0 + + + 729, 25 + + + 8 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 25 + + + 6, 12 + + + 729, 594 + + + Edit or add a [VLESS] server + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportClient + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer5Form + + + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx new file mode 100644 index 00000000..46ec6353 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer5Form.zh-Hans.resx @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 取消(&C) + + + 服务器 + + + + 220, 20 + + + 65, 12 + + + 流控(flow) + + + 生成(&G) + + + *手填,方便识别管理 + + + 底层传输方式(transport) + + + 149, 12 + + + 3)QUIC 加密密钥/Kcp seed + + + 95, 12 + + + 4)QUIC 加密方式 + + + 167, 12 + + + 跳过证书验证(allowInsecure) + + + 223, 7 + + + 353, 36 + + + 143, 12 + + + *默认tcp,选错会无法连接 + + + 149, 12 + + + 3)h2 host中间逗号(,)隔开 + + + 127, 168 + + + 127, 32 + + + 220, 20 + + + 9, 36 + + + 107, 12 + + + 传输协议(network) + + + 9, 168 + + + 65, 12 + + + 路径(path) + + + 161, 12 + + + 1)http host中间逗号(,)隔开 + + + 9, 241 + + + 107, 12 + + + 底层传输安全(tls) + + + 127, 237 + + + 282, 71 + + + 197, 12 + + + *tcp或kcp或QUIC伪装类型,默认none + + + 127, 102 + + + 334, 51 + + + 9, 71 + + + 89, 12 + + + 伪装类型(type) + + + 9, 102 + + + 89, 12 + + + 伪装域名(host) + + + 127, 67 + + + 353, 158 + + + 71, 12 + + + *非空(none) + + + 220, 20 + + + 220, 21 + + + 83, 12 + + + 别名(remarks) + + + 101, 12 + + + 加密(encryption) + + + 65, 12 + + + 用户ID(id) + + + 65, 12 + + + 端口(port) + + + 83, 12 + + + 地址(address) + + + 确定(&O) + + + + False + + + 92, 21 + + + 导入配置文件 + + + 171, 22 + + + 导入客户端配置 + + + 171, 22 + + + 导入服务端配置 + + + 168, 6 + + + 171, 22 + + + 从剪贴板导入URL + + + 编辑或添加[VLESS]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs new file mode 100644 index 00000000..eba21fc8 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer6Form.Designer.cs @@ -0,0 +1,173 @@ +namespace v2rayN.Forms +{ + partial class AddServer6Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer6Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label13 = new System.Windows.Forms.Label(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.txtId = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.txtId); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // AddServer6Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MinimizeBox = true; + this.Name = "AddServer6Form"; + this.Load += new System.EventHandler(this.AddServer6Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtId; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label13; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.cs b/v2rayN/v2rayN/Forms/AddServer6Form.cs new file mode 100644 index 00000000..37e3f565 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer6Form.cs @@ -0,0 +1,96 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer6Form : BaseServerForm + { + public AddServer6Form() + { + InitializeComponent(); + } + + private void AddServer6Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtRemarks.Text = vmessItem.remarks; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtId.Text = ""; + txtRemarks.Text = ""; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string id = txtId.Text; + string remarks = txtRemarks.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillPassword")); + return; + } + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.id = id; + vmessItem.remarks = remarks; + + if (ConfigHandler.AddTrojanServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.ShowWarning(UIRes.I18N("OperationFailed")); + } + } + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.resx b/v2rayN/v2rayN/Forms/AddServer6Form.resx new file mode 100644 index 00000000..e3935dc5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer6Form.resx @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + groupBox1 + + + Server address + + + + 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Bottom + + + txtPort + + + True + + + groupBox1 + + + 4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + txtRemarks + + + + 194, 21 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer6Form + + + label1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + panel2 + + + 12, 155 + + + True + + + 53, 12 + + + Fill + + + 194, 21 + + + groupBox1 + + + 6, 12 + + + True + + + label3 + + + 127, 154 + + + True + + + 6 + + + 7 + + + groupBox1 + + + 113, 12 + + + 12, 93 + + + 8 + + + Server + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 2 + + + 547, 60 + + + 89, 12 + + + 278, 21 + + + 359, 21 + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + * + + + groupBox1 + + + * Fill in manually + + + 11 + + + 10 + + + 71, 12 + + + 75, 23 + + + panel1 + + + txtId + + + 12, 62 + + + 1 + + + btnClose + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &OK + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Password + + + 75, 23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtAddress + + + 547, 10 + + + Top + + + 0, 10 + + + 2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 547, 221 + + + 2 + + + groupBox1 + + + 4 + + + 3 + + + 127, 27 + + + 5 + + + groupBox1 + + + True + + + 127, 59 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Alias (remarks) + + + 5 + + + groupBox1 + + + 303, 17 + + + $this + + + 6 + + + &Cancel + + + 12, 31 + + + Edit or add a [Trojan] server + + + 0 + + + Server port + + + 4 + + + 337, 158 + + + groupBox1 + + + 127, 91 + + + 5 + + + $this + + + 1 + + + 0, 0 + + + 1 + + + label13 + + + 3 + + + 95, 12 + + + label2 + + + 0 + + + panel2 + + + 0, 231 + + + 22 + + + 7 + + + 547, 291 + + + 0 + + + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + $this + + + 396, 17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + panel2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx new file mode 100644 index 00000000..d7642edd --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer6Form.zh-Hans.resx @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 取消(&C) + + + 服务器 + + + *手填,方便识别管理 + + + + 83, 12 + + + 别名(remarks) + + + 29, 12 + + + 密码 + + + 65, 12 + + + 服务器端口 + + + 65, 12 + + + 服务器地址 + + + 确定(&O) + + + 编辑或添加[Trojan]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs index c398397b..a96b32ab 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -37,11 +37,13 @@ this.label24 = new System.Windows.Forms.Label(); this.label23 = new System.Windows.Forms.Label(); this.panTlsMore = new System.Windows.Forms.Panel(); - this.label22 = new System.Windows.Forms.Label(); this.label21 = new System.Windows.Forms.Label(); this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); this.label20 = new System.Windows.Forms.Label(); this.txtPath = new System.Windows.Forms.TextBox(); + this.cmbNetwork = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); this.label19 = new System.Windows.Forms.Label(); this.label18 = new System.Windows.Forms.Label(); this.label17 = new System.Windows.Forms.Label(); @@ -54,10 +56,7 @@ this.label11 = new System.Windows.Forms.Label(); this.label10 = new System.Windows.Forms.Label(); this.cmbHeaderType = new System.Windows.Forms.ComboBox(); - this.label9 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label(); - this.cmbNetwork = new System.Windows.Forms.ComboBox(); - this.label7 = new System.Windows.Forms.Label(); this.cmbSecurity = new System.Windows.Forms.ComboBox(); this.txtRemarks = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); @@ -99,10 +98,7 @@ this.groupBox1.Controls.Add(this.btnGUID); this.groupBox1.Controls.Add(this.label13); this.groupBox1.Controls.Add(this.groupBox2); - this.groupBox1.Controls.Add(this.label9); this.groupBox1.Controls.Add(this.label8); - this.groupBox1.Controls.Add(this.cmbNetwork); - this.groupBox1.Controls.Add(this.label7); this.groupBox1.Controls.Add(this.cmbSecurity); this.groupBox1.Controls.Add(this.txtRemarks); this.groupBox1.Controls.Add(this.label6); @@ -136,8 +132,11 @@ this.groupBox2.Controls.Add(this.label24); this.groupBox2.Controls.Add(this.label23); this.groupBox2.Controls.Add(this.panTlsMore); + this.groupBox2.Controls.Add(this.label9); this.groupBox2.Controls.Add(this.label20); this.groupBox2.Controls.Add(this.txtPath); + this.groupBox2.Controls.Add(this.cmbNetwork); + this.groupBox2.Controls.Add(this.label7); this.groupBox2.Controls.Add(this.label19); this.groupBox2.Controls.Add(this.label18); this.groupBox2.Controls.Add(this.label17); @@ -166,17 +165,11 @@ // // panTlsMore // - this.panTlsMore.Controls.Add(this.label22); this.panTlsMore.Controls.Add(this.label21); this.panTlsMore.Controls.Add(this.cmbAllowInsecure); resources.ApplyResources(this.panTlsMore, "panTlsMore"); this.panTlsMore.Name = "panTlsMore"; // - // label22 - // - resources.ApplyResources(this.label22, "label22"); - this.label22.Name = "label22"; - // // label21 // resources.ApplyResources(this.label21, "label21"); @@ -193,6 +186,11 @@ resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); this.cmbAllowInsecure.Name = "cmbAllowInsecure"; // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // // label20 // resources.ApplyResources(this.label20, "label20"); @@ -203,6 +201,25 @@ resources.ApplyResources(this.txtPath, "txtPath"); this.txtPath.Name = "txtPath"; // + // cmbNetwork + // + this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbNetwork.FormattingEnabled = true; + this.cmbNetwork.Items.AddRange(new object[] { + resources.GetString("cmbNetwork.Items"), + resources.GetString("cmbNetwork.Items1"), + resources.GetString("cmbNetwork.Items2"), + resources.GetString("cmbNetwork.Items3"), + resources.GetString("cmbNetwork.Items4")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); + this.cmbNetwork.Name = "cmbNetwork"; + this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // // label19 // resources.ApplyResources(this.label19, "label19"); @@ -279,35 +296,11 @@ resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); this.cmbHeaderType.Name = "cmbHeaderType"; // - // label9 - // - resources.ApplyResources(this.label9, "label9"); - this.label9.Name = "label9"; - // // label8 // resources.ApplyResources(this.label8, "label8"); this.label8.Name = "label8"; // - // cmbNetwork - // - this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmbNetwork.FormattingEnabled = true; - this.cmbNetwork.Items.AddRange(new object[] { - resources.GetString("cmbNetwork.Items"), - resources.GetString("cmbNetwork.Items1"), - resources.GetString("cmbNetwork.Items2"), - resources.GetString("cmbNetwork.Items3"), - resources.GetString("cmbNetwork.Items4")}); - resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); - this.cmbNetwork.Name = "cmbNetwork"; - this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); - // - // label7 - // - resources.ApplyResources(this.label7, "label7"); - this.label7.Name = "label7"; - // // cmbSecurity // this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -508,7 +501,6 @@ private System.Windows.Forms.Label label20; private System.Windows.Forms.Label label21; private System.Windows.Forms.ComboBox cmbAllowInsecure; - private System.Windows.Forms.Label label22; private System.Windows.Forms.Panel panTlsMore; private System.Windows.Forms.Label label24; private System.Windows.Forms.Label label23; diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs index 816b7013..bd80867b 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.cs +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -5,10 +5,8 @@ using v2rayN.Mode; namespace v2rayN.Forms { - public partial class AddServerForm : BaseForm - { - public int EditIndex { get; set; } - VmessItem vmessItem = null; + public partial class AddServerForm : BaseServerForm + { public AddServerForm() { @@ -166,7 +164,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } @@ -180,6 +178,18 @@ namespace v2rayN.Forms this.DialogResult = DialogResult.Cancel; } + private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) + { + string security = cmbStreamSecurity.Text; + if (Utils.IsNullOrEmpty(security)) + { + panTlsMore.Hide(); + } + else + { + panTlsMore.Show(); + } + } #region 导入客户端/服务端配置 @@ -207,9 +217,11 @@ namespace v2rayN.Forms { ClearServer(); - OpenFileDialog fileDialog = new OpenFileDialog(); - fileDialog.Multiselect = false; - fileDialog.Filter = "Config|*.json|All|*.*"; + OpenFileDialog fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = "Config|*.json|All|*.*" + }; if (fileDialog.ShowDialog() != DialogResult.OK) { return; @@ -231,7 +243,7 @@ namespace v2rayN.Forms } if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } @@ -256,11 +268,10 @@ namespace v2rayN.Forms { ClearServer(); - string msg; - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg); if (vmessItem == null) { - UI.Show(msg); + UI.ShowWarning(msg); return; } @@ -277,17 +288,5 @@ namespace v2rayN.Forms } #endregion - private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) - { - string security = cmbStreamSecurity.Text; - if (Utils.IsNullOrEmpty(security)) - { - panTlsMore.Hide(); - } - else - { - panTlsMore.Show(); - } - } } } diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx index e519eab6..6d3eec6c 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -171,7 +171,7 @@ True - 285, 203 + 285, 175 113, 12 @@ -202,16 +202,16 @@ NoControl - 526, 165 + 529, 207 - 65, 12 + 119, 12 35 - 3)QUIC key + 3)QUIC key/Kcp seed label24 @@ -232,7 +232,7 @@ NoControl - 470, 99 + 465, 146 89, 12 @@ -255,33 +255,6 @@ 1 - - True - - - 205, 11 - - - 113, 12 - - - 32 - - - Default value true - - - label22 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panTlsMore - - - 0 - True @@ -307,7 +280,7 @@ panTlsMore - 1 + 0 @@ -337,10 +310,10 @@ panTlsMore - 2 + 1 - 284, 189 + 284, 234 338, 35 @@ -360,11 +333,38 @@ 2 + + True + + + 350, 32 + + + 113, 12 + + + 15 + + + *Default value tcp + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + True - 469, 83 + 464, 130 203, 12 @@ -385,10 +385,10 @@ groupBox2 - 3 + 4 - 124, 125 + 127, 169 True @@ -409,13 +409,76 @@ groupBox2 - 4 + 5 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + 192, 28 + + + 143, 20 + + + 12 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 6 + + + True + + + 9, 32 + + + 167, 12 + + + 13 + + + Transport protocol(network) + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 7 True - 9, 125 + 9, 169 29, 12 @@ -436,13 +499,13 @@ groupBox2 - 5 + 8 True - 526, 147 + 529, 189 59, 12 @@ -463,13 +526,13 @@ groupBox2 - 6 + 9 True - 469, 68 + 464, 115 59, 12 @@ -490,13 +553,13 @@ groupBox2 - 7 + 10 True - 526, 130 + 529, 172 59, 12 @@ -517,13 +580,13 @@ groupBox2 - 8 + 11 True - 469, 53 + 464, 100 215, 12 @@ -544,13 +607,13 @@ groupBox2 - 9 + 12 True - 9, 201 + 9, 243 23, 12 @@ -571,7 +634,7 @@ groupBox2 - 10 + 13 @@ -580,7 +643,7 @@ tls - 124, 197 + 127, 239 143, 20 @@ -598,13 +661,13 @@ groupBox2 - 11 + 14 True - 282, 34 + 282, 66 299, 12 @@ -625,10 +688,10 @@ groupBox2 - 12 + 15 - 158, 58 + 158, 100 True @@ -649,13 +712,13 @@ groupBox2 - 13 + 16 True - 9, 34 + 9, 66 95, 12 @@ -676,13 +739,13 @@ groupBox2 - 14 + 17 True - 9, 62 + 9, 100 143, 12 @@ -703,7 +766,7 @@ groupBox2 - 15 + 18 none @@ -727,7 +790,7 @@ wireguard - 124, 30 + 127, 64 143, 20 @@ -745,22 +808,22 @@ groupBox2 - 16 + 19 Bottom - 3, 237 + 3, 215 - 723, 234 + 723, 281 21 - Keep the default value if it is not clear + Transport groupBox2 @@ -774,33 +837,6 @@ 2 - - True - - - 353, 175 - - - 113, 12 - - - 15 - - - *Default value tcp - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - True @@ -826,70 +862,7 @@ groupBox1 - 4 - - - tcp - - - kcp - - - ws - - - h2 - - - quic - - - 195, 171 - - - 143, 20 - - - 12 - - - cmbNetwork - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - 12, 175 - - - 167, 12 - - - 13 - - - Transport protocol(network) - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 + 3 aes-128-gcm @@ -922,10 +895,10 @@ groupBox1 - 7 + 4 - 127, 199 + 127, 171 143, 21 @@ -943,13 +916,13 @@ groupBox1 - 8 + 5 True - 12, 203 + 12, 175 95, 12 @@ -970,7 +943,7 @@ groupBox1 - 9 + 6 True @@ -997,7 +970,7 @@ groupBox1 - 10 + 7 127, 114 @@ -1018,7 +991,7 @@ groupBox1 - 11 + 8 True @@ -1045,7 +1018,7 @@ groupBox1 - 12 + 9 127, 85 @@ -1066,7 +1039,7 @@ groupBox1 - 13 + 10 True @@ -1093,7 +1066,7 @@ groupBox1 - 14 + 11 127, 56 @@ -1114,7 +1087,7 @@ groupBox1 - 15 + 12 True @@ -1141,7 +1114,7 @@ groupBox1 - 16 + 13 127, 27 @@ -1162,7 +1135,7 @@ groupBox1 - 17 + 14 True @@ -1189,7 +1162,7 @@ groupBox1 - 18 + 15 Fill @@ -1198,7 +1171,7 @@ 0, 35 - 729, 474 + 729, 499 3 @@ -1246,7 +1219,7 @@ Bottom - 0, 509 + 0, 534 729, 60 @@ -1344,11 +1317,14 @@ True + + 25 + 6, 12 - 729, 569 + 729, 594 Edit or add a [VMess] server @@ -1387,6 +1363,6 @@ AddServerForm - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + v2rayN.Forms.BaseServerForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx index 7c5b3623..489f5fd2 100644 --- a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -130,14 +130,14 @@ *手填,方便识别管理 - 不清楚则保持默认值 + 底层传输方式(transport) - 95, 12 + 149, 12 - 3)QUIC 加密密钥 + 3)QUIC 加密密钥/Kcp seed 95, 12 @@ -145,11 +145,23 @@ 4)QUIC 加密方式 - - 53, 12 + + 167, 12 - - 默认true + + 跳过证书验证(allowInsecure) + + + 223, 7 + + + 350, 36 + + + 143, 12 + + + *默认tcp,选错会无法连接 149, 12 @@ -157,6 +169,27 @@ 3)h2 host中间逗号(,)隔开 + + 127, 168 + + + 127, 32 + + + 211, 20 + + + 9, 36 + + + 107, 12 + + + 传输协议(network) + + + 9, 168 + 65, 12 @@ -169,11 +202,20 @@ 1)http host中间逗号(,)隔开 + + 9, 237 + - 77, 12 + 107, 12 - 底层传输安全 + 底层传输安全(tls) + + + 127, 237 + + + 282, 71 197, 12 @@ -182,28 +224,31 @@ *tcp或kcp或QUIC伪装类型,默认none - 124, 58 + 127, 102 334, 51 + + 9, 71 + 89, 12 伪装类型(type) + + 9, 102 + 89, 12 伪装域名(host) - - 143, 12 - - - *默认tcp,选错会无法连接 + + 127, 67 113, 12 @@ -211,18 +256,6 @@ *随便选,建议(auto) - - 127, 171 - - - 211, 20 - - - 107, 12 - - - 传输协议(network) - 127, 143 diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs b/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs new file mode 100644 index 00000000..7fe6a797 --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseServerForm.Designer.cs @@ -0,0 +1,51 @@ +namespace v2rayN.Forms +{ + partial class BaseServerForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BaseServerForm)); + this.SuspendLayout(); + // + // BaseServerForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 273); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "BaseServerForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "BaseServerForm"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.cs b/v2rayN/v2rayN/Forms/BaseServerForm.cs new file mode 100644 index 00000000..84711727 --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseServerForm.cs @@ -0,0 +1,18 @@ +using System; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class BaseServerForm : BaseForm + { + public int EditIndex { get; set; } + protected VmessItem vmessItem = null; + + public BaseServerForm() + { + InitializeComponent(); + } + + } +} diff --git a/v2rayN/v2rayN/Forms/BaseServerForm.resx b/v2rayN/v2rayN/Forms/BaseServerForm.resx new file mode 100644 index 00000000..61360d3d --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseServerForm.resx @@ -0,0 +1,1253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAIAAAACAAAAAwAA + AAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAADAAAAAwAAAAMAAAADAAAAAgAAAAIAAAACAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAA + AAIAAAADAAAABAAAAAUAAAAGAAAACAAAAAgAAAAKAAAACgAAAAsAAAAMAAAADQAAAA0AAAANAAAADQAA + AAwAAAALAAAACgAAAAoAAAAIAAAACAAAAAYAAAAFAAAABAAAAAMAAAACAAAAAQAAAAEAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAQAAAAIAAAACAAAABAAAAAUAAAAHAAAACQAAAAwAAAAOAAAAEQAAABMAAAAVAAAAFwAA + ABgAAAAaAAAAGwAAABwAAAAcAAAAHQAAAB0AAAAcAAAAHAAAABsAAAAaAAAAGAAAABcAAAAVAAAAEwAA + ABEAAAAOAAAADAAAAAkAAAAHAAAABQAAAAQAAAACAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAAEAAAABwAAAAkAAAAMAAAAEAAA + ABMAAAAXAAAAGgAAAB4BAQAgAgEBIwMDASUDAgEmAwMBKAUEASkGAwMrCAUDKwgFAysIBQMsCAUDLAgF + AysIBQMrBgMDKwUEASkDAwEoAwIBJgMDASUCAQEjAQEAIAAAAB4AAAAaAAAAFwAAABMAAAAQAAAADAAA + AAkAAAAHAAAABAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA + AAQAAAAHAAAACgAAAA4AAAASAAAAFwAAABwAAAAgAwIBJAUDAicGBAIqBQUCKwICAi0FAwMvCQcEMQgH + BjACAwQwAAECMQYFBTURDgg5GRMJPBwWCz0cFgs9GRMJPBEOCDkGBQU1AAECMQICBDAIBwYwCQcEMQUD + Ay8CAgItBQUCKwYEAioFAwInAwIBJAAAACAAAAAcAAAAFwAAABIAAAAOAAAACgAAAAcAAAAEAAAAAgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAUAAAAIAAAADQAAABIAAAAXAQAAHQIBASIDAgEmBgMDKgQD + AywAAAEtBQQEMRYRCTckHA0+OCoTSlU/G19sUCF1elomhoZjKZWOaCufkmstqphwL7Kccy+3nnQwup51 + MLqccy+3mXEvspNsLaqOaSufh2QqlHtbJ4ZtTyJ1Vj8cXzgpE0okHA0+FhEJNwUEBDEAAAEtBAMDLAYD + AyoDAgEmAgEBIgAAAB0AAAAXAAAAEgAAAA0AAAAIAAAABQAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAADwAA + ABUAAAAcAgIAIgQCAicFBAErBAMDLgUEBDAWEQo5QjEWT2BHH2d6WiaHkGssq6B2MMWtfzTbt4Y367+M + OfXEjzv5yZM8/M2WPv7PmD7/0Zk//9KaP//Tmz//05s//9OaP//Smj//0Jg+/82WPv3KlD37xZA7+cCM + OvW4iDjrroA126F2McWRbCyre1smh2FHH2dCMRZPFhEKOQUEBDAEAwMuBQQBKwQCAicCAgAiAAAAHAAA + ABUAAAAPAAAACgAAAAYAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAwAAAAYAAAAKAAAAEAAAABcBAQAeAwIBJAYDAyoBAAEsBwUEMSIaDDxSPBtaelomhpRt + LbGoezPVt4Y37MSQO/nMlj3/0Zk//9WcQP/YnkH/2J5B/9ieQP/XnkD/155A/9eeQP7XnkD+155A/tee + QP7XnkD+155A/teeQP7XnkD+155A/9eeQP/YnkD/2J5B/9ieQf/WnED/0po//82WPf/FkTv5uog47Kp8 + M9WVbi6xelomh1E8GlshGQw8BwUFMgEAASwGAwMqAwIBJAEBAB4AAAAXAAAAEAAAAAoAAAAGAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAAEQAAABgBAQAgBAMBJgUD + AysDAgMvGRIKOVQ+G1p+XSiKm3MvvrKDNubCjjr5zZY+/tWcQP/XnUD/2J9B/tieQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5A/9ifQf7XnUD/1ZxA/8+YPv7Djzv5s4M25pxyL799XCeLUj0bWhkT + CzkDAgMvBQMDKwQDASYBAQAfAAAAGAAAABEAAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA + AAQAAAAJAAAADwAAABcBAQAfBAMBJgMCASsIBgQwMSQRQ2xQIXOUbS2xr4A14cOOO/nPmD7/1p1A/9ie + QP/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tieQP/WnUD/0Jg+/8SPO/mvgTXhlG0usWtOInQwIxJDCAYEMAMCASsEAwEnAQEAHwAA + ABcAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAHAAAADQAAABQBAQAdBQQBJQUFAiwGBQQwRDMXTXxc + J4ahdjHKuog48syVPf7VnED/155B/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/9Wc + QP/Nlj3+uok486B2Mcp6WiaGQjIWTgYFBDAEAwIsBAMBJQEBAB0AAAAUAAAADQAAAAcAAAADAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAACgAA + ABEAAAAaAwIBIwUDAioHBgQvQDAVSoFeKIynejLTv4w6+NCYPv/XnkD/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7XnkD/0Jk+/8CNOvimejLTfl0njT0u + FEoGBQQvBQMCKgMCASMAAAAaAAAAEQAAAAoAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAAAADAAAABwAAAA0AAAAWAQAAHwQDASgDAgIuNScSRHxbJoOnejPSwY06+dKa + P//YnkD+2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5B/tObP//Bjjr5pXky03hZJoQzJhJEAwMCLgQDASgBAAAfAAAAFgAA + AA0AAAAHAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAgAAAAQAAAAGQQC + AiQDAQIqFBAINWlOIWuedDDBvos59dGZP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + Qf/Smj//vYs59ZtyL8JlSh9sEw8INQMBAioEAgIkAAAAGQAAABAAAAAIAAAAAwAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAgAAAAQAAAAKAAAAEwIBAR0FAwInAQECLUg1GE2QaiyjtoU3686WPf/XnUD/2J5A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/zpc+/7SEN+yLZiqlRTMXTwEB + Ai4FAwInAgEBHQAAABMAAAAKAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADAAAABUDAgEgBAIBKBoU + CTVxUyNxpnkyzcWQO/zVnED/2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/1ZxA/8WQO/yidzHPak8hcxkTCTUEAgEoAwIBIAAAABUAAAAMAAAABQAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAACAAAABgAAAA0AAAAXAwMBIgIBAis4KhNDj2ksm7iHN+7QmD7/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/tCZ + Pv+2hTfviGQqnTUnEkUDAgIrAwMBIwAAABcAAAANAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAOAQEAGQQCAiQIBgMsXEQdWaB2 + Mb3Djzr51ZxA/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tacQP/Cjjr5mnAvv1U/G1sIBgMtBAICJAEB + ABkAAAAOAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAIAAAAHAAAADwEBABkFAwIlCQcDLnVWJHCvgDXZzJY9/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/LlT3/qHwz2m1QInIJBwMvBQMCJgEBABkAAAAPAAAABwAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAA8CAQAaAwIBJhIOBjJ/Xid+toY35tGZ + P//YnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7RmT7/sYI26HZX + JYARDQYzBAIBJgIBABoAAAAPAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + AAYAAAAOAQEAGgYFASYjGgw4jGcrkLuJOO7Tmz//2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7UnD//toY374FeKJIgGAs5BgUBJwEBABoAAAAOAAAABgAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADQIBABkBAQEkLCENOpJrLZnAjTrz1Js//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/VnED/u4k49IdjKZwpHw07AgEBJAIBABkAAAANAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA + AAwBAQAXBgQBJSwiDjmXby2fw4469tadQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vYs594tmKqEqHg07BwUBJQEB + ABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAKAQEAFgMCASImHAw2lm4umMSPO/bVnED+155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/VnED+vos59ohkKZsiGgw4AwIBIgEBABYAAAAKAAAABAAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAACQEB + ABMGBAIhFQ8IMJJrLY/Djzrz1p1A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vIo59INh + KZMUDggxBgQCIQEBABMAAAAJAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAQBQICHQgGAyqHYyl8wI067tWcQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/uIc38HhYJYAIBgMrBQICHQAAABAAAAAGAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADQQD + ARoEAwEnf10mbr2LOebVnED/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/UnD//s4M26HBSInEFAwEnBAQBGgAAAA0AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAoFAwIWAQABI2hNIFW5hzjY05o//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/RmT//qn0021tCHFoDAQEjBAMCFgAA + AAoAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAHAwICEgAA + AB9GNBU/roA0vdCZPv7XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7Mlj3/nXIwwTwsEkEAAAEfAwICEgAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA0GBAMbHRUJLaF2MJnMlT35155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Djzv6jGcrnhoT + CC8HBAMbAAAADQAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJBgQDFgAA + ACOGYiluxpE779adQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQ//cq1n/2qVN/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9adQP+5hzfwc1QjcwAAACQGAwMWAAAACQAAAAMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABgIBARAAAAEdW0MbR7mIN83Um0D/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2KFH/+XCiP/pypf/26dS/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZ + P/+nejPRTjkYSgAAAR0CAQEQAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMBAAEKBgMDGBwU + CSypfDOh0Jg+/deeQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Zokf/6cqX//jw5P/qzZ7/2aNL/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155B/seSPP2SayynGBEILQcDAxgBAAELAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAACAAAABwcEAxECAAIghWEoZciSPOvXnUD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr3//n06//mw4v/2aRM/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/1p1A/reHN+1uUSFqBAICIAcEAhEAAAAHAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAwALAAAAGE05 + Fzm6iDe/1ZtA/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f7+//jv + 4//nxY7/2aJJ/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0Jg+/6F3McVBMBQ9AgIAGAID + AAsAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABggGAhIHBQMgnHMvf8+YPvbXnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z69//9/f7//f39//jw4v/kvX//2aJI/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/YnkH/wY4694JhKIQIBgMhCAYCEgAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEBAELAQEAGFxC + G0DCjjrR151A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//bs3P/kv4L/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Tmz//q3401Us3 + F0MCAgAYBQMBCwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABQkHARACAgEgpXgxh9KaP/rYnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//fz8//br2f/huHX/2KFF/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/FkDv7iWQpjQQCASEJBwERAAAABQAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAwAJAAAAFWhL + H0HGkTzS2J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//Xo1P/iuXf/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSb + QP+tfzTWVD0ZRQAAABUDAwAJAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABAsIAw4HBQIdpnkygNObP/nYnkH+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//fz6//Tl + zv/fs2v/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/sSQO/qJZCmHCQYCHgsIAw4AAAAEAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBQEHBgYAE1Q+ + GTTFkTvI155B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Pky//gtW3/159C/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/0po//6p8M85FMRQ4BwcBEwYFAQcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkGBAsCAAEZnHMvatObP/LYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//Pv4//Hfwf/er2H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/wI069H5cJnIDAgIZCQYECwAA + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFCgQFDzUn + ESfAjTqt155B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv5//Hfwv/esWb/155B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7QmD7/n3YwtCwhDioLBQYQAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQoJAQgAAAAShmIoTM+YPt/YnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//Pn1/+/Ztv/drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9adQP+2hjfkaE0gUgAA + ABIJCQEIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEw0GCw4K + BRmygjWC1p1A+teeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pn2/+/Y + tf/drV3/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5B/siTPPuOaSuKDwsFGxMNBgsAAAADAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUEAAQEBAANRjQVKMiSPLrYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+/fx/+3Uq//bqVX/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0po//6h7 + M8I2JxErBgUADQUEAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDgoFBgYE + AhGOaCpK05s/5tieQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f7/+/fy/+zSqP/bqVX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUD/vIk56m1PIVMJBQMSDgoEBgAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIUEQMIAAAAFLSENnvXnUH5155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+vTs/+rOof/apk//154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + QP/Ikzz6jWgrhAAAABUUEQMIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxcP + Bws+LBMhyJI8rdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3/+vTs/+rMnP/apU7/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tKZP/+keDK0MSMPJRcPBwsAAAADAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAAADIRgJznRmT/S2J9B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+fHm/+jJ + lv/Zo0r/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/1p1A/7SFNthlSh5AAAAADAABAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsV + BgUAAAAMpXkyV9acQOvYnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+PLm/+fGj//Zo0r/154//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/wY06735cJl4AAAANGRQFBgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIxcMBwwHBRK7iTl82J5B/NeeQf7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/fz/9+7g/+bDi//YoUb/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9ieQf7LlT38lGwthg8KBhQiFgsHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEQCAcIQS4UG8iSPKLZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pz/9+7g/+S/gv/YoUf/154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tGZPv+leTGsMyQPHRMK + CAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAABkVw0ACwoAAgAAAAhcQxwizpg+wdmfQf/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/Pz/9erX/+S+gP/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/1ZxA/7CBNchCMBQmAgEACAoKAAJLQQoAAAAAAAAAAAAAAAAAAAAAAAAA + AAAcEQsCBwAFCodiKTPUmz/c2J5B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/9uvZ/+K5 + dv/YoEX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUH/uog34GRK + HjoLBAYKGxALAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8VCgMLBgQLpXkxTNadQO7YnkH/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8+TM/+G3c//Xn0L/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9ieQf/Cjjrwf10mVQ4IBQweFAoDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAIBcJAwsIAg21hDZj155A9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/8+/r/9ObR/9+zaf/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8eS + PPeOaCtsDgoEDR8WCQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVDgcEAAABDL+MOXfXnkH4155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8d/C/9+yaf/Xn0H/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/y5U9+phwLoAAAAIMFQ4HBAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAASAfAQQAAAAMxpA7idieQfzXnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/8+/n/8uDF/92vYv/Xn0L/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Plz79oHYwkAAAAAwfHgEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABKxoQBQwKBQ/JkzyX2J5B/tee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/8+/n/79m2/92t + X//XnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZP/+leTKeDAkFEigYDwUAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAE4IxUFRC8UE82WPaTYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/8+vf/8Nu6/9ysW//Xn0H/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD+05s//6x+M6s0JBEYNiMTBgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAS8eEAZcQhwXz5g+rtie + Qf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/7+fX/7NOq/9upV//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Um0D/sIE0tEYzFhwvHhEGAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAABKRoPBmlMIBnQmT+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PP/7dWu/9uoVf/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tWcQP+0gza7UzoYHioaDwYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAE5Kg4FcVMiGtGZ + PrjYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/69u//6s2d/9qmT//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+1ZxA/7WENr5aQBkfOSsPBgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAADwsDwV1VSIa0Zk+uNieQf/XnkD+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/69vD/69Ci/9qm + UP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7VnED/tYU2vltCGh89LRAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCATBHNU + IhjSmj+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/58+n/6MiU/9qkTP/Xnj//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tWcQP+1hTa6WUAaHTUh + EwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKRcEa04gFdGZP67YnkH/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /v/58uj/6MiU/9mkS//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+1ZtA/7ODNbRSPRcaPSYWBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFM0 + HgRbQhwQ0Jg+pdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/37+H/5cGH/9miSP/Xnj//155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Tmz//sIE0q0Uy + FhVKLxoEAAAAAAAAAAAAAAAAAAAAAAAAAACCRD4AYC4xAyQXDArPlz6W2J5B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//YoUf/6cmX//z6 + 9//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PT/+fLo//38+//9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/37uD/5cKI/9iiSP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/tKaP/+rfTOdHRMKDlQpKwNpNzIAAAAAAAAAAAAAAAAAAAAAACQb + CgBVPhcCAAAABs2WPYfYnkH8155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9ihR//pyZf//Pr3//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f7///ft3v/pypn/9ejT//38+//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/P/27Nv/471//9ih + Rf/Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/0Jg+/ah7 + Mo4AAAAHUDsWAiMaCQAAAAAAAAAAAAAAAAAAAAAAPzMNADUvCgEAAAAFyZM9ddieQfnYnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/96wZP/ht3P/8+TM//z7 + +v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/P/26tj/47x9/9igRP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Nlj36pHgxfQAAAAU2MAoBPzMNAAAAAAAAAAAAAAAAAAAA + AABuUB4AVj8XARsTBQbGkDte2J5B9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//3+///26tn/3a5f/9igQ//htnD/8+LJ//z7+f/9/f7//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38 + +v/159P/4rh0/9ifQ//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8mT + PPadcy9nIBcHBlE7FgFmShsAAAAAAAAAAAAAAAAAAAAAAH1bIgBrTh0BKB0JBcCMOkbYnkHu2J5B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150+/9ef + Qv/gs2v/8d/B//z6+P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38+//05c7/4bdy/9efQv/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/xZE78JduLU8rHwoFYEYaAW1QHgAAAAAAAAAAAAAA + AAAAAAAAi1M4ALluSwASABEDsYI2LNedQN3Zn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9efQv/fsWf/8d6///z59v/9/f7//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//z7+P/z48r/37Nq/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + Qf/AjTnghGIoMhsGEgOPVToAckQuAAAAAAAAAAAAAAAAAAAAAAB/dAsAvasRAAARAAKacC4Y1ZxAwdmf + Qf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed + P//XnkD/155A/9eeQf/esGT/79m3//v49P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//z7+f/x4MP/37Np/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/1ZxA/7mHN8dwUiIbCh4AArGgEAB6bwoAAAAAAAAA + AAAAAAAAAAAAAEZHAAAADwAATT8MAolkKQ7Smj+g2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9efQf/drV7/7tex//v3 + 8P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//z59v/w3sD/3a5g/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Smj//soI2qWhMIBBZSA8CABAAAEdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR4PACfZzcBRTAXBs+Y + PnjZn0H92J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u + YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/cq1n/69Gl//r28P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//v6 + 9v/v2rf/3q5h/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/s6XPf2pfDOBOygVCIpZMAKVYzIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAt25JAL9yTQEAAAAAyJI8TtieQezYn0H/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee + QP/bqVT/69Gl//r17P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//v48//u2LT/26lW/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkH+yJI87590MFQAAAABlVk8AY5WOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADixB0A/+AeAAAA + AADAjDkt151A0tmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq + 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/aqFP/6cuZ//n07P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//v49P/s0qj/3KpY/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edQP+/jDnXlGwsMgAAAADjyBsAy7AaAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcPx4AfU8rAqF1MBHVnD+r2Z9B/9ieQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/apU3/6cyb//nx5v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//r27v/s0af/2qVO/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkD+1JtA/7eGNrF3VyQWdksoAlM5GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdO + GQCMdxUBAAAAAtGZPnTZn0H52J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+ + ///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//apEz/5sSL//ny + 5//9/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f3+//v48v/py5r/2qdS/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQP7Olz76rX40fAAAAAONeBUBZU0ZAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArXY3AMqKQQAtFhICyJM9PtieQejYnkH/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yokj/58eR//fv4f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//nz + 6f/pyZf/2aNL/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/8aRO+ueczBGOSAVAq53OACZaDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACSghAAtrAHAAADAAGwgDYV1p1AutmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/5L6B//ft3v/8/Pr//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//r17f/nxpH/2qVN/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/u4k4wIJfKBgbGAABop0GAId4 + DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+dEsAvWpTAXdSJgXSmj972Z9B/Nie + QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoEX/5cGF//br2f/9/fz//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//jw4//mxIz/2KJH/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/s+YPv2xgjWDWz0cB6pgSQGkZEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAO+CbgD+iXYA//+JAMuUPTvYnkHf2J9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/YoET/4bh1//Xo1P/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//ny6P/lwof/2aNJ/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/xZA746J3MUH//4YA8oJxAd55 + ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJMKACQVDgBtIM3Etad + QKvZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KFH/+nJ + l//8+vf//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoET/4rp5//Tn + 0P/9/Pv//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//bs3P/kvX//2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5A/tObP/+6iDiwiGMrFZpcOQFrRyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAnVxAALlxSAEAABMB0po/XtmfQfTYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + Qf/Xn0L/159C/9efQv/Xn0L/159C/9efQv/Zo0n/6cqY//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0L/37Jn//Lgxf/8+vf//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//fu + 4P/kvX7/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH+y5U99q6ANGUGABcCn2E+AY1T + OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyiycAyJ0rAB4k + AAHDjzse155BydmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2qZQ/+K5dv/kvoH/5L6A/+S+gP/kvoD/5L6A/+XA + hf/v27r//Pv5//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0L/4LNr//LgxP/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Tn0v/iuXb/2J9D/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9WdQP/AjTrNmXEuITk1AAGphSUAm3kiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKfU4AynRVAaNvNQPUmz922Z9B+tifQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//gtGz/9OjU//r38P/69u//+vbv//r27//69u//+vbw//v59f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0H/3a5g/+/auP/8+fT//f3+//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//fz8//Xo1P/iuHT/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D+zpc9+7OENn10UCYFv25PAbRw + RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+B + gwD/i5AA//91AMuWPSzYnkHS2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/150//+C2b//37uD//f7+//39/v/9/f7//f3+//39 + /v/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed + P//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xn0H/3a9h/+/Ztv/7+fX//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv6//LiyP/fs2v/159B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9adQP/EkDrWo3gxMf//ZAC2Wl0AqlVWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZaPQDLZWYBjmcpBdWcP37Zn0H62J9A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnT//4LZv//fu3//9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KtZ/+3U + rf/69/D//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//Pv5//Lhxv/fsmj/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/z5g++7eGNoRoSx4GolBQAX9L + MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAwXFRANB5VwBGAEQBzZc+KNieQdLZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edP//gtm//9+7f//39/v/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u + YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KpZ/+zSqf/69vD//f3+//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pr3//Dd + vf/er2P/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9adQP/FkDvVpnozLFoORQG3a00ArGRJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/mswA87wPAP/AWgDCjzUD1p1Ac9mf + QfjYn0D+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/150//+C2b//37t///f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/26hT/+rPov/69Oz//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pr2/+/bu//drV//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0D+z5g++bmIN3mMaSUE/+FqAPSv + DgD/v/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD//wAA//8AAP/+agDTmkEf2J5Bv9mfQf/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnT//4LZv//fu4P/9/v7//f3+//39 + /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//v7///br + 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/26hU/+rMnf/59Or//f3+//39 + /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39 + /v/9/f7/+/n1/+7Xs//drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9WdQP/EkDvDrH00Iv//dwD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGdVEA1YJTAF4h + PQHVnEBW2Z9B7difQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//gtW3/9erY//z59v/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 + 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+vf/9OfS/92tX//XnT//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2qVP/+nJlv/37+H//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 + 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX/+fPq/+zSqP/bp1P/154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+zZY97riHN1pbJTECtm9HAbBo + SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+sVQD/3nIAwXpDAceROw3XnkGd2Z9B/tifQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9upV//mxYz/6syb/+rM + m//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM + nP/mw4n/2qZP/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2qVO/+O9 + f//pzJr/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM + m//qzJv/6syb/+rMm//qzJv/58WO/9yrW//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tObP//CjjqhnnIvD7RzPgHLh0UAwIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfK + HgDu0xsA5aVJANKZPy7YnkHO2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155B/9igQ//YoET/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig + Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBE/9ifQ//XnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159C/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig + Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igRP/YoET/159C/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnkD/yZM80bKCNjHVmkcA9tkcAOfK + HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaSNADwpkgBpXwvA9acP2HZn0Hy2J9B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/8+YPvO9iThliGQpBMuNPQG8ijEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA6s8bAOXPFgD//wAAzZc8C9edQJPZn0H62J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9efQP7Tmz/7xJA7l6h9MQz//wAA5ccWAOrP + GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6pWAP+wWQD//0MA0Jg/JNif + Qb/Zn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkD+1p1A/8qUPcG0hDcn//9RAP+0WwD/qlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAwIs2AMaKPABOQBEB151AP9mfQdrZn0H/2J5A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQf/Plz7cwIw5QlxRGwHWlEAAyJE4AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP+7 + dgDXik8B151BW9mfQejZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0D/0Zo/6cSPO16dYz0C/+KKAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gIAA/3yEAP+6egDVmj8H2J5Ac9mfQfHYn0H+155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSbP/LJkjx2sYA1CP/ikQD/fIQA/4CAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADAgEAAxIVAAKJbQAHOlj4O2J5AitmfQfbYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9if + QP7VnD/3ypQ9jbKAOA++bkkBwoRAAMGBQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/gEAAxYRCAP///wDOmD4U2J9Bldmf + QfrYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0H+155A+82XPZi3hzgW//9PAMeGQwC/gEAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADSpiwA0qoqAMabGQDUmj8Z2J5BntmfQfrYn0H+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/tee + QPrRmT6gwo07GvrDIgDUrCoA1qktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD/4CcA/+seAMN8 + TwDZnkEY2Z9BltmfQffYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7XnkD30po/mMiTPBm6dUkA/+0eAP/gJwD//wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3SsA//YVAPHUHgDVm0EU2Z5Bi9mfQfLZn0H/2J5A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D/2J5A8tOa + P4zGkD0V//8qAP/4FQD/4iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + AAB+AIEAyZQ3AP//SADUmkAO2Z9BdNmfQejZn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J5B/9edQOnTmj91xo88D///KgDKlTcAfgCBAP//AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6ekAAv4FAAJ5YPwHJlj4G2Z5BXNmf + QdvZn0H/2J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159A/tifQf/YnkHb1Js/XbiI + NwepYUMBwoNAAL19QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC/gEAAv4BAALdxQQHXnEED2J9BQNmfQcHZn0H72J9B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9ifQf/Zn0H72J9BwdSdQEHPlz0DvXVEAb+AQAC/gEAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qlUA/6pVAP+t + WQDBjC4A2Z5BJdmfQZTZn0Hy2Z9B/9ifQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Yn0H/2Z9B8tmfQZTXnUAlqHoqAP+v + WQD/q1UA/6tVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAOCaRQAIAEwA155AC9ieQWLZn0HQ2Z9B/dif + Qf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0H+2Z9B/dmfQdDYnkFi155ACwoAUwDinEUA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/6tWAP+sVgD/k2MAx4tCA9ieQS/YnkGg2Z9B7tmfQf/Yn0D+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQe7YnkGg2J5BL8eLQgP/k2MA/6xWAP+r + VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAypc1APXnDwC4eD4Bn1w2ANab + Qg/Zn0FZ2Z9BxNmfQfjZn0H/2J5B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mf + QfjZn0HE2Z9BWdabQg+fXDYAuHg+AfXnDwDKlzUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaVMQDjzRMAxopOAeGlUAHZoEEh2J5Bd9mfQdXZn0H72Z9B/9if + QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQfvZn0HV2Z9BdtmgQSHhpVABxopOAePNEwDGlTEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+q + VQD/q1gA7dAbAYdJLQDbnUUE2J9CKtmfQYLZn0HV2Z9B+tmfQf/Yn0D/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD/2J9B/9ifQfrZn0HV2Z9Bg9if + QirgoEYEh0ktAO3QGwH/q1gA/6pVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/f4EA/3+BAP+fcgEMAIwA1pxIBNme + Qi7Zn0F72Z9BztmfQffZn0H/2J9B/tieQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + QP7Yn0D+2J9B/9mfQffZn0HO2Z9Be9qfQi7ZlkMFAgCRAP+ecgH/f4EA/3+BAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD/gIAA/4CqANp/XADzpFQB/9emAN6gQQTZn0Ae2Z9CY9mfQbDZn0Hj2Z9B/dif + Qf/YnkH/2J5A/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J5A/9ieQf/Yn0H/2Z9B/dmfQePZn0Gw2Z9CY9mfQB7eoEEE/+ezAPOm + VQHaf1wA/4CqAP+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9+ + hAD/foQA/6BzAY5EQwC6cUYB2Z9DEtmfQT7Zn0GB2Z9Bv9mfQezZn0H62Z9B/9ifQf/Yn0H+155A/tee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD+2J5B/9ifQf/Zn0H62Z9B7Nmf + Qb/Zn0GB2Z9BPtmfQxK6cUYBjkRDAP+gcwH/foQA/36EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA0KMtAN+pPwD/uGIAAAAAAOGi + SATbnkMV2aBBQtmfQXnZn0Gx2Z9B1tmfQfDZn0H+2Z9B/9mfQf/YnkH/2J5A/9eeQP/YnkD+155A/tee + QP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP/XnkD/2J5B/9if + Qf/Zn0H/2Z9B/tmfQfDZn0HW2Z9BsdmfQXnZoEFC255DFeGiSAQAAAAA/7hiAN+pPwDQoy0A//8AAP// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+ZbAD/iHsA/6BoAbohkgCBMUIA3aFBAdmeQBHYnkEt2Z9AUtqf + QX/Zn0Gm2Z9ByNmfQePZn0Hx2Z9B9tmfQfrZn0H+2Z9B/9ieQf/YnkH/2J5B/9ieQf/YnkH/2J5B/9ie + Qf/YnkH/2Z9B/9mfQf7Zn0H62Z9B9tmfQfHZn0Hj2Z9ByNmfQabZn0F+2Z9AUtieQS3ZnkAR3aFBAYEx + QgC6IZIA/6BoAf+IewD/mWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADSgFMA635uANaMSgD/jXgB7qBwAQAAIAD//2kA46NHBNueRAvYn0MW2Z9CLtmfQEnZn0Fj2Z9Bedie + QYzZn0Ge2Z9BrNmfQbbZn0G82Z9Bv9mfQb/Zn0G82Z9BttmfQazZn0Ge2J5BjNmfQXnZn0Fj2Z9ASdmf + Qi7Yn0MW255EC+GkSgP///8AAAAbAO6gcAH/jXgB1oxKAOt+bgDSgFMAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/p1oA/94hAP+Z + awH/rGAB/2SnAP/B6gC9f2oAqngnAcCcGgDRpzoA0ao7AdudPwfZnD8M2KBBEdmgQxTaoEIX2qBCF9mg + QxTYoEER2Zw/DNudPwfRqjsB0ac6AMCcGgCqeCcBvX9qAP/B6gD/Y6YA/6xgAf+ZagH/3iEA/6daAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA/6NgAOOUUADLkzkB951ZAP/P + MQD/mW4B9qlcAbJxQwGhWz8Bj0U8AX0yOgF9MjoBj0U8AaFbPwGycUMB9qlcAf+ZbgH/zzEA951ZAMuT + OQHjlFAA/6NgAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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////////4AAAB///////////////+AAAAAAf/////////////+AAAAAA + B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////4AAAAAAAAAf//////////8AA + AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH/////// + //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////wAAAAAAAAAAAA////////wAAAAAAAAAAAAD/ + //////4AAAAAAAAAAAAAf//////8AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAAf//////AAAAAAAAAA + AAAAD//////gAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAA + AAAAAAAAAAD////+AAAAAAAAAAAAAAAAf////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///4 + AAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAA + B///wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAA + AAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAA + AAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/gA + AAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA + AB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA + AAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAA + AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAA8AA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA + AAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA + AAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA + AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAv/4A + AAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAA + AP//QAAAAAAAAAAAAAAAAAL//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAA + AAAAAAP//9AAAAAAAAAAAAAAAAAL///gAAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///QAAAAA + AAAAAAAAAAAv///4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAB////0AAAAAAAAAAAAAAAC////+ + AAAAAAAAAAAAAAAAf////gAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAB + /////9AAAAAAAAAAAAAAC//////gAAAAAAAAAAAAAAf/////9AAAAAAAAAAAAAAv//////gAAAAAAAAA + AAAAH//////9AAAAAAAAAAAAAL///////gAAAAAAAAAAAAB///////8AAAAAAAAAAAAA////////gAAA + AAAAAAAAAf///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////// + //4AAAAAAAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////gAAAAAAAAB/// + /////////AAAAAAAAD////////////4QAAAAAAh/////////////4AAAAAAH//////////////gAAAAA + H///////////////gEACAf////////////////AAAA////////////////////////////////////// + //////////////////////////////////8= + + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index 13ce7b39..86a73954 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -30,12 +30,14 @@ { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.scMain = new System.Windows.Forms.SplitContainer(); this.lvServers = new v2rayN.Base.ListViewFlickerFree(); this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); this.menuAddVmessServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddVlessServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuAddShadowsocksServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuAddSocksServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddTrojanServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuAddCustomServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuAddServers = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen = new System.Windows.Forms.ToolStripMenuItem(); @@ -55,13 +57,14 @@ this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); - this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); + this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components); this.menuSysAgentMode = new System.Windows.Forms.ToolStripMenuItem(); @@ -70,10 +73,13 @@ this.menuGlobalPAC = new System.Windows.Forms.ToolStripMenuItem(); this.menuKeep = new System.Windows.Forms.ToolStripMenuItem(); this.menuKeepPAC = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepPACNothing = new System.Windows.Forms.ToolStripMenuItem(); this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); this.menuCopyPACUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.menuUpdateSubscriptions = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.menuExit = new System.Windows.Forms.ToolStripMenuItem(); this.bgwScan = new System.ComponentModel.BackgroundWorker(); @@ -98,6 +104,7 @@ this.tsbSub = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbSubSetting = new System.Windows.Forms.ToolStripMenuItem(); this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbQRCodeSwitch = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); this.tsbOptionSetting = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); @@ -107,20 +114,22 @@ this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); this.tsbCheckUpdatePACList = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.tsbCheckClearPACList = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton(); this.tsbAbout = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbV2rayWebsite = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.tsbLanguageDef = new System.Windows.Forms.ToolStripMenuItem(); this.tsbLanguageZhHans = new System.Windows.Forms.ToolStripMenuItem(); this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.tsbClose = new System.Windows.Forms.ToolStripButton(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit(); + this.scMain.Panel1.SuspendLayout(); + this.scMain.Panel2.SuspendLayout(); + this.scMain.SuspendLayout(); this.cmsLv.SuspendLayout(); this.cmsMain.SuspendLayout(); this.groupBox1.SuspendLayout(); @@ -129,25 +138,27 @@ this.tsMain.SuspendLayout(); this.SuspendLayout(); // - // splitContainer1 + // scMain // - resources.ApplyResources(this.splitContainer1, "splitContainer1"); - this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; - this.splitContainer1.Name = "splitContainer1"; + resources.ApplyResources(this.scMain, "scMain"); + this.scMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.scMain.Name = "scMain"; // - // splitContainer1.Panel1 + // scMain.Panel1 // - this.splitContainer1.Panel1.Controls.Add(this.lvServers); + resources.ApplyResources(this.scMain.Panel1, "scMain.Panel1"); + this.scMain.Panel1.Controls.Add(this.lvServers); // - // splitContainer1.Panel2 + // scMain.Panel2 // - this.splitContainer1.Panel2.Controls.Add(this.qrCodeControl); - this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved); + resources.ApplyResources(this.scMain.Panel2, "scMain.Panel2"); + this.scMain.Panel2.Controls.Add(this.qrCodeControl); + this.scMain.TabStop = false; // // lvServers // - this.lvServers.ContextMenuStrip = this.cmsLv; resources.ApplyResources(this.lvServers, "lvServers"); + this.lvServers.ContextMenuStrip = this.cmsLv; this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; @@ -158,6 +169,7 @@ this.lvServers.Name = "lvServers"; this.lvServers.UseCompatibleStateImageBehavior = false; this.lvServers.View = System.Windows.Forms.View.Details; + this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick); this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged); this.lvServers.Click += new System.EventHandler(this.lvServers_Click); this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick); @@ -165,11 +177,14 @@ // // cmsLv // + resources.ApplyResources(this.cmsLv, "cmsLv"); this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuAddVmessServer, + this.menuAddVlessServer, this.menuAddShadowsocksServer, this.menuAddSocksServer, + this.menuAddTrojanServer, this.menuAddCustomServer, this.menuAddServers, this.menuScanScreen, @@ -189,201 +204,219 @@ this.menuTcpingServer, this.menuRealPingServer, this.menuSpeedServer, + this.tsbTestMe, this.toolStripSeparator6, this.menuExport2ClientConfig, this.menuExport2ServerConfig, this.menuExport2ShareUrl, this.menuExport2SubContent}); this.cmsLv.Name = "cmsLv"; - this.cmsLv.OwnerItem = this.tsbServer; - resources.ApplyResources(this.cmsLv, "cmsLv"); // // menuAddVmessServer // - this.menuAddVmessServer.Name = "menuAddVmessServer"; resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); + this.menuAddVmessServer.Name = "menuAddVmessServer"; this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); // + // menuAddVlessServer + // + resources.ApplyResources(this.menuAddVlessServer, "menuAddVlessServer"); + this.menuAddVlessServer.Name = "menuAddVlessServer"; + this.menuAddVlessServer.Click += new System.EventHandler(this.menuAddVlessServer_Click); + // // menuAddShadowsocksServer // - this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); + this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); // // menuAddSocksServer // - this.menuAddSocksServer.Name = "menuAddSocksServer"; resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); + this.menuAddSocksServer.Name = "menuAddSocksServer"; this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); // + // menuAddTrojanServer + // + resources.ApplyResources(this.menuAddTrojanServer, "menuAddTrojanServer"); + this.menuAddTrojanServer.Name = "menuAddTrojanServer"; + this.menuAddTrojanServer.Click += new System.EventHandler(this.menuAddTrojanServer_Click); + // // menuAddCustomServer // - this.menuAddCustomServer.Name = "menuAddCustomServer"; resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); + this.menuAddCustomServer.Name = "menuAddCustomServer"; this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); // // menuAddServers // - this.menuAddServers.Name = "menuAddServers"; resources.ApplyResources(this.menuAddServers, "menuAddServers"); + this.menuAddServers.Name = "menuAddServers"; this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen // - this.menuScanScreen.Name = "menuScanScreen"; resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); + this.menuScanScreen.Name = "menuScanScreen"; this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); // // toolStripSeparator1 // - this.toolStripSeparator1.Name = "toolStripSeparator1"; resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + this.toolStripSeparator1.Name = "toolStripSeparator1"; // // menuRemoveServer // - this.menuRemoveServer.Name = "menuRemoveServer"; resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); + this.menuRemoveServer.Name = "menuRemoveServer"; this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); // // menuRemoveDuplicateServer // - this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); + this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); // // menuCopyServer // - this.menuCopyServer.Name = "menuCopyServer"; resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); + this.menuCopyServer.Name = "menuCopyServer"; this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); // // menuSetDefaultServer // - this.menuSetDefaultServer.Name = "menuSetDefaultServer"; resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); + this.menuSetDefaultServer.Name = "menuSetDefaultServer"; this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); // // toolStripSeparator3 // - this.toolStripSeparator3.Name = "toolStripSeparator3"; resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); + this.toolStripSeparator3.Name = "toolStripSeparator3"; // // menuMoveTop // - this.menuMoveTop.Name = "menuMoveTop"; resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); + this.menuMoveTop.Name = "menuMoveTop"; this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); // // menuMoveUp // - this.menuMoveUp.Name = "menuMoveUp"; resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); + this.menuMoveUp.Name = "menuMoveUp"; this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); // // menuMoveDown // - this.menuMoveDown.Name = "menuMoveDown"; resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); + this.menuMoveDown.Name = "menuMoveDown"; this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); // // menuMoveBottom // - this.menuMoveBottom.Name = "menuMoveBottom"; resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); + this.menuMoveBottom.Name = "menuMoveBottom"; this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); // // menuSelectAll // - this.menuSelectAll.Name = "menuSelectAll"; resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Name = "menuSelectAll"; this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); // // toolStripSeparator9 // - this.toolStripSeparator9.Name = "toolStripSeparator9"; resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); + this.toolStripSeparator9.Name = "toolStripSeparator9"; // // menuPingServer // - this.menuPingServer.Name = "menuPingServer"; resources.ApplyResources(this.menuPingServer, "menuPingServer"); + this.menuPingServer.Name = "menuPingServer"; this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); // // menuTcpingServer // - this.menuTcpingServer.Name = "menuTcpingServer"; resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); + this.menuTcpingServer.Name = "menuTcpingServer"; this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); // // menuRealPingServer // - this.menuRealPingServer.Name = "menuRealPingServer"; resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); + this.menuRealPingServer.Name = "menuRealPingServer"; this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); // // menuSpeedServer // - this.menuSpeedServer.Name = "menuSpeedServer"; resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); + this.menuSpeedServer.Name = "menuSpeedServer"; this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // + // tsbTestMe + // + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); + this.tsbTestMe.Name = "tsbTestMe"; + this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); + // // toolStripSeparator6 // - this.toolStripSeparator6.Name = "toolStripSeparator6"; resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); + this.toolStripSeparator6.Name = "toolStripSeparator6"; // // menuExport2ClientConfig // - this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); + this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); // // menuExport2ServerConfig // - this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); + this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); // // menuExport2ShareUrl // - this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); + this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); // // menuExport2SubContent // - this.menuExport2SubContent.Name = "menuExport2SubContent"; resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); + this.menuExport2SubContent.Name = "menuExport2SubContent"; this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); // - // tsbServer - // - this.tsbServer.DropDown = this.cmsLv; - this.tsbServer.Image = global::v2rayN.Properties.Resources.server; - resources.ApplyResources(this.tsbServer, "tsbServer"); - this.tsbServer.Name = "tsbServer"; - // // qrCodeControl // resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); this.qrCodeControl.Name = "qrCodeControl"; // + // tsbServer + // + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + this.tsbServer.Name = "tsbServer"; + // // notifyMain // - this.notifyMain.ContextMenuStrip = this.cmsMain; resources.ApplyResources(this.notifyMain, "notifyMain"); + this.notifyMain.ContextMenuStrip = this.cmsMain; this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); // // cmsMain // - this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); resources.ApplyResources(this.cmsMain, "cmsMain"); + this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuSysAgentMode, this.menuServers, this.menuAddServers2, this.menuScanScreen2, this.menuCopyPACUrl, + this.menuUpdateSubscriptions, this.toolStripSeparator2, this.menuExit}); this.cmsMain.Name = "contextMenuStrip1"; @@ -393,77 +426,97 @@ // // menuSysAgentMode // + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.menuNotEnabledHttp, this.menuGlobal, this.menuGlobalPAC, this.menuKeep, - this.menuKeepPAC}); + this.menuKeepPAC, + this.menuKeepNothing, + this.menuKeepPACNothing}); this.menuSysAgentMode.Name = "menuSysAgentMode"; - resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); // // menuNotEnabledHttp // - this.menuNotEnabledHttp.Name = "menuNotEnabledHttp"; resources.ApplyResources(this.menuNotEnabledHttp, "menuNotEnabledHttp"); + this.menuNotEnabledHttp.Name = "menuNotEnabledHttp"; this.menuNotEnabledHttp.Click += new System.EventHandler(this.menuNotEnabledHttp_Click); // // menuGlobal // - this.menuGlobal.Name = "menuGlobal"; resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Name = "menuGlobal"; this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); // // menuGlobalPAC // - this.menuGlobalPAC.Name = "menuGlobalPAC"; resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC"); + this.menuGlobalPAC.Name = "menuGlobalPAC"; this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click); // // menuKeep // - this.menuKeep.Name = "menuKeep"; resources.ApplyResources(this.menuKeep, "menuKeep"); + this.menuKeep.Name = "menuKeep"; this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click); // // menuKeepPAC // - this.menuKeepPAC.Name = "menuKeepPAC"; resources.ApplyResources(this.menuKeepPAC, "menuKeepPAC"); + this.menuKeepPAC.Name = "menuKeepPAC"; this.menuKeepPAC.Click += new System.EventHandler(this.menuKeepPAC_Click); // + // menuKeepNothing + // + resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing"); + this.menuKeepNothing.Name = "menuKeepNothing"; + this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click); + // + // menuKeepPACNothing + // + resources.ApplyResources(this.menuKeepPACNothing, "menuKeepPACNothing"); + this.menuKeepPACNothing.Name = "menuKeepPACNothing"; + this.menuKeepPACNothing.Click += new System.EventHandler(this.menuKeepPACNothing_Click); + // // menuServers // - this.menuServers.Name = "menuServers"; resources.ApplyResources(this.menuServers, "menuServers"); + this.menuServers.Name = "menuServers"; // // menuAddServers2 // - this.menuAddServers2.Name = "menuAddServers2"; resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); + this.menuAddServers2.Name = "menuAddServers2"; this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); // // menuScanScreen2 // - this.menuScanScreen2.Name = "menuScanScreen2"; resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); + this.menuScanScreen2.Name = "menuScanScreen2"; this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); // // menuCopyPACUrl // - this.menuCopyPACUrl.Name = "menuCopyPACUrl"; resources.ApplyResources(this.menuCopyPACUrl, "menuCopyPACUrl"); + this.menuCopyPACUrl.Name = "menuCopyPACUrl"; this.menuCopyPACUrl.Click += new System.EventHandler(this.menuCopyPACUrl_Click); // + // menuUpdateSubscriptions + // + resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions"); + this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions"; + this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click); + // // toolStripSeparator2 // - this.toolStripSeparator2.Name = "toolStripSeparator2"; resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); + this.toolStripSeparator2.Name = "toolStripSeparator2"; // // menuExit // - this.menuExit.Name = "menuExit"; resources.ApplyResources(this.menuExit, "menuExit"); + this.menuExit.Name = "menuExit"; this.menuExit.Click += new System.EventHandler(this.menuExit_Click); // // bgwScan @@ -474,30 +527,31 @@ // // groupBox1 // - this.groupBox1.Controls.Add(this.splitContainer1); resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.scMain); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // // groupBox2 // + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.txtMsgBox); this.groupBox2.Controls.Add(this.ssMain); - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // // txtMsgBox // + resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52))))); this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); this.txtMsgBox.Name = "txtMsgBox"; this.txtMsgBox.ReadOnly = true; // // ssMain // + resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslSocksPortLab, this.toolSslSocksPort, @@ -510,7 +564,6 @@ this.toolSslBlank3, this.toolSslServerSpeed, this.toolSslBlank4}); - resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Name = "ssMain"; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // @@ -521,8 +574,8 @@ // // toolSslSocksPort // - this.toolSslSocksPort.Name = "toolSslSocksPort"; resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); + this.toolSslSocksPort.Name = "toolSslSocksPort"; // // toolSslBlank1 // @@ -537,8 +590,8 @@ // // toolSslHttpPort // - this.toolSslHttpPort.Name = "toolSslHttpPort"; resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); + this.toolSslHttpPort.Name = "toolSslHttpPort"; // // toolSslBlank2 // @@ -553,8 +606,8 @@ // // toolSslPacPort // - this.toolSslPacPort.Name = "toolSslPacPort"; resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort"); + this.toolSslPacPort.Name = "toolSslPacPort"; // // toolSslBlank3 // @@ -570,8 +623,8 @@ // // toolSslBlank4 // - this.toolSslBlank4.Name = "toolSslBlank4"; resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + this.toolSslBlank4.Name = "toolSslBlank4"; // // panel1 // @@ -580,11 +633,13 @@ // // tsMain // + resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32); this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbServer, this.toolStripSeparator4, this.tsbSub, + this.tsbQRCodeSwitch, this.toolStripSeparator8, this.tsbOptionSetting, this.toolStripSeparator5, @@ -596,51 +651,60 @@ this.tsbPromotion, this.toolStripSeparator11, this.tsbClose}); - resources.ApplyResources(this.tsMain, "tsMain"); this.tsMain.Name = "tsMain"; + this.tsMain.TabStop = true; // // toolStripSeparator4 // - this.toolStripSeparator4.Name = "toolStripSeparator4"; resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); + this.toolStripSeparator4.Name = "toolStripSeparator4"; // // tsbSub // + resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbSubSetting, this.tsbSubUpdate}); this.tsbSub.Image = global::v2rayN.Properties.Resources.sub; - resources.ApplyResources(this.tsbSub, "tsbSub"); this.tsbSub.Name = "tsbSub"; // // tsbSubSetting // - this.tsbSubSetting.Name = "tsbSubSetting"; resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); + this.tsbSubSetting.Name = "tsbSubSetting"; this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); // // tsbSubUpdate // - this.tsbSubUpdate.Name = "tsbSubUpdate"; resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); + this.tsbSubUpdate.Name = "tsbSubUpdate"; this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click); // + // tsbQRCodeSwitch + // + resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch"); + this.tsbQRCodeSwitch.CheckOnClick = true; + this.tsbQRCodeSwitch.ForeColor = System.Drawing.Color.Black; + this.tsbQRCodeSwitch.Image = global::v2rayN.Properties.Resources.share; + this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch"; + this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged); + // // toolStripSeparator8 // - this.toolStripSeparator8.Name = "toolStripSeparator8"; resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); + this.toolStripSeparator8.Name = "toolStripSeparator8"; // // tsbOptionSetting // - this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option; resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); + this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option; this.tsbOptionSetting.Name = "tsbOptionSetting"; this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); // // toolStripSeparator5 // - this.toolStripSeparator5.Name = "toolStripSeparator5"; resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + this.toolStripSeparator5.Name = "toolStripSeparator5"; // // tsbReload // @@ -650,95 +714,108 @@ // // toolStripSeparator7 // - this.toolStripSeparator7.Name = "toolStripSeparator7"; resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); + this.toolStripSeparator7.Name = "toolStripSeparator7"; // // tsbCheckUpdate // + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbCheckUpdateN, this.tsbCheckUpdateCore, this.tsbCheckUpdatePACList, + this.toolStripSeparator13, this.tsbCheckClearPACList}); this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; - resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); this.tsbCheckUpdate.Name = "tsbCheckUpdate"; // // tsbCheckUpdateN // - this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); + this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); // // tsbCheckUpdateCore // - this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); + this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); // // tsbCheckUpdatePACList // - this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList"; resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList"); + this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList"; this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click); // + // toolStripSeparator13 + // + resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13"); + this.toolStripSeparator13.Name = "toolStripSeparator13"; + // // tsbCheckClearPACList // - this.tsbCheckClearPACList.Name = "tsbCheckClearPACList"; resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList"); + this.tsbCheckClearPACList.Name = "tsbCheckClearPACList"; this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click); // // toolStripSeparator10 // - this.toolStripSeparator10.Name = "toolStripSeparator10"; resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); + this.toolStripSeparator10.Name = "toolStripSeparator10"; // // tsbHelp // + resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsbAbout, + this.tsbV2rayWebsite, this.toolStripSeparator12, this.tsbLanguageDef, this.tsbLanguageZhHans}); this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; - resources.ApplyResources(this.tsbHelp, "tsbHelp"); this.tsbHelp.Name = "tsbHelp"; // // tsbAbout // - this.tsbAbout.Name = "tsbAbout"; resources.ApplyResources(this.tsbAbout, "tsbAbout"); + this.tsbAbout.Name = "tsbAbout"; this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); // + // tsbV2rayWebsite + // + resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite"); + this.tsbV2rayWebsite.Name = "tsbV2rayWebsite"; + this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click); + // // toolStripSeparator12 // - this.toolStripSeparator12.Name = "toolStripSeparator12"; resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); + this.toolStripSeparator12.Name = "toolStripSeparator12"; // // tsbLanguageDef // - this.tsbLanguageDef.Name = "tsbLanguageDef"; resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); + this.tsbLanguageDef.Name = "tsbLanguageDef"; this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); // // tsbLanguageZhHans // - this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); + this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click); // // tsbPromotion // + resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); this.tsbPromotion.ForeColor = System.Drawing.Color.Black; this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion; - resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); this.tsbPromotion.Name = "tsbPromotion"; this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click); // // toolStripSeparator11 // - this.toolStripSeparator11.Name = "toolStripSeparator11"; resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); + this.toolStripSeparator11.Name = "toolStripSeparator11"; // // tsbClose // @@ -762,10 +839,10 @@ this.Shown += new System.EventHandler(this.MainForm_Shown); this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged); this.Resize += new System.EventHandler(this.MainForm_Resize); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); + this.scMain.Panel1.ResumeLayout(false); + this.scMain.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.scMain)).EndInit(); + this.scMain.ResumeLayout(false); this.cmsLv.ResumeLayout(false); this.cmsMain.ResumeLayout(false); this.groupBox1.ResumeLayout(false); @@ -780,7 +857,7 @@ } - #endregion +#endregion private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; @@ -804,7 +881,6 @@ private System.Windows.Forms.ToolStrip tsMain; private System.Windows.Forms.ToolStripDropDownButton tsbServer; private System.Windows.Forms.ToolStripButton tsbOptionSetting; - private System.Windows.Forms.ToolStripButton tsbReload; private System.Windows.Forms.ToolStripButton tsbClose; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; @@ -823,7 +899,7 @@ private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer; - private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer scMain; private QRCodeControl qrCodeControl; private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate; @@ -869,6 +945,16 @@ private System.Windows.Forms.ToolStripMenuItem menuTcpingServer; private System.Windows.Forms.ToolStripMenuItem menuRealPingServer; private System.Windows.Forms.ToolStripMenuItem menuNotEnabledHttp; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator13; + private System.Windows.Forms.ToolStripMenuItem menuUpdateSubscriptions; + private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite; + private System.Windows.Forms.ToolStripMenuItem menuKeepNothing; + private System.Windows.Forms.ToolStripMenuItem menuKeepPACNothing; + private System.Windows.Forms.ToolStripMenuItem tsbTestMe; + private System.Windows.Forms.ToolStripButton tsbReload; + private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch; + private System.Windows.Forms.ToolStripMenuItem menuAddVlessServer; + private System.Windows.Forms.ToolStripMenuItem menuAddTrojanServer; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index bef32c86..7d041432 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -1,1398 +1,1577 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.IO.Compression; -using System.Text; -using System.Windows.Forms; -using v2rayN.Handler; -using v2rayN.HttpProxyHandler; -using v2rayN.Mode; -using v2rayN.Base; - -namespace v2rayN.Forms -{ - public partial class MainForm : BaseForm - { - private V2rayHandler v2rayHandler; - private PACListHandle pacListHandle; - private DownloadHandle downloadHandle; - private List lvSelecteds = new List(); - private StatisticsHandler statistics = null; - - #region Window 事件 - - public MainForm() - { - InitializeComponent(); - this.ShowInTaskbar = false; - this.WindowState = FormWindowState.Minimized; - HideForm(); - this.Text = Utils.GetVersion(); - - Application.ApplicationExit += (sender, args) => - { - Utils.ClearTempPath(); - - v2rayHandler.V2rayStop(); - - HttpProxyHandle.CloseHttpAgent(config); - PACServerHandle.Stop(); - - ConfigHandler.SaveConfig(ref config); - statistics?.SaveToFile(); - statistics?.Close(); - }; - } - - private void MainForm_Load(object sender, EventArgs e) - { - ConfigHandler.LoadConfig(ref config); - v2rayHandler = new V2rayHandler(); - v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; - - if (config.enableStatistics) - { - statistics = new StatisticsHandler(config, UpdateStatisticsHandler); - } - } - - private void MainForm_VisibleChanged(object sender, EventArgs e) - { - if (statistics == null || !statistics.Enable) return; - if ((sender as Form).Visible) - { - statistics.UpdateUI = true; - } - else - { - statistics.UpdateUI = false; - } - } - - private void MainForm_Shown(object sender, EventArgs e) - { - InitServersView(); - RefreshServers(); - lvServers.AutoResizeColumns(); - - LoadV2ray(); - - HideForm(); - - } - - private void MainForm_FormClosing(object sender, FormClosingEventArgs e) - { - if (e.CloseReason == CloseReason.UserClosing) - { - e.Cancel = true; - HideForm(); - return; - } - } - - private void MainForm_Resize(object sender, EventArgs e) - { - //if (this.WindowState == FormWindowState.Minimized) - //{ - // HideForm(); - //} - //else - //{ - // //this.splitContainer1.SplitterDistance = config.uiItem.mainQRCodeWidth; - //} - } - - private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e) - { - //config.uiItem.mainQRCodeWidth = splitContainer1.SplitterDistance; - } - - //private const int WM_QUERYENDSESSION = 0x0011; - //protected override void WndProc(ref Message m) - //{ - // switch (m.Msg) - // { - // case WM_QUERYENDSESSION: - // Utils.SaveLog("Windows shutdown UnsetProxy"); - - // ConfigHandler.ToJsonFile(config); - // statistics?.SaveToFile(); - // ProxySetting.UnsetProxy(); - // m.Result = (IntPtr)1; - // break; - // default: - // base.WndProc(ref m); - // break; - // } - //} - #endregion - - #region 显示服务器 listview 和 menu - - /// - /// 刷新服务器 - /// - private void RefreshServers() - { - RefreshServersView(); - RefreshServersMenu(); - } - - /// - /// 初始化服务器列表 - /// - private void InitServersView() - { - lvServers.Items.Clear(); - - lvServers.GridLines = true; - lvServers.FullRowSelect = true; - lvServers.View = View.Details; - lvServers.Scrollable = true; - lvServers.MultiSelect = true; - lvServers.HeaderStyle = ColumnHeaderStyle.Nonclickable; - - lvServers.Columns.Add("", 30, HorizontalAlignment.Center); - lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvAlias"), 100, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvAddress"), 120, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvPort"), 50, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 90, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 70, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Left); - - if (statistics != null && statistics.Enable) - { - lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70, HorizontalAlignment.Left); - lvServers.Columns.Add(UIRes.I18N("LvTodayDownloadDataAmount"), 70, HorizontalAlignment.Left); - } - } - - /// - /// 刷新服务器列表 - /// - private void RefreshServersView() - { - lvServers.Items.Clear(); - - for (int k = 0; k < config.vmess.Count; k++) - { - string def = string.Empty; - string totalUp = string.Empty, - totalDown = string.Empty, - todayUp = string.Empty, - todayDown = string.Empty; - if (config.index.Equals(k)) - { - def = "√"; - } - - VmessItem item = config.vmess[k]; - - ListViewItem lvItem = null; - if (statistics != null && statistics.Enable) - { - var index = statistics.Statistic.FindIndex(item_ => item_.itemId == item.getItemId()); - if (index != -1) - { - totalUp = Utils.HumanFy(statistics.Statistic[index].totalUp); - totalDown = Utils.HumanFy(statistics.Statistic[index].totalDown); - todayUp = Utils.HumanFy(statistics.Statistic[index].todayUp); - todayDown = Utils.HumanFy(statistics.Statistic[index].todayDown); - } - - lvItem = new ListViewItem(new string[] - { - def, - ((EConfigType)item.configType).ToString(), - item.remarks, - item.address, - item.port.ToString(), - //item.id, - //item.alterId.ToString(), - item.security, - item.network, - item.getSubRemarks(config), - item.testResult, - totalUp, - totalDown, - todayUp, - todayDown - }); - } - else - { - lvItem = new ListViewItem(new string[] - { - def, - ((EConfigType)item.configType).ToString(), - item.remarks, - item.address, - item.port.ToString(), - //item.id, - //item.alterId.ToString(), - item.security, - item.network, - item.getSubRemarks(config), - item.testResult - //totalUp, - //totalDown, - //todayUp, - //todayDown, - }); - } - - if (lvItem != null) lvServers.Items.Add(lvItem); - } - - //if (lvServers.Items.Count > 0) - //{ - // if (lvServers.Items.Count <= testConfigIndex) - // { - // testConfigIndex = lvServers.Items.Count - 1; - // } - // lvServers.Items[testConfigIndex].Selected = true; - // lvServers.Select(); - //} - } - - /// - /// 刷新托盘服务器菜单 - /// - private void RefreshServersMenu() - { - menuServers.DropDownItems.Clear(); - - List lst = new List(); - for (int k = 0; k < config.vmess.Count; k++) - { - VmessItem item = config.vmess[k]; - string name = item.getSummary(); - - ToolStripMenuItem ts = new ToolStripMenuItem(name); - ts.Tag = k; - if (config.index.Equals(k)) - { - ts.Checked = true; - } - ts.Click += new EventHandler(ts_Click); - lst.Add(ts); - } - menuServers.DropDownItems.AddRange(lst.ToArray()); - } - - private void ts_Click(object sender, EventArgs e) - { - try - { - ToolStripItem ts = (ToolStripItem)sender; - int index = Utils.ToInt(ts.Tag); - SetDefaultServer(index); - } - catch - { - } - } - - private void lvServers_SelectedIndexChanged(object sender, EventArgs e) - { - int index = -1; - try - { - if (lvServers.SelectedIndices.Count > 0) - { - index = lvServers.SelectedIndices[0]; - } - } - catch - { - } - if (index < 0) - { - return; - } - //qrCodeControl.showQRCode(index, config); - } - - private void DisplayToolStatus() - { - toolSslSocksPort.Text = - toolSslHttpPort.Text = - toolSslPacPort.Text = "NONE"; - - toolSslSocksPort.Text = $"{Global.Loopback}:{config.inbound[0].localPort}"; - - if (config.listenerType != 0) - { - toolSslHttpPort.Text = $"{Global.Loopback}:{Global.httpPort}"; - if (config.listenerType == 2 || config.listenerType == 4) - { - if (PACServerHandle.IsRunning) - { - toolSslPacPort.Text = $"{HttpProxyHandle.GetPacUrl()}"; - } - else - { - toolSslPacPort.Text = UIRes.I18N("StartPacFailed"); - } - } - } - - notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); - } - private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) - { - if (!Utils.IsNullOrEmpty(e.ClickedItem.Text)) - { - Utils.SetClipboardData(e.ClickedItem.Text); - } - } - - #endregion - - #region v2ray 操作 - - /// - /// 载入V2ray - /// - private void LoadV2ray() - { - if (Global.reloadV2ray) - { - ClearMsg(); - } - v2rayHandler.LoadV2ray(config); - Global.reloadV2ray = false; - ConfigHandler.SaveConfig(ref config, false); - statistics?.SaveToFile(); - - ChangePACButtonStatus(config.listenerType); - } - - /// - /// 关闭V2ray - /// - private void CloseV2ray() - { - ConfigHandler.SaveConfig(ref config, false); - statistics?.SaveToFile(); - - ChangePACButtonStatus(0); - - v2rayHandler.V2rayStop(); - } - - #endregion - - #region 功能按钮 - - private void lvServers_Click(object sender, EventArgs e) - { - int index = -1; - try - { - if (lvServers.SelectedIndices.Count > 0) - { - index = lvServers.SelectedIndices[0]; - } - } - catch - { - } - if (index < 0) - { - return; - } - qrCodeControl.showQRCode(index, config); - } - - private void lvServers_DoubleClick(object sender, EventArgs e) - { - int index = GetLvSelectedIndex(); - if (index < 0) - { - return; - } - - if (config.vmess[index].configType == (int)EConfigType.Vmess) - { - var fm = new AddServerForm(); - fm.EditIndex = index; - if (fm.ShowDialog() == DialogResult.OK) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - } - else if (config.vmess[index].configType == (int)EConfigType.Shadowsocks) - { - var fm = new AddServer3Form(); - fm.EditIndex = index; - if (fm.ShowDialog() == DialogResult.OK) - { - RefreshServers(); - LoadV2ray(); - } - } - else if (config.vmess[index].configType == (int)EConfigType.Socks) - { - var fm = new AddServer4Form(); - fm.EditIndex = index; - if (fm.ShowDialog() == DialogResult.OK) - { - RefreshServers(); - LoadV2ray(); - } - } - else - { - var fm2 = new AddServer2Form(); - fm2.EditIndex = index; - if (fm2.ShowDialog() == DialogResult.OK) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - } - } - - private void lvServers_KeyDown(object sender, KeyEventArgs e) - { - if (e.Control) - { - switch (e.KeyCode) - { - case Keys.A: - menuSelectAll_Click(null, null); - break; - case Keys.P: - menuPingServer_Click(null, null); - break; - case Keys.O: - menuTcpingServer_Click(null, null); - break; - case Keys.R: - menuRealPingServer_Click(null, null); - break; - case Keys.T: - menuSpeedServer_Click(null, null); - break; - } - } - switch (e.KeyCode) - { - case Keys.Enter: - menuSetDefaultServer_Click(null, null); - break; - case Keys.Delete: - menuRemoveServer_Click(null, null); - break; - case Keys.U: - menuMoveUp_Click(null, null); - break; - case Keys.D: - menuMoveDown_Click(null, null); - break; - } - } - - private void menuAddVmessServer_Click(object sender, EventArgs e) - { - AddServerForm fm = new AddServerForm(); - fm.EditIndex = -1; - if (fm.ShowDialog() == DialogResult.OK) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - } - - private void menuRemoveServer_Click(object sender, EventArgs e) - { - - int index = GetLvSelectedIndex(); - if (index < 0) - { - return; - } - if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) - { - return; - } - for (int k = lvSelecteds.Count - 1; k >= 0; k--) - { - ConfigHandler.RemoveServer(ref config, lvSelecteds[k]); - } - //刷新 - RefreshServers(); - LoadV2ray(); - - } - - private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) - { - List servers = null; - Utils.DedupServerList(config.vmess, out servers); - if (servers != null) - { - config.vmess = servers; - } - //刷新 - RefreshServers(); - LoadV2ray(); - } - - private void menuCopyServer_Click(object sender, EventArgs e) - { - int index = GetLvSelectedIndex(); - if (index < 0) - { - return; - } - if (ConfigHandler.CopyServer(ref config, index) == 0) - { - //刷新 - RefreshServers(); - } - } - - private void menuSetDefaultServer_Click(object sender, EventArgs e) - { - int index = GetLvSelectedIndex(); - if (index < 0) - { - return; - } - SetDefaultServer(index); - } - - - private void menuPingServer_Click(object sender, EventArgs e) - { - Speedtest("ping"); - } - private void menuTcpingServer_Click(object sender, EventArgs e) - { - Speedtest("tcping"); - } - - private void menuRealPingServer_Click(object sender, EventArgs e) - { - //if (!config.sysAgentEnabled) - //{ - // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); - // return; - //} - - //UI.Show(UIRes.I18N("SpeedServerTips")); - - Speedtest("realping"); - } - - private void menuSpeedServer_Click(object sender, EventArgs e) - { - //if (!config.sysAgentEnabled) - //{ - // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); - // return; - //} - - //UI.Show(UIRes.I18N("SpeedServerTips")); - - Speedtest("speedtest"); - } - private void Speedtest(string actionType) - { - GetLvSelectedIndex(); - ClearTestResult(); - var statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, actionType, UpdateSpeedtestHandler); - } - - private void menuExport2ClientConfig_Click(object sender, EventArgs e) - { - int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ClientConfig(index, config); - } - - private void menuExport2ServerConfig_Click(object sender, EventArgs e) - { - int index = GetLvSelectedIndex(); - MainFormHandler.Instance.Export2ServerConfig(index, config); - } - - private void menuExport2ShareUrl_Click(object sender, EventArgs e) - { - GetLvSelectedIndex(); - - StringBuilder sb = new StringBuilder(); - for (int k = 0; k < lvSelecteds.Count; k++) - { - string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]); - if (Utils.IsNullOrEmpty(url)) - { - continue; - } - sb.Append(url); - sb.AppendLine(); - } - if (sb.Length > 0) - { - Utils.SetClipboardData(sb.ToString()); - UI.Show(UIRes.I18N("BatchExportURLSuccessfully")); - } - } - - private void menuExport2SubContent_Click(object sender, EventArgs e) - { - GetLvSelectedIndex(); - - StringBuilder sb = new StringBuilder(); - for (int k = 0; k < lvSelecteds.Count; k++) - { - string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]); - if (Utils.IsNullOrEmpty(url)) - { - continue; - } - sb.Append(url); - sb.AppendLine(); - } - if (sb.Length > 0) - { - Utils.SetClipboardData(Utils.Base64Encode(sb.ToString())); - UI.Show(UIRes.I18N("BatchExportSubscriptionSuccessfully")); - } - } - - private void tsbOptionSetting_Click(object sender, EventArgs e) - { - OptionSettingForm fm = new OptionSettingForm(); - if (fm.ShowDialog() == DialogResult.OK) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - } - - private void tsbReload_Click(object sender, EventArgs e) - { - Global.reloadV2ray = true; - LoadV2ray(); - } - - private void tsbClose_Click(object sender, EventArgs e) - { - HideForm(); - //this.WindowState = FormWindowState.Minimized; - } - - /// - /// 设置活动服务器 - /// - /// - /// - private int SetDefaultServer(int index) - { - if (index < 0) - { - UI.Show(UIRes.I18N("PleaseSelectServer")); - return -1; - } - if (ConfigHandler.SetDefaultServer(ref config, index) == 0) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - return 0; - } - - /// - /// 取得ListView选中的行 - /// - /// - private int GetLvSelectedIndex() - { - int index = -1; - lvSelecteds.Clear(); - try - { - if (lvServers.SelectedIndices.Count <= 0) - { - UI.Show(UIRes.I18N("PleaseSelectServer")); - return index; - } - - index = lvServers.SelectedIndices[0]; - foreach (int i in lvServers.SelectedIndices) - { - lvSelecteds.Add(i); - } - return index; - } - catch - { - return index; - } - } - - private void menuAddCustomServer_Click(object sender, EventArgs e) - { - UI.Show(UIRes.I18N("CustomServerTips")); - - OpenFileDialog fileDialog = new OpenFileDialog(); - fileDialog.Multiselect = false; - fileDialog.Filter = "Config|*.json|All|*.*"; - if (fileDialog.ShowDialog() != DialogResult.OK) - { - return; - } - string fileName = fileDialog.FileName; - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - - if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) - { - //刷新 - RefreshServers(); - LoadV2ray(); - UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); - } - else - { - UI.Show(UIRes.I18N("FailedImportedCustomServer")); - } - } - - private void menuAddShadowsocksServer_Click(object sender, EventArgs e) - { - var fm = new AddServer3Form(); - fm.EditIndex = -1; - if (fm.ShowDialog() == DialogResult.OK) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - ShowForm(); - } - - private void menuAddSocksServer_Click(object sender, EventArgs e) - { - var fm = new AddServer4Form(); - fm.EditIndex = -1; - if (fm.ShowDialog() == DialogResult.OK) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - ShowForm(); - } - - private void menuAddServers_Click(object sender, EventArgs e) - { - string clipboardData = Utils.GetClipboardData(); - if (AddBatchServers(clipboardData) == 0) - { - UI.Show(UIRes.I18N("SuccessfullyImportedServerViaClipboard")); - } - } - - private void menuScanScreen_Click(object sender, EventArgs e) - { - HideForm(); - bgwScan.RunWorkerAsync(); - } - - private int AddBatchServers(string clipboardData, string subid = "") - { - if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0) - { - clipboardData = Utils.Base64Decode(clipboardData); - if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0) - { - return -1; - } - } - RefreshServers(); - return 0; - } - - #endregion - - - #region 提示信息 - - /// - /// 消息委托 - /// - /// - /// - void v2rayHandler_ProcessEvent(bool notify, string msg) - { - AppendText(notify, msg); - } - - delegate void AppendTextDelegate(string text); - void AppendText(bool notify, string msg) - { - try - { - AppendText(msg); - if (notify) - { - notifyMsg(msg); - } - } - catch - { - } - } - - void AppendText(string text) - { - if (this.txtMsgBox.InvokeRequired) - { - Invoke(new AppendTextDelegate(AppendText), new object[] { text }); - } - else - { - //this.txtMsgBox.AppendText(text); - ShowMsg(text); - } - } - - /// - /// 提示信息 - /// - /// - private void ShowMsg(string msg) - { - if (txtMsgBox.Lines.Length > 999) - { - ClearMsg(); - } - this.txtMsgBox.AppendText(msg); - if (!msg.EndsWith("\r\n")) - { - this.txtMsgBox.AppendText("\r\n"); - } - } - - /// - /// 清除信息 - /// - private void ClearMsg() - { - this.txtMsgBox.Clear(); - } - - /// - /// 托盘信息 - /// - /// - private void notifyMsg(string msg) - { - notifyMain.Text = msg; - } - - #endregion - - - #region 托盘事件 - - private void notifyMain_MouseClick(object sender, MouseEventArgs e) - { - if (e.Button == System.Windows.Forms.MouseButtons.Left) - { - ShowForm(); - } - } - - private void menuExit_Click(object sender, EventArgs e) - { - - this.Visible = false; - this.Close(); - - Application.Exit(); - } - - - private void ShowForm() - { - this.Show(); - this.WindowState = FormWindowState.Normal; - this.Activate(); - //this.notifyIcon1.Visible = false; - this.ShowInTaskbar = true; - this.txtMsgBox.ScrollToCaret(); - - SetVisibleCore(true); - } - - private void HideForm() - { - //this.WindowState = FormWindowState.Minimized; - this.Hide(); - //this.notifyMain.Icon = this.Icon; - this.notifyMain.Visible = true; - this.ShowInTaskbar = false; - - SetVisibleCore(false); - } - - #endregion - - #region 后台测速 - - private void SetTestResult(int k, string txt) - { - config.vmess[k].testResult = txt; - lvServers.Items[k].SubItems[8].Text = txt; - } - private void ClearTestResult() - { - for (int k = 0; k < config.vmess.Count; k++) - { - SetTestResult(k, ""); - } - } - private void UpdateSpeedtestHandler(int index, string msg) - { - lvServers.Invoke((MethodInvoker)delegate - { - lvServers.SuspendLayout(); - - SetTestResult(index, msg); - - lvServers.ResumeLayout(); - }); - } - - private void UpdateStatisticsHandler(ulong up, ulong down, List statistics) - { - try - { - up /= (ulong)(config.statisticsFreshRate / 1000f); - down /= (ulong)(config.statisticsFreshRate / 1000f); - toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); - - List datas = new List(); - for (int i = 0; i < config.vmess.Count; i++) - { - var index = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); - if (index != -1) - { - lvServers.Invoke((MethodInvoker)delegate - { - lvServers.SuspendLayout(); - - var indexStart = 9; - lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].totalUp); - lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].totalDown); - lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].todayUp); - lvServers.Items[i].SubItems[indexStart++].Text = Utils.HumanFy(statistics[index].todayDown); - - lvServers.ResumeLayout(); - }); - } - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - #endregion - - #region 移动服务器 - - private void menuMoveTop_Click(object sender, EventArgs e) - { - MoveServer(EMove.Top); - } - - private void menuMoveUp_Click(object sender, EventArgs e) - { - MoveServer(EMove.Up); - } - - private void menuMoveDown_Click(object sender, EventArgs e) - { - MoveServer(EMove.Down); - } - - private void menuMoveBottom_Click(object sender, EventArgs e) - { - MoveServer(EMove.Bottom); - } - - private void MoveServer(EMove eMove) - { - int index = GetLvSelectedIndex(); - if (index < 0) - { - UI.Show(UIRes.I18N("PleaseSelectServer")); - return; - } - if (ConfigHandler.MoveServer(ref config, index, eMove) == 0) - { - //刷新 - RefreshServers(); - LoadV2ray(); - } - } - private void menuSelectAll_Click(object sender, EventArgs e) - { - foreach (ListViewItem item in lvServers.Items) - { - item.Selected = true; - } - } - - #endregion - - #region 系统代理相关 - - private void menuCopyPACUrl_Click(object sender, EventArgs e) - { - Utils.SetClipboardData(HttpProxyHandle.GetPacUrl()); - } - - private void menuNotEnabledHttp_Click(object sender, EventArgs e) - { - SetListenerType(0); - } - - private void menuGlobal_Click(object sender, EventArgs e) - { - SetListenerType(1); - } - - private void menuGlobalPAC_Click(object sender, EventArgs e) - { - SetListenerType(2); - } - - private void menuKeep_Click(object sender, EventArgs e) - { - SetListenerType(3); - } - - private void menuKeepPAC_Click(object sender, EventArgs e) - { - SetListenerType(4); - } - - private void SetListenerType(int type) - { - config.listenerType = type; - ChangePACButtonStatus(type); - } - - private void ChangePACButtonStatus(int type) - { - if (type != 0) - { - HttpProxyHandle.RestartHttpAgent(config, false); - } - else - { - HttpProxyHandle.CloseHttpAgent(config); - } - - for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++) - { - var item = ((ToolStripMenuItem)menuSysAgentMode.DropDownItems[k]); - item.Checked = (type == k); - } - - ConfigHandler.SaveConfig(ref config, false); - DisplayToolStatus(); - } - - #endregion - - - #region CheckUpdate - - private void tsbCheckUpdateN_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start(Global.UpdateUrl); - } - - private void tsbCheckUpdateCore_Click(object sender, EventArgs e) - { - if (downloadHandle == null) - { - downloadHandle = new DownloadHandle(); - downloadHandle.AbsoluteCompleted += (sender2, args) => - { - if (args.Success) - { - AppendText(false, UIRes.I18N("MsgParsingV2rayCoreSuccessfully")); - - string url = args.Msg; - this.Invoke((MethodInvoker)(delegate - { - - if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.No) - { - return; - } - else - { - downloadHandle.DownloadFileAsync(config, url, null, -1); - } - })); - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); - AppendText(false, UIRes.I18N("MsgUnpacking")); - - try - { - CloseV2ray(); - - string fileName = downloadHandle.DownloadFileName; - fileName = Utils.GetPath(fileName); - using (ZipArchive archive = ZipFile.OpenRead(fileName)) - { - foreach (ZipArchiveEntry entry in archive.Entries) - { - if (entry.Length == 0) - continue; - entry.ExtractToFile(Utils.GetPath(entry.Name), true); - } - } - AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); - - Global.reloadV2ray = true; - LoadV2ray(); - - AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); - } - catch (Exception ex) - { - AppendText(false, ex.Message); - } - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - } - - AppendText(false, UIRes.I18N("MsgStartUpdatingV2rayCore")); - downloadHandle.AbsoluteV2rayCore(config); - } - - private void tsbCheckUpdatePACList_Click(object sender, EventArgs e) - { - if (pacListHandle == null) - { - pacListHandle = new PACListHandle(); - pacListHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - AppendText(false, UIRes.I18N("MsgPACUpdateSuccessfully")); - } - else - { - AppendText(false, UIRes.I18N("MsgPACUpdateFailed")); - } - }; - pacListHandle.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - } - AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); - pacListHandle.UpdatePACFromGFWList(config); - } - - private void tsbCheckClearPACList_Click(object sender, EventArgs e) - { - try - { - File.WriteAllText(Utils.GetPath(Global.pacFILE), Utils.GetEmbedText(Global.BlankPacFileName), Encoding.UTF8); - AppendText(false, UIRes.I18N("MsgSimplifyPAC")); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - #endregion - - #region Help - - - private void tsbAbout_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start(Global.AboutUrl); - } - - private void tsbPromotion_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start($"{Utils.Base64Decode(Global.PromotionUrl)}?t={DateTime.Now.Ticks}"); - } - #endregion - - #region ScanScreen - - - private void bgwScan_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) - { - string ret = Utils.ScanScreen(); - bgwScan.ReportProgress(0, ret); - } - - private void bgwScan_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) - { - ShowForm(); - - string result = Convert.ToString(e.UserState); - if (Utils.IsNullOrEmpty(result)) - { - UI.Show(UIRes.I18N("NoValidQRcodeFound")); - } - else - { - if (AddBatchServers(result) == 0) - { - UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); - } - } - } - - #endregion - - #region 订阅 - private void tsbSubSetting_Click(object sender, EventArgs e) - { - SubSettingForm fm = new SubSettingForm(); - if (fm.ShowDialog() == DialogResult.OK) - { - RefreshServers(); - } - } - - private void tsbSubUpdate_Click(object sender, EventArgs e) - { - AppendText(false, UIRes.I18N("MsgUpdateSubscriptionStart")); - - if (config.subItem == null || config.subItem.Count <= 0) - { - AppendText(false, UIRes.I18N("MsgNoValidSubscription")); - return; - } - - for (int k = 1; k <= config.subItem.Count; k++) - { - string id = config.subItem[k - 1].id.TrimEx(); - string url = config.subItem[k - 1].url.TrimEx(); - string hashCode = $"{k}->"; - if (config.subItem[k - 1].enabled == false) - { - continue; - } - if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) - { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); - continue; - } - - DownloadHandle downloadHandle3 = new DownloadHandle(); - downloadHandle3.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); - var result = Utils.Base64Decode(args.Msg); - if (Utils.IsNullOrEmpty(result)) - { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); - return; - } - - ConfigHandler.RemoveServerViaSubid(ref config, id); - AppendText(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); - RefreshServers(); - if (AddBatchServers(result, id) == 0) - { - } - else - { - AppendText(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); - } - AppendText(false, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); - } - else - { - AppendText(false, args.Msg); - } - }; - downloadHandle3.Error += (sender2, args) => - { - AppendText(true, args.GetException().Message); - }; - - downloadHandle3.WebDownloadString(url); - AppendText(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); - } - - - } - - #endregion - - #region Language - - private void tsbLanguageDef_Click(object sender, EventArgs e) - { - SetCurrentLanguage("en"); - } - - private void tsbLanguageZhHans_Click(object sender, EventArgs e) - { - SetCurrentLanguage("zh-Hans"); - } - private void SetCurrentLanguage(string value) - { - Utils.RegWriteValue(Global.MyRegPath, Global.MyRegKeyLanguage, value); - } - - #endregion - - - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.HttpProxyHandler; +using v2rayN.Mode; +using v2rayN.Base; +using v2rayN.Tool; +using System.Diagnostics; +using System.Drawing; +using System.Net; + +namespace v2rayN.Forms +{ + public partial class MainForm : BaseForm + { + private V2rayHandler v2rayHandler; + private List lvSelecteds = new List(); + private StatisticsHandler statistics = null; + + #region Window 事件 + + public MainForm() + { + InitializeComponent(); + this.ShowInTaskbar = false; + this.WindowState = FormWindowState.Minimized; + HideForm(); + this.Text = Utils.GetVersion(); + Global.processJob = new Job(); + + Application.ApplicationExit += (sender, args) => + { + v2rayHandler.V2rayStop(); + + HttpProxyHandle.CloseHttpAgent(config); + PACServerHandle.Stop(); + + ConfigHandler.SaveConfig(ref config); + statistics?.SaveToFile(); + statistics?.Close(); + }; + } + + private void MainForm_Load(object sender, EventArgs e) + { + ConfigHandler.LoadConfig(ref config); + v2rayHandler = new V2rayHandler(); + v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; + + if (config.enableStatistics) + { + statistics = new StatisticsHandler(config, UpdateStatisticsHandler); + } + } + + private void MainForm_VisibleChanged(object sender, EventArgs e) + { + if (statistics == null || !statistics.Enable) return; + if ((sender as Form).Visible) + { + statistics.UpdateUI = true; + } + else + { + statistics.UpdateUI = false; + } + } + + private void MainForm_Shown(object sender, EventArgs e) + { + InitServersView(); + RefreshServers(); + RestoreUI(); + + LoadV2ray(); + + HideForm(); + + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing) + { + StorageUI(); + e.Cancel = true; + HideForm(); + return; + } + } + + private void MainForm_Resize(object sender, EventArgs e) + { + //if (this.WindowState == FormWindowState.Minimized) + //{ + // HideForm(); + //} + //else + //{ + + //} + } + + + //private const int WM_QUERYENDSESSION = 0x0011; + //protected override void WndProc(ref Message m) + //{ + // switch (m.Msg) + // { + // case WM_QUERYENDSESSION: + // Utils.SaveLog("Windows shutdown UnsetProxy"); + + // ConfigHandler.ToJsonFile(config); + // statistics?.SaveToFile(); + // ProxySetting.UnsetProxy(); + // m.Result = (IntPtr)1; + // break; + // default: + // base.WndProc(ref m); + // break; + // } + //} + + private void RestoreUI() + { + scMain.Panel2Collapsed = true; + + if (!config.uiItem.mainSize.IsEmpty) + { + this.Width = config.uiItem.mainSize.Width; + this.Height = config.uiItem.mainSize.Height; + } + + for (int k = 0; k < lvServers.Columns.Count; k++) + { + var width = ConfigHandler.GetformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width); + lvServers.Columns[k].Width = width; + } + } + + private void StorageUI() + { + config.uiItem.mainSize = new Size(this.Width, this.Height); + + for (int k = 0; k < lvServers.Columns.Count; k++) + { + ConfigHandler.AddformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width); + } + } + + #endregion + + #region 显示服务器 listview 和 menu + + /// + /// 刷新服务器 + /// + private void RefreshServers() + { + RefreshServersView(); + //lvServers.AutoResizeColumns(); + RefreshServersMenu(); + } + + /// + /// 初始化服务器列表 + /// + private void InitServersView() + { + lvServers.BeginUpdate(); + lvServers.Items.Clear(); + + lvServers.GridLines = true; + lvServers.FullRowSelect = true; + lvServers.View = View.Details; + lvServers.Scrollable = true; + lvServers.MultiSelect = true; + lvServers.HeaderStyle = ColumnHeaderStyle.Clickable; + + lvServers.Columns.Add("", 30); + lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80); + lvServers.Columns.Add(UIRes.I18N("LvAlias"), 100); + lvServers.Columns.Add(UIRes.I18N("LvAddress"), 120); + lvServers.Columns.Add(UIRes.I18N("LvPort"), 50); + lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 90); + lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 70); + lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50); + lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Right); + + if (statistics != null && statistics.Enable) + { + lvServers.Columns.Add(UIRes.I18N("LvTodayDownloadDataAmount"), 70); + lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70); + lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70); + lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70); + } + lvServers.EndUpdate(); + } + + /// + /// 刷新服务器列表 + /// + private void RefreshServersView() + { + lvServers.BeginUpdate(); + lvServers.Items.Clear(); + + for (int k = 0; k < config.vmess.Count; k++) + { + string def = string.Empty; + string totalUp = string.Empty, + totalDown = string.Empty, + todayUp = string.Empty, + todayDown = string.Empty; + if (config.index.Equals(k)) + { + def = "√"; + } + + VmessItem item = config.vmess[k]; + + void _addSubItem(ListViewItem i, string name, string text) + { + i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text }); + } + bool stats = statistics != null && statistics.Enable; + if (stats) + { + ServerStatItem sItem = statistics.Statistic.Find(item_ => item_.itemId == item.getItemId()); + if (sItem != null) + { + totalUp = Utils.HumanFy(sItem.totalUp); + totalDown = Utils.HumanFy(sItem.totalDown); + todayUp = Utils.HumanFy(sItem.todayUp); + todayDown = Utils.HumanFy(sItem.todayDown); + } + } + ListViewItem lvItem = new ListViewItem(def); + _addSubItem(lvItem, EServerColName.configType.ToString(), ((EConfigType)item.configType).ToString()); + _addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); + _addSubItem(lvItem, EServerColName.address.ToString(), item.address); + _addSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString()); + _addSubItem(lvItem, EServerColName.security.ToString(), item.security); + _addSubItem(lvItem, EServerColName.network.ToString(), item.network); + _addSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config)); + _addSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); + if (stats) + { + _addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown); + _addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp); + _addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown); + _addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp); + } + + if (k % 2 == 1) // 隔行着色 + { + lvItem.BackColor = Color.WhiteSmoke; + } + if (config.index.Equals(k)) + { + //lvItem.Checked = true; + lvItem.ForeColor = Color.DodgerBlue; + lvItem.Font = new Font(lvItem.Font, FontStyle.Bold); + } + + if (lvItem != null) lvServers.Items.Add(lvItem); + } + lvServers.EndUpdate(); + + //if (lvServers.Items.Count > 0) + //{ + // if (lvServers.Items.Count <= testConfigIndex) + // { + // testConfigIndex = lvServers.Items.Count - 1; + // } + // lvServers.Items[testConfigIndex].Selected = true; + // lvServers.Select(); + //} + } + + /// + /// 刷新托盘服务器菜单 + /// + private void RefreshServersMenu() + { + menuServers.DropDownItems.Clear(); + + List lst = new List(); + for (int k = 0; k < config.vmess.Count; k++) + { + VmessItem item = config.vmess[k]; + string name = item.getSummary(); + + ToolStripMenuItem ts = new ToolStripMenuItem(name) + { + Tag = k + }; + if (config.index.Equals(k)) + { + ts.Checked = true; + } + ts.Click += new EventHandler(ts_Click); + lst.Add(ts); + } + menuServers.DropDownItems.AddRange(lst.ToArray()); + } + + private void ts_Click(object sender, EventArgs e) + { + try + { + ToolStripItem ts = (ToolStripItem)sender; + int index = Utils.ToInt(ts.Tag); + SetDefaultServer(index); + } + catch + { + } + } + + private void lvServers_SelectedIndexChanged(object sender, EventArgs e) + { + int index = -1; + try + { + if (lvServers.SelectedIndices.Count > 0) + { + index = lvServers.SelectedIndices[0]; + } + } + catch + { + } + if (index < 0) + { + return; + } + //qrCodeControl.showQRCode(index, config); + } + + private void DisplayToolStatus() + { + toolSslSocksPort.Text = + toolSslHttpPort.Text = + toolSslPacPort.Text = "OFF"; + + toolSslSocksPort.Text = $"{Global.Loopback}:{config.inbound[0].localPort}"; + + if (config.listenerType != (int)ListenerType.noHttpProxy) + { + toolSslHttpPort.Text = $"{Global.Loopback}:{Global.httpPort}"; + if (config.listenerType == ListenerType.GlobalPac || + config.listenerType == ListenerType.PacOpenAndClear || + config.listenerType == ListenerType.PacOpenOnly) + { + if (PACServerHandle.IsRunning) + { + toolSslPacPort.Text = $"{HttpProxyHandle.GetPacUrl()}"; + } + else + { + toolSslPacPort.Text = UIRes.I18N("StartPacFailed"); + } + } + } + + notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); + } + private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + if (!Utils.IsNullOrEmpty(e.ClickedItem.Text)) + { + Utils.SetClipboardData(e.ClickedItem.Text); + } + } + + private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e) + { + if (e.Column < 0) + { + return; + } + + try + { + var tag = lvServers.Columns[e.Column].Tag?.ToString(); + bool asc = Utils.IsNullOrEmpty(tag) ? true : !Convert.ToBoolean(tag); + if (ConfigHandler.SortServers(ref config, (EServerColName)e.Column, asc) != 0) + { + return; + } + lvServers.Columns[e.Column].Tag = Convert.ToString(asc); + RefreshServers(); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + + if (e.Column < 0) + { + return; + } + + } + #endregion + + #region v2ray 操作 + + /// + /// 载入V2ray + /// + private void LoadV2ray() + { + tsbReload.Enabled = false; + + if (Global.reloadV2ray) + { + ClearMsg(); + } + v2rayHandler.LoadV2ray(config); + Global.reloadV2ray = false; + ConfigHandler.SaveConfig(ref config, false); + statistics?.SaveToFile(); + + ChangePACButtonStatus(config.listenerType); + + tsbReload.Enabled = true; + } + + /// + /// 关闭V2ray + /// + private void CloseV2ray() + { + ConfigHandler.SaveConfig(ref config, false); + statistics?.SaveToFile(); + + ChangePACButtonStatus(0); + + v2rayHandler.V2rayStop(); + } + + #endregion + + #region 功能按钮 + + private void lvServers_Click(object sender, EventArgs e) + { + int index = -1; + try + { + if (lvServers.SelectedIndices.Count > 0) + { + index = lvServers.SelectedIndices[0]; + } + } + catch + { + } + if (index < 0) + { + return; + } + qrCodeControl.showQRCode(index, config); + } + + private void lvServers_DoubleClick(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + ShowServerForm(config.vmess[index].configType, index); + } + private void ShowServerForm(int configType, int index) + { + BaseServerForm fm; + switch (configType) + { + case (int)EConfigType.Vmess: + fm = new AddServerForm(); + break; + case (int)EConfigType.Shadowsocks: + fm = new AddServer3Form(); + break; + case (int)EConfigType.Socks: + fm = new AddServer4Form(); + break; + case (int)EConfigType.VLESS: + fm = new AddServer5Form(); + break; + case (int)EConfigType.Trojan: + fm = new AddServer6Form(); + break; + default: + fm = new AddServer2Form(); + break; + } + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + + + private void lvServers_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuSelectAll_Click(null, null); + break; + case Keys.C: + menuExport2ShareUrl_Click(null, null); + break; + case Keys.V: + menuAddServers_Click(null, null); + break; + case Keys.P: + menuPingServer_Click(null, null); + break; + case Keys.O: + menuTcpingServer_Click(null, null); + break; + case Keys.R: + menuRealPingServer_Click(null, null); + break; + case Keys.S: + menuScanScreen_Click(null, null); + break; + case Keys.T: + menuSpeedServer_Click(null, null); + break; + } + } + else + { + switch (e.KeyCode) + { + case Keys.Enter: + menuSetDefaultServer_Click(null, null); + break; + case Keys.Delete: + menuRemoveServer_Click(null, null); + break; + case Keys.T: + menuMoveTop_Click(null, null); + break; + case Keys.B: + menuMoveBottom_Click(null, null); + break; + case Keys.U: + menuMoveUp_Click(null, null); + break; + case Keys.D: + menuMoveDown_Click(null, null); + break; + } + } + } + + private void menuAddVmessServer_Click(object sender, EventArgs e) + { + ShowServerForm((int)EConfigType.Vmess, -1); + } + + private void menuAddVlessServer_Click(object sender, EventArgs e) + { + ShowServerForm((int)EConfigType.VLESS, -1); + } + + private void menuRemoveServer_Click(object sender, EventArgs e) + { + + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) + { + return; + } + for (int k = lvSelecteds.Count - 1; k >= 0; k--) + { + ConfigHandler.RemoveServer(ref config, lvSelecteds[k]); + } + //刷新 + RefreshServers(); + LoadV2ray(); + + } + + private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) + { + Utils.DedupServerList(config.vmess, out List servers, config.keepOlderDedupl); + int oldCount = config.vmess.Count; + int newCount = servers.Count; + if (servers != null) + { + config.vmess = servers; + } + //刷新 + RefreshServers(); + LoadV2ray(); + UI.Show(string.Format(UIRes.I18N("RemoveDuplicateServerResult"), oldCount, newCount)); + } + + private void menuCopyServer_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (ConfigHandler.CopyServer(ref config, index) == 0) + { + //刷新 + RefreshServers(); + } + } + + private void menuSetDefaultServer_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + SetDefaultServer(index); + } + + + private void menuPingServer_Click(object sender, EventArgs e) + { + Speedtest("ping"); + } + private void menuTcpingServer_Click(object sender, EventArgs e) + { + Speedtest("tcping"); + } + + private void menuRealPingServer_Click(object sender, EventArgs e) + { + //if (!config.sysAgentEnabled) + //{ + // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + // return; + //} + + //UI.Show(UIRes.I18N("SpeedServerTips")); + + Speedtest("realping"); + } + + private void menuSpeedServer_Click(object sender, EventArgs e) + { + //if (!config.sysAgentEnabled) + //{ + // UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + // return; + //} + + //UI.Show(UIRes.I18N("SpeedServerTips")); + + Speedtest("speedtest"); + } + private void Speedtest(string actionType) + { + if (GetLvSelectedIndex() < 0) return; + ClearTestResult(); + SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, actionType, UpdateSpeedtestHandler); + } + + private void tsbTestMe_Click(object sender, EventArgs e) + { + string result = httpProxyTest() + "ms"; + AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result)); + } + private int httpProxyTest() + { + SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "", UpdateSpeedtestHandler); + return statistics.RunAvailabilityCheck(); + } + + private void menuExport2ClientConfig_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + MainFormHandler.Instance.Export2ClientConfig(index, config); + } + + private void menuExport2ServerConfig_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + MainFormHandler.Instance.Export2ServerConfig(index, config); + } + + private void menuExport2ShareUrl_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + + StringBuilder sb = new StringBuilder(); + foreach (int v in lvSelecteds) + { + string url = ConfigHandler.GetVmessQRCode(config, v); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + sb.Append(url); + sb.AppendLine(); + } + if (sb.Length > 0) + { + Utils.SetClipboardData(sb.ToString()); + AppendText(false, UIRes.I18N("BatchExportURLSuccessfully")); + //UI.Show(UIRes.I18N("BatchExportURLSuccessfully")); + } + } + + private void menuExport2SubContent_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + + StringBuilder sb = new StringBuilder(); + foreach (int v in lvSelecteds) + { + string url = ConfigHandler.GetVmessQRCode(config, v); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + sb.Append(url); + sb.AppendLine(); + } + if (sb.Length > 0) + { + Utils.SetClipboardData(Utils.Base64Encode(sb.ToString())); + UI.Show(UIRes.I18N("BatchExportSubscriptionSuccessfully")); + } + } + + private void tsbOptionSetting_Click(object sender, EventArgs e) + { + OptionSettingForm fm = new OptionSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + HttpProxyHandle.RestartHttpAgent(config, true); + } + } + + private void tsbReload_Click(object sender, EventArgs e) + { + Global.reloadV2ray = true; + LoadV2ray(); + } + + private void tsbClose_Click(object sender, EventArgs e) + { + HideForm(); + //this.WindowState = FormWindowState.Minimized; + } + + /// + /// 设置活动服务器 + /// + /// + /// + private int SetDefaultServer(int index) + { + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return -1; + } + if (ConfigHandler.SetDefaultServer(ref config, index) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + return 0; + } + + /// + /// 取得ListView选中的行 + /// + /// + private int GetLvSelectedIndex() + { + int index = -1; + lvSelecteds.Clear(); + try + { + if (lvServers.SelectedIndices.Count <= 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return index; + } + + index = lvServers.SelectedIndices[0]; + foreach (int i in lvServers.SelectedIndices) + { + lvSelecteds.Add(i); + } + return index; + } + catch + { + return index; + } + } + + private void menuAddCustomServer_Click(object sender, EventArgs e) + { + UI.Show(UIRes.I18N("CustomServerTips")); + + OpenFileDialog fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = "Config|*.json|All|*.*" + }; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + + if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); + } + else + { + UI.ShowWarning(UIRes.I18N("FailedImportedCustomServer")); + } + } + + private void menuAddShadowsocksServer_Click(object sender, EventArgs e) + { + ShowServerForm((int)EConfigType.Shadowsocks, -1); + ShowForm(); + } + + private void menuAddSocksServer_Click(object sender, EventArgs e) + { + ShowServerForm((int)EConfigType.Socks, -1); + ShowForm(); + } + + private void menuAddTrojanServer_Click(object sender, EventArgs e) + { + ShowServerForm((int)EConfigType.Trojan, -1); + ShowForm(); + } + + private void menuAddServers_Click(object sender, EventArgs e) + { + string clipboardData = Utils.GetClipboardData(); + int result = AddBatchServers(clipboardData); + if (result > 0) + { + UI.Show(string.Format(UIRes.I18N("SuccessfullyImportedServerViaClipboard"), result)); + } + } + + private void menuScanScreen_Click(object sender, EventArgs e) + { + HideForm(); + bgwScan.RunWorkerAsync(); + } + + private int AddBatchServers(string clipboardData, string subid = "") + { + int counter; + int _Add() + { + return ConfigHandler.AddBatchServers(ref config, clipboardData, subid); + } + counter = _Add(); + if (counter < 1) + { + clipboardData = Utils.Base64Decode(clipboardData); + counter = _Add(); + } + RefreshServers(); + return counter; + } + + private void menuUpdateSubscriptions_Click(object sender, EventArgs e) + { + UpdateSubscriptionProcess(); + } + + #endregion + + + #region 提示信息 + + /// + /// 消息委托 + /// + /// + /// + void v2rayHandler_ProcessEvent(bool notify, string msg) + { + AppendText(notify, msg); + } + + delegate void AppendTextDelegate(string text); + void AppendText(bool notify, string msg) + { + try + { + AppendText(msg); + if (notify) + { + notifyMsg(msg); + } + } + catch + { + } + } + + void AppendText(string text) + { + if (this.txtMsgBox.InvokeRequired) + { + Invoke(new AppendTextDelegate(AppendText), new object[] { text }); + } + else + { + //this.txtMsgBox.AppendText(text); + ShowMsg(text); + } + } + + /// + /// 提示信息 + /// + /// + private void ShowMsg(string msg) + { + if (txtMsgBox.Lines.Length > 999) + { + ClearMsg(); + } + this.txtMsgBox.AppendText(msg); + if (!msg.EndsWith(Environment.NewLine)) + { + this.txtMsgBox.AppendText(Environment.NewLine); + } + } + + /// + /// 清除信息 + /// + private void ClearMsg() + { + this.txtMsgBox.Clear(); + } + + /// + /// 托盘信息 + /// + /// + private void notifyMsg(string msg) + { + notifyMain.Text = msg; + } + + #endregion + + + #region 托盘事件 + + private void notifyMain_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + ShowForm(); + } + } + + private void menuExit_Click(object sender, EventArgs e) + { + this.Visible = false; + this.Close(); + + Application.Exit(); + } + + + private void ShowForm() + { + this.Show(); + this.WindowState = FormWindowState.Normal; + this.Activate(); + this.ShowInTaskbar = true; + //this.notifyIcon1.Visible = false; + this.txtMsgBox.ScrollToCaret(); + if (config.index >= 0 && config.index < lvServers.Items.Count) + { + lvServers.EnsureVisible(config.index); // workaround + } + + SetVisibleCore(true); + } + + private void HideForm() + { + //this.WindowState = FormWindowState.Minimized; + this.Hide(); + //this.notifyMain.Icon = this.Icon; + this.notifyMain.Visible = true; + this.ShowInTaskbar = false; + + SetVisibleCore(false); + } + + #endregion + + #region 后台测速 + + private void SetTestResult(int k, string txt) + { + if (k < lvServers.Items.Count) + { + config.vmess[k].testResult = txt; + lvServers.Items[k].SubItems["testResult"].Text = txt; + } + } + private void ClearTestResult() + { + foreach (int s in lvSelecteds) + { + SetTestResult(s, ""); + } + } + private void UpdateSpeedtestHandler(int index, string msg) + { + lvServers.Invoke((MethodInvoker)delegate + { + SetTestResult(index, msg); + }); + } + + private void UpdateStatisticsHandler(ulong up, ulong down, List statistics) + { + try + { + up /= (ulong)(config.statisticsFreshRate / 1000f); + down /= (ulong)(config.statisticsFreshRate / 1000f); + toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); + + List datas = new List(); + for (int i = 0; i < config.vmess.Count; i++) + { + int index = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); + if (index != -1) + { + lvServers.Invoke((MethodInvoker)delegate + { + lvServers.BeginUpdate(); + + lvServers.Items[i].SubItems["todayDown"].Text = Utils.HumanFy(statistics[index].todayDown); + lvServers.Items[i].SubItems["todayUp"].Text = Utils.HumanFy(statistics[index].todayUp); + lvServers.Items[i].SubItems["totalDown"].Text = Utils.HumanFy(statistics[index].totalDown); + lvServers.Items[i].SubItems["totalUp"].Text = Utils.HumanFy(statistics[index].totalUp); + + lvServers.EndUpdate(); + }); + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + #endregion + + #region 移动服务器 + + private void menuMoveTop_Click(object sender, EventArgs e) + { + MoveServer(EMove.Top); + } + + private void menuMoveUp_Click(object sender, EventArgs e) + { + MoveServer(EMove.Up); + } + + private void menuMoveDown_Click(object sender, EventArgs e) + { + MoveServer(EMove.Down); + } + + private void menuMoveBottom_Click(object sender, EventArgs e) + { + MoveServer(EMove.Bottom); + } + + private void MoveServer(EMove eMove) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return; + } + if (ConfigHandler.MoveServer(ref config, index, eMove) == 0) + { + //TODO: reload is not good. + RefreshServers(); + LoadV2ray(); + } + } + private void menuSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in lvServers.Items) + { + item.Selected = true; + } + } + + #endregion + + #region 系统代理相关 + + private void menuCopyPACUrl_Click(object sender, EventArgs e) + { + Utils.SetClipboardData(HttpProxyHandle.GetPacUrl()); + } + + private void menuNotEnabledHttp_Click(object sender, EventArgs e) + { + SetListenerType(ListenerType.noHttpProxy); + } + private void menuGlobal_Click(object sender, EventArgs e) + { + SetListenerType(ListenerType.GlobalHttp); + } + private void menuGlobalPAC_Click(object sender, EventArgs e) + { + SetListenerType(ListenerType.GlobalPac); + } + private void menuKeep_Click(object sender, EventArgs e) + { + SetListenerType(ListenerType.HttpOpenAndClear); + } + private void menuKeepPAC_Click(object sender, EventArgs e) + { + SetListenerType(ListenerType.PacOpenAndClear); + } + private void menuKeepNothing_Click(object sender, EventArgs e) + { + SetListenerType(ListenerType.HttpOpenOnly); + } + private void menuKeepPACNothing_Click(object sender, EventArgs e) + { + SetListenerType(ListenerType.PacOpenOnly); + } + private void SetListenerType(ListenerType type) + { + config.listenerType = type; + ChangePACButtonStatus(type); + } + + private void ChangePACButtonStatus(ListenerType type) + { + if (type != ListenerType.noHttpProxy) + { + HttpProxyHandle.RestartHttpAgent(config, false); + } + else + { + HttpProxyHandle.CloseHttpAgent(config); + } + + for (int k = 0; k < menuSysAgentMode.DropDownItems.Count; k++) + { + ToolStripMenuItem item = ((ToolStripMenuItem)menuSysAgentMode.DropDownItems[k]); + item.Checked = ((int)type == k); + } + + ConfigHandler.SaveConfig(ref config, false); + DisplayToolStatus(); + } + + #endregion + + + #region CheckUpdate + + private void askToDownload(DownloadHandle downloadHandle, string url) + { + if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes) + { + if (httpProxyTest() > 0) + { + int httpPort = config.GetLocalPort(Global.InboundHttp); + WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); + downloadHandle.DownloadFileAsync(url, webProxy, 600); + } + else + { + downloadHandle.DownloadFileAsync(url, null, 600); + } + } + } + private void tsbCheckUpdateN_Click(object sender, EventArgs e) + { + //System.Diagnostics.Process.Start(Global.UpdateUrl); + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + downloadHandle.AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayN")); + + string url = args.Msg; + this.Invoke((MethodInvoker)(delegate + { + askToDownload(downloadHandle, url); + })); + } + else + { + AppendText(false, args.Msg); + } + }; + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + + try + { + string fileName = Utils.GetPath(downloadHandle.DownloadFileName); + Process process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "v2rayUpgrade.exe", + Arguments = "\"" + fileName + "\"", + WorkingDirectory = Utils.StartupPath() + } + }; + process.Start(); + if (process.Id > 0) + { + menuExit_Click(null, null); + } + } + catch (Exception ex) + { + AppendText(false, ex.Message); + } + } + else + { + AppendText(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + } + + AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayN")); + downloadHandle.CheckUpdateAsync("v2rayN"); + } + + private void tsbCheckUpdateCore_Click(object sender, EventArgs e) + { + DownloadHandle downloadHandle = null; + if (downloadHandle == null) + { + downloadHandle = new DownloadHandle(); + downloadHandle.AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, string.Format(UIRes.I18N("MsgParsingSuccessfully"), "v2rayCore")); + + string url = args.Msg; + this.Invoke((MethodInvoker)(delegate + { + askToDownload(downloadHandle, url); + })); + } + else + { + AppendText(false, args.Msg); + } + }; + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + AppendText(false, UIRes.I18N("MsgUnpacking")); + + try + { + CloseV2ray(); + + string fileName = downloadHandle.DownloadFileName; + fileName = Utils.GetPath(fileName); + FileManager.ZipExtractToFile(fileName); + + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); + + Global.reloadV2ray = true; + LoadV2ray(); + + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); + } + catch (Exception ex) + { + AppendText(false, ex.Message); + } + } + else + { + AppendText(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + } + + AppendText(false, string.Format(UIRes.I18N("MsgStartUpdating"), "v2rayCore")); + downloadHandle.CheckUpdateAsync("Core"); + } + + private void tsbCheckUpdatePACList_Click(object sender, EventArgs e) + { + DownloadHandle pacListHandle = null; + if (pacListHandle == null) + { + pacListHandle = new DownloadHandle(); + pacListHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + string result = args.Msg; + if (Utils.IsNullOrEmpty(result)) + { + return; + } + pacListHandle.GenPacFile(result); + + AppendText(false, UIRes.I18N("MsgPACUpdateSuccessfully")); + } + else + { + AppendText(false, UIRes.I18N("MsgPACUpdateFailed")); + } + }; + pacListHandle.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + } + AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); + pacListHandle.WebDownloadString(config.urlGFWList); + } + + private void tsbCheckClearPACList_Click(object sender, EventArgs e) + { + try + { + File.WriteAllText(Utils.GetPath(Global.pacFILE), Utils.GetEmbedText(Global.BlankPacFileName), Encoding.UTF8); + AppendText(false, UIRes.I18N("MsgSimplifyPAC")); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + #endregion + + #region Help + + + private void tsbAbout_Click(object sender, EventArgs e) + { + Process.Start(Global.AboutUrl); + } + + private void tsbV2rayWebsite_Click(object sender, EventArgs e) + { + Process.Start(Global.v2rayWebsiteUrl); + } + + private void tsbPromotion_Click(object sender, EventArgs e) + { + Process.Start($"{Utils.Base64Decode(Global.PromotionUrl)}?t={DateTime.Now.Ticks}"); + } + #endregion + + #region ScanScreen + + + private void bgwScan_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) + { + string ret = Utils.ScanScreen(); + bgwScan.ReportProgress(0, ret); + } + + private void bgwScan_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) + { + ShowForm(); + + string result = Convert.ToString(e.UserState); + if (Utils.IsNullOrEmpty(result)) + { + UI.ShowWarning(UIRes.I18N("NoValidQRcodeFound")); + } + else + { + if (AddBatchServers(result) > 0) + { + UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); + } + } + } + + #endregion + + #region 订阅 + private void tsbSubSetting_Click(object sender, EventArgs e) + { + SubSettingForm fm = new SubSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshServers(); + } + } + + private void tsbSubUpdate_Click(object sender, EventArgs e) + { + UpdateSubscriptionProcess(); + } + + /// + /// the subscription update process + /// + private void UpdateSubscriptionProcess() + { + AppendText(false, UIRes.I18N("MsgUpdateSubscriptionStart")); + + if (config.subItem == null || config.subItem.Count <= 0) + { + AppendText(false, UIRes.I18N("MsgNoValidSubscription")); + return; + } + + for (int k = 1; k <= config.subItem.Count; k++) + { + string id = config.subItem[k - 1].id.TrimEx(); + string url = config.subItem[k - 1].url.TrimEx(); + string hashCode = $"{k}->"; + if (config.subItem[k - 1].enabled == false) + { + continue; + } + if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); + continue; + } + + DownloadHandle downloadHandle3 = new DownloadHandle(); + downloadHandle3.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); + string result = Utils.Base64Decode(args.Msg); + if (Utils.IsNullOrEmpty(result)) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); + return; + } + + ConfigHandler.RemoveServerViaSubid(ref config, id); + AppendText(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + RefreshServers(); + if (AddBatchServers(result, id) > 0) + { + } + else + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); + } + AppendText(false, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); + } + else + { + AppendText(false, args.Msg); + } + }; + downloadHandle3.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + + downloadHandle3.WebDownloadString(url); + AppendText(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); + } + } + + private void tsbQRCodeSwitch_CheckedChanged(object sender, EventArgs e) + { + bool bShow = tsbQRCodeSwitch.Checked; + scMain.Panel2Collapsed = !bShow; + } + #endregion + + #region Language + + private void tsbLanguageDef_Click(object sender, EventArgs e) + { + SetCurrentLanguage("en"); + } + + private void tsbLanguageZhHans_Click(object sender, EventArgs e) + { + SetCurrentLanguage("zh-Hans"); + } + private void SetCurrentLanguage(string value) + { + Utils.RegWriteValue(Global.MyRegPath, Global.MyRegKeyLanguage, value); + //Application.Restart(); + } + + + + + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 0045a460..eb1e2e63 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -117,190 +117,703 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill + + Remove duplicate servers - - 3, 17 + + 355, 22 - - 327, 17 - - - 447, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Add [VMess] server + + Magenta - - 447, 22 + + 355, 22 - - Add [Shadowsocks] server + + 97, 53 - - 447, 22 + + groupBox2 + + + Add [VLESS] server + + + 2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Restart service + + + 184, 6 + + + tsbSubSetting + + + 264, 22 + + + groupBox2 + + + menuMoveUp Add [Socks] server - - 447, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Add a custom configuration server + + + ImageAboveText - - 447, 22 + + 语言-[中文简体] - - Import bulk URL from clipboard + + NoControl - - 447, 22 + + Top - - Scan QR code on the screen + + tsbHelp - - 444, 6 + + 5 + + + + False + + + toolStripSeparator6 + + + 355, 22 + + + 99, 53 + + + Update subscriptions + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 187, 22 + + + toolSslBlank2 + + + tsbCheckUpdateN - 447, 22 + 355, 22 - - Remove selected server (multiple choice) (Delete) - - - 447, 22 - - - Remove duplicate server - - - 447, 22 - - - Copy selected server - - - 447, 22 - - - Set as active server (Enter) - - - 444, 6 - - - 447, 22 + + 355, 22 - Up to top + Move to top (T) - - 447, 22 + + 45, 53 - - Upward (U) + + Only open Http proxy and do nothing - - 447, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Down (D) + + toolStripSeparator7 - - 447, 22 + + Update v2rayCore - - Moves down to the bottom + + Magenta - - 447, 22 + + menuKeepNothing - - Select All (Ctrl+A) + + 355, 22 - - 444, 6 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 447, 22 + + menuExport2SubContent - - Test server ping (multiple choice)(Ctrl+P) + + 52, 17 - - 447, 22 + + Share - - Test server tcping (multiple choice)(Ctrl+O) + + tsbQRCodeSwitch - - 447, 22 - - - Test server real ping (multiple choice)(Ctrl+R) - - - 447, 22 - - - Test server speed (multiple choice)(Ctrl+T) - - - 444, 6 - - - 447, 22 + + 355, 22 Export selected server for client configuration - - 447, 22 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Export selected server for server configuration - - 447, 22 - - - Batch export share URL to clipboard (multiple choice) - - - 447, 22 - - - Batch export subscription content to clipboard (multiple choice) - - - Magenta - - - 64, 53 - - - Servers - - + ImageAboveText - - 448, 534 + + 952, 56 - - cmsLv + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + Test servers real delay (Ctrl+R) + + + menuTcpingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + 411, 22 + + + 355, 22 + + + toolStripSeparator1 + + + 3 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 393, 22 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbClose + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageDef + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM + mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY + FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr + flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh + VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh + 6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC + + + + 411, 22 + + + 3 + + + 3, 17 + + + 355, 22 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + 6, 56 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 220, 17 + + + menuAddCustomServer + + + menuMoveDown + + + Import bulk URL from clipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 411, 22 + + + Move to bottom (B) + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 12 + + + 48, 53 + + + 393, 22 + + + 355, 22 + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel1 + + + 195, 17 + + + 0 + + + 686, 331 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bottom + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain.Panel2 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 39, 17 + + + menuAddServers2 + + + Fill + + + tsbServer + + + Add [VMess] server + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + tsbAbout + + + 195, 17 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 352, 6 + + + 256, 331 + + + 4, 4, 4, 4 + + + Test servers with tcping (Ctrl+O) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 56 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 195, 17 + + + 2 + + + 125, 22 + + + 0, 17 + + + scMain.Panel2 + + + 58, 53 + + + 355, 22 + + + Not Enabled Http Proxy + + + 187, 22 + + + 6, 56 + + + Test servers download speed (Ctrl+T) + + + ssMain + + + 686 + + + ImageAboveText + + + 265, 164 + + + 355, 22 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + Check for updates + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslServerSpeed + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + 125, 22 + + + Only open Http proxy and clear the proxy settings + + + scMain + + + HTTP: + + + Remove selected servers (Delete) + + + 411, 22 + + + menuKeepPAC + + + 0 + + + Help + + + menuSelectAll + + + $this + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Scan QR code on the screen (Ctrl+S) + + + ImageAboveText + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 187, 22 + + + menuAddServers + + + 355, 22 + + + menuAddVmessServer + + + tsbLanguageZhHans + + + menuRemoveDuplicateServer + + + BottomCenter + + + menuExport2ShareUrl + + + tsMain + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + v2rayN (this software) + + + Magenta + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 66 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbV2rayWebsite + + + Server + + + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + menuAddShadowsocksServer + + + txtMsgBox + + + toolSslBlank4 + + + menuAddTrojanServer + + + 261, 6 + + + v2rayN + + + Language-[English] + + + menuSpeedServer + + + 264, 22 + + + 0 + + + toolSslBlank3 + + + 128, 53 + + + Add [Trojan] server + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator11 System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Fill + + 0, 417 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 352, 6 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + V2Ray Website + + + No + + + 1 + + + toolSslPacPort + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Settings + + + menuMoveTop + + + menuKeep @@ -319,566 +832,539 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 0, 0 - - - 686, 331 - - - - 1 - - - lvServers - - - v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - splitContainer1.Panel1 - - - 0 - - - splitContainer1.Panel1 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1 - - - 0 - - - Fill - - - 0, 0 - - - 256, 331 - - - 0 - - - qrCodeControl - - - v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - - - splitContainer1.Panel2 - - - 0 - - - splitContainer1.Panel2 - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - splitContainer1 - - - 1 - - - 100 - - - 946, 331 - - - 686 - - - 2 - - - splitContainer1 - - - System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 17, 17 - - - 137, 17 - - - NoControl - - - 547, 22 - - - Not Enabled Http Proxy - - - 547, 22 - - - Open Http proxy and automatically configure proxy server (global mode) - - - 547, 22 - - - Open PAC and automatically configure PAC (PAC mode) - - - 547, 22 - - - Only open Http proxy, do not automatically configure proxy server (direct mode) - - - 547, 22 - - - Only open PAC, do not automatically configure PAC - - - 264, 22 - - - Http proxy - - - 264, 22 - - - Server - - - 264, 22 - - - Import bulk URL from clipboard - - - 264, 22 - - - Scan QR code on the screen - - - 264, 22 - - - Copy local PAC URL - - - 261, 6 - - - 264, 22 - - - Exit - - - 265, 142 - - - cmsMain - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - v2rayN - - - True - - - 498, 17 - - - Fill - - - 0, 66 - 952, 351 - - 2 + + menuScanScreen - - Server list + + cmsLv - - groupBox1 + + toolStripSeparator12 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6, 56 - - $this - - - 2 - - + Fill - - 3, 17 + + toolSslBlank1 - - 0 - - - True - - - Vertical - - - 946, 134 - - - 2 - - - txtMsgBox - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - 228, 18 - - - 微软雅黑, 8pt - - - 49, 17 - - - SOCKS5 - - - 0, 17 - - - 微软雅黑, 8pt - - - 198, 17 + + tsbSubUpdate 微软雅黑, 8pt - - 36, 17 - - - HTTP - - - 0, 17 - - - 微软雅黑, 8pt - - - 198, 17 - - - 微软雅黑, 8pt - - - 30, 17 - - - PAC - - - 0, 17 - - - 微软雅黑, 8pt - - - 198, 17 - - - False - - - 微软雅黑, 8pt - - - No - - - 220, 17 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 SPEED Disabled - - MiddleRight + + PAC: - + + Promotion + + + menuSysAgentMode + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0 + + + Export subscription (base64) share to clipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen2 + + + cmsMain + + + 264, 22 + + + menuServers + + + menuUpdateSubscriptions + + + $this + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + 1 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 17 3, 151 - - 946, 22 + + True - - 7 + + 355, 22 - - statusStrip1 - - - ssMain - - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - Bottom - - - 0, 417 - - - 952, 176 - - - 4 - - - Information - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - Top - - - 0, 56 + + Subscriptions 952, 10 - - 5 - - - panel1 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 4 - - - 409, 17 - - - 6, 56 - - - 197, 22 - - - Subscription settings - - - 197, 22 - - Update subscription + Updates - - Magenta + + 264, 22 - - 93, 53 + + menuNotEnabledHttp - - Subscription + + 0 - - ImageAboveText + + Informations - - 6, 56 - - - Magenta - - - 52, 53 - - - Setting - - - ImageAboveText - - - 6, 56 - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd - QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X - jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY - 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 - NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY - B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== - - - - BottomCenter - - - Magenta - - - 97, 53 - - - Restart service - - - ImageAboveText - - - 6, 56 - - - 338, 22 - - - Check for updates to v2rayN - - - 338, 22 - - - Check for updates to v2rayCore - - - 338, 22 - - - Check for updated PAC (requires Http proxy) - - - 338, 22 - - - Simplify PAC (please set Core route) - - - Magenta - - - 128, 53 - - - Check for updates - - - ImageAboveText - - - 6, 56 - - - 187, 22 - - - About - - - 184, 6 - - - 187, 22 - - - Language-[English] - - - 187, 22 - - - 语言-[中文简体] - - - Magenta - - - 48, 53 - - - Help - - - ImageAboveText - - - Magenta + + toolStripSeparator8 89, 53 - - Promotion + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + BottomCenter + + + Test servers ping (Ctrl+P) + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 355, 22 + + + 264, 22 + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Settings + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyServer + + + Http proxy + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 411, 22 + + + Only open PAC and clear the proxy settings + + + 355, 22 + + + groupBox1 + + + MainForm + + + toolStripSeparator9 + + + menuExit + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Servers list + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + lvServers + + + menuRealPingServer + + + Magenta + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobal + + + 100 + + + 2 + + + menuKeepPACNothing + + + Check for updated PAC (need the HTTP proxy are ON) + + + 355, 22 + + + v2rayN Project + + + Servers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Select All (Ctrl+A) + + + ImageAboveText + + + 3 + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + SOCKS5: + + + 33, 17 + + + 355, 22 + + + menuRemoveServer + + + tsbTestMe + + + 355, 22 + + + 946, 134 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + scMain + + + Down (D) + + + menuCopyPACUrl + + + 352, 6 + + + Magenta + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Only open PAC and do nothing + + + 355, 22 + + + tsbSub + + + Magenta + + + ImageAboveText + + + Clone selected server + + + 0, 0 + + + 355, 22 + + + groupBox2 + + + tsbCheckUpdate + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 微软雅黑, 8pt + + + Export share URLs to clipboard (Ctrl+C) + + + 411, 22 + + + 355, 22 + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + 微软雅黑, 8pt + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Simplify PAC (need to set Core route) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + $this + + + Fill + + + qrCodeControl + + + 264, 22 + + + 355, 22 + + + 0 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 微软雅黑, 8pt + + + tsbPromotion + + + ImageAboveText + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobalPAC + + + 393, 22 + + + 356, 600 + + + 0, 0 + + + scMain.Panel1 + + + Up (U) + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + Open Http proxy and set the system proxy (global mode) + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MiddleRight + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + scMain.Panel1 + + + 微软雅黑, 8pt + + + 64, 53 + + + Magenta + + + 946, 22 + + + Open PAC and set the system proxy (PAC mode) + + + 355, 22 + + + Set as active server (Enter) + + + menuAddVlessServer + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 946, 331 + + + 6, 56 + + + Add [Shadowsocks] server + + + 390, 6 + + + 微软雅黑, 8pt + + + 952, 593 + + + 411, 22 + + + tsbCheckClearPACList + + + Test current service status + + + toolSslSocksPort + + + toolStripSeparator10 + + + toolSslHttpPortLab + + + menuMoveBottom + + + 393, 22 + + + 1 + + + Magenta + + + menuExport2ClientConfig + + + 187, 22 + + + menuExport2ServerConfig + + + 0 ImageAboveText @@ -886,524 +1372,152 @@ 6, 56 - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - + + 0, 17 - + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Magenta 52, 53 - - Close - - + ImageAboveText - - 0, 0 - - - 952, 56 - - - 6 - - - tsMain - - - System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 5 - - - True - - - 65 - - - 6, 12 - - - 952, 593 - - - 4, 4, 4, 4 - - - v2rayN - - - menuAddVmessServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddShadowsocksServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddCustomServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddServers - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuScanScreen - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator1 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemoveServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemoveDuplicateServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuCopyServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSetDefaultServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator3 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveTop - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveUp - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveDown - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveBottom - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSelectAll - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator9 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuPingServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuTcpingServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRealPingServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSpeedServer - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator6 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2ClientConfig - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2ServerConfig - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2ShareUrl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2SubContent - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbServer - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - notifyMain - - - System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSysAgentMode - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuNotEnabledHttp - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobalPAC - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeep - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeepPAC - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuServers - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddServers2 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuScanScreen2 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuCopyPACUrl - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator2 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExit - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bgwScan - - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslSocksPortLab - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslSocksPort - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslBlank1 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslHttpPortLab - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslHttpPort - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslBlank2 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - toolSslPacPortLab - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslPacPort - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslBlank3 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslServerSpeed - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslBlank4 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator4 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSub - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSubSetting - - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbSubUpdate + + Exit - + + bgwScan + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator8 + + Scan QR code on the screen - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 56 - - tsbOptionSetting + + Close - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 264, 22 - - toolStripSeparator5 + + 0, 17 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - - tsbReload + + Import bulk URL from clipboard (Ctrl+V) + + + $this + + + toolStripSeparator2 + + + toolSslSocksPortLab + + + Add a custom configuration server + + + toolSslHttpPort System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - toolStripSeparator7 + + 352, 6 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 952, 176 - - tsbCheckUpdate + + statusStrip1 - + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tsbCheckUpdateN + + 0 - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill - - tsbCheckUpdateCore + + Copy local PAC URL - + + 3, 17 + + + toolStripSeparator3 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA + 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC + + + + 355, 22 + + + 微软雅黑, 8pt + + + 355, 22 + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 tsbCheckUpdatePACList - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckClearPACList - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator10 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbHelp - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbAbout - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator12 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageDef - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageZhHans - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbPromotion - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator11 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbClose - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MainForm - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - + + 228, 18 + + + True + + + 108 + + + 137, 17 + + + 498, 17 + + + 17, 17 + + + 409, 17 + + + 327, 17 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index d9fdbce0..83e8f530 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -119,163 +119,175 @@ - 278, 22 + 300, 22 添加[VMess]服务器 + + 300, 22 + + + 添加[VLESS]服务器 + - 278, 22 + 300, 22 添加[Shadowsocks]服务器 - 278, 22 + 300, 22 添加[Socks]服务器 + + 300, 22 + + + 添加[Trojan]服务器 + - 278, 22 + 300, 22 添加自定义配置服务器 - 278, 22 + 300, 22 - 从剪贴板导入批量URL + 从剪贴板导入批量URL (Ctrl+V) - 278, 22 + 300, 22 - 扫描屏幕上的二维码 + 扫描屏幕上的二维码 (Ctrl+S) - 275, 6 + 297, 6 - 278, 22 + 300, 22 - 移除所选服务器(多选) (Delete) + 移除所选服务器(多选) (Delete) - 278, 22 + 300, 22 移除重复的服务器 - 278, 22 + 300, 22 - 复制所选服务器 + 克隆所选服务器 - 278, 22 + 300, 22 - 设为活动服务器 (Enter) + 设为活动服务器 (Enter) - 275, 6 + 297, 6 - 278, 22 + 300, 22 - 上移至顶 + 上移至顶 (T) - 278, 22 + 300, 22 - 上移 (U) + 上移 (U) - 278, 22 + 300, 22 - 下移 (D) + 下移 (D) - 278, 22 + 300, 22 - 下移至底 + 下移至底 (B) - 278, 22 + 300, 22 - 全选 (Ctrl+A) + 全选 (Ctrl+A) - 275, 6 + 297, 6 - 278, 22 + 300, 22 - 测试服务器延迟Ping(多选)(Ctrl+P) + 测试服务器延迟Ping(多选) (Ctrl+P) - 278, 22 + 300, 22 - 测试服务器延迟Tcping(多选)(Ctrl+O) + 测试服务器延迟Tcping(多选) (Ctrl+O) - 278, 22 + 300, 22 - 测试服务器真连接延迟(多选)(Ctrl+R) + 测试服务器真连接延迟(多选) (Ctrl+R) - 278, 22 + 300, 22 - 测试服务器速度(多选)(Ctrl+T) + 测试服务器速度(多选) (Ctrl+T) + + + 300, 22 + + + 测试当前服务状态 - 275, 6 + 297, 6 - 278, 22 + 300, 22 导出所选服务器为客户端配置 - 278, 22 + 300, 22 导出所选服务器为服务端配置 - 278, 22 + 300, 22 - 批量导出分享URL至剪贴板(多选) + 批量导出分享URL至剪贴板(多选) (Ctrl+C) - 278, 22 + 300, 22 批量导出订阅内容至剪贴板(多选) - - 73, 53 - - - 服务器 - - 279, 534 + 301, 600 @@ -294,35 +306,14 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 340, 22 + + 73, 53 - - 关闭Http代理 + + 服务器 - - 340, 22 - - - 开启Http代理,并自动配置代理服务器(全局模式) - - - 340, 22 - - - 开启PAC,并自动配置PAC(PAC模式) - - - 340, 22 - - - 仅开启Http代理,不自动配置代理服务器(直连模式) - - - 340, 22 - - - 仅开启PAC,不自动配置PAC + + 196, 164 195, 22 @@ -330,6 +321,48 @@ Http代理 + + 316, 22 + + + 关闭Http代理 + + + 316, 22 + + + 开启Http代理,并自动配置系统代理(全局模式) + + + 316, 22 + + + 开启PAC,并自动配置系统代理(PAC模式) + + + 316, 22 + + + 仅开启Http代理,并清除系统代理 + + + 316, 22 + + + 仅开启PAC,并清除系统代理 + + + 316, 22 + + + 仅开启Http代理,不改变系统代理 + + + 316, 22 + + + 仅开启PAC,不改变系统代理 + 195, 22 @@ -354,6 +387,12 @@ 复制本地PAC网址 + + 195, 22 + + + 更新订阅 + 192, 6 @@ -363,17 +402,20 @@ 退出 - - 196, 142 - 服务器列表 + + 信息 + 网速显示未启用 - - 信息 + + 61, 53 + + + 订阅 124, 22 @@ -387,11 +429,11 @@ 更新订阅 - - 61, 53 + + 52, 53 - - 订阅 + + 分享 76, 53 @@ -402,7 +444,7 @@ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 @@ -416,38 +458,38 @@ 重启服务 - - 232, 22 - - - 检查更新v2rayN - - - 232, 22 - - - 检查更新v2rayCore - - - 232, 22 - - - 检查更新PAC (需要Http代理) - - - 232, 22 - - - 简化PAC (请设置Core路由) - 85, 53 检查更新 - - 关于 + + 223, 22 + + + v2rayN + + + 223, 22 + + + v2rayCore + + + 223, 22 + + + PAC + + + 220, 6 + + + 223, 22 + + + 简化PAC (请设置Core路由) 69, 53 @@ -455,6 +497,12 @@ 帮助 + + v2rayN 项目 + + + V2Ray 官网 + 68, 53 @@ -464,11 +512,14 @@ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + 76, 53 + - 关闭 + 关闭窗口 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index 57488adc..62af6048 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -33,6 +33,7 @@ this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.chkdefAllowInsecure = new System.Windows.Forms.CheckBox(); this.label16 = new System.Windows.Forms.Label(); this.cmblistenerType = new System.Windows.Forms.ComboBox(); this.chksniffingEnabled2 = new System.Windows.Forms.CheckBox(); @@ -65,10 +66,10 @@ this.tabPage8 = new System.Windows.Forms.TabPage(); this.cmbroutingMode = new System.Windows.Forms.ComboBox(); this.panel3 = new System.Windows.Forms.Panel(); + this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); this.btnSetDefRountingRule = new System.Windows.Forms.Button(); this.labRoutingTips = new System.Windows.Forms.Label(); this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); - this.label15 = new System.Windows.Forms.Label(); this.tabPage6 = new System.Windows.Forms.TabPage(); this.chkKcpcongestion = new System.Windows.Forms.CheckBox(); this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox(); @@ -84,6 +85,7 @@ this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPage7 = new System.Windows.Forms.TabPage(); + this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox(); this.cbFreshrate = new System.Windows.Forms.ComboBox(); this.lbFreshrate = new System.Windows.Forms.Label(); this.chkEnableStatistics = new System.Windows.Forms.CheckBox(); @@ -91,6 +93,10 @@ this.txturlGFWList = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); + this.tabPage9 = new System.Windows.Forms.TabPage(); + this.txtuserPacRule = new System.Windows.Forms.TextBox(); + this.panel4 = new System.Windows.Forms.Panel(); + this.label4 = new System.Windows.Forms.Label(); this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); @@ -107,36 +113,41 @@ this.panel3.SuspendLayout(); this.tabPage6.SuspendLayout(); this.tabPage7.SuspendLayout(); + this.tabPage9.SuspendLayout(); + this.panel4.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); // // btnClose // - this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.btnClose.Name = "btnClose"; this.btnClose.UseVisualStyleBackColor = true; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // tabControl1 // + resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabPage6); this.tabControl1.Controls.Add(this.tabPage7); - resources.ApplyResources(this.tabControl1, "tabControl1"); + this.tabControl1.Controls.Add(this.tabPage9); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // // tabPage1 // - this.tabPage1.Controls.Add(this.groupBox1); resources.ApplyResources(this.tabPage1, "tabPage1"); + this.tabPage1.Controls.Add(this.groupBox1); this.tabPage1.Name = "tabPage1"; this.tabPage1.UseVisualStyleBackColor = true; // // groupBox1 // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.chkdefAllowInsecure); this.groupBox1.Controls.Add(this.label16); this.groupBox1.Controls.Add(this.cmblistenerType); this.groupBox1.Controls.Add(this.chksniffingEnabled2); @@ -157,10 +168,15 @@ this.groupBox1.Controls.Add(this.label5); this.groupBox1.Controls.Add(this.txtlocalPort); this.groupBox1.Controls.Add(this.label2); - resources.ApplyResources(this.groupBox1, "groupBox1"); this.groupBox1.Name = "groupBox1"; this.groupBox1.TabStop = false; // + // chkdefAllowInsecure + // + resources.ApplyResources(this.chkdefAllowInsecure, "chkdefAllowInsecure"); + this.chkdefAllowInsecure.Name = "chkdefAllowInsecure"; + this.chkdefAllowInsecure.UseVisualStyleBackColor = true; + // // label16 // resources.ApplyResources(this.label16, "label16"); @@ -168,6 +184,7 @@ // // cmblistenerType // + resources.ApplyResources(this.cmblistenerType, "cmblistenerType"); this.cmblistenerType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmblistenerType.FormattingEnabled = true; this.cmblistenerType.Items.AddRange(new object[] { @@ -175,8 +192,9 @@ resources.GetString("cmblistenerType.Items1"), resources.GetString("cmblistenerType.Items2"), resources.GetString("cmblistenerType.Items3"), - resources.GetString("cmblistenerType.Items4")}); - resources.ApplyResources(this.cmblistenerType, "cmblistenerType"); + resources.GetString("cmblistenerType.Items4"), + resources.GetString("cmblistenerType.Items5"), + resources.GetString("cmblistenerType.Items6")}); this.cmblistenerType.Name = "cmblistenerType"; // // chksniffingEnabled2 @@ -222,12 +240,12 @@ // // cmbprotocol2 // + resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2"); this.cmbprotocol2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbprotocol2.FormattingEnabled = true; this.cmbprotocol2.Items.AddRange(new object[] { resources.GetString("cmbprotocol2.Items"), resources.GetString("cmbprotocol2.Items1")}); - resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2"); this.cmbprotocol2.Name = "cmbprotocol2"; // // label3 @@ -242,8 +260,8 @@ // // cmbprotocol // - this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); + this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbprotocol.FormattingEnabled = true; this.cmbprotocol.Items.AddRange(new object[] { resources.GetString("cmbprotocol.Items"), @@ -269,6 +287,7 @@ // // cmbloglevel // + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbloglevel.FormattingEnabled = true; this.cmbloglevel.Items.AddRange(new object[] { @@ -277,7 +296,6 @@ resources.GetString("cmbloglevel.Items2"), resources.GetString("cmbloglevel.Items3"), resources.GetString("cmbloglevel.Items4")}); - resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); this.cmbloglevel.Name = "cmbloglevel"; // // label5 @@ -297,33 +315,33 @@ // // tabPage2 // - this.tabPage2.Controls.Add(this.groupBox2); resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Controls.Add(this.groupBox2); this.tabPage2.Name = "tabPage2"; this.tabPage2.UseVisualStyleBackColor = true; // // groupBox2 // + resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Controls.Add(this.tabControl2); this.groupBox2.Controls.Add(this.panel3); - resources.ApplyResources(this.groupBox2, "groupBox2"); this.groupBox2.Name = "groupBox2"; this.groupBox2.TabStop = false; // // tabControl2 // + resources.ApplyResources(this.tabControl2, "tabControl2"); this.tabControl2.Controls.Add(this.tabPage3); this.tabControl2.Controls.Add(this.tabPage4); this.tabControl2.Controls.Add(this.tabPage5); this.tabControl2.Controls.Add(this.tabPage8); - resources.ApplyResources(this.tabControl2, "tabControl2"); this.tabControl2.Name = "tabControl2"; this.tabControl2.SelectedIndex = 0; // // tabPage3 // - this.tabPage3.Controls.Add(this.txtUseragent); resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Controls.Add(this.txtUseragent); this.tabPage3.Name = "tabPage3"; this.tabPage3.UseVisualStyleBackColor = true; // @@ -334,8 +352,8 @@ // // tabPage4 // - this.tabPage4.Controls.Add(this.txtUserdirect); resources.ApplyResources(this.tabPage4, "tabPage4"); + this.tabPage4.Controls.Add(this.txtUserdirect); this.tabPage4.Name = "tabPage4"; this.tabPage4.UseVisualStyleBackColor = true; // @@ -346,8 +364,8 @@ // // tabPage5 // - this.tabPage5.Controls.Add(this.txtUserblock); resources.ApplyResources(this.tabPage5, "tabPage5"); + this.tabPage5.Controls.Add(this.txtUserblock); this.tabPage5.Name = "tabPage5"; this.tabPage5.UseVisualStyleBackColor = true; // @@ -358,13 +376,14 @@ // // tabPage8 // - this.tabPage8.Controls.Add(this.cmbroutingMode); resources.ApplyResources(this.tabPage8, "tabPage8"); + this.tabPage8.Controls.Add(this.cmbroutingMode); this.tabPage8.Name = "tabPage8"; this.tabPage8.UseVisualStyleBackColor = true; // // cmbroutingMode // + resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbroutingMode.FormattingEnabled = true; this.cmbroutingMode.Items.AddRange(new object[] { @@ -372,18 +391,24 @@ resources.GetString("cmbroutingMode.Items1"), resources.GetString("cmbroutingMode.Items2"), resources.GetString("cmbroutingMode.Items3")}); - resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); this.cmbroutingMode.Name = "cmbroutingMode"; // // panel3 // + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Controls.Add(this.linkLabelRoutingDoc); this.panel3.Controls.Add(this.btnSetDefRountingRule); this.panel3.Controls.Add(this.labRoutingTips); this.panel3.Controls.Add(this.cmbdomainStrategy); - this.panel3.Controls.Add(this.label15); - resources.ApplyResources(this.panel3, "panel3"); this.panel3.Name = "panel3"; // + // linkLabelRoutingDoc + // + resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc"); + this.linkLabelRoutingDoc.Name = "linkLabelRoutingDoc"; + this.linkLabelRoutingDoc.TabStop = true; + this.linkLabelRoutingDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelRoutingDoc_LinkClicked); + // // btnSetDefRountingRule // resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); @@ -393,28 +418,24 @@ // // labRoutingTips // - this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; this.labRoutingTips.Name = "labRoutingTips"; // // cmbdomainStrategy // + resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cmbdomainStrategy.FormattingEnabled = true; this.cmbdomainStrategy.Items.AddRange(new object[] { resources.GetString("cmbdomainStrategy.Items"), resources.GetString("cmbdomainStrategy.Items1"), resources.GetString("cmbdomainStrategy.Items2")}); - resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); this.cmbdomainStrategy.Name = "cmbdomainStrategy"; // - // label15 - // - resources.ApplyResources(this.label15, "label15"); - this.label15.Name = "label15"; - // // tabPage6 // + resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Controls.Add(this.chkKcpcongestion); this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); this.tabPage6.Controls.Add(this.label10); @@ -428,7 +449,6 @@ this.tabPage6.Controls.Add(this.label7); this.tabPage6.Controls.Add(this.txtKcpmtu); this.tabPage6.Controls.Add(this.label6); - resources.ApplyResources(this.tabPage6, "tabPage6"); this.tabPage6.Name = "tabPage6"; this.tabPage6.UseVisualStyleBackColor = true; // @@ -500,6 +520,8 @@ // // tabPage7 // + resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); this.tabPage7.Controls.Add(this.cbFreshrate); this.tabPage7.Controls.Add(this.lbFreshrate); this.tabPage7.Controls.Add(this.chkEnableStatistics); @@ -507,15 +529,20 @@ this.tabPage7.Controls.Add(this.txturlGFWList); this.tabPage7.Controls.Add(this.label13); this.tabPage7.Controls.Add(this.chkAutoRun); - resources.ApplyResources(this.tabPage7, "tabPage7"); this.tabPage7.Name = "tabPage7"; this.tabPage7.UseVisualStyleBackColor = true; // + // chkKeepOlderDedupl + // + resources.ApplyResources(this.chkKeepOlderDedupl, "chkKeepOlderDedupl"); + this.chkKeepOlderDedupl.Name = "chkKeepOlderDedupl"; + this.chkKeepOlderDedupl.UseVisualStyleBackColor = true; + // // cbFreshrate // + resources.ApplyResources(this.cbFreshrate, "cbFreshrate"); this.cbFreshrate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cbFreshrate.FormattingEnabled = true; - resources.ApplyResources(this.cbFreshrate, "cbFreshrate"); this.cbFreshrate.Name = "cbFreshrate"; // // lbFreshrate @@ -551,11 +578,36 @@ this.chkAutoRun.Name = "chkAutoRun"; this.chkAutoRun.UseVisualStyleBackColor = true; // + // tabPage9 + // + resources.ApplyResources(this.tabPage9, "tabPage9"); + this.tabPage9.Controls.Add(this.txtuserPacRule); + this.tabPage9.Controls.Add(this.panel4); + this.tabPage9.Name = "tabPage9"; + this.tabPage9.UseVisualStyleBackColor = true; + // + // txtuserPacRule + // + resources.ApplyResources(this.txtuserPacRule, "txtuserPacRule"); + this.txtuserPacRule.Name = "txtuserPacRule"; + // + // panel4 + // + resources.ApplyResources(this.panel4, "panel4"); + this.panel4.Controls.Add(this.label4); + this.panel4.Name = "panel4"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.ForeColor = System.Drawing.Color.Brown; + this.label4.Name = "label4"; + // // panel2 // + resources.ApplyResources(this.panel2, "panel2"); this.panel2.Controls.Add(this.btnClose); this.panel2.Controls.Add(this.btnOK); - resources.ApplyResources(this.panel2, "panel2"); this.panel2.Name = "panel2"; // // btnOK @@ -601,6 +653,9 @@ this.tabPage6.PerformLayout(); this.tabPage7.ResumeLayout(false); this.tabPage7.PerformLayout(); + this.tabPage9.ResumeLayout(false); + this.tabPage9.PerformLayout(); + this.panel4.ResumeLayout(false); this.panel2.ResumeLayout(false); this.ResumeLayout(false); @@ -662,7 +717,6 @@ private System.Windows.Forms.Label label14; private System.Windows.Forms.Panel panel3; private System.Windows.Forms.ComboBox cmbdomainStrategy; - private System.Windows.Forms.Label label15; private System.Windows.Forms.ComboBox cmbroutingMode; private System.Windows.Forms.CheckBox chksniffingEnabled; private System.Windows.Forms.CheckBox chksniffingEnabled2; @@ -673,5 +727,12 @@ private System.Windows.Forms.Label label16; private System.Windows.Forms.ComboBox cmblistenerType; private System.Windows.Forms.TabPage tabPage8; + private System.Windows.Forms.TabPage tabPage9; + private System.Windows.Forms.TextBox txtuserPacRule; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.CheckBox chkKeepOlderDedupl; + private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; + private System.Windows.Forms.CheckBox chkdefAllowInsecure; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index cefc211a..78d4eeff 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Windows.Forms; using v2rayN.Handler; using v2rayN.Base; +using v2rayN.HttpProxyHandler; namespace v2rayN.Forms { @@ -22,6 +23,8 @@ namespace v2rayN.Forms InitKCP(); InitGUI(); + + InitUserPAC(); } /// @@ -65,7 +68,9 @@ namespace v2rayN.Forms //remoteDNS txtremoteDNS.Text = config.remoteDNS; - cmblistenerType.SelectedIndex = config.listenerType; + cmblistenerType.SelectedIndex = (int)config.listenerType; + + chkdefAllowInsecure.Checked = config.defAllowInsecure; } /// @@ -75,8 +80,7 @@ namespace v2rayN.Forms { //路由 cmbdomainStrategy.Text = config.domainStrategy; - int routingMode = 0; - int.TryParse(config.routingMode, out routingMode); + int.TryParse(config.routingMode, out int routingMode); cmbroutingMode.SelectedIndex = routingMode; txtUseragent.Text = Utils.List2String(config.useragent, true); @@ -110,13 +114,13 @@ namespace v2rayN.Forms txturlGFWList.Text = config.urlGFWList; chkAllowLANConn.Checked = config.allowLANConn; + chkEnableStatistics.Checked = config.enableStatistics; + chkKeepOlderDedupl.Checked = config.keepOlderDedupl; - var enableStatistics = config.enableStatistics; - chkEnableStatistics.Checked = enableStatistics; - var cbSource = new ComboItem[] + ComboItem[] cbSource = new ComboItem[] { new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = UIRes.I18N("QuickFresh")}, new ComboItem{ID = (int)Global.StatisticsFreshRate.medium, Text = UIRes.I18N("MediumFresh")}, @@ -142,6 +146,11 @@ namespace v2rayN.Forms } + private void InitUserPAC() + { + txtuserPacRule.Text = Utils.List2String(config.userPacRule, true); + } + private void btnOK_Click(object sender, EventArgs e) { if (SaveBase() != 0) @@ -164,13 +173,18 @@ namespace v2rayN.Forms return; } + if (SaveUserPAC() != 0) + { + return; + } + if (ConfigHandler.SaveConfig(ref config) == 0) { this.DialogResult = DialogResult.OK; } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } @@ -250,8 +264,11 @@ namespace v2rayN.Forms //remoteDNS config.remoteDNS = txtremoteDNS.Text.TrimEx(); - - config.listenerType = cmblistenerType.SelectedIndex; + + config.listenerType = (ListenerType)Enum.ToObject(typeof(ListenerType), cmblistenerType.SelectedIndex); + + config.defAllowInsecure = chkdefAllowInsecure.Checked; + return 0; } @@ -328,9 +345,10 @@ namespace v2rayN.Forms config.allowLANConn = chkAllowLANConn.Checked; - var lastEnableStatistics = config.enableStatistics; + bool lastEnableStatistics = config.enableStatistics; config.enableStatistics = chkEnableStatistics.Checked; config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; + config.keepOlderDedupl = chkKeepOlderDedupl.Checked; //if(lastEnableStatistics != config.enableStatistics) //{ @@ -344,6 +362,15 @@ namespace v2rayN.Forms return 0; } + private int SaveUserPAC() + { + string userPacRule = txtuserPacRule.Text.TrimEx(); + userPacRule = userPacRule.Replace("\"", ""); + + config.userPacRule = Utils.String2List(userPacRule); + + return 0; + } private void btnClose_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; @@ -368,25 +395,29 @@ namespace v2rayN.Forms txtUserblock.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.blockTag); cmbroutingMode.SelectedIndex = 3; - var lstUrl = new List(); - lstUrl.Add(Global.CustomRoutingListUrl + Global.agentTag); - lstUrl.Add(Global.CustomRoutingListUrl + Global.directTag); - lstUrl.Add(Global.CustomRoutingListUrl + Global.blockTag); + List lstUrl = new List + { + Global.CustomRoutingListUrl + Global.agentTag, + Global.CustomRoutingListUrl + Global.directTag, + Global.CustomRoutingListUrl + Global.blockTag + }; - var lstTxt = new List(); - lstTxt.Add(txtUseragent); - lstTxt.Add(txtUserdirect); - lstTxt.Add(txtUserblock); + List lstTxt = new List + { + txtUseragent, + txtUserdirect, + txtUserblock + }; for (int k = 0; k < lstUrl.Count; k++) { - var txt = lstTxt[k]; + TextBox txt = lstTxt[k]; DownloadHandle downloadHandle = new DownloadHandle(); downloadHandle.UpdateCompleted += (sender2, args) => { if (args.Success) { - var result = args.Msg; + string result = args.Msg; if (Utils.IsNullOrEmpty(result)) { return; @@ -410,6 +441,11 @@ namespace v2rayN.Forms { labRoutingTips.Text = text; } + + private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + System.Diagnostics.Process.Start("https://www.v2fly.org/config/routing.html"); + } } class ComboItem diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index e2c26e28..2d85641a 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -117,1412 +117,34 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 355, 16 - - - 75, 23 - - - 7 - - - &Cancel - - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 0 - - - True - - - - NoControl - - - 42, 98 - - - 65, 12 - - - 34 - - - Http proxy - - - label16 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - Not Enabled Http Proxy - - - Open Http proxy and automatically configure proxy server (global mode) - - - Open PAC and automatically configure PAC (PAC mode) - - - Only open Http proxy, do not automatically configure proxy server (direct mode) - - - Only open PAC, do not automatically configure PAC - - - 124, 94 - - - 464, 20 - - - 33 - - - cmblistenerType - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 1 - - - True - - - NoControl - - - 468, 60 - - - 120, 16 - - - 32 - - - Turn on Sniffing - - - False - - - chksniffingEnabled2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 2 - - - True - - - NoControl - - - 468, 27 - - - 120, 16 - - - 31 - - - Turn on Sniffing - - - chksniffingEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 3 - - - 33, 228 - - - 402, 21 - - - 30 - - - txtremoteDNS - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 4 - - - True - - - 33, 204 - - - 281, 12 - - - 29 - - - Custom DNS (multiple, separated by commas (,)) - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 5 - - - True - - - 15, 129 - - - 174, 16 - - - 20 - - - Turn on Mux Multiplexing - - - chkmuxEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 6 - True - - 15, 63 - - - 120, 16 - - - 19 - - - listening port 2 - - - False - - - chkAllowIn2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 7 - - - True - - - 369, 62 - - - 84, 16 - - - 18 - - - Enable UDP - - - False - - - chkudpEnabled2 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 8 - - - socks - - - http - - - 257, 60 - - - 97, 20 - - - 17 - - - False - - - cmbprotocol2 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 9 - - - True - - - 206, 64 - - - 53, 12 - - - 16 - - - protocol - - - False - - - label3 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 10 - - - 124, 60 - - - 78, 21 - - - 14 - - - False - - - txtlocalPort2 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 11 - - - False - - - socks - - - http - - - 257, 25 - - - 97, 20 - - - 12 - - - cmbprotocol - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 12 - - - True - - - 206, 29 - - - 53, 12 - - - 11 - - - protocol - - - label1 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 13 - - - True - - - 369, 27 - - - 84, 16 - - - 10 - - - Enable UDP - - - chkudpEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 14 - - - True - - - 15, 160 - - - 126, 16 - - - 9 - - - Record local logs - - - chklogEnabled - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 15 - - - debug - - - info - - - warning - - - error - - - none - - - 257, 158 - - - 97, 20 - - - 6 - - - cmbloglevel - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 16 - - - True - - - 193, 162 - - - 59, 12 - - - 8 - - - Log level - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 17 - - - 124, 25 - - - 78, 21 - - - 3 - - - txtlocalPort - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 18 - - - True - - - 33, 29 - - - 89, 12 - - - 2 - - - Listening port - - - label2 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 19 - - - Fill - - - 3, 3 - - - 648, 573 - - - 6 - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage1 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 579 - - - 0 - - - Core: basic settings - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 0 - - - Fill - - - 3, 3 - - - 0 - - - True - - - Vertical - - - 628, 454 - - - 0 - - - txtUseragent - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage3 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 634, 460 - - - 0 - - - 1.Proxy Domain or IP - - - tabPage3 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 0 - - - Fill - - - 3, 3 - - - 0 - - - True - - - Vertical - - - 628, 454 - - - 1 - - - txtUserdirect - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage4 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 634, 460 - - - 1 - - - 2.Direct Domain or IP - - - tabPage4 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 1 - - - Fill - - - 3, 3 - - - 0 - - - True - - - Vertical - - - 628, 454 - - - 1 - - - txtUserblock - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage5 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 634, 460 - - - 2 - - - 3.Block Domain or IP - - - tabPage5 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 2 - - - Global - - - Bypassing the LAN address - - - Bypass mainland address - - - Bypassing LAN and mainland address - - - 21, 17 - - - 255, 20 - - - 14 - - - cmbroutingMode - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage8 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 634, 460 - - - 3 - - - 4.Pre-defined rules - - - tabPage8 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl2 - - - 3 - - - Fill - - - 3, 84 - - - 642, 486 - - - 12 - - - tabControl2 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 0 - - - 322, 10 - - - 229, 23 - - - 18 - - - Set default custom routing rules - - - btnSetDefRountingRule - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 0 - - - 5, 45 - - - 598, 16 - - - 13 - - - *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP - - - labRoutingTips - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 1 - - - AsIs - - - IPIfNonMatch - - - IPOnDemand - - - 115, 10 - - - 165, 20 - - - 16 - - - cmbdomainStrategy - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 2 - - - True - - - NoControl - - - 5, 14 - - - 95, 12 - - - 17 - - - Domain strategy - - - label15 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel3 - - - 3 - - - Top - - - 3, 17 - - - 642, 67 - - - 19 - - - panel3 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox2 - - - 1 - - - Fill - - - 3, 3 - - - 648, 573 - - - 12 - - - groupBox2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage2 - - - 0 - - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 579 - - - 1 - - - Core: Routing settings - - - tabPage2 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 1 - - - True - - - 20, 143 - - - 84, 16 - - - 20 - - - congestion - - - chkKcpcongestion - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 0 - - - 345, 100 - - - 94, 21 - - - 15 - - - txtKcpwriteBufferSize - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage6 + + 11 - - 1 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + groupBox2 - - 236, 104 - - - 95, 12 - - - 14 - - - writeBufferSize - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - + 2 - - 111, 100 + + + 30, 176 - - 94, 21 + + Record local logs - - 13 - - - txtKcpreadBufferSize - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 3 - - - True - - - 18, 104 - - - 89, 12 - - - 12 - - - readBufferSize - - - label11 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 4 - - - 345, 62 - - - 94, 21 - - - 11 - - - txtKcpdownlinkCapacity - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 5 - - - True - - - 236, 66 - - - 101, 12 - - - 10 - - - downlinkCapacity - - - label8 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 6 - - - 111, 62 - - - 94, 21 - - - 9 - - - txtKcpuplinkCapacity - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 7 - - - True - - - 18, 66 - - - 89, 12 - - - 8 - - - uplinkCapacity - - - label9 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 8 - - - 345, 24 - - - 94, 21 - - - 7 - - - txtKcptti - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 9 - - - True - - - 236, 28 - - - 23, 12 - - - 6 - - - tti - - - label7 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 10 - - - 111, 24 - - - 94, 21 - - - 5 - - - txtKcpmtu - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 - - - 11 - - - True - - - 18, 28 - - - 23, 12 - - - 4 - - - mtu - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage6 + + 634, 460 12 @@ -1530,355 +152,1922 @@ 4, 22 - - 3, 3, 3, 3 + + txtKcpwriteBufferSize - - 654, 579 - - - 2 - - - Core: KCP settings - - - tabPage6 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 2 - - - 161, 84 - - - 58, 20 - - - 32 - - - cbFreshrate - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 0 - - - True - - - NoControl - - - 30, 92 - - - 125, 12 - - - 30 - - - Statistics freshrate - - - lbFreshrate - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 + + txtuserPacRule - 1 - - - True - - - NoControl - - - 15, 62 - - - 558, 16 - - - 29 - - - Enable Statistics(Realtime net speed and traffic data amount. Need restart v2rayN client) - - - chkEnableStatistics - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - 2 - - True + + False - - 15, 38 - - - 204, 16 - - - 29 - - - Allow connections from the LAN - - - chkAllowLANConn + + 18 System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - tabPage7 + + tabControl1 - - 3 + + groupBox1 - - 32, 205 - - - 544, 21 - - - 28 - - - txturlGFWList - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - - 4 - - - True - - - 30, 176 - - - 431, 12 - - - 27 - - - Custom GFWList address (please fill in the blank without customization) - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage7 - - + 5 - + + 94, 21 + + + 9 + + + groupBox1 + + + tabPage9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + linkLabelRoutingDoc + + + 468, 60 + + + + Top + + + 102, 16 + + + 6 + + + txtKcptti + + + tabPage3 + + + 4, 22 + + + cmblistenerType + + + 0 + + + 634, 460 + + + 0 + + + 111, 100 + + True - - 15, 16 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 132, 16 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 23 + + 3, 3 - - Boot automatically + + 598, 16 - - chkAutoRun + + Core: basic settings - + + True + + + 120, 16 + + + 281, 12 + + + panel3 + + + True + + + tti + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 84, 16 + + + groupBox1 + + + 65, 12 + + + 628, 454 + tabPage7 - - 6 + + Only open PAC, do not automatically configure PAC - - 4, 22 - - - 3, 3, 3, 3 - - - 654, 579 - - - 3 - - - v2rayN settings - - - tabPage7 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabControl1 - - - 3 - - - Fill - - - 0, 10 - - - 662, 605 - - - 10 - - - tabControl1 - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - 267, 16 - - - 75, 23 - - - 8 - - - &OK - - - btnOK - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - - Bottom - - - 0, 615 + + 12 662, 60 - - 11 + + 20 - - panel2 + + http - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 7 - - $this + + chkdefAllowInsecure - + + 648, 573 + + + 206, 64 + + + 95, 12 + + + tabPage6 + + + 14 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 63 + + + tabControl2 + + + 16 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + Enable UDP + + + 94, 21 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + &Cancel + + + label10 + + + 648, 573 + + + Vertical + + + groupBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + 1 - + + Bypassing the LAN address + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bypassing LAN and mainland address + + + Bypass mainland address + + Top - - 0, 0 + + 12 - - 662, 10 + + txtKcpmtu - - 9 + + lbFreshrate - - panel1 + + 1 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + label11 - + + 29 + + + 1 + + + NoControl + + + Turn on Sniffing + + + Only open Http proxy, do not automatically configure proxy server (direct mode) + + + False + + + 4 + + + tabPage6 + + + False + + + tabControl2 + + + 1 + + $this - - 2 + + 7 - + + 3 + + + 4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + readBufferSize + + + 0 + + + tabPage6 + + + 3 + + True - + + + 18 + + + True + + + Fill + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + congestion + + + NoControl + + + groupBox1 + + + panel3 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + 89, 12 + + + info + + + txtUseragent + + + 1 + + + tabPage7 + + + v2rayN settings + + + 20 + + + groupBox1 + + + 16 + + + Not Enabled Http Proxy + + + 14 + + + 32 + + + 628, 454 + 6, 12 - - 662, 675 + + groupBox1 - - 4, 4, 4, 4 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Settings + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - OptionSettingForm + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtKcpdownlinkCapacity + + + 198, 16 + + + Automatically start at system startup + + + 3, 3, 3, 3 + + + 1 + + + Http proxy + + + 4 + + + groupBox1 + + + tabPage6 + + + 355, 16 + + + 3, 3, 3, 3 + + + 97, 20 + + + 3 + + + 662, 605 + + + 33, 29 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 78, 21 + + + 5, 45 + + + Custom DNS (multiple, separated by commas (,)) + + + tabControl1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 598, 16 v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + warning + + + groupBox1 + + + 0 + + + tabPage7 + + + Statistics freshrate + + + label5 + + + 120, 16 + + + 20 + + + 89, 12 + + + Only open Http proxy and do nothing + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 18, 66 + + + 20, 143 + + + 11 + + + 4, 4, 4, 4 + + + tabPage6 + + + btnClose + + + Turn on Sniffing + + + groupBox1 + + + 18, 28 + + + 30 + + + 34 + + + 20 + + + 29 + + + 0 + + + 21, 17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14 + + + 19 + + + 4, 22 + + + *Set user pac rules, separated by commas (,) + + + True + + + chksniffingEnabled + + + 6 + + + 174, 16 + + + 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 18, 104 + + + tabPage2 + + + NoControl + + + 97, 20 + + + socks + + + tabPage5 + + + 576, 16 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 464, 20 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage9 + + + True + + + tabPage6 + + + *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP + + + tabPage3 + + + 30 + + + 53, 12 + + + 17 + + + label8 + + + 468, 27 + + + label13 + + + chkAutoRun + + + tabControl2 + + + 654, 579 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 345, 62 + + + 15 + + + 12 + + + 1 + + + chkudpEnabled + + + True + + + 33, 253 + + + tabPage1 + + + 5 + + + tabPage6 + + + 2 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 5 + + + btnSetDefRountingRule + + + True + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 32 + + + label1 + + + 84, 16 + + + tabPage8 + + + True + + + panel4 + + + label7 + + + allowInsecure + + + txtlocalPort + + + True + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3, 17 + + + 3, 40 + + + labRoutingTips + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + 124, 25 + + + protocol + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + Top, Right + + + Turn on Mux Multiplexing + + + True + + + 23, 12 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 555, 100 + + + socks + + + 0 + + + 3, 3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + chkAllowLANConn + + + 84, 16 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + tabControl1 + + + True + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 15, 38 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + 10 + + + 369, 62 + + + 13 + + + 1.Proxy Domain or IP + + + groupBox1 + + + panel3 + + + NoControl + + + 654, 579 + + + chkEnableStatistics + + + 14 + + + 8 + + + 7 + + + http + + + 53, 12 + + + 193, 162 + + + True + + + 2 + + + 0 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + label2 + + + 165, 20 + + + False + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 3, 3 + + + 9 + + + groupBox1 + + + 4.Pre-defined rules + + + 101, 12 + + + 3 + + + 12 + + + 431, 12 + + + Domain strategy + + + cmbprotocol + + + 648, 37 + + + True + + + Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 4 + + + Listening port + + + Vertical + + + Fill + + + 1 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Vertical + + + 1 + + + 28 + + + 257, 60 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 94, 21 + + + True + + + cmbprotocol2 + + + Open Http proxy and automatically configure proxy server (global mode) + + + groupBox2 + + + chkKeepOlderDedupl + + + 15, 129 + + + 255, 20 + + + mtu + + + True + + + True + + + True + + + chkKcpcongestion + + + 1 + + + 0 + + + 257, 25 + + + 3, 84 + + + groupBox1 + + + Top + + + listening port 2 + + + 97, 20 + + + chkAllowIn2 + + + tabPage2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + False + + + 3 + + + 33 + + + 4, 22 + + + 9 + + + 541, 100 + + + Core: KCP settings + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + error + + + 15, 160 + + + True + + + 59, 12 + + + 5, 14 + + + groupBox1 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 634, 460 + + + 12 + + + 120, 16 + + + 662, 10 + + + txtlocalPort2 + + + Only open PAC and do nothing + + + True + + + Fill + + + groupBox1 + + + 654, 579 + + + 7 + + + 27 + + + 10 + + + False + + + Vertical + + + 206, 29 + + + 8 + + + txtUserdirect + + + chkudpEnabled2 + + + 0 + + + 0 + + + 648, 536 + + + Allow connections from the LAN + + + 161, 84 + + + panel3 + + + 0 + + + tabPage6 + + + tabControl2 + + + 30, 87 + + + txtKcpreadBufferSize + + + 4 + + + panel2 + + + 3 + + + 8 + + + 35 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + User PAC settings + + + 95, 12 + + + tabPage7 + + + 10 + + + none + + + Log level + + + tabControl1 + + + protocol + + + 6 + + + tabPage4 + + + NoControl + + + 2 + + + AsIs + + + 15, 62 + + + 7 + + + tabPage7 + + + 642, 486 + + + 4, 22 + + + 58, 20 + + + groupBox1 + + + 1 + + + 42, 98 + + + 13 + + + 13 + + + 2 + + + downlinkCapacity + + + True + + + 78, 21 + + + tabPage7 + + + True + + + 19 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + cmbroutingMode + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + 23, 12 + + + True + + + 8 + + + True + + + 3, 3, 3, 3 + + + Custom GFWList address (please fill in the blank without customization) + + + 345, 100 + + + panel3 + + + 75, 23 + + + 654, 579 + + + 10 + + + 204, 16 + + + 17 + + + 628, 454 + + + debug + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6 + + + 1 + + + txtUserblock + + + 229, 23 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 15 + + + 2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 11 + + + 18 + + + 126, 16 + + + 345, 24 + + + NoControl + + + 4, 22 + + + cmbdomainStrategy + + + False + + + 257, 158 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + &OK + + + 10 + + + 634, 460 + + + panel2 + + + txtKcpuplinkCapacity + + + 115, 10 + + + System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage4 + + + chklogEnabled + + + chksniffingEnabled2 + + + tabPage7 + + + 642, 67 + + + 0 + + + 4, 22 + + + True + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage5 + + + 9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + IPIfNonMatch + + + groupBox1 + + + 4, 22 + + + 23 + + + 3.Block Domain or IP + + + label3 + + + 6 + + + 236, 66 + + + tabPage7 + + + $this + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + $this + + + 8 + + + txtremoteDNS + + + 3, 3 + + + 0, 615 + + + 19 + + + 33 + + + 94, 21 + + + 4, 22 + + + writeBufferSize + + + 11 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 89, 12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 31 + + + 369, 27 + + + 4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + tabPage6 + + + groupBox1 + + + groupBox1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel4 + + + True + + + 29 + + + Fill + + + True + + + 3, 3 + + + OptionSettingForm + + + 124, 94 + + + Core: Routing settings + + + 13 + + + tabPage8 + + + 2 + + + 236, 104 + + + 5 + + + Open PAC and automatically configure PAC (PAC mode) + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + NoControl + + + tabPage9 + + + 94, 21 + + + 75, 23 + + + 15, 16 + + + 33, 277 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0, 0, 0 + + + 662, 675 + + + uplinkCapacity + + + IPOnDemand + + + NoControl + + + True + + + 6 + + + 1 + + + 0 + + + Settings + + + 0 + + + 3, 3, 3, 3 + + + 3, 3 + + + 32, 205 + + + cmbloglevel + + + 111, 62 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + label4 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + label16 + + + btnOK + + + Set default custom routing rules + + + tabPage6 + + + txturlGFWList + + + chkmuxEnabled + + + 654, 579 + + + tabPage6 + + + tabControl1 + + + 0 + + + 15, 110 + + + 5, 11 + + + 0 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0, 0 + + + Enable UDP + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3, 3, 3, 3 + + + groupBox1 + + + 19 + + + 2.Direct Domain or IP + + + 267, 16 + + + Global + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9 + + + 0 + + + 322, 10 + + + 15, 192 + + + 0 + + + 94, 21 + + + 3 + + + Keep older when deduplication + + + 3, 3, 3, 3 + + + 236, 28 + + + Bottom + + + 3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + groupBox1 + + + 125, 12 + + + 3, 3, 3, 3 + + + 11 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 124, 60 + + + cbFreshrate + + + 246, 16 + + + tabPage6 + + + label6 + + + 111, 24 + + + panel2 + + + 21 + + + label9 + + + 0, 10 + + + panel1 + + + 2 + + + label14 + + + True + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index d1502a31..81c0d92c 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -124,6 +124,12 @@ Core:基础设置 + + 222, 16 + + + 底层传输安全选tls时,默认跳过证书验证(allowInsecure) + 53, 12 @@ -134,16 +140,22 @@ 关闭Http代理 - 开启Http代理,并自动配置代理服务器(全局模式) + 开启Http代理,并自动配置系统代理(全局模式) - 开启PAC,并自动配置PAC(PAC模式) + 开启PAC,并自动配置系统代理(PAC模式) - 仅开启Http代理,不自动配置代理服务器(直连模式) + 仅开启Http代理,并清除系统代理 - 仅开启PAC,不自动配置PAC + 仅开启PAC,并清除系统代理 + + + 仅开启Http代理,不改变系统代理 + + + 仅开启PAC,不改变系统代理 96, 16 @@ -277,6 +289,12 @@ 642, 72 + + 77, 12 + + + 域名解析策略 + NoControl @@ -303,41 +321,29 @@ *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP - - 81, 14 - - - 186, 20 - - - 53, 12 - - - 域名策略 - Core:KCP设置 v2rayN设置 + + 156, 16 + + + 去重时保留序号较小的项 + 77, 12 统计刷新频率 - - 305, 12 - - - 缓存天数(0-30, 0关闭缓存单独每天的数据使用情况) - - 384, 16 + 372, 16 - 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) + 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) 144, 16 @@ -357,6 +363,12 @@ 开机自动启动(可能会不成功) + + 用户PAC设置 + + + *设置用户PAC规则,用逗号(,)隔开 + 确定(&O) diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs index 5d0a2624..ca405968 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs +++ b/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs @@ -31,7 +31,6 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(QRCodeControl)); this.txtUrl = new System.Windows.Forms.TextBox(); this.picQRCode = new System.Windows.Forms.PictureBox(); - this.chkShow = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); this.SuspendLayout(); // @@ -47,20 +46,12 @@ this.picQRCode.Name = "picQRCode"; this.picQRCode.TabStop = false; // - // chkShow - // - resources.ApplyResources(this.chkShow, "chkShow"); - this.chkShow.Name = "chkShow"; - this.chkShow.UseVisualStyleBackColor = true; - this.chkShow.CheckedChanged += new System.EventHandler(this.chkShow_CheckedChanged); - // // QRCodeControl // resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.picQRCode); this.Controls.Add(this.txtUrl); - this.Controls.Add(this.chkShow); this.Name = "QRCodeControl"; this.Load += new System.EventHandler(this.QRCodeControl_Load); ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); @@ -73,6 +64,5 @@ private System.Windows.Forms.TextBox txtUrl; private System.Windows.Forms.PictureBox picQRCode; - private System.Windows.Forms.CheckBox chkShow; } } diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs index ea5e7fda..02d59b48 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.cs +++ b/v2rayN/v2rayN/Forms/QRCodeControl.cs @@ -12,7 +12,6 @@ namespace v2rayN.Forms } private void QRCodeControl_Load(object sender, System.EventArgs e) { - chkShow_CheckedChanged(null, null); txtUrl.MouseUp += txtUrl_MouseUp; } @@ -32,16 +31,9 @@ namespace v2rayN.Forms txtUrl.Text = string.Empty; return; } - picQRCode.Image = QRCodeHelper.GetQRCode(url); txtUrl.Text = url; + picQRCode.Image = QRCodeHelper.GetQRCode(url); } } - - private void chkShow_CheckedChanged(object sender, System.EventArgs e) - { - picQRCode.Visible = - txtUrl.Visible = chkShow.Checked; - } - } } diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.resx b/v2rayN/v2rayN/Forms/QRCodeControl.resx index ef0c4f04..a6ceff05 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.resx +++ b/v2rayN/v2rayN/Forms/QRCodeControl.resx @@ -117,106 +117,76 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 0 - - - - 356, 441 - - - 0, 0 - - - - 0 - - - Show shared content - - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 356, 16 - - - QRCodeControl - - - 356, 355 - - - 0, 371 - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bottom - - 24 - - - Top - - - Fill + + + 0, 371 + True - - Zoom - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - $this - - - 0, 16 - - - $this - - - chkShow - - - $this - - - txtUrl - - - 2 - - - picQRCode - 356, 70 - - 25 + + 0 - - 6, 12 + + txtUrl - - True + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Fill + + + 0, 0 + + + 356, 371 + + + Zoom + + + 24 + + + picQRCode + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 True + + 6, 12 + + + 356, 441 + + + QRCodeControl + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx index 991ed0d0..1af7de15 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx @@ -117,7 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 显示分享内容 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs index a3f09593..9836be5d 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.cs +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -54,10 +54,7 @@ namespace v2rayN.Forms subItem.url = string.Empty; } - if (OnButtonClicked != null) - { - OnButtonClicked(sender, e); - } + OnButtonClicked?.Invoke(sender, e); } } } diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx index af5f03e9..a5dec524 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -118,213 +118,123 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl - - - groupBox2 - - - 60, 16 - - - txtUrl - - - &Remove - - - 484, 21 - - - 24 - - - 432, 46 - - - SubSettingControl - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - groupBox2 - - - 83, 12 - - - groupBox2 - 6, 12 - - label3 + + zh-Hans - - 127, 21 - - + True - - 0 - - - 12, 55 - - - 127, 55 - - - 10 - - - Bottom - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - groupBox2 - - - 4 - - - 47, 12 - - - Subscription details - - - 0, 9 - - - Enable - - - chkEnabled - - - 3 - - - NoControl - - - Address (url) - - - 25 - - - 23 - - - groupBox2 - - - groupBox2 - - - 406, 23 - - - True - - - True - - - btnRemove - - - NoControl - - - label2 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 584, 110 - - - NoControl - 584, 119 - - 11 + + NoControl - - Remarks - - - 0 - - - 12, 25 + + 484, 21 75, 23 - - groupBox2 + + 24 - - 265, 21 + + &Remove + + + True + + + NoControl + + + 406, 23 + + + 60, 16 + + + 25 + + + Enable + + + Bottom + + + 0, 9 + + + 584, 110 10 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Subscription details - - 1 + + True - - $this + + NoControl - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 12, 25 - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 47, 12 - + + 10 + + + Remarks + + + True + + + NoControl + + + 12, 55 + + + 83, 12 + + 0 - - txtRemarks + + Address (url) - - 5 + + 127, 21 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 265, 21 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 11 - + + 127, 55 + + True - - - zh-Hans - + + + 432, 46 + + + 23 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx index 12e6dbd4..95e5122f 100644 --- a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -118,14 +118,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 移除 + 48, 16 启用 - - 移除 + + 订阅详情 29, 12 @@ -139,7 +142,4 @@ 地址 (url) - - 订阅详情 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs index 14b5fbf6..c8e7725b 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.cs +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -35,7 +35,7 @@ namespace v2rayN.Forms for (int k = config.subItem.Count - 1; k >= 0; k--) { - var item = config.subItem[k]; + SubItem item = config.subItem[k]; if (Utils.IsNullOrEmpty(item.remarks) && Utils.IsNullOrEmpty(item.url)) { @@ -47,9 +47,8 @@ namespace v2rayN.Forms } } - for (int k = 0; k < config.subItem.Count; k++) + foreach (SubItem item in config.subItem) { - var item = config.subItem[k]; SubSettingControl control = new SubSettingControl(); control.OnButtonClicked += Control_OnButtonClicked; control.subItem = item; @@ -80,7 +79,7 @@ namespace v2rayN.Forms } else { - UI.Show(UIRes.I18N("OperationFailed")); + UI.ShowWarning(UIRes.I18N("OperationFailed")); } } @@ -99,10 +98,12 @@ namespace v2rayN.Forms private void AddSub() { - var subItem = new SubItem(); - subItem.id = string.Empty; - subItem.remarks = "remarks"; - subItem.url = "url"; + SubItem subItem = new SubItem + { + id = string.Empty, + remarks = "remarks", + url = "url" + }; config.subItem.Add(subItem); } } diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx index 05d3db7b..e2001bb5 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -118,61 +118,19 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl - - - 448, 17 - - - 75, 23 - - - 4 + + 6, 12 - - &Cancel + + 581, 629 - - btnClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - panel2 - - - 1 - - + True - - Fill - - - 0, 0 - - - 581, 569 - - - 10 - - - panCon - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 + + Subscription settings NoControl @@ -189,17 +147,20 @@ &Add - - btnAdd + + NoControl - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 448, 17 - - panel2 + + 75, 23 - - 0 + + 4 + + + &Cancel NoControl @@ -216,17 +177,20 @@ &OK - - btnOK + + True - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill - - panel2 + + 0, 0 - - 2 + + 581, 569 + + + 10 Bottom @@ -240,34 +204,4 @@ 7 - - panel2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 1 - - - True - - - 6, 12 - - - 581, 629 - - - Subscription settings - - - SubSettingForm - - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx index 628dd5ab..35c3cbac 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx @@ -117,12 +117,15 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 取消(&C) + + 订阅设置 添加(&A) + + 取消(&C) + 确定(&O) @@ -143,7 +146,4 @@ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - 订阅设置 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 929d7624..55eeea14 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -6,6 +6,7 @@ namespace v2rayN #region 常量 + public const string v2rayWebsiteUrl = @"https://www.v2fly.org/"; public const string AboutUrl = @"https://github.com/2dust/v2rayN"; public const string UpdateUrl = AboutUrl + @"/releases"; @@ -13,8 +14,9 @@ namespace v2rayN /// /// SpeedTestUrl /// - public const string SpeedTestUrl = @"http://speedtest-sgp1.digitalocean.com/10mb.test"; + public const string SpeedTestUrl = @"http://cachefly.cachefly.net/10mb.test"; public const string SpeedPingTestUrl = @"https://www.google.com/generate_204"; + public const string AvailabilityTestUrl = @"https://www.google.com/generate_204"; /// /// CustomRoutingListUrl @@ -26,7 +28,7 @@ namespace v2rayN /// /// PromotionUrl /// - public const string PromotionUrl = @"aHR0cHM6Ly8xLjIzNDQ1Ni54eXovYWRzLmh0bWw="; + public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw="; /// /// 本软件配置文件名 @@ -101,6 +103,7 @@ namespace v2rayN /// /// public const string StreamSecurity = "tls"; + public const string StreamSecurityX = "xtls"; public const string InboundSocks = "socks"; public const string InboundHttp = "http"; @@ -114,14 +117,26 @@ namespace v2rayN /// public const string vmessProtocol = "vmess://"; /// + /// vmess + /// + public const string vmessProtocolLite = "vmess"; + /// /// shadowsocks /// public const string ssProtocol = "ss://"; /// + /// shadowsocks + /// + public const string ssProtocolLite = "shadowsocks"; + /// /// socks /// public const string socksProtocol = "socks://"; /// + /// socks + /// + public const string socksProtocolLite = "socks"; + /// /// http /// public const string httpProtocol = "http://"; @@ -129,6 +144,22 @@ namespace v2rayN /// https /// public const string httpsProtocol = "https://"; + /// + /// vless + /// + public const string vlessProtocol = "vless://"; + /// + /// vless + /// + public const string vlessProtocolLite = "vless"; + /// + /// trojan + /// + public const string trojanProtocol = "trojan://"; + /// + /// trojan + /// + public const string trojanProtocolLite = "trojan"; /// /// pac @@ -162,6 +193,8 @@ namespace v2rayN } public const string StatisticLogOverall = "StatisticLogOverall.json"; + public const string IEProxyExceptions = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*"; + #endregion #region 全局变量 @@ -214,6 +247,15 @@ namespace v2rayN get; set; } + public static Job processJob + { + get; set; + } + public static System.Threading.Mutex mutexObj + { + get; set; + } + #endregion diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 0437efcf..59c0dcd7 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -4,6 +4,8 @@ using System.IO; using System.Net; using v2rayN.Mode; using v2rayN.Base; +using System.Linq; +using v2rayN.Tool; namespace v2rayN.Handler { @@ -30,34 +32,38 @@ namespace v2rayN.Handler } if (config == null) { - config = new Config(); - config.index = -1; - config.logEnabled = false; - config.loglevel = "warning"; - config.vmess = new List(); + config = new Config + { + index = -1, + logEnabled = false, + loglevel = "warning", + vmess = new List(), - //Mux - config.muxEnabled = true; + //Mux + muxEnabled = false, - ////默认监听端口 - //config.pacPort = 8888; - - // 默认不开启统计 - config.enableStatistics = false; + ////默认监听端口 + //config.pacPort = 8888; - // 默认中等刷新率 - config.statisticsFreshRate = (int)Global.StatisticsFreshRate.medium; + // 默认不开启统计 + enableStatistics = false, + + // 默认中等刷新率 + statisticsFreshRate = (int)Global.StatisticsFreshRate.medium + }; } //本地监听 if (config.inbound == null) { config.inbound = new List(); - InItem inItem = new InItem(); - inItem.protocol = Global.InboundSocks; - inItem.localPort = 10808; - inItem.udpEnabled = true; - inItem.sniffingEnabled = true; + InItem inItem = new InItem + { + protocol = Global.InboundSocks, + localPort = 10808, + udpEnabled = true, + sniffingEnabled = true + }; config.inbound.Add(inItem); @@ -100,24 +106,39 @@ namespace v2rayN.Handler //kcp if (config.kcpItem == null) { - config.kcpItem = new KcpItem(); - config.kcpItem.mtu = 1350; - config.kcpItem.tti = 50; - config.kcpItem.uplinkCapacity = 12; - config.kcpItem.downlinkCapacity = 100; - config.kcpItem.readBufferSize = 2; - config.kcpItem.writeBufferSize = 2; - config.kcpItem.congestion = false; + config.kcpItem = new KcpItem + { + mtu = 1350, + tti = 50, + uplinkCapacity = 12, + downlinkCapacity = 100, + readBufferSize = 2, + writeBufferSize = 2, + congestion = false + }; } if (config.uiItem == null) { config.uiItem = new UIItem(); } + if (config.uiItem.mainLvColWidth == null) + { + config.uiItem.mainLvColWidth = new Dictionary(); + } + //// 如果是用户升级,首次会有端口号为0的情况,不可用,这里处理 //if (config.pacPort == 0) //{ // config.pacPort = 8888; //} + if (Utils.IsNullOrEmpty(config.speedTestUrl)) + { + config.speedTestUrl = Global.SpeedTestUrl; + } + if (Utils.IsNullOrEmpty(config.speedPingTestUrl)) + { + config.speedPingTestUrl = Global.SpeedPingTestUrl; + } if (Utils.IsNullOrEmpty(config.urlGFWList)) { config.urlGFWList = Global.GFWLIST_URL; @@ -131,6 +152,10 @@ namespace v2rayN.Handler { config.subItem = new List(); } + if (config.userPacRule == null) + { + config.userPacRule = new List(); + } if (config == null || config.index < 0 @@ -188,6 +213,10 @@ namespace v2rayN.Handler else { //添加 + if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) + { + vmessItem.allowInsecure = config.defAllowInsecure.ToString(); + } config.vmess.Add(vmessItem); if (config.vmess.Count == 1) { @@ -243,7 +272,7 @@ namespace v2rayN.Handler } /// - /// 复制服务器 + /// 克隆服务器 /// /// /// @@ -255,22 +284,25 @@ namespace v2rayN.Handler return -1; } - VmessItem vmessItem = new VmessItem(); - vmessItem.configVersion = config.vmess[index].configVersion; - vmessItem.configType = config.vmess[index].configType; - vmessItem.address = config.vmess[index].address; - vmessItem.port = config.vmess[index].port; - vmessItem.id = config.vmess[index].id; - vmessItem.alterId = config.vmess[index].alterId; - vmessItem.security = config.vmess[index].security; - vmessItem.network = config.vmess[index].network; - vmessItem.headerType = config.vmess[index].headerType; - vmessItem.requestHost = config.vmess[index].requestHost; - vmessItem.path = config.vmess[index].path; - vmessItem.streamSecurity = config.vmess[index].streamSecurity; - vmessItem.remarks = string.Format("{0}-clone", config.vmess[index].remarks); + VmessItem vmessItem = new VmessItem + { + configVersion = config.vmess[index].configVersion, + address = config.vmess[index].address, + port = config.vmess[index].port, + id = config.vmess[index].id, + alterId = config.vmess[index].alterId, + security = config.vmess[index].security, + network = config.vmess[index].network, + remarks = string.Format("{0}-clone", config.vmess[index].remarks), + headerType = config.vmess[index].headerType, + requestHost = config.vmess[index].requestHost, + path = config.vmess[index].path, + streamSecurity = config.vmess[index].streamSecurity, + allowInsecure = config.vmess[index].allowInsecure, + configType = config.vmess[index].configType + }; - config.vmess.Add(vmessItem); + config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 ToJsonFile(config); @@ -341,18 +373,20 @@ namespace v2rayN.Handler VmessItem vmessItem = config.vmess[index]; if (vmessItem.configType == (int)EConfigType.Vmess) { - VmessQRCode vmessQRCode = new VmessQRCode(); - vmessQRCode.v = vmessItem.configVersion.ToString(); - vmessQRCode.ps = vmessItem.remarks.TrimEx(); //备注也许很长 ; - vmessQRCode.add = vmessItem.address; - vmessQRCode.port = vmessItem.port.ToString(); - vmessQRCode.id = vmessItem.id; - vmessQRCode.aid = vmessItem.alterId.ToString(); - vmessQRCode.net = vmessItem.network; - vmessQRCode.type = vmessItem.headerType; - vmessQRCode.host = vmessItem.requestHost; - vmessQRCode.path = vmessItem.path; - vmessQRCode.tls = vmessItem.streamSecurity; + VmessQRCode vmessQRCode = new VmessQRCode + { + v = vmessItem.configVersion.ToString(), + ps = vmessItem.remarks.TrimEx(), //备注也许很长 ; + add = vmessItem.address, + port = vmessItem.port.ToString(), + id = vmessItem.id, + aid = vmessItem.alterId.ToString(), + net = vmessItem.network, + type = vmessItem.headerType, + host = vmessItem.requestHost, + path = vmessItem.path, + tls = vmessItem.streamSecurity + }; url = Utils.ToJson(vmessQRCode); url = Utils.Base64Encode(url); @@ -361,7 +395,7 @@ namespace v2rayN.Handler } else if (vmessItem.configType == (int)EConfigType.Shadowsocks) { - var remark = string.Empty; + string remark = string.Empty; if (!Utils.IsNullOrEmpty(vmessItem.remarks)) { remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); @@ -376,7 +410,7 @@ namespace v2rayN.Handler } else if (vmessItem.configType == (int)EConfigType.Socks) { - var remark = string.Empty; + string remark = string.Empty; if (!Utils.IsNullOrEmpty(vmessItem.remarks)) { remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); @@ -389,6 +423,19 @@ namespace v2rayN.Handler url = Utils.Base64Encode(url); url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); } + else if (vmessItem.configType == (int)EConfigType.Trojan) + { + string remark = string.Empty; + if (!Utils.IsNullOrEmpty(vmessItem.remarks)) + { + remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); + } + url = string.Format("{0}@{1}:{2}", + vmessItem.id, + vmessItem.address, + vmessItem.port); + url = string.Format("{0}{1}{2}", Global.trojanProtocol, url, remark); + } else { } @@ -422,7 +469,7 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); config.vmess.RemoveAt(index); config.vmess.Insert(0, vmess); if (index < config.index) @@ -445,7 +492,7 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); config.vmess.RemoveAt(index); config.vmess.Insert(index - 1, vmess); if (index == config.index + 1) @@ -465,7 +512,7 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); config.vmess.RemoveAt(index); config.vmess.Insert(index + 1, vmess); if (index == config.index - 1) @@ -484,7 +531,7 @@ namespace v2rayN.Handler { return 0; } - VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); config.vmess.RemoveAt(index); config.vmess.Add(vmess); if (index < config.index) @@ -518,8 +565,7 @@ namespace v2rayN.Handler /// public static int AddCustomServer(ref Config config, string fileName) { - string newFileName = string.Empty; - newFileName = string.Format("{0}.json", Utils.GetGUID()); + string newFileName = string.Format("{0}.json", Utils.GetGUID()); //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); try @@ -531,10 +577,12 @@ namespace v2rayN.Handler return -1; } - VmessItem vmessItem = new VmessItem(); - vmessItem.address = newFileName; - vmessItem.configType = (int)EConfigType.Custom; - vmessItem.remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()); + VmessItem vmessItem = new VmessItem + { + address = newFileName, + configType = (int)EConfigType.Custom, + remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()) + }; config.vmess.Add(vmessItem); if (config.vmess.Count == 1) @@ -649,6 +697,50 @@ namespace v2rayN.Handler return 0; } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddTrojanServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.Trojan; + + vmessItem.address = vmessItem.address.TrimEx(); + vmessItem.id = vmessItem.id.TrimEx(); + + vmessItem.streamSecurity = Global.StreamSecurity; + vmessItem.allowInsecure = "false"; + + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + /// /// 配置文件版本升级 /// @@ -720,7 +812,7 @@ namespace v2rayN.Handler /// /// /// - /// + /// 成功导入的数量 public static int AddBatchServers(ref Config config, string clipboardData, string subid = "") { if (Utils.IsNullOrEmpty(clipboardData)) @@ -737,7 +829,6 @@ namespace v2rayN.Handler string[] arrData = clipboardData.Split(Environment.NewLine.ToCharArray()); foreach (string str in arrData) { - string msg; //maybe sub if (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol)) { @@ -747,7 +838,7 @@ namespace v2rayN.Handler } continue; } - VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(str, out msg); + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(str, out string msg); if (vmessItem == null) { continue; @@ -774,12 +865,15 @@ namespace v2rayN.Handler countServers++; } } + else if (vmessItem.configType == (int)EConfigType.Trojan) + { + if (AddTrojanServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } } - if (countServers > 0) - { - return 0; - } - return -1; + return countServers; } /// @@ -791,7 +885,7 @@ namespace v2rayN.Handler public static int AddSubItem(ref Config config, string url) { //already exists - foreach (var sub in config.subItem) + foreach (SubItem sub in config.subItem) { if (url == sub.url) { @@ -799,10 +893,12 @@ namespace v2rayN.Handler } } - var subItem = new SubItem(); - subItem.id = string.Empty; - subItem.remarks = "import sub"; - subItem.url = url; + SubItem subItem = new SubItem + { + id = string.Empty, + remarks = "import sub", + url = url + }; config.subItem.Add(subItem); return SaveSubItem(ref config); @@ -855,5 +951,129 @@ namespace v2rayN.Handler ToJsonFile(config); return 0; } + + public static int AddformMainLvColWidth(ref Config config, string name, int width) + { + if (config.uiItem.mainLvColWidth == null) + { + config.uiItem.mainLvColWidth = new Dictionary(); + } + if (config.uiItem.mainLvColWidth.ContainsKey(name)) + { + config.uiItem.mainLvColWidth[name] = width; + } + else + { + config.uiItem.mainLvColWidth.Add(name, width); + } + return 0; + } + public static int GetformMainLvColWidth(ref Config config, string name, int width) + { + if (config.uiItem.mainLvColWidth == null) + { + config.uiItem.mainLvColWidth = new Dictionary(); + } + if (config.uiItem.mainLvColWidth.ContainsKey(name)) + { + return config.uiItem.mainLvColWidth[name]; + } + else + { + return width; + } + } + + public static int SortServers(ref Config config, EServerColName name, bool asc) + { + if (config.vmess.Count <= 0) + { + return -1; + } + switch (name) + { + case EServerColName.configType: + case EServerColName.remarks: + case EServerColName.address: + case EServerColName.port: + case EServerColName.security: + case EServerColName.network: + case EServerColName.testResult: + break; + default: + return -1; + } + string itemId = config.getItemId(); + var items = config.vmess.AsQueryable(); + + if (asc) + { + config.vmess = items.OrderBy(name.ToString()).ToList(); + } + else + { + config.vmess = items.OrderByDescending(name.ToString()).ToList(); + } + + var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId); + if (index_ >= 0) + { + config.index = index_; + } + + ToJsonFile(config); + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddVlessServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.VLESS; + + vmessItem.address = vmessItem.address.TrimEx(); + vmessItem.id = vmessItem.id.TrimEx(); + vmessItem.security = vmessItem.security.TrimEx(); + vmessItem.network = vmessItem.network.TrimEx(); + vmessItem.headerType = vmessItem.headerType.TrimEx(); + vmessItem.requestHost = vmessItem.requestHost.TrimEx(); + vmessItem.path = vmessItem.path.TrimEx(); + vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); + + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + if (Utils.IsNullOrEmpty(vmessItem.allowInsecure)) + { + vmessItem.allowInsecure = config.defAllowInsecure.ToString(); + } + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + } } diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index 68f5d9db..67a936f2 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -1,8 +1,16 @@ -using System; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Net; +using System.Net.Http; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; using v2rayN.Base; using v2rayN.Mode; +using v2rayN.Properties; namespace v2rayN.Handler { @@ -37,68 +45,147 @@ namespace v2rayN.Handler } } - private string latestUrl = "https://github.com/v2ray/v2ray-core/releases/latest"; - private const string coreURL = "https://github.com/v2ray/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; private int progressPercentage = -1; private long totalBytesToReceive = 0; private DateTime totalDatetime = new DateTime(); private int DownloadTimeout = -1; - public void AbsoluteV2rayCore(Config config) + #region Check for updates + + private readonly string nLatestUrl = "https://github.com/2dust/v2rayN/releases/latest"; + private const string nUrl = "https://github.com/2dust/v2rayN/releases/download/{0}/v2rayN.zip"; + private readonly string coreLatestUrl = "https://github.com/v2fly/v2ray-core/releases/latest"; + private const string coreUrl = "https://github.com/v2fly/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; + + public async void CheckUpdateAsync(string type) { - SetSecurityProtocol(); - WebRequest request = WebRequest.Create(latestUrl); - request.BeginGetResponse(new AsyncCallback(OnResponseV2rayCore), request); + Utils.SetSecurityProtocol(); + WebRequestHandler webRequestHandler = new WebRequestHandler + { + AllowAutoRedirect = false + }; + HttpClient httpClient = new HttpClient(webRequestHandler); + + string url; + if (type == "Core") + { + url = coreLatestUrl; + } + else if (type == "v2rayN") + { + url = nLatestUrl; + } + else + { + throw new ArgumentException("Type"); + } + HttpResponseMessage response = await httpClient.GetAsync(url); + if (response.StatusCode.ToString() == "Redirect") + { + responseHandler(type, response.Headers.Location.ToString()); + } + else + { + Utils.SaveLog("StatusCode error: " + url); + return; + } } - private void OnResponseV2rayCore(IAsyncResult ar) + /// + /// 获取V2RayCore版本 + /// + public string getV2rayVersion() + { + try + { + string filePath = Utils.GetPath("V2ray.exe"); + if (!File.Exists(filePath)) + { + string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); + //ShowMsg(true, msg); + return ""; + } + + Process p = new Process(); + p.StartInfo.FileName = filePath; + p.StartInfo.Arguments = "-version"; + p.StartInfo.WorkingDirectory = Utils.StartupPath(); + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.StandardOutputEncoding = Encoding.UTF8; + p.Start(); + p.WaitForExit(5000); + string echo = p.StandardOutput.ReadToEnd(); + string version = Regex.Match(echo, "V2Ray ([0-9.]+) \\(").Groups[1].Value; + return version; + } + + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return ""; + } + } + private void responseHandler(string type, string redirectUrl) { try { - HttpWebRequest request = (HttpWebRequest)ar.AsyncState; - HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar); - string redirectUrl = response.ResponseUri.AbsoluteUri; string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); - string osBit = string.Empty; - if (Environment.Is64BitProcess) + string curVersion; + string message; + string url; + if (type == "Core") { - osBit = "64"; + curVersion = "v" + getV2rayVersion(); + message = string.Format(UIRes.I18N("IsLatestCore"), curVersion); + string osBit = Environment.Is64BitProcess ? "64" : "32"; + url = string.Format(coreUrl, version, osBit); + } + else if (type == "v2rayN") + { + curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString(); + message = string.Format(UIRes.I18N("IsLatestN"), curVersion); + url = string.Format(nUrl, version); } else { - osBit = "32"; + throw new ArgumentException("Type"); } - string url = string.Format(coreURL, version, osBit); - if (AbsoluteCompleted != null) + + if (curVersion == version) { - AbsoluteCompleted(this, new ResultEventArgs(true, url)); + AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message)); + return; } + + AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url)); } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - if (Error != null) - Error(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); } } + #endregion - public void DownloadFileAsync(Config config, string url, WebProxy webProxy, int downloadTimeout) + #region Download + + public WebClientEx DownloadFileAsync(string url, WebProxy webProxy, int downloadTimeout) { + WebClientEx ws = new WebClientEx(); try { - SetSecurityProtocol(); - if (UpdateCompleted != null) - { - UpdateCompleted(this, new ResultEventArgs(false, "Downloading...")); - } + Utils.SetSecurityProtocol(); + UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading"))); progressPercentage = -1; totalBytesToReceive = 0; - WebClientEx ws = new WebClientEx(); + //WebClientEx ws = new WebClientEx(); DownloadTimeout = downloadTimeout; if (webProxy != null) { @@ -107,15 +194,15 @@ namespace v2rayN.Handler ws.DownloadFileCompleted += ws_DownloadFileCompleted; ws.DownloadProgressChanged += ws_DownloadProgressChanged; - ws.DownloadFileAsync(new Uri(url), Utils.GetPath(DownloadFileName)); + ws.DownloadFileAsync(new Uri(url), Utils.GetPath(DownloadFileName)); } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); - if (Error != null) - Error(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); } + return ws; } void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) @@ -145,7 +232,6 @@ namespace v2rayN.Handler } } } - void ws_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { try @@ -156,7 +242,7 @@ namespace v2rayN.Handler { ((WebClientEx)sender).Dispose(); TimeSpan ts = (DateTime.Now - totalDatetime); - string speed = string.Format("<{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); + string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); UpdateCompleted(this, new ResultEventArgs(true, speed)); return; } @@ -179,8 +265,7 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); - if (Error != null) - Error(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); } } @@ -193,7 +278,7 @@ namespace v2rayN.Handler string source = string.Empty; try { - SetSecurityProtocol(); + Utils.SetSecurityProtocol(); WebClientEx ws = new WebClientEx(); ws.DownloadStringCompleted += Ws_DownloadStringCompleted; @@ -213,10 +298,7 @@ namespace v2rayN.Handler || Utils.IsNullOrEmpty(e.Error.ToString())) { string source = e.Result; - if (UpdateCompleted != null) - { - UpdateCompleted(this, new ResultEventArgs(true, source)); - } + UpdateCompleted?.Invoke(this, new ResultEventArgs(true, source)); } else { @@ -227,18 +309,51 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); - if (Error != null) - Error(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); } } - private void SetSecurityProtocol() + #endregion + + #region PAC + + public string GenPacFile(string result) { - ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 - | SecurityProtocolType.Tls - | SecurityProtocolType.Tls11 - | SecurityProtocolType.Tls12; - ServicePointManager.DefaultConnectionLimit = 256; + try + { + File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), result, Encoding.UTF8); + List lines = ParsePacResult(result); + string abpContent = Utils.UnGzip(Resources.abp_js); + abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); + File.WriteAllText(Utils.GetPath(Global.pacFILE), abpContent, Encoding.UTF8); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return ex.Message; + } + return string.Empty; } + + private List ParsePacResult(string response) + { + IEnumerable IgnoredLineBegins = new[] { '!', '[' }; + + byte[] bytes = Convert.FromBase64String(response); + string content = Encoding.UTF8.GetString(bytes); + List valid_lines = new List(); + using (StringReader sr = new StringReader(content)) + { + foreach (string line in sr.NonWhiteSpaceLines()) + { + if (line.BeginWithAny(IgnoredLineBegins)) + continue; + valid_lines.Add(line); + } + } + return valid_lines; + } + + #endregion } } diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index d03a2cb6..419ba374 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -1,13 +1,6 @@ -using Grpc.Core; -using System; -using System.Collections.Generic; -using System.Diagnostics; +using System; using System.Drawing; -using System.Net; -using System.Net.Sockets; -using System.Threading; using System.Windows.Forms; -using v2rayN.Base; using v2rayN.Mode; namespace v2rayN.Handler @@ -38,23 +31,23 @@ namespace v2rayN.Handler { try { - var color = ColorTranslator.FromHtml("#3399CC"); - var index = config.listenerType; + Color color = ColorTranslator.FromHtml("#3399CC"); + int index = (int)config.listenerType; if (index > 0) { - color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange })[index - 1]; + color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; //color = ColorTranslator.FromHtml(new string[] { "#CC0066", "#CC6600", "#99CC99", "#666699" }[index - 1]); } - var width = 128; - var height = 128; + int width = 128; + int height = 128; - var bitmap = new Bitmap(width, height); - var graphics = Graphics.FromImage(bitmap); - var drawBrush = new SolidBrush(color); + Bitmap bitmap = new Bitmap(width, height); + Graphics graphics = Graphics.FromImage(bitmap); + SolidBrush drawBrush = new SolidBrush(color); graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height)); - var zoom = 16; + int zoom = 16; graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2); Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); @@ -79,16 +72,19 @@ namespace v2rayN.Handler { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess) + if (config.vmess[index].configType != (int)EConfigType.Vmess + && config.vmess[index].configType != (int)EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; } - SaveFileDialog fileDialog = new SaveFileDialog(); - fileDialog.Filter = "Config|*.json"; - fileDialog.FilterIndex = 2; - fileDialog.RestoreDirectory = true; + SaveFileDialog fileDialog = new SaveFileDialog + { + Filter = "Config|*.json", + FilterIndex = 2, + RestoreDirectory = true + }; if (fileDialog.ShowDialog() != DialogResult.OK) { return; @@ -98,16 +94,15 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); + Config configCopy = Utils.DeepCopy(config); configCopy.index = index; - string msg; - if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out msg) != 0) + if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0) { UI.Show(msg); } else { - UI.Show(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); } } @@ -118,16 +113,19 @@ namespace v2rayN.Handler { return; } - if (config.vmess[index].configType != (int)EConfigType.Vmess) + if (config.vmess[index].configType != (int)EConfigType.Vmess + && config.vmess[index].configType != (int)EConfigType.VLESS) { UI.Show(UIRes.I18N("NonVmessService")); return; } - SaveFileDialog fileDialog = new SaveFileDialog(); - fileDialog.Filter = "Config|*.json"; - fileDialog.FilterIndex = 2; - fileDialog.RestoreDirectory = true; + SaveFileDialog fileDialog = new SaveFileDialog + { + Filter = "Config|*.json", + FilterIndex = 2, + RestoreDirectory = true + }; if (fileDialog.ShowDialog() != DialogResult.OK) { return; @@ -137,19 +135,18 @@ namespace v2rayN.Handler { return; } - Config configCopy = Utils.DeepCopy(config); + Config configCopy = Utils.DeepCopy(config); configCopy.index = index; - string msg; - if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out msg) != 0) + if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0) { UI.Show(msg); } else { - UI.Show(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); } } - + } } diff --git a/v2rayN/v2rayN/Handler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs deleted file mode 100644 index ec43bce1..00000000 --- a/v2rayN/v2rayN/Handler/ProxySetting.cs +++ /dev/null @@ -1,190 +0,0 @@ -using System; -using Microsoft.Win32; -using System.Runtime.InteropServices; - -namespace v2rayN.Handler -{ - /// - /// 设置系统代理类 - /// - class ProxySetting - { - public static bool UnsetProxy() - { - return SetProxy(null, null); - } - public static bool SetProxy(string strProxy) - { - return SetProxy(strProxy, null); - } - - public static bool SetProxy(string strProxy, string exceptions) - { - InternetPerConnOptionList list = new InternetPerConnOptionList(); - - int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3); - InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; - // USE a proxy server ... - options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; - options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); - // use THIS proxy server - if (optionCount > 1) - { - options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; - options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); - // except for these addresses ... - if (optionCount > 2) - { - options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; - options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); - } - } - - // default stuff - list.dwSize = Marshal.SizeOf(list); - list.szConnection = IntPtr.Zero; - list.dwOptionCount = options.Length; - list.dwOptionError = 0; - - - int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); - // make a pointer out of all that ... - IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); - // copy the array over into that spot in memory ... - for (int i = 0; i < options.Length; ++i) - { - IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); - Marshal.StructureToPtr(options[i], opt, false); - } - - list.options = optionsPtr; - - // and then make a pointer out of the whole list - IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); - Marshal.StructureToPtr(list, ipcoListPtr, false); - - // and finally, call the API method! - int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero, - InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, - ipcoListPtr, list.dwSize) ? -1 : 0; - if (returnvalue == 0) - { // get the error codes, they might be helpful - returnvalue = Marshal.GetLastWin32Error(); - } - // FREE the data ASAP - Marshal.FreeCoTaskMem(optionsPtr); - Marshal.FreeCoTaskMem(ipcoListPtr); - if (returnvalue > 0) - { // throw the error codes, they might be helpful - //throw new Win32Exception(Marshal.GetLastWin32Error()); - } - - return (returnvalue < 0); - } - - - #region WinInet structures - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - public struct InternetPerConnOptionList - { - public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct - public IntPtr szConnection; // connection name to set/query options - public int dwOptionCount; // number of options to set/query - public int dwOptionError; // on error, which option failed - //[MarshalAs(UnmanagedType.)] - public IntPtr options; - }; - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - public struct InternetConnectionOption - { - static readonly int Size; - public PerConnOption m_Option; - public InternetConnectionOptionValue m_Value; - static InternetConnectionOption() - { - InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption)); - } - - // Nested Types - [StructLayout(LayoutKind.Explicit)] - public struct InternetConnectionOptionValue - { - // Fields - [FieldOffset(0)] - public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime; - [FieldOffset(0)] - public int m_Int; - [FieldOffset(0)] - public IntPtr m_StringPtr; - } - } - #endregion - - #region WinInet enums - // - // options manifests for Internet{Query|Set}Option - // - public enum InternetOption : uint - { - INTERNET_OPTION_PER_CONNECTION_OPTION = 75 - } - - // - // Options used in INTERNET_PER_CONN_OPTON struct - // - public enum PerConnOption - { - INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags - INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers. - INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server. - INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script. - - } - - // - // PER_CONN_FLAGS - // - [Flags] - public enum PerConnFlags - { - PROXY_TYPE_DIRECT = 0x00000001, // direct to net - PROXY_TYPE_PROXY = 0x00000002, // via named proxy - PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL - PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection - } - #endregion - - internal static class NativeMethods - { - [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength); - } - - //判断是否使用代理 - public static bool UsedProxy() - { - RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); - if (rk.GetValue("ProxyEnable").ToString() == "1") - { - rk.Close(); - return true; - } - else - { - rk.Close(); - return false; - } - } - //获得代理的IP和端口 - public static string GetProxyProxyServer() - { - RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); - string ProxyServer = rk.GetValue("ProxyServer").ToString(); - rk.Close(); - return ProxyServer; - - } - } -} diff --git a/v2rayN/v2rayN/Handler/QRCodeHelper.cs b/v2rayN/v2rayN/Handler/QRCodeHelper.cs index e5433dec..2fc56954 100644 --- a/v2rayN/v2rayN/Handler/QRCodeHelper.cs +++ b/v2rayN/v2rayN/Handler/QRCodeHelper.cs @@ -1,6 +1,4 @@ using System.Drawing; -using System.Drawing.Imaging; -using System.IO; using ZXing; using ZXing.QrCode; @@ -16,18 +14,22 @@ namespace v2rayN.Handler Image img = null; try { - QrCodeEncodingOptions options = new QrCodeEncodingOptions(); - options.CharacterSet = "UTF-8"; - options.DisableECI = true; // Extended Channel Interpretation (ECI) 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。 - options.ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.M; // 纠错级别 - options.Width = 500; - options.Height = 500; - options.Margin = 1; + QrCodeEncodingOptions options = new QrCodeEncodingOptions + { + CharacterSet = "UTF-8", + DisableECI = true, // Extended Channel Interpretation (ECI) 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。 + ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.M, // 纠错级别 + Width = 500, + Height = 500, + Margin = 1 + }; // options.Hints,更多属性,也可以在这里添加。 - BarcodeWriter writer = new BarcodeWriter(); - writer.Format = BarcodeFormat.QR_CODE; - writer.Options = options; + BarcodeWriter writer = new BarcodeWriter + { + Format = BarcodeFormat.QR_CODE, + Options = options + }; Bitmap bmp = writer.Write(strContent); img = (Image)bmp; return img; diff --git a/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs b/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs deleted file mode 100644 index 57d4f564..00000000 --- a/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace v2rayN.Handler -{ - /// - /// 路由规则文件处理类 - /// - class RoutingRuleHandler - { - /// - /// Parse Pac to v2ray rule - /// - /// - /// - public static List ParsePac(string filePath) - { - string result = Utils.LoadResource(filePath); - if (Utils.IsNullOrEmpty(result)) - { - return null; - } - - //取得rule - string pattern = @"(?is)(?<=\[)(.*)(?=\])"; - Regex rgx = new Regex(pattern); - result = rgx.Match(result).Value; - int index = result.IndexOf("];"); - result = result.Substring(0, index); - if (Utils.IsNullOrEmpty(result)) - { - return null; - } - - string[] arrPac = result.Split(','); - List lstPac = new List(); - foreach (string str in arrPac) - { - //处理有效值 - if (Utils.IsNullOrEmpty(str) - || str.Length <= 3) - { - continue; - } - string value = str.Replace("\",", "").Replace("\"", "").Replace(",", "").Replace("\r\n", "").Replace(" ", ""); - lstPac.Add(value); - } - - return lstPac; - } - - } -} diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index cc157e52..91523091 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -4,85 +4,57 @@ using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Threading; +using System.Threading.Tasks; using v2rayN.Mode; namespace v2rayN.Handler { class SpeedtestHandler { - private DownloadHandle downloadHandle2; private Config _config; private V2rayHandler _v2rayHandler; private List _selecteds; - private Thread _workThread; Action _updateFunc; - private int testCounter = 0; - private int ItemIndex - { - get - { - return _selecteds[testCounter - 1]; - } - } public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) { _config = config; _v2rayHandler = v2rayHandler; - _selecteds = selecteds; + _selecteds = Utils.DeepCopy(selecteds); _updateFunc = update; if (actionType == "ping") { - _workThread = new Thread(new ThreadStart(RunPing)); - _workThread.IsBackground = true; - _workThread.Start(); + Task.Run(() => RunPing()); } if (actionType == "tcping") { - _workThread = new Thread(new ThreadStart(RunTcping)); - _workThread.IsBackground = true; - _workThread.Start(); + Task.Run(() => RunTcping()); } else if (actionType == "realping") { - _workThread = new Thread(new ThreadStart(RunRealPing)); - _workThread.IsBackground = true; - _workThread.Start(); + Task.Run(() => RunRealPing()); } else if (actionType == "speedtest") { - RunSpeedTest(); + Task.Run(() => RunSpeedTest()); } } - public void Close() + private void RunPingSub(Action updateFun) { try { - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - private void RunPing() - { - try - { - for (int k = 0; k < _selecteds.Count; k++) + foreach (int index in _selecteds) { - int index = _selecteds[k]; if (_config.vmess[index].configType == (int)EConfigType.Custom) { continue; } try { - long time = Utils.Ping(_config.vmess[index].address); - _updateFunc(index, string.Format("{0}ms", time)); + updateFun(index); } catch (Exception ex) { @@ -90,8 +62,7 @@ namespace v2rayN.Handler } } - Thread.Sleep(100); - + Thread.Sleep(10); } catch (Exception ex) { @@ -99,170 +70,177 @@ namespace v2rayN.Handler } } + + private void RunPing() + { + RunPingSub((int index) => + { + long time = Utils.Ping(_config.vmess[index].address); + _updateFunc(index, FormatOut(time, "ms")); + }); + } + private void RunTcping() { - try + RunPingSub((int index) => { - for (int k = 0; k < _selecteds.Count; k++) - { - int index = _selecteds[k]; - if (_config.vmess[index].configType == (int)EConfigType.Custom) - { - continue; - } - try - { - var time = GetTcpingTime(_config.vmess[index].address, _config.vmess[index].port); - _updateFunc(index, string.Format("{0}ms", time)); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - - Thread.Sleep(100); - - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } + int time = GetTcpingTime(_config.vmess[index].address, _config.vmess[index].port); + _updateFunc(index, FormatOut(time, "ms")); + }); } private void RunRealPing() { + int pid = -1; try { string msg = string.Empty; - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config, _selecteds); + pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); - Thread.Sleep(5000); - - var httpPort = _config.GetLocalPort("speedtest"); - for (int k = 0; k < _selecteds.Count; k++) + //Thread.Sleep(5000); + int httpPort = _config.GetLocalPort("speedtest"); + List tasks = new List(); + foreach (int itemIndex in _selecteds) { - int index = _selecteds[k]; - if (_config.vmess[index].configType == (int)EConfigType.Custom) + if (_config.vmess[itemIndex].configType == (int)EConfigType.Custom) { continue; } - - try + tasks.Add(Task.Run(() => { - var webProxy = new WebProxy(Global.Loopback, httpPort + index); - int responseTime = -1; - var status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, out responseTime); - if (!Utils.IsNullOrEmpty(status)) + try { - _updateFunc(index, string.Format("{0}", status)); + WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); + int responseTime = -1; + string status = GetRealPingTime(_config.speedPingTestUrl, webProxy, out responseTime); + string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : FormatOut(status, ""); + _updateFunc(itemIndex, output); } - else + catch (Exception ex) { - _updateFunc(index, string.Format("{0}ms", responseTime)); + Utils.SaveLog(ex.Message, ex); } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - Thread.Sleep(100); + })); + //Thread.Sleep(100); } - - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config); - Thread.Sleep(100); - + Task.WaitAll(tasks.ToArray()); } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); } + finally + { + if (pid > 0) _v2rayHandler.V2rayStopPid(pid); + } + } + + public int RunAvailabilityCheck() // alias: isLive + { + try + { + int httpPort = _config.GetLocalPort(Global.InboundHttp); + + Task t = Task.Run(() => + { + try + { + WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); + int responseTime = -1; + string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime); + bool noError = Utils.IsNullOrEmpty(status); + return noError ? responseTime : -1; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return -1; + } + }); + return t.Result; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return -1; + } } private void RunSpeedTest() { + int testCounter = 0; + int pid = -1; + if (_config.vmess.Count <= 0) { return; } - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config, _selecteds); + pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds); - Thread.Sleep(5000); - - string url = Global.SpeedTestUrl; - testCounter = 0; - if (downloadHandle2 == null) + string url = _config.speedTestUrl; + DownloadHandle downloadHandle2 = new DownloadHandle(); + downloadHandle2.UpdateCompleted += (sender2, args) => { - downloadHandle2 = new DownloadHandle(); - downloadHandle2.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - _updateFunc(ItemIndex, args.Msg); - if (ServerSpeedTestSub(testCounter, url) != 0) - { - return; - } - } - else - { - _updateFunc(ItemIndex, args.Msg); - } - }; - downloadHandle2.Error += (sender2, args) => - { - _updateFunc(ItemIndex, args.GetException().Message); - if (ServerSpeedTestSub(testCounter, url) != 0) - { - return; - } - }; - } - - if (ServerSpeedTestSub(testCounter, url) != 0) + _updateFunc(testCounter, args.Msg); + }; + downloadHandle2.Error += (sender2, args) => { - return; + _updateFunc(testCounter, args.GetException().Message); + }; + + var timeout = 10; + foreach (int itemIndex in _selecteds) + { + if (itemIndex >= _config.vmess.Count) + { + break; + } + + if (_config.vmess[itemIndex].configType == (int)EConfigType.Custom) + { + continue; + } + testCounter = itemIndex; + int httpPort = _config.GetLocalPort("speedtest"); + + WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex); + var ws = downloadHandle2.DownloadFileAsync(url, webProxy, timeout - 2); + + Thread.Sleep(1000 * timeout); + + ws.CancelAsync(); + + Thread.Sleep(1000 * 2); } + if (pid > 0) _v2rayHandler.V2rayStopPid(pid); } - private int ServerSpeedTestSub(int index, string url) - { - if (index >= _selecteds.Count) - { - Global.reloadV2ray = true; - _v2rayHandler.LoadV2ray(_config); - return -1; - } - - var httpPort = _config.GetLocalPort("speedtest"); - index = _selecteds[index]; - - testCounter++; - var webProxy = new WebProxy(Global.Loopback, httpPort + index); - downloadHandle2.DownloadFileAsync(_config, url, webProxy, 30); - - return 0; - } private int GetTcpingTime(string url, int port) { - var responseTime = -1; + int responseTime = -1; try { - IPHostEntry ipHostInfo = System.Net.Dns.GetHostEntry(url); - IPAddress ipAddress = ipHostInfo.AddressList[0]; + if (!IPAddress.TryParse(url, out IPAddress ipAddress)) + { + IPHostEntry ipHostInfo = System.Net.Dns.GetHostEntry(url); + ipAddress = ipHostInfo.AddressList[0]; + } - var timer = new Stopwatch(); + Stopwatch timer = new Stopwatch(); timer.Start(); - Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - clientSocket.Connect(new IPEndPoint(ipAddress, port)); + IPEndPoint endPoint = new IPEndPoint(ipAddress, port); + Socket clientSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + + IAsyncResult result = clientSocket.BeginConnect(endPoint, null, null); + if (!result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5))) + throw new TimeoutException("connect timeout (5s): " + url); + clientSocket.EndConnect(result); + timer.Stop(); responseTime = timer.Elapsed.Milliseconds; clientSocket.Close(); @@ -278,14 +256,13 @@ namespace v2rayN.Handler { string msg = string.Empty; responseTime = -1; - try { HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); myHttpWebRequest.Timeout = 5000; myHttpWebRequest.Proxy = webProxy;//new WebProxy(Global.Loopback, Global.httpPort); - var timer = new Stopwatch(); + Stopwatch timer = new Stopwatch(); timer.Start(); HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); @@ -305,7 +282,14 @@ namespace v2rayN.Handler msg = ex.Message; } return msg; - + } + private string FormatOut(object time, string unit) + { + if (time.ToString().Equals("-1")) + { + return "Timeout"; + } + return string.Format("{0}{1}", time, unit).PadLeft(6, ' '); } } } diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index 1827685a..ab4d4a6a 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -1,14 +1,12 @@ using Grpc.Core; using System; using System.Collections.Generic; -using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; +using System.Threading.Tasks; using v2rayN.Mode; -using v2rayN.Properties; using v2rayN.Protos.Statistics; -using v2rayN.Tool; namespace v2rayN.Handler { @@ -18,7 +16,6 @@ namespace v2rayN.Handler private ServerStatistics serverStatistics_; private Channel channel_; private StatsService.StatsServiceClient client_; - private Thread workThread_; private bool exitFlag_; Action> updateFunc_; @@ -43,22 +40,22 @@ namespace v2rayN.Handler public StatisticsHandler(Mode.Config config, Action> update) { - try - { - if (Environment.Is64BitOperatingSystem) - { - FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x64.dll"), Resources.grpc_csharp_ext_x64_dll); - } - else - { - FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x86.dll"), Resources.grpc_csharp_ext_x86_dll); - } - } - catch (IOException ex) - { - Utils.SaveLog(ex.Message, ex); + //try + //{ + // if (Environment.Is64BitOperatingSystem) + // { + // FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x64.dll"), Resources.grpc_csharp_ext_x64_dll); + // } + // else + // { + // FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x86.dll"), Resources.grpc_csharp_ext_x86_dll); + // } + //} + //catch (IOException ex) + //{ + // Utils.SaveLog(ex.Message, ex); - } + //} config_ = config; Enable = config.enableStatistics; @@ -70,9 +67,7 @@ namespace v2rayN.Handler GrpcInit(); - workThread_ = new Thread(new ThreadStart(Run)); - workThread_.IsBackground = true; - workThread_.Start(); + Task.Run(() => Run()); } private void GrpcInit() @@ -120,13 +115,11 @@ namespace v2rayN.Handler if (res != null) { - var itemId = config_.getItemId(); - var serverStatItem = GetServerStatItem(itemId); - ulong up = 0, - down = 0; + string itemId = config_.getItemId(); + ServerStatItem serverStatItem = GetServerStatItem(itemId); //TODO: parse output - ParseOutput(res.Stat, out up, out down); + ParseOutput(res.Stat, out ulong up, out ulong down); serverStatItem.todayUp += up; serverStatItem.todayDown += down; @@ -169,8 +162,8 @@ namespace v2rayN.Handler serverStatistics_.server = new List(); } - var ticks = DateTime.Now.Date.Ticks; - foreach (var item in serverStatistics_.server) + long ticks = DateTime.Now.Date.Ticks; + foreach (ServerStatItem item in serverStatistics_.server) { if (item.dateNow != ticks) { @@ -200,8 +193,8 @@ namespace v2rayN.Handler private ServerStatItem GetServerStatItem(string itemId) { - var ticks = DateTime.Now.Date.Ticks; - var cur = Statistic.FindIndex(item => item.itemId == itemId); + long ticks = DateTime.Now.Date.Ticks; + int cur = Statistic.FindIndex(item => item.itemId == itemId); if (cur < 0) { Statistic.Add(new ServerStatItem @@ -231,12 +224,12 @@ namespace v2rayN.Handler try { - foreach (var stat in source) + foreach (Stat stat in source) { - var name = stat.Name; - var value = stat.Value; - var nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); - var type = ""; + string name = stat.Name; + long value = stat.Value; + string[] nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + string type = ""; name = name.Trim(); @@ -270,7 +263,7 @@ namespace v2rayN.Handler // TCP stack please do me a favor TcpListener l = new TcpListener(IPAddress.Loopback, 0); l.Start(); - var port = ((IPEndPoint)l.LocalEndpoint).Port; + int port = ((IPEndPoint)l.LocalEndpoint).Port; l.Stop(); return port; } diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index fcf07549..078a3fbc 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -1,8 +1,12 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Web; using v2rayN.Base; using v2rayN.Mode; @@ -27,8 +31,6 @@ namespace v2rayN.Handler /// public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg) { - msg = string.Empty; - try { //检查GUI设置 @@ -149,7 +151,7 @@ namespace v2rayN.Handler { try { - var inbound = v2rayConfig.inbounds[0]; + Inbounds inbound = v2rayConfig.inbounds[0]; //端口 inbound.port = config.inbound[0].localPort; inbound.protocol = config.inbound[0].protocol; @@ -226,20 +228,24 @@ namespace v2rayN.Handler && userRule.Count > 0) { //Domain - RulesItem rulesDomain = new RulesItem(); - rulesDomain.type = "field"; - rulesDomain.outboundTag = tag; - rulesDomain.domain = new List(); + RulesItem rulesDomain = new RulesItem + { + type = "field", + outboundTag = tag, + domain = new List() + }; //IP - RulesItem rulesIP = new RulesItem(); - rulesIP.type = "field"; - rulesIP.outboundTag = tag; - rulesIP.ip = new List(); - - for (int k = 0; k < userRule.Count; k++) + RulesItem rulesIP = new RulesItem { - string url = userRule[k].TrimEx(); + type = "field", + outboundTag = tag, + ip = new List() + }; + + foreach (string u in userRule) + { + string url = u.TrimEx(); if (Utils.IsNullOrEmpty(url)) { continue; @@ -283,10 +289,12 @@ namespace v2rayN.Handler //IP if (ipOrDomain == "ip" || ipOrDomain == "") { - RulesItem rulesItem = new RulesItem(); - rulesItem.type = "field"; - rulesItem.outboundTag = Global.directTag; - rulesItem.ip = new List(); + RulesItem rulesItem = new RulesItem + { + type = "field", + outboundTag = Global.directTag, + ip = new List() + }; rulesItem.ip.Add($"geoip:{code}"); v2rayConfig.routing.rules.Add(rulesItem); @@ -294,10 +302,12 @@ namespace v2rayN.Handler if (ipOrDomain == "domain" || ipOrDomain == "") { - RulesItem rulesItem = new RulesItem(); - rulesItem.type = "field"; - rulesItem.outboundTag = Global.directTag; - rulesItem.domain = new List(); + RulesItem rulesItem = new RulesItem + { + type = "field", + outboundTag = Global.directTag, + domain = new List() + }; rulesItem.domain.Add($"geosite:{code}"); v2rayConfig.routing.rules.Add(rulesItem); } @@ -319,7 +329,7 @@ namespace v2rayN.Handler { try { - var outbound = v2rayConfig.outbounds[0]; + Outbounds outbound = v2rayConfig.outbounds[0]; if (config.configType() == (int)EConfigType.Vmess) { VnextItem vnextItem; @@ -354,12 +364,13 @@ namespace v2rayN.Handler //Mux outbound.mux.enabled = config.muxEnabled; + outbound.mux.concurrency = config.muxEnabled ? 8 : -1; //远程服务器底层传输配置 StreamSettings streamSettings = outbound.streamSettings; boundStreamSettings(config, "out", ref streamSettings); - outbound.protocol = "vmess"; + outbound.protocol = Global.vmessProtocolLite; outbound.settings.servers = null; } else if (config.configType() == (int)EConfigType.Shadowsocks) @@ -384,8 +395,10 @@ namespace v2rayN.Handler serversItem.level = 1; outbound.mux.enabled = false; + outbound.mux.concurrency = -1; - outbound.protocol = "shadowsocks"; + + outbound.protocol = Global.ssProtocolLite; outbound.settings.vnext = null; } else if (config.configType() == (int)EConfigType.Socks) @@ -403,21 +416,117 @@ namespace v2rayN.Handler //远程服务器地址和端口 serversItem.address = config.address(); serversItem.port = config.port(); + serversItem.method = null; + serversItem.password = null; if (!Utils.IsNullOrEmpty(config.security()) && !Utils.IsNullOrEmpty(config.id())) { - var socksUsersItem = new SocksUsersItem(); - socksUsersItem.user = config.security(); - socksUsersItem.pass = config.id(); - socksUsersItem.level = 1; + SocksUsersItem socksUsersItem = new SocksUsersItem + { + user = config.security(), + pass = config.id(), + level = 1 + }; serversItem.users = new List() { socksUsersItem }; } outbound.mux.enabled = false; + outbound.mux.concurrency = -1; - outbound.protocol = "socks"; + outbound.protocol = Global.socksProtocolLite; + outbound.settings.vnext = null; + } + else if (config.configType() == (int)EConfigType.VLESS) + { + VnextItem vnextItem; + if (outbound.settings.vnext.Count <= 0) + { + vnextItem = new VnextItem(); + outbound.settings.vnext.Add(vnextItem); + } + else + { + vnextItem = outbound.settings.vnext[0]; + } + //远程服务器地址和端口 + vnextItem.address = config.address(); + vnextItem.port = config.port(); + + UsersItem usersItem; + if (vnextItem.users.Count <= 0) + { + usersItem = new UsersItem(); + vnextItem.users.Add(usersItem); + } + else + { + usersItem = vnextItem.users[0]; + } + //远程服务器用户ID + usersItem.id = config.id(); + usersItem.alterId = 0; + usersItem.flow = string.Empty; + usersItem.email = Global.userEMail; + usersItem.encryption = config.security(); + + //Mux + outbound.mux.enabled = config.muxEnabled; + outbound.mux.concurrency = config.muxEnabled ? 8 : -1; + + //远程服务器底层传输配置 + StreamSettings streamSettings = outbound.streamSettings; + boundStreamSettings(config, "out", ref streamSettings); + + //if xtls + if (config.streamSecurity() == Global.StreamSecurityX) + { + if (Utils.IsNullOrEmpty(config.flow())) + { + usersItem.flow = "xtls-rprx-origin"; + } + else + { + usersItem.flow = config.flow(); + } + + outbound.mux.enabled = false; + outbound.mux.concurrency = -1; + } + + outbound.protocol = Global.vlessProtocolLite; + outbound.settings.servers = null; + } + else if (config.configType() == (int)EConfigType.Trojan) + { + ServersItem serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers[0]; + } + //远程服务器地址和端口 + serversItem.address = config.address(); + serversItem.port = config.port(); + serversItem.password = config.id(); + + serversItem.ota = false; + serversItem.level = 1; + + outbound.mux.enabled = false; + outbound.mux.concurrency = -1; + + + //远程服务器底层传输配置 + StreamSettings streamSettings = outbound.streamSettings; + boundStreamSettings(config, "out", ref streamSettings); + + outbound.protocol = Global.trojanProtocolLite; outbound.settings.vnext = null; } } @@ -440,15 +549,16 @@ namespace v2rayN.Handler { //远程服务器底层传输配置 streamSettings.network = config.network(); - var host = config.requestHost(); - + string host = config.requestHost(); //if tls if (config.streamSecurity() == Global.StreamSecurity) { streamSettings.security = config.streamSecurity(); - TlsSettings tlsSettings = new TlsSettings(); - tlsSettings.allowInsecure = config.allowInsecure(); + TlsSettings tlsSettings = new TlsSettings + { + allowInsecure = config.allowInsecure() + }; if (!string.IsNullOrWhiteSpace(host)) { tlsSettings.serverName = host; @@ -456,14 +566,32 @@ namespace v2rayN.Handler streamSettings.tlsSettings = tlsSettings; } + //if xtls + if (config.streamSecurity() == Global.StreamSecurityX) + { + streamSettings.security = config.streamSecurity(); + + TlsSettings xtlsSettings = new TlsSettings + { + allowInsecure = config.allowInsecure() + }; + if (!string.IsNullOrWhiteSpace(host)) + { + xtlsSettings.serverName = host; + } + streamSettings.xtlsSettings = xtlsSettings; + } + //streamSettings switch (config.network()) { //kcp基本配置暂时是默认值,用户能自己设置伪装类型 case "kcp": - KcpSettings kcpSettings = new KcpSettings(); - kcpSettings.mtu = config.kcpItem.mtu; - kcpSettings.tti = config.kcpItem.tti; + KcpSettings kcpSettings = new KcpSettings + { + mtu = config.kcpItem.mtu, + tti = config.kcpItem.tti + }; if (iobound.Equals("out")) { kcpSettings.uplinkCapacity = config.kcpItem.uplinkCapacity; @@ -483,20 +611,30 @@ namespace v2rayN.Handler kcpSettings.congestion = config.kcpItem.congestion; kcpSettings.readBufferSize = config.kcpItem.readBufferSize; kcpSettings.writeBufferSize = config.kcpItem.writeBufferSize; - kcpSettings.header = new Header(); - kcpSettings.header.type = config.headerType(); + kcpSettings.header = new Header + { + type = config.headerType() + }; + if (!Utils.IsNullOrEmpty(config.path())) + { + kcpSettings.seed = config.path(); + } streamSettings.kcpSettings = kcpSettings; break; //ws case "ws": - WsSettings wsSettings = new WsSettings(); - wsSettings.connectionReuse = true; + WsSettings wsSettings = new WsSettings + { + connectionReuse = true + }; string path = config.path(); if (!string.IsNullOrWhiteSpace(host)) { - wsSettings.headers = new Headers(); - wsSettings.headers.Host = host; + wsSettings.headers = new Headers + { + Host = host + }; } if (!string.IsNullOrWhiteSpace(path)) { @@ -530,22 +668,33 @@ namespace v2rayN.Handler break; //quic case "quic": - QuicSettings quicsettings = new QuicSettings(); - quicsettings.security = host; - quicsettings.key = config.path(); - quicsettings.header = new Header(); - quicsettings.header.type = config.headerType(); - + QuicSettings quicsettings = new QuicSettings + { + security = host, + key = config.path(), + header = new Header + { + type = config.headerType() + } + }; streamSettings.quicSettings = quicsettings; + if (config.streamSecurity() == Global.StreamSecurity) + { + streamSettings.tlsSettings.serverName = config.address(); + } break; default: //tcp带http伪装 if (config.headerType().Equals(Global.TcpHeaderHttp)) { - TcpSettings tcpSettings = new TcpSettings(); - tcpSettings.connectionReuse = true; - tcpSettings.header = new Header(); - tcpSettings.header.type = config.headerType(); + TcpSettings tcpSettings = new TcpSettings + { + connectionReuse = true, + header = new Header + { + type = config.headerType() + } + }; if (iobound.Equals("out")) { @@ -608,8 +757,10 @@ namespace v2rayN.Handler //} } //servers.Add("localhost"); - v2rayConfig.dns = new Mode.Dns(); - v2rayConfig.dns.servers = servers; + v2rayConfig.dns = new Mode.Dns + { + servers = servers + }; } catch { @@ -621,10 +772,10 @@ namespace v2rayN.Handler { if (config.enableStatistics) { - var tag = Global.InboundAPITagName; - var apiObj = new Mode.API(); - var policyObj = new Mode.Policy(); - var policySystemSetting = new Mode.SystemPolicy(); + string tag = Global.InboundAPITagName; + API apiObj = new API(); + Policy policyObj = new Policy(); + SystemPolicy policySystemSetting = new SystemPolicy(); string[] services = { "StatsService" }; @@ -641,8 +792,8 @@ namespace v2rayN.Handler if (!v2rayConfig.inbounds.Exists(item => { return item.tag == tag; })) { - var apiInbound = new Mode.Inbounds(); - var apiInboundSettings = new Mode.Inboundsettings(); + Inbounds apiInbound = new Inbounds(); + Inboundsettings apiInboundSettings = new Inboundsettings(); apiInbound.tag = tag; apiInbound.listen = Global.Loopback; apiInbound.port = Global.statePort; @@ -654,10 +805,12 @@ namespace v2rayN.Handler if (!v2rayConfig.routing.rules.Exists(item => { return item.outboundTag == tag; })) { - var apiRoutingRule = new Mode.RulesItem(); - apiRoutingRule.inboundTag = new List { tag }; - apiRoutingRule.outboundTag = tag; - apiRoutingRule.type = "field"; + RulesItem apiRoutingRule = new RulesItem + { + inboundTag = new List { tag }, + outboundTag = tag, + type = "field" + }; v2rayConfig.routing.rules.Add(apiRoutingRule); } } @@ -673,8 +826,6 @@ namespace v2rayN.Handler /// public static int GenerateClientCustomConfig(Config config, string fileName, out string msg) { - msg = string.Empty; - try { //检查GUI设置 @@ -728,8 +879,6 @@ namespace v2rayN.Handler /// public static int GenerateServerConfig(Config config, string fileName, out string msg) { - msg = string.Empty; - try { //检查GUI设置 @@ -792,7 +941,7 @@ namespace v2rayN.Handler { try { - var inbound = v2rayConfig.inbounds[0]; + Inbounds inbound = v2rayConfig.inbounds[0]; UsersItem usersItem; if (inbound.settings.clients.Count <= 0) { @@ -808,9 +957,22 @@ namespace v2rayN.Handler //远程服务器用户ID usersItem.id = config.id(); - usersItem.alterId = config.alterId(); usersItem.email = Global.userEMail; + if (config.configType() == (int)EConfigType.Vmess) + { + inbound.protocol = Global.vmessProtocolLite; + usersItem.alterId = config.alterId(); + + } + else if (config.configType() == (int)EConfigType.VLESS) + { + inbound.protocol = Global.vlessProtocolLite; + usersItem.alterId = 0; + usersItem.flow = config.flow(); + inbound.settings.decryption = config.security(); + } + //远程服务器底层传输配置 StreamSettings streamSettings = inbound.streamSettings; boundStreamSettings(config, "in", ref streamSettings); @@ -881,10 +1043,10 @@ namespace v2rayN.Handler return null; } - var outbound = v2rayConfig.outbounds[0]; + Outbounds outbound = v2rayConfig.outbounds[0]; if (outbound == null || Utils.IsNullOrEmpty(outbound.protocol) - || outbound.protocol != "vmess" + || outbound.protocol != Global.vmessProtocolLite || outbound.settings == null || outbound.settings.vnext == null || outbound.settings.vnext.Count <= 0 @@ -1027,10 +1189,10 @@ namespace v2rayN.Handler return null; } - var inbound = v2rayConfig.inbounds[0]; + Inbounds inbound = v2rayConfig.inbounds[0]; if (inbound == null || Utils.IsNullOrEmpty(inbound.protocol) - || inbound.protocol != "vmess" + || inbound.protocol != Global.vmessProtocolLite || inbound.settings == null || inbound.settings.clients == null || inbound.settings.clients.Count <= 0) @@ -1161,7 +1323,7 @@ namespace v2rayN.Handler int indexSplit = result.IndexOf("?"); if (indexSplit > 0) { - vmessItem = ResolveVmess4Kitsunebi(result); + vmessItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result); } else { @@ -1208,46 +1370,21 @@ namespace v2rayN.Handler { msg = UIRes.I18N("ConfigurationFormatIncorrect"); - vmessItem.configType = (int)EConfigType.Shadowsocks; - result = result.Substring(Global.ssProtocol.Length); - //remark - int indexRemark = result.IndexOf("#"); - if (indexRemark > 0) + vmessItem = ResolveSSLegacy(result); + if (vmessItem == null) { - try - { - vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); - } - catch { } - result = result.Substring(0, indexRemark); + vmessItem = ResolveSip002(result); } - //part decode - int indexS = result.IndexOf("@"); - if (indexS > 0) + if (vmessItem == null) { - result = Utils.Base64Decode(result.Substring(0, indexS)) + result.Substring(indexS, result.Length - indexS); + return null; } - else + if (vmessItem.address.Length == 0 || vmessItem.port == 0 || vmessItem.security.Length == 0 || vmessItem.id.Length == 0) { - result = Utils.Base64Decode(result); + return null; } - string[] arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - string[] arr21 = arr1[0].Split(':'); - //string[] arr22 = arr1[1].Split(':'); - int indexPort = arr1[1].LastIndexOf(":"); - if (arr21.Length != 2 || indexPort < 0) - { - return null; - } - vmessItem.address = arr1[1].Substring(0, indexPort); - vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); - vmessItem.security = arr21[0]; - vmessItem.id = arr21[1]; + vmessItem.configType = (int)EConfigType.Shadowsocks; } else if (result.StartsWith(Global.socksProtocol)) { @@ -1293,6 +1430,48 @@ namespace v2rayN.Handler vmessItem.security = arr21[0]; vmessItem.id = arr21[1]; } + else if (result.StartsWith(Global.trojanProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem.configType = (int)EConfigType.Trojan; + result = result.Substring(Global.trojanProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result.Substring(0, indexRemark); + } + //part decode + int indexS = result.IndexOf("@"); + if (indexS > 0) + { + } + else + { + result = Utils.Base64Decode(result); + } + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + int indexPort = arr1[1].LastIndexOf(":"); + if (indexPort < 0) + { + return null; + } + vmessItem.address = arr1[1].Substring(0, indexPort); + vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); + + vmessItem.id = arr1[0]; + } else { msg = UIRes.I18N("NonvmessOrssProtocol"); @@ -1318,7 +1497,6 @@ namespace v2rayN.Handler /// public static int Export2ClientConfig(Config config, string fileName, out string msg) { - msg = string.Empty; return GenerateClientConfig(config, fileName, true, out msg); } @@ -1331,15 +1509,15 @@ namespace v2rayN.Handler /// public static int Export2ServerConfig(Config config, string fileName, out string msg) { - msg = string.Empty; return GenerateServerConfig(config, fileName, out msg); } private static VmessItem ResolveVmess4Kitsunebi(string result) { - VmessItem vmessItem = new VmessItem(); - - vmessItem.configType = (int)EConfigType.Vmess; + VmessItem vmessItem = new VmessItem + { + configType = (int)EConfigType.Vmess + }; result = result.Substring(Global.vmessProtocol.Length); int indexSplit = result.IndexOf("?"); if (indexSplit > 0) @@ -1373,15 +1551,184 @@ namespace v2rayN.Handler return vmessItem; } + private static VmessItem ResolveSip002(string result) + { + Uri parsedUrl; + try + { + parsedUrl = new Uri(result); + } + catch (UriFormatException) + { + return null; + } + VmessItem server = new VmessItem + { + remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + address = parsedUrl.IdnHost, + port = parsedUrl.Port, + }; + + // parse base64 UserInfo + string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); + string base64 = rawUserInfo.Replace('-', '+').Replace('_', '/'); // Web-safe base64 to normal base64 + string userInfo; + try + { + userInfo = Encoding.UTF8.GetString(Convert.FromBase64String( + base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '='))); + } + catch (FormatException) + { + return null; + } + string[] userInfoParts = userInfo.Split(new char[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + server.security = userInfoParts[0]; + server.id = userInfoParts[1]; + + NameValueCollection queryParameters = HttpUtility.ParseQueryString(parsedUrl.Query); + if (queryParameters["plugin"] != null) + { + return null; + } + + return server; + } + + private static readonly Regex UrlFinder = new Regex(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase); + private static readonly Regex DetailsParser = new Regex(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase); + + private static VmessItem ResolveSSLegacy(string result) + { + var match = UrlFinder.Match(result); + if (!match.Success) + return null; + + VmessItem server = new VmessItem(); + var base64 = match.Groups["base64"].Value.TrimEnd('/'); + var tag = match.Groups["tag"].Value; + if (!tag.IsNullOrEmpty()) + { + server.remarks = HttpUtility.UrlDecode(tag, Encoding.UTF8); + } + Match details; + try + { + details = DetailsParser.Match(Encoding.UTF8.GetString(Convert.FromBase64String( + base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=')))); + } + catch (FormatException) + { + return null; + } + if (!details.Success) + return null; + server.security = details.Groups["method"].Value; + server.id = details.Groups["password"].Value; + server.address = details.Groups["hostname"].Value; + server.port = int.Parse(details.Groups["port"].Value); + return server; + } + + + private static readonly Regex StdVmessUserInfo = new Regex( + @"^(?[a-z]+)(\+(?[a-z]+))?:(?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})-(?[0-9]+)$"); + + private static VmessItem ResolveStdVmess(string result) + { + VmessItem i = new VmessItem + { + configType = (int)EConfigType.Vmess, + security = "auto" + }; + + Uri u = new Uri(result); + + i.address = u.IdnHost; + i.port = u.Port; + i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + var q = HttpUtility.ParseQueryString(u.Query); + + var m = StdVmessUserInfo.Match(u.UserInfo); + if (!m.Success) return null; + + i.id = m.Groups["id"].Value; + if (!int.TryParse(m.Groups["alterId"].Value, out int aid)) + { + return null; + } + i.alterId = aid; + + if (m.Groups["streamSecurity"].Success) + { + i.streamSecurity = m.Groups["streamSecurity"].Value; + } + switch (i.streamSecurity) + { + case "tls": + // TODO tls config + break; + default: + if (!string.IsNullOrWhiteSpace(i.streamSecurity)) + return null; + break; + } + + i.network = m.Groups["network"].Value; + switch (i.network) + { + case "tcp": + string t1 = q["type"] ?? "none"; + i.headerType = t1; + // TODO http option + + break; + case "kcp": + i.headerType = q["type"] ?? "none"; + // TODO kcp seed + break; + + case "ws": + string p1 = q["path"] ?? "/"; + string h1 = q["host"] ?? ""; + i.requestHost = h1; + i.path = p1; + break; + + case "http": + i.network = "h2"; + string p2 = q["path"] ?? "/"; + string h2 = q["host"] ?? ""; + i.requestHost = h2; + i.path = p2; + break; + + case "quic": + string s = q["security"] ?? "none"; + string k = q["key"] ?? ""; + string t3 = q["type"] ?? "none"; + i.headerType = t3; + i.requestHost = s; + i.path = k; + break; + + default: + return null; + } + + return i; + } #endregion #region Gen speedtest config - public static int GenerateClientSpeedtestConfig(Config config, List selecteds, string fileName, out string msg) + public static string GenerateClientSpeedtestConfigString(Config config, List selecteds, out string msg) { - msg = string.Empty; - try { if (config == null @@ -1391,71 +1738,75 @@ namespace v2rayN.Handler ) { msg = UIRes.I18N("CheckServerSettings"); - return -1; + return ""; } msg = UIRes.I18N("InitialConfiguration"); + Config configCopy = Utils.DeepCopy(config); + string result = Utils.GetEmbedText(SampleClient); if (Utils.IsNullOrEmpty(result)) { msg = UIRes.I18N("FailedGetDefaultConfiguration"); - return -1; + return ""; } V2rayConfig v2rayConfig = Utils.FromJson(result); if (v2rayConfig == null) { msg = UIRes.I18N("FailedGenDefaultConfiguration"); - return -1; + return ""; } - log(config, ref v2rayConfig, false); + log(configCopy, ref v2rayConfig, false); //routing(config, ref v2rayConfig); - dns(config, ref v2rayConfig); + dns(configCopy, ref v2rayConfig); + v2rayConfig.inbounds.RemoveAt(0); // Remove "proxy" service for speedtest, avoiding port conflicts. - var httpPort = config.GetLocalPort("speedtest"); - for (int k = 0; k < selecteds.Count; k++) + int httpPort = configCopy.GetLocalPort("speedtest"); + foreach (int index in selecteds) { - int index = selecteds[k]; - if (config.vmess[index].configType == (int)EConfigType.Custom) + if (configCopy.vmess[index].configType == (int)EConfigType.Custom) { continue; } - config.index = index; + configCopy.index = index; - var inbound = new Inbounds(); - inbound.listen = Global.Loopback; - inbound.port = httpPort + index; - inbound.protocol = Global.InboundHttp; + Inbounds inbound = new Inbounds + { + listen = Global.Loopback, + port = httpPort + index, + protocol = Global.InboundHttp + }; inbound.tag = Global.InboundHttp + inbound.port.ToString(); v2rayConfig.inbounds.Add(inbound); - var v2rayConfigCopy = Utils.FromJson(result); - outbound(config, ref v2rayConfigCopy); + V2rayConfig v2rayConfigCopy = Utils.FromJson(result); + outbound(configCopy, ref v2rayConfigCopy); v2rayConfigCopy.outbounds[0].tag = Global.agentTag + inbound.port.ToString(); v2rayConfig.outbounds.Add(v2rayConfigCopy.outbounds[0]); - var rule = new Mode.RulesItem(); - rule.inboundTag = new List { inbound.tag }; - rule.outboundTag = v2rayConfigCopy.outbounds[0].tag; - rule.type = "field"; + RulesItem rule = new RulesItem + { + inboundTag = new List { inbound.tag }, + outboundTag = v2rayConfigCopy.outbounds[0].tag, + type = "field" + }; v2rayConfig.routing.rules.Add(rule); } - Utils.ToJsonFile(v2rayConfig, fileName); - - msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), configCopy.getSummary()); + return Utils.ToJson(v2rayConfig); } - catch (Exception ex) + catch { msg = UIRes.I18N("FailedGenDefaultConfiguration"); - return -1; + return ""; } - return 0; } #endregion diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index a8209775..cc6c404e 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Text; using v2rayN.Mode; namespace v2rayN.Handler @@ -22,13 +23,16 @@ namespace v2rayN.Handler private static string v2rayConfigRes = Global.v2rayConfigFileName; private List lstV2ray; public event ProcessDelegate ProcessEvent; - private int processId = 0; + //private int processId = 0; + private Process _process; public V2rayHandler() { - lstV2ray = new List(); - lstV2ray.Add("wv2ray"); - lstV2ray.Add("v2ray"); + lstV2ray = new List + { + "wv2ray", + "v2ray" + }; } /// @@ -38,9 +42,8 @@ namespace v2rayN.Handler { if (Global.reloadV2ray) { - string msg = string.Empty; string fileName = Utils.GetPath(v2rayConfigRes); - if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out msg) != 0) + if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0) { ShowMsg(false, msg); } @@ -53,24 +56,25 @@ namespace v2rayN.Handler } /// - /// 载入V2ray + /// 新建进程,载入V2ray配置文件字符串 + /// 返回新进程pid。 /// - public void LoadV2ray(Config config, List _selecteds) + public int LoadV2rayConfigString(Config config, List _selecteds) { - if (Global.reloadV2ray) + int pid = -1; + string configStr = V2rayConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg); + if (configStr == "") { - string msg = string.Empty; - string fileName = Utils.GetPath(v2rayConfigRes); - if (V2rayConfigHandler.GenerateClientSpeedtestConfig(config, _selecteds, fileName, out msg) != 0) - { - ShowMsg(false, msg); - } - else - { - ShowMsg(true, msg); - V2rayRestart(); - } + ShowMsg(false, msg); } + else + { + ShowMsg(false, msg); + pid = V2rayStartNew(configStr); + //V2rayRestart(); + // start with -config + } + return pid; } /// @@ -89,33 +93,92 @@ namespace v2rayN.Handler { try { - bool blExist = true; - if (processId > 0) + if (_process != null) { - Process p1 = Process.GetProcessById(processId); - if (p1 != null) - { - p1.Kill(); - blExist = false; - } + KillProcess(_process); + _process.Dispose(); + _process = null; } - if (blExist) + else { foreach (string vName in lstV2ray) { - Process[] killPro = Process.GetProcessesByName(vName); - foreach (Process p in killPro) + Process[] existing = Process.GetProcessesByName(vName); + foreach (Process p in existing) { - p.Kill(); + string path = p.MainModule.FileName; + if (path == $"{Utils.GetPath(vName)}.exe") + { + KillProcess(p); + } } } } + + //bool blExist = true; + //if (processId > 0) + //{ + // Process p1 = Process.GetProcessById(processId); + // if (p1 != null) + // { + // p1.Kill(); + // blExist = false; + // } + //} + //if (blExist) + //{ + // foreach (string vName in lstV2ray) + // { + // Process[] killPro = Process.GetProcessesByName(vName); + // foreach (Process p in killPro) + // { + // p.Kill(); + // } + // } + //} } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); } } + /// + /// V2ray停止 + /// + public void V2rayStopPid(int pid) + { + try + { + Process _p = Process.GetProcessById(pid); + KillProcess(_p); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private string V2rayFindexe() { + //查找v2ray文件是否存在 + string fileName = string.Empty; + lstV2ray.Reverse(); + foreach (string name in lstV2ray) + { + string vName = string.Format("{0}.exe", name); + vName = Utils.GetPath(vName); + if (File.Exists(vName)) + { + fileName = vName; + break; + } + } + if (Utils.IsNullOrEmpty(fileName)) + { + string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2fly/v2ray-core/releases"); + ShowMsg(false, msg); + } + return fileName; + } /// /// V2ray启动 @@ -126,30 +189,77 @@ namespace v2rayN.Handler try { - //查找v2ray文件是否存在 - string fileName = string.Empty; - for (int k = 0; k < lstV2ray.Count; k++) + string fileName = V2rayFindexe(); + if (fileName == "") return; + + Process p = new Process { - string vName = string.Format("{0}.exe", lstV2ray[k]); - vName = Utils.GetPath(vName); - if (File.Exists(vName)) + StartInfo = new ProcessStartInfo { - fileName = vName; - break; + FileName = fileName, + WorkingDirectory = Utils.StartupPath(), + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8 } - } - if (Utils.IsNullOrEmpty(fileName)) + }; + p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => { - string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases"); - ShowMsg(true, msg); - return; + if (!String.IsNullOrEmpty(e.Data)) + { + string msg = e.Data + Environment.NewLine; + ShowMsg(false, msg); + } + }); + p.Start(); + p.PriorityClass = ProcessPriorityClass.High; + p.BeginOutputReadLine(); + //processId = p.Id; + _process = p; + + if (p.WaitForExit(1000)) + { + throw new Exception(p.StandardError.ReadToEnd()); } - Process p = new Process(); - p.StartInfo.FileName = fileName; - p.StartInfo.UseShellExecute = false; - p.StartInfo.RedirectStandardOutput = true; - p.StartInfo.CreateNoWindow = true; + Global.processJob.AddProcess(p.Handle); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + string msg = ex.Message; + ShowMsg(true, msg); + } + } + /// + /// V2ray启动,新建进程,传入配置字符串 + /// + private int V2rayStartNew(string configStr) + { + ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + + try + { + string fileName = V2rayFindexe(); + if (fileName == "") return -1; + + Process p = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = fileName, + Arguments = "-config stdin:", + WorkingDirectory = Utils.StartupPath(), + UseShellExecute = false, + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8 + } + }; p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => { if (!String.IsNullOrEmpty(e.Data)) @@ -160,27 +270,53 @@ namespace v2rayN.Handler }); p.Start(); p.BeginOutputReadLine(); - processId = p.Id; + + p.StandardInput.Write(configStr); + p.StandardInput.Close(); + + if (p.WaitForExit(1000)) + { + throw new Exception(p.StandardError.ReadToEnd()); + } + + Global.processJob.AddProcess(p.Handle); + return p.Id; } catch (Exception ex) { Utils.SaveLog(ex.Message, ex); string msg = ex.Message; - ShowMsg(true, msg); + ShowMsg(false, msg); + return -1; } } /// /// 消息委托 /// - /// - /// - private void ShowMsg(bool notify, string msg) + /// 是否更新托盘图标的工具提示 + /// 输出到日志框 + private void ShowMsg(bool updateToTrayTooltip, string msg) { - if (ProcessEvent != null) - { - ProcessEvent(notify, msg); - } + ProcessEvent?.Invoke(updateToTrayTooltip, msg); } + + private void KillProcess(Process p) + { + try + { + p.CloseMainWindow(); + p.WaitForExit(100); + if (!p.HasExited) + { + p.Kill(); + p.WaitForExit(100); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index 716d213e..0236c5a8 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -1,151 +1,186 @@ -using System; -using v2rayN.Mode; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// 系统代理(http)总处理 - /// 启动privoxy提供http协议 - /// 使用SysProxy设置IE系统代理或者PAC模式 - /// - class HttpProxyHandle - { - private static bool Update(Config config, bool forceDisable) - { - int type = config.listenerType; - - if (forceDisable) - { - type = 0; - } - - try - { - if (type != 0) - { - var port = Global.httpPort; - if (port <= 0) - { - return false; - } - if (type == 1) - { - //PACServerHandle.Stop(); - SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}", null); - } - else if (type == 2) - { - string pacUrl = GetPacUrl(); - SysProxyHandle.SetIEProxy(true, false, null, pacUrl); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } - else if (type == 3) - { - //PACServerHandle.Stop(); - SysProxyHandle.SetIEProxy(false, false, null, null); - } - else if (type == 4) - { - string pacUrl = GetPacUrl(); - SysProxyHandle.SetIEProxy(false, false, null, null); - //PACServerHandle.Stop(); - PACServerHandle.Init(config); - } - } - else - { - SysProxyHandle.SetIEProxy(false, false, null, null); - //PACServerHandle.Stop(); - } - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - } - return true; - } - - /// - /// 启用系统代理(http) - /// - /// - private static void StartHttpAgent(Config config) - { - try - { - int localPort = config.GetLocalPort(Global.InboundSocks); - if (localPort > 0) - { - PrivoxyHandler.Instance.Start(localPort, config); - if (PrivoxyHandler.Instance.RunningPort > 0) - { - Global.sysAgent = true; - Global.socksPort = localPort; - Global.httpPort = PrivoxyHandler.Instance.RunningPort; - Global.pacPort = config.GetLocalPort("pac"); - } - } - } - catch - { - } - } - - /// - /// 关闭系统代理 - /// - /// - public static void CloseHttpAgent(Config config) - { - try - { - Update(config, true); - - PrivoxyHandler.Instance.Stop(); - - Global.sysAgent = false; - Global.socksPort = 0; - Global.httpPort = 0; - } - catch - { - } - } - - /// - /// 重启系统代理(http) - /// - /// - /// - public static void RestartHttpAgent(Config config, bool forced) - { - bool isRestart = false; - //强制重启或者socks端口变化 - if (forced) - { - isRestart = true; - } - else - { - int localPort = config.GetLocalPort(Global.InboundSocks); - if (localPort != Global.socksPort) - { - isRestart = true; - } - } - if (isRestart) - { - CloseHttpAgent(config); - StartHttpAgent(config); - } - Update(config, false); - } - - public static string GetPacUrl() - { - string pacUrl = $"http://{Global.Loopback}:{Global.pacPort}/pac/?t={ DateTime.Now.ToString("HHmmss")}"; - return pacUrl; - } - } -} +using System; +using v2rayN.Mode; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 系统代理(http)模式 + /// + public enum ListenerType + { + noHttpProxy = 0, + GlobalHttp = 1, + GlobalPac = 2, + HttpOpenAndClear = 3, + PacOpenAndClear = 4, + HttpOpenOnly = 5, + PacOpenOnly = 6 + } + /// + /// 系统代理(http)总处理 + /// 启动privoxy提供http协议 + /// 设置IE系统代理或者PAC模式 + /// + class HttpProxyHandle + { + private static bool Update(Config config, bool forceDisable) + { + ListenerType type = config.listenerType; + + if (forceDisable) + { + type = ListenerType.noHttpProxy; + } + + try + { + if (type != ListenerType.noHttpProxy) + { + int port = Global.httpPort; + if (port <= 0) + { + return false; + } + if (type == ListenerType.GlobalHttp) + { + //PACServerHandle.Stop(); + //ProxySetting.SetProxy($"{Global.Loopback}:{port}", Global.IEProxyExceptions, 2); + SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}"); + } + else if (type == ListenerType.GlobalPac) + { + string pacUrl = GetPacUrl(); + //ProxySetting.SetProxy(pacUrl, "", 4); + SysProxyHandle.SetIEProxy(true, false, pacUrl); + //PACServerHandle.Stop(); + PACServerHandle.Init(config); + } + else if (type == ListenerType.HttpOpenAndClear) + { + //PACServerHandle.Stop(); + SysProxyHandle.ResetIEProxy(); + } + else if (type == ListenerType.PacOpenAndClear) + { + string pacUrl = GetPacUrl(); + SysProxyHandle.ResetIEProxy(); + //PACServerHandle.Stop(); + PACServerHandle.Init(config); + } + else if (type == ListenerType.HttpOpenOnly) + { + //PACServerHandle.Stop(); + //SysProxyHandle.ResetIEProxy(); + } + else if (type == ListenerType.PacOpenOnly) + { + string pacUrl = GetPacUrl(); + //SysProxyHandle.ResetIEProxy(); + //PACServerHandle.Stop(); + PACServerHandle.Init(config); + } + } + else + { + SysProxyHandle.ResetIEProxy(); + //PACServerHandle.Stop(); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return true; + } + + /// + /// 启用系统代理(http) + /// + /// + private static void StartHttpAgent(Config config) + { + try + { + int localPort = config.GetLocalPort(Global.InboundSocks); + if (localPort > 0) + { + PrivoxyHandler.Instance.Restart(localPort, config); + if (PrivoxyHandler.Instance.RunningPort > 0) + { + Global.sysAgent = true; + Global.socksPort = localPort; + Global.httpPort = PrivoxyHandler.Instance.RunningPort; + Global.pacPort = config.GetLocalPort("pac"); + } + } + } + catch + { + } + } + + /// + /// 关闭系统代理 + /// + /// + public static void CloseHttpAgent(Config config) + { + try + { + if (config.listenerType != ListenerType.HttpOpenOnly && config.listenerType != ListenerType.PacOpenOnly) + { + Update(config, true); + } + + PrivoxyHandler.Instance.Stop(); + + Global.sysAgent = false; + Global.socksPort = 0; + Global.httpPort = 0; + } + catch + { + } + } + + /// + /// 重启系统代理(http) + /// + /// + /// + public static void RestartHttpAgent(Config config, bool forced) + { + bool isRestart = false; + if (config.listenerType == ListenerType.noHttpProxy) + { + // 关闭http proxy时,直接返回 + return; + } + //强制重启或者socks端口变化 + if (forced) + { + isRestart = true; + } + else + { + int localPort = config.GetLocalPort(Global.InboundSocks); + if (localPort != Global.socksPort) + { + isRestart = true; + } + } + if (isRestart) + { + CloseHttpAgent(config); + StartHttpAgent(config); + } + Update(config, false); + } + + public static string GetPacUrl() + { + string pacUrl = $"http://{Global.Loopback}:{Global.pacPort}/pac/?t={ DateTime.Now.ToString("HHmmss")}"; + return pacUrl; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs deleted file mode 100644 index 85a53c14..00000000 --- a/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Net; -using System.Text; -using Newtonsoft.Json; -using v2rayN.Base; -using v2rayN.Mode; -using v2rayN.Properties; - -namespace v2rayN.HttpProxyHandler -{ - /// - /// 提供PAC功能支持 - /// - class PACListHandle - { - public event EventHandler UpdateCompleted; - - public event ErrorEventHandler Error; - - public class ResultEventArgs : EventArgs - { - public bool Success; - - public ResultEventArgs(bool success) - { - this.Success = success; - } - } - - - - private static readonly IEnumerable IgnoredLineBegins = new[] { '!', '[' }; - - public void UpdatePACFromGFWList(Config config) - { - string url = Global.GFWLIST_URL; - if (!Utils.IsNullOrEmpty(config.urlGFWList)) - { - url = config.urlGFWList; - } - - //默认用户已开启系统代理 - //var httpProxy = config.inbound.FirstOrDefault(x => x.protocol=="http"); - //if (httpProxy == null) - //{ - // throw new Exception("未发现HTTP代理,无法设置代理更新"); - //} - var http = new WebClientEx(); - //http.Headers.Add("Connection", "Close"); - //http.Proxy = new WebProxy(IPAddress.Loopback.ToString(), httpProxy.localPort); - http.DownloadStringCompleted += http_DownloadStringCompleted; - http.DownloadStringAsync(new Uri(url)); - } - - private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) - { - try - { - File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), e.Result, Encoding.UTF8); - List lines = ParseResult(e.Result); - string abpContent = Utils.UnGzip(Resources.abp_js); - abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); - File.WriteAllText(Utils.GetPath(Global.pacFILE), abpContent, Encoding.UTF8); - if (UpdateCompleted != null) UpdateCompleted(this, new ResultEventArgs(true)); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - - if (Error != null) Error(this, new ErrorEventArgs(ex)); - } - } - - public static List ParseResult(string response) - { - byte[] bytes = Convert.FromBase64String(response); - string content = Encoding.UTF8.GetString(bytes); - List valid_lines = new List(); - using (var sr = new StringReader(content)) - { - foreach (var line in sr.NonWhiteSpaceLines()) - { - if (line.BeginWithAny(IgnoredLineBegins)) - continue; - valid_lines.Add(line); - } - } - return valid_lines; - } - } -} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs index d3902d7f..23bf8087 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs @@ -17,6 +17,7 @@ namespace v2rayN.HttpProxyHandler private static int pacPort = 0; private static HttpWebServer server; private static HttpWebServerB serverB; + private static Config _config; public static bool IsRunning { @@ -28,6 +29,7 @@ namespace v2rayN.HttpProxyHandler public static void Init(Config config) { + _config = config; Global.pacPort = config.GetLocalPort("pac"); if (InitServer("*")) @@ -112,7 +114,7 @@ namespace v2rayN.HttpProxyHandler { try { - var pac = GetPacList(address); + string pac = GetPacList(address); return pac; } catch (Exception ex) @@ -161,27 +163,40 @@ namespace v2rayN.HttpProxyHandler //} } - private static string GetPacList(string address) { - var port = Global.httpPort; + int port = Global.httpPort; if (port <= 0) { return "No port"; } try { - List lstProxy = new List(); - lstProxy.Add(string.Format("PROXY {0}:{1};", address, port)); - var proxy = string.Join("", lstProxy.ToArray()); + List lstProxy = new List + { + string.Format("PROXY {0}:{1};", address, port) + }; + string proxy = string.Join("", lstProxy.ToArray()); string strPacfile = Utils.GetPath(Global.pacFILE); if (!File.Exists(strPacfile)) { FileManager.UncompressFile(strPacfile, Resources.pac_txt); } - var pac = File.ReadAllText(strPacfile, Encoding.UTF8); + string pac = File.ReadAllText(strPacfile, Encoding.UTF8); pac = pac.Replace("__PROXY__", proxy); + + if (_config.userPacRule.Count > 0) + { + string keyWords = "var rules = ["; + if (pac.IndexOf(keyWords) >= 0) + { + string userPac = string.Join($"\",{Environment.NewLine}\"", _config.userPacRule.ToArray()); + userPac = string.Format("\"{0}\",", userPac); + pac = pac.Replace(keyWords, keyWords + userPac); + } + } + return pac; } catch diff --git a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs index baa9fa94..f738a318 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs @@ -22,18 +22,17 @@ namespace v2rayN.HttpProxyHandler private static int _uid; private static string _uniqueConfigFile; - private static Job _privoxyJob; private Process _process; + private static string _privoxyName = "v2ray_privoxy"; static PrivoxyHandler() { try { - _uid = Application.StartupPath.GetHashCode(); // Currently we use ss's StartupPath to identify different Privoxy instance. + _uid = Application.StartupPath.GetHashCode(); _uniqueConfigFile = string.Format("privoxy_{0}.conf", _uid); - _privoxyJob = new Job(); - FileManager.UncompressFile(Utils.GetTempPath("v2ray_privoxy.exe"), Resources.privoxy_exe); + FileManager.UncompressFile(Utils.GetTempPath($"{_privoxyName}.exe"), Resources.privoxy_exe); } catch (IOException ex) { @@ -41,11 +40,6 @@ namespace v2rayN.HttpProxyHandler } } - private PrivoxyHandler() - { - - } - /// /// 单例 /// @@ -66,17 +60,20 @@ namespace v2rayN.HttpProxyHandler get; set; } + public void Restart(int localPort, Config config) + { + Stop(); + Start(localPort, config); + } + + public void Start(int localPort, Config config) { try { if (_process == null) { - Process[] existingPrivoxy = Process.GetProcessesByName("v2ray_privoxy"); - foreach (Process p in existingPrivoxy.Where(IsChildProcess)) - { - KillProcess(p); - } + string privoxyConfig = Resources.privoxy_conf; RunningPort = config.GetLocalPort(Global.InboundHttp); privoxyConfig = privoxyConfig.Replace("__SOCKS_PORT__", localPort.ToString()); @@ -96,7 +93,7 @@ namespace v2rayN.HttpProxyHandler // Configure the process using the StartInfo properties. StartInfo = { - FileName = "v2ray_privoxy.exe", + FileName = $"{_privoxyName}.exe", Arguments = _uniqueConfigFile, WorkingDirectory = Utils.GetTempPath(), WindowStyle = ProcessWindowStyle.Hidden, @@ -110,12 +107,13 @@ namespace v2rayN.HttpProxyHandler * Add this process to job obj associated with this ss process, so that * when ss exit unexpectedly, this process will be forced killed by system. */ - _privoxyJob.AddProcess(_process.Handle); + Global.processJob.AddProcess(_process.Handle); } } catch (Exception ex) { + RunningPort = 0; Utils.SaveLog(ex.Message, ex); } } @@ -129,6 +127,14 @@ namespace v2rayN.HttpProxyHandler _process = null; RunningPort = 0; } + else + { + Process[] existingPrivoxy = Process.GetProcessesByName(_privoxyName); + foreach (Process p in existingPrivoxy.Where(IsChildProcess)) + { + KillProcess(p); + } + } } private static void KillProcess(Process p) @@ -140,7 +146,7 @@ namespace v2rayN.HttpProxyHandler if (!p.HasExited) { p.Kill(); - p.WaitForExit(); + p.WaitForExit(100); } } catch (Exception ex) @@ -166,9 +172,9 @@ namespace v2rayN.HttpProxyHandler /* * Under PortableMode, we could identify it by the path of v2ray_privoxy.exe. */ - var path = process.MainModule.FileName; + string path = process.MainModule.FileName; - return Utils.GetTempPath("v2ray_privoxy.exe").Equals(path); + return Utils.GetTempPath($"{_privoxyName}.exe").Equals(path); } catch (Exception ex) diff --git a/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs b/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs index 638a1131..2ee71072 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs @@ -8,26 +8,46 @@ namespace v2rayN.HttpProxyHandler { public static bool UnsetProxy() { - return SetProxy(null, null); - } - public static bool SetProxy(string strProxy) - { - return SetProxy(strProxy, null); + return SetProxy(null, null, 1); } - public static bool SetProxy(string strProxy, string exceptions) + public static bool SetProxy(string strProxy, string exceptions, int type) { InternetPerConnOptionList list = new InternetPerConnOptionList(); - int optionCount = Utils.IsNullOrEmpty(strProxy) ? 1 : (Utils.IsNullOrEmpty(exceptions) ? 2 : 3); + int optionCount = 1; + if (type == 1) + { + optionCount = 1; + } + else if (type == 2 || type == 4) + { + optionCount = Utils.IsNullOrEmpty(exceptions) ? 2 : 3; + } + + int m_Int = (int)PerConnFlags.PROXY_TYPE_DIRECT; + PerConnOption m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; + if (type == 2) + { + m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY); + m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; + } + else if (type == 4) + { + m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL); + m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; + } + + //int optionCount = Utils.IsNullOrEmpty(strProxy) ? 1 : (Utils.IsNullOrEmpty(exceptions) ? 2 : 3); InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; // USE a proxy server ... options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; - options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); + //options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); + options[0].m_Value.m_Int = m_Int; // use THIS proxy server if (optionCount > 1) { - options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; + options[1].m_Option = m_Option; options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); // except for these addresses ... if (optionCount > 2) @@ -50,14 +70,22 @@ namespace v2rayN.HttpProxyHandler // copy the array over into that spot in memory ... for (int i = 0; i < options.Length; ++i) { - IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); - Marshal.StructureToPtr(options[i], opt, false); + if (Environment.Is64BitOperatingSystem) + { + IntPtr opt = new IntPtr(optionsPtr.ToInt64() + (i * optSize)); + Marshal.StructureToPtr(options[i], opt, false); + } + else + { + IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); + Marshal.StructureToPtr(options[i], opt, false); + } } list.options = optionsPtr; // and then make a pointer out of the whole list - IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); + IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((int)list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); // and finally, call the API method! @@ -100,7 +128,7 @@ namespace v2rayN.HttpProxyHandler public InternetConnectionOptionValue m_Value; static InternetConnectionOption() { - InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption)); + Size = Marshal.SizeOf(typeof(InternetConnectionOption)); } // Nested Types @@ -181,7 +209,7 @@ namespace v2rayN.HttpProxyHandler string ProxyServer = rk.GetValue("ProxyServer").ToString(); rk.Close(); return ProxyServer; - + } } } diff --git a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs index df06f21a..7c5410ca 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs @@ -1,20 +1,20 @@ -using Newtonsoft.Json; + using System; using System.Diagnostics; using System.IO; using System.Text; -using v2rayN.Base; +using System.Threading; using v2rayN.Mode; using v2rayN.Properties; using v2rayN.Tool; namespace v2rayN.HttpProxyHandler { - class SysProxyHandle + public static class SysProxyHandle { - private const string _userWininetConfigFile = "user-wininet.json"; + //private const string _userWininetConfigFile = "user-wininet.json"; - private static string _queryStr; + //private static string _queryStr; // In general, this won't change // format: @@ -44,11 +44,10 @@ namespace v2rayN.HttpProxyHandler catch (IOException ex) { Utils.SaveLog(ex.Message, ex); - } } - public static void SetIEProxy(bool enable, bool global, string proxyServer, string pacURL) + public static void SetIEProxy(bool enable, bool global, string strProxy) { //Read(); @@ -56,130 +55,138 @@ namespace v2rayN.HttpProxyHandler //{ // // record user settings // ExecSysproxy("query"); - // ParseQueryStr(_queryStr); + // //ParseQueryStr(_queryStr); //} string arguments; if (enable) { arguments = global - ? string.Format( - //"global {0} ;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*", - "global {0} ;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*", - proxyServer) - : string.Format("pac {0}", pacURL); + ? $"global {strProxy} {Global.IEProxyExceptions}" + : $"pac {strProxy}"; } else { // restore user settings - //var flags = _userSettings.Flags; - //var proxy_server = _userSettings.ProxyServer ?? "-"; - //var bypass_list = _userSettings.BypassList ?? "-"; - //var pac_url = _userSettings.PacUrl ?? "-"; - ////arguments = string.Format("set {0} {1} {2} {3}", flags, proxy_server, bypass_list, pac_url); - //set null settings - arguments = string.Format("set {0} {1} {2} {3}", 1, "-", "", @"http://127.0.0.1"); + string flags = _userSettings.Flags; + string proxy_server = _userSettings.ProxyServer ?? "-"; + string bypass_list = _userSettings.BypassList ?? "-"; + string pac_url = _userSettings.PacUrl ?? "-"; + arguments = $"set {flags} {proxy_server} {bypass_list} {pac_url}"; // have to get new settings - //_userSettings.UserSettingsRecorded = false; + _userSettings.UserSettingsRecorded = false; } //Save(); ExecSysproxy(arguments); } + // set system proxy to 1 (null) (null) (null) + public static bool ResetIEProxy() + { + try + { + // clear user-wininet.json + //_userSettings = new SysproxyConfig(); + //Save(); + // clear system setting + ExecSysproxy("set 1 - - -"); + } + catch (Exception) + { + return false; + } + + return true; + } + private static void ExecSysproxy(string arguments) { - using (var process = new Process()) + // using event to avoid hanging when redirect standard output/error + // ref: https://stackoverflow.com/questions/139593/processstartinfo-hanging-on-waitforexit-why + // and http://blog.csdn.net/zhangweixing0/article/details/7356841 + using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false)) + using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false)) { - // Configure the process using the StartInfo properties. - process.StartInfo.FileName = Utils.GetTempPath("sysproxy.exe"); - process.StartInfo.Arguments = arguments; - process.StartInfo.WorkingDirectory = Utils.GetTempPath(); - process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; - process.StartInfo.UseShellExecute = false; - process.StartInfo.RedirectStandardError = true; - process.StartInfo.RedirectStandardOutput = true; - - // Need to provide encoding info, or output/error strings we got will be wrong. - process.StartInfo.StandardOutputEncoding = Encoding.Unicode; - process.StartInfo.StandardErrorEncoding = Encoding.Unicode; - - process.StartInfo.CreateNoWindow = true; - process.Start(); - - var stderr = process.StandardError.ReadToEnd(); - var stdout = process.StandardOutput.ReadToEnd(); - - process.WaitForExit(); - - var exitCode = process.ExitCode; - if (exitCode != (int)RET_ERRORS.RET_NO_ERROR) + using (Process process = new Process()) { - throw new Exception(stderr); - } + // Configure the process using the StartInfo properties. + process.StartInfo.FileName = Utils.GetTempPath("sysproxy.exe"); + process.StartInfo.Arguments = arguments; + process.StartInfo.WorkingDirectory = Utils.GetTempPath(); + process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardError = true; + process.StartInfo.RedirectStandardOutput = true; - if (arguments == "query") - { - if (stdout.IsNullOrWhiteSpace() || stdout.IsNullOrEmpty()) + // Need to provide encoding info, or output/error strings we got will be wrong. + process.StartInfo.StandardOutputEncoding = Encoding.Unicode; + process.StartInfo.StandardErrorEncoding = Encoding.Unicode; + + process.StartInfo.CreateNoWindow = true; + + StringBuilder output = new StringBuilder(); + StringBuilder error = new StringBuilder(); + + process.OutputDataReceived += (sender, e) => { - // we cannot get user settings - throw new Exception("failed to query wininet settings"); + if (e.Data == null) + { + outputWaitHandle.Set(); + } + else + { + output.AppendLine(e.Data); + } + }; + process.ErrorDataReceived += (sender, e) => + { + if (e.Data == null) + { + errorWaitHandle.Set(); + } + else + { + error.AppendLine(e.Data); + } + }; + try + { + process.Start(); + + process.BeginErrorReadLine(); + process.BeginOutputReadLine(); + + process.WaitForExit(); } - _queryStr = stdout; + catch (System.ComponentModel.Win32Exception e) + { + + // log the arguments + throw new Exception(process.StartInfo.Arguments); + } + string stderr = error.ToString(); + string stdout = output.ToString(); + + int exitCode = process.ExitCode; + if (exitCode != (int)RET_ERRORS.RET_NO_ERROR) + { + throw new Exception(stderr); + } + + //if (arguments == "query") + //{ + // if (stdout.IsNullOrWhiteSpace() || stdout.IsNullOrEmpty()) + // { + // throw new Exception("failed to query wininet settings"); + // } + // _queryStr = stdout; + //} } } } - private static void Save() - { - try - { - using (StreamWriter sw = new StreamWriter(File.Open(Utils.GetPath(_userWininetConfigFile), FileMode.Create))) - { - string jsonString = JsonConvert.SerializeObject(_userSettings, Formatting.Indented); - sw.Write(jsonString); - sw.Flush(); - } - } - catch (IOException ex) - { - Utils.SaveLog(ex.Message, ex); - } - } - private static void Read() - { - try - { - string configContent = File.ReadAllText(Utils.GetPath(_userWininetConfigFile)); - _userSettings = JsonConvert.DeserializeObject(configContent); - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - // Suppress all exceptions. finally block will initialize new user config settings. - } - finally - { - if (_userSettings == null) _userSettings = new SysproxyConfig(); - } - } - - private static void ParseQueryStr(string str) - { - string[] userSettingsArr = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); - _userSettings.Flags = userSettingsArr[0]; - - // handle output from WinINET - if (userSettingsArr[1] == "(null)") _userSettings.ProxyServer = null; - else _userSettings.ProxyServer = userSettingsArr[1]; - if (userSettingsArr[2] == "(null)") _userSettings.BypassList = null; - else _userSettings.BypassList = userSettingsArr[2]; - if (userSettingsArr[3] == "(null)") _userSettings.PacUrl = null; - else _userSettings.PacUrl = userSettingsArr[3]; - - _userSettings.UserSettingsRecorded = true; - } } } diff --git a/v2rayN/v2rayN/LIB/Google.Protobuf.dll b/v2rayN/v2rayN/LIB/Google.Protobuf.dll deleted file mode 100644 index 596878f0..00000000 Binary files a/v2rayN/v2rayN/LIB/Google.Protobuf.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/Grpc.Core.Api.dll b/v2rayN/v2rayN/LIB/Grpc.Core.Api.dll deleted file mode 100644 index c2dfadc2..00000000 Binary files a/v2rayN/v2rayN/LIB/Grpc.Core.Api.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/Grpc.Core.dll b/v2rayN/v2rayN/LIB/Grpc.Core.dll deleted file mode 100644 index 9413b6e5..00000000 Binary files a/v2rayN/v2rayN/LIB/Grpc.Core.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/Newtonsoft.Json.dll b/v2rayN/v2rayN/LIB/Newtonsoft.Json.dll deleted file mode 100644 index 71ae7e6c..00000000 Binary files a/v2rayN/v2rayN/LIB/Newtonsoft.Json.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/System.Buffers.dll b/v2rayN/v2rayN/LIB/System.Buffers.dll deleted file mode 100644 index b6d9c778..00000000 Binary files a/v2rayN/v2rayN/LIB/System.Buffers.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/System.Memory.dll b/v2rayN/v2rayN/LIB/System.Memory.dll deleted file mode 100644 index bdfc501e..00000000 Binary files a/v2rayN/v2rayN/LIB/System.Memory.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/System.Runtime.CompilerServices.Unsafe.dll b/v2rayN/v2rayN/LIB/System.Runtime.CompilerServices.Unsafe.dll deleted file mode 100644 index 31562392..00000000 Binary files a/v2rayN/v2rayN/LIB/System.Runtime.CompilerServices.Unsafe.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/grpc_csharp_ext.x64.dll b/v2rayN/v2rayN/LIB/grpc_csharp_ext.x64.dll deleted file mode 100644 index 8c10df69..00000000 Binary files a/v2rayN/v2rayN/LIB/grpc_csharp_ext.x64.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/grpc_csharp_ext.x86.dll b/v2rayN/v2rayN/LIB/grpc_csharp_ext.x86.dll deleted file mode 100644 index dd3876df..00000000 Binary files a/v2rayN/v2rayN/LIB/grpc_csharp_ext.x86.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/netstandard.dll b/v2rayN/v2rayN/LIB/netstandard.dll deleted file mode 100644 index 1f1ab22c..00000000 Binary files a/v2rayN/v2rayN/LIB/netstandard.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/zxing.dll b/v2rayN/v2rayN/LIB/zxing.dll deleted file mode 100644 index 7b99de64..00000000 Binary files a/v2rayN/v2rayN/LIB/zxing.dll and /dev/null differ diff --git a/v2rayN/v2rayN/LIB/zxing.presentation.dll b/v2rayN/v2rayN/LIB/zxing.presentation.dll deleted file mode 100644 index 8ad3f9bf..00000000 Binary files a/v2rayN/v2rayN/LIB/zxing.presentation.dll and /dev/null differ diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index e83d1c2c..fb737942 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using v2rayN.Base; +using v2rayN.HttpProxyHandler; + namespace v2rayN.Mode { @@ -107,13 +109,27 @@ namespace v2rayN.Mode } /// - /// 监听状态 0-not 1-http 2-PAC + /// 监听状态 /// - public int listenerType + public ListenerType listenerType { get; set; } + /// + /// 自定义服务器下载测速url + /// + public string speedTestUrl + { + get; set; + } + /// + /// 自定义“服务器真连接延迟”测试url + /// + public string speedPingTestUrl + { + get; set; + } /// /// 自定义GFWList url /// @@ -138,6 +154,14 @@ namespace v2rayN.Mode get; set; } + /// + /// 去重时优先保留较旧(顶部)节点 + /// + public bool keepOlderDedupl + { + get; set; + } + /// /// 视图刷新率 /// @@ -145,7 +169,7 @@ namespace v2rayN.Mode { get; set; } - + /// /// 自定义远程DNS @@ -154,6 +178,15 @@ namespace v2rayN.Mode { get; set; } + + /// + /// 是否允许不安全连接 + /// + public bool defAllowInsecure + { + get; set; + } + /// /// 订阅 /// @@ -169,6 +202,11 @@ namespace v2rayN.Mode get; set; } + public List userPacRule + { + get; set; + } + #region 函数 public string address() @@ -268,7 +306,7 @@ namespace v2rayN.Mode { if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure)) { - return true; + return defAllowInsecure; } return Convert.ToBoolean(vmess[index].allowInsecure); } @@ -327,7 +365,14 @@ namespace v2rayN.Mode return vmess[index].getItemId(); } - + public string flow() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].flow.TrimEx(); + } #endregion } @@ -353,14 +398,14 @@ namespace v2rayN.Mode configType = (int)EConfigType.Vmess; testResult = string.Empty; subid = string.Empty; + flow = string.Empty; } public string getSummary() { - string summary = string.Empty; - summary = string.Format("{0}-", ((EConfigType)configType).ToString()); + string summary = string.Format("[{0}] ", ((EConfigType)configType).ToString()); string[] arrAddr = address.Split('.'); - string addr = string.Empty; + string addr; if (arrAddr.Length > 2) { addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}"; @@ -373,21 +418,26 @@ namespace v2rayN.Mode { addr = address; } - if (configType == (int)EConfigType.Vmess) + switch (configType) { - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - } - else if (configType == (int)EConfigType.Shadowsocks) - { - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - } - else if (configType == (int)EConfigType.Socks) - { - summary += string.Format("{0}({1}:{2})", remarks, addr, port); - } - else - { - summary += string.Format("{0}", remarks); + case (int)EConfigType.Vmess: + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + break; + case (int)EConfigType.Shadowsocks: + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + break; + case (int)EConfigType.Socks: + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + break; + case (int)EConfigType.VLESS: + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + break; + case (int)EConfigType.Trojan: + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + break; + default: + summary += string.Format("{0}", remarks); + break; } return summary; } @@ -414,7 +464,7 @@ namespace v2rayN.Mode public string getItemId() { - var itemId = $"{address}{port}{requestHost}{path}"; + string itemId = $"{address}{port}{requestHost}{path}"; itemId = Utils.Base64Encode(itemId); return itemId; } @@ -463,7 +513,7 @@ namespace v2rayN.Mode get; set; } /// - /// tcp,kcp,ws + /// tcp,kcp,ws,h2,quic /// public string network { @@ -541,6 +591,14 @@ namespace v2rayN.Mode { get; set; } + + /// + /// VLESS flow + /// + public string flow + { + get; set; + } } [Serializable] @@ -667,10 +725,16 @@ namespace v2rayN.Mode [Serializable] public class UIItem { - /// - /// - /// - public int mainQRCodeWidth { get; set; } = 600; + + public System.Drawing.Size mainSize + { + get; set; + } + + public Dictionary mainLvColWidth + { + get; set; + } } } diff --git a/v2rayN/v2rayN/Mode/EConfigType.cs b/v2rayN/v2rayN/Mode/EConfigType.cs index 733c8556..e1adc53c 100644 --- a/v2rayN/v2rayN/Mode/EConfigType.cs +++ b/v2rayN/v2rayN/Mode/EConfigType.cs @@ -6,6 +6,8 @@ namespace v2rayN.Mode Vmess = 1, Custom = 2, Shadowsocks = 3, - Socks = 4 + Socks = 4, + VLESS = 5, + Trojan = 6 } } diff --git a/v2rayN/v2rayN/Mode/EServerColName.cs b/v2rayN/v2rayN/Mode/EServerColName.cs new file mode 100644 index 00000000..0704e47e --- /dev/null +++ b/v2rayN/v2rayN/Mode/EServerColName.cs @@ -0,0 +1,21 @@ + +namespace v2rayN.Mode +{ + public enum EServerColName + { + def = 0, + configType, + remarks, + address, + port, + security, + network, + subRemarks, + testResult, + + todayDown, + todayUp, + totalDown, + totalUp + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs index 0d661c0f..9f0cbf1f 100644 --- a/v2rayN/v2rayN/Mode/V2rayConfig.cs +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -132,6 +132,13 @@ namespace v2rayN.Mode /// /// public List clients { get; set; } + + + /// + /// VLESS + /// + public string decryption { get; set; } + } public class UsersItem @@ -152,6 +159,16 @@ namespace v2rayN.Mode /// /// public string security { get; set; } + + /// + /// VLESS + /// + public string encryption { get; set; } + + /// + /// VLESS + /// + public string flow { get; set; } } public class Sniffing { @@ -281,6 +298,11 @@ namespace v2rayN.Mode /// /// public bool enabled { get; set; } + + /// + /// + /// + public int concurrency { get; set; } } public class Response @@ -376,7 +398,12 @@ namespace v2rayN.Mode /// QUIC /// public QuicSettings quicSettings { get; set; } - + + /// + /// VLESS xtls + /// + public TlsSettings xtlsSettings { get; set; } + } public class TlsSettings @@ -454,6 +481,10 @@ namespace v2rayN.Mode /// /// public Header header { get; set; } + /// + /// + /// + public string seed { get; set; } } public class WsSettings diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs index 0f32d796..cd3e1559 100644 --- a/v2rayN/v2rayN/Program.cs +++ b/v2rayN/v2rayN/Program.cs @@ -1,8 +1,10 @@ using System; using System.Diagnostics; -using System.Reflection; +using System.Threading; using System.Windows.Forms; using v2rayN.Forms; +using v2rayN.Properties; +using v2rayN.Tool; namespace v2rayN { @@ -23,20 +25,20 @@ namespace v2rayN } Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); - Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); + Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); - AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; + //AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; - Process instance = RunningInstance(); - if (instance == null) + if (!IsDuplicateInstance()) { - Utils.SaveLog("v2rayN start up"); + + Utils.SaveLog("v2rayN start up " + Utils.GetVersion()); //设置语言环境 string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans"); - System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); + Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); @@ -44,53 +46,47 @@ namespace v2rayN } else { - UI.Show($"v2rayN is already running(v2rayN已经运行)"); + UI.ShowWarning($"v2rayN is already running(v2rayN已经运行)"); } } - private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) - { - try - { - string resourceName = "v2rayN.LIB." + new AssemblyName(args.Name).Name + ".dll"; - using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) - { - if (stream == null) - { - return null; - } - byte[] assemblyData = new byte[stream.Length]; - stream.Read(assemblyData, 0, assemblyData.Length); - return Assembly.Load(assemblyData); - } - } - catch - { - return null; - } - } + //private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) + //{ + // try + // { + // string resourceName = "v2rayN.LIB." + new AssemblyName(args.Name).Name + ".dll"; + // using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) + // { + // if (stream == null) + // { + // return null; + // } + // byte[] assemblyData = new byte[stream.Length]; + // stream.Read(assemblyData, 0, assemblyData.Length); + // return Assembly.Load(assemblyData); + // } + // } + // catch + // { + // return null; + // } + //} /// - /// 获取正在运行的实例,没有运行的实例返回null; + /// 检查是否已在运行 /// - public static Process RunningInstance() + public static bool IsDuplicateInstance() { - Process current = Process.GetCurrentProcess(); - Process[] processes = Process.GetProcessesByName(current.ProcessName); - foreach (Process process in processes) - { - if (process.Id != current.Id) - { - if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == process.MainModule.FileName) - { - return process; - } - } - } - return null; + //string name = "v2rayN"; + + string name = Utils.GetExePath(); // Allow different locations to run + name = name.Replace("\\", "/"); // https://stackoverflow.com/questions/20714120/could-not-find-a-part-of-the-path-error-while-creating-mutex + + Global.mutexObj = new Mutex(false, name, out bool bCreatedNew); + return !bCreatedNew; } - static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) + static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { Utils.SaveLog("Application_ThreadException", e.Exception); } @@ -99,6 +95,5 @@ namespace v2rayN { Utils.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject); } - } } diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs index 545bcf93..fa240436 100644 --- a/v2rayN/v2rayN/Properties/AssemblyInfo.cs +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // 有关程序集的常规信息通过以下 @@ -8,9 +7,9 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("v2rayN")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyCompany("")] [assembly: AssemblyProduct("v2rayN")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] +[assembly: AssemblyCopyright("Copyright © 2019-2020 (GPLv3)")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -33,4 +32,4 @@ using System.Runtime.InteropServices; // 方法是按如下所示使用“*”: //[assembly: AssemblyVersion("1.0.*")] //[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("2.53")] +[assembly: AssemblyFileVersion("3.26")] diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index f2d8f030..f21638d7 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -90,26 +90,6 @@ namespace v2rayN.Properties { } } - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] grpc_csharp_ext_x64_dll { - get { - object obj = ResourceManager.GetObject("grpc_csharp_ext_x64_dll", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// 查找 System.Byte[] 类型的本地化资源。 - /// - internal static byte[] grpc_csharp_ext_x86_dll { - get { - object obj = ResourceManager.GetObject("grpc_csharp_ext_x86_dll", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// @@ -217,6 +197,16 @@ namespace v2rayN.Properties { } } + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap share { + get { + object obj = ResourceManager.GetObject("share", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index 2488ee55..706454a0 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -118,58 +118,55 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\grpc_csharp_ext.x64.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\grpc_csharp_ext.x86.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\option.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 - - - ..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 + + + ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/v2rayN/v2rayN/Resources/grpc_csharp_ext.x64.dll.gz b/v2rayN/v2rayN/Resources/grpc_csharp_ext.x64.dll.gz deleted file mode 100644 index b69a16bd..00000000 Binary files a/v2rayN/v2rayN/Resources/grpc_csharp_ext.x64.dll.gz and /dev/null differ diff --git a/v2rayN/v2rayN/Resources/grpc_csharp_ext.x86.dll.gz b/v2rayN/v2rayN/Resources/grpc_csharp_ext.x86.dll.gz deleted file mode 100644 index d56025ca..00000000 Binary files a/v2rayN/v2rayN/Resources/grpc_csharp_ext.x86.dll.gz and /dev/null differ diff --git a/v2rayN/v2rayN/Resources/pac.txt b/v2rayN/v2rayN/Resources/pac.txt index 4bed057c..6695b760 100644 --- a/v2rayN/v2rayN/Resources/pac.txt +++ b/v2rayN/v2rayN/Resources/pac.txt @@ -49,7 +49,7 @@ var rules = [ "|http://img.dlsite.jp/", "||dm530.net", "share.dmhy.org", - "@@|https://share.dmhy.org", + "||dmhy.org", "||dmm.co.jp", "|http://www.dmm.com/netgame", "||dnvod.tv", @@ -262,19 +262,25 @@ var rules = [ "||daum.net", "||depositphotos.com", "||disconnect.me", + "||documentingreality.com", "||doubibackup.com", "||doubmirror.cf", "||encyclopedia.com", "||fangeqiang.com", + "||fanqiangdang.com", "||cloud.feedly.com", + "||feedx.net", "||flyzy2005.com", "||foreignpolicy.com", "||free-ss.site", + "||freehongkong.org", "||blog.fuckgfw233.org", "||g0v.social", "||globalvoices.org", "||glorystar.me", "||goregrish.com", + "||guangnianvpn.com", + "||hanime.tv", "||hbo.com", "||spaces.hightail.com", "||hkgalden.com", @@ -288,6 +294,7 @@ var rules = [ "||joinmastodon.org", "||liangzhichuanmei.com", "||lighti.me", + "||lightyearvpn.com", "||lihkg.com", "||line-scdn.net", "||i.lithium.com", @@ -325,6 +332,7 @@ var rules = [ "||api.pureapk.com", "||quora.com", "||quoracdn.net", + "||qz.com", "||cdn.seatguru.com", "||secure.raxcdn.com", "||redd.it", @@ -368,6 +376,8 @@ var rules = [ "||steemit.com", "||taiwanjustice.net", "||tinc-vpn.org", + "||u15.info", + "||washingtonpost.com", "||wenzhao.ca", "||whatsonweibo.com", "||wire.com", @@ -375,6 +385,7 @@ var rules = [ "||xm.com", "||xuehua.us", "||yes-news.com", + "||yigeni.com", "||you-get.org", "||zzcloud.me", "||aex.com", @@ -697,459 +708,8 @@ var rules = [ "||thefacebook.com", "||whatsapp.com", "||whatsapp.net", - "|https://www.ftchinese.com", - ".ftchinese.com/channel/video", - ".ftchinese.com/premium/001081066", - ".ftchinese.com/story/00102753", - ".ftchinese.com/story/001026616", - ".ftchinese.com/story/001026749", - ".ftchinese.com/story/001026807", - ".ftchinese.com/story/001026808", - ".ftchinese.com/story/001026834", - ".ftchinese.com/story/001026880", - ".ftchinese.com/story/001027429", - ".ftchinese.com/story/001030341", - ".ftchinese.com/story/001030502", - ".ftchinese.com/story/001030803", - ".ftchinese.com/story/001031317", - ".ftchinese.com/story/001032617", - ".ftchinese.com/story/001032636", - ".ftchinese.com/story/001032692", - ".ftchinese.com/story/001032762", - ".ftchinese.com/story/001033138", - ".ftchinese.com/story/001034917", - ".ftchinese.com/story/001034926", - ".ftchinese.com/story/001034927", - ".ftchinese.com/story/001034928", - ".ftchinese.com/story/001034952", - ".ftchinese.com/story/001035890", - ".ftchinese.com/story/001035972", - ".ftchinese.com/story/001035993", - ".ftchinese.com/story/001036417", - ".ftchinese.com/story/001037090", - ".ftchinese.com/story/001037091", - ".ftchinese.com/story/001038178", - ".ftchinese.com/story/001038199", - ".ftchinese.com/story/001038220", - ".ftchinese.com/story/001038819", - ".ftchinese.com/story/001038862", - ".ftchinese.com/story/001039067", - ".ftchinese.com/story/001039178", - ".ftchinese.com/story/001039211", - ".ftchinese.com/story/001039271", - ".ftchinese.com/story/001039295", - ".ftchinese.com/story/001039369", - ".ftchinese.com/story/001039482", - ".ftchinese.com/story/001039534", - ".ftchinese.com/story/001039555", - ".ftchinese.com/story/001039576", - ".ftchinese.com/story/001039712", - ".ftchinese.com/story/001039779", - ".ftchinese.com/story/001039809", - ".ftchinese.com/story/001040134", - ".ftchinese.com/story/001040835", - ".ftchinese.com/story/001040890", - ".ftchinese.com/story/001040918", - ".ftchinese.com/story/001040992", - ".ftchinese.com/story/001041209", - ".ftchinese.com/story/001042100", - ".ftchinese.com/story/001042252", - ".ftchinese.com/story/001042272", - ".ftchinese.com/story/001042280", - ".ftchinese.com/story/001043029", - ".ftchinese.com/story/001043066", - ".ftchinese.com/story/001043096", - ".ftchinese.com/story/001043124", - ".ftchinese.com/story/001043152", - ".ftchinese.com/story/001043189", - ".ftchinese.com/story/001043428", - ".ftchinese.com/story/001043439", - ".ftchinese.com/story/001043534", - ".ftchinese.com/story/001043675", - ".ftchinese.com/story/001043680", - ".ftchinese.com/story/001043702", - ".ftchinese.com/story/001043849", - ".ftchinese.com/story/001044099", - ".ftchinese.com/story/001044776", - ".ftchinese.com/story/001044871", - ".ftchinese.com/story/001044897", - ".ftchinese.com/story/001045114", - ".ftchinese.com/story/001045139", - ".ftchinese.com/story/001045186", - ".ftchinese.com/story/001045755", - ".ftchinese.com/story/001046087", - ".ftchinese.com/story/001046105", - ".ftchinese.com/story/001046118", - ".ftchinese.com/story/001046132", - ".ftchinese.com/story/001046517", - ".ftchinese.com/story/001046822", - ".ftchinese.com/story/001046866", - ".ftchinese.com/story/001046942", - ".ftchinese.com/story/001047180", - ".ftchinese.com/story/001047206", - ".ftchinese.com/story/001047304", - ".ftchinese.com/story/001047317", - ".ftchinese.com/story/001047345", - ".ftchinese.com/story/001047358", - ".ftchinese.com/story/001047375", - ".ftchinese.com/story/001047381", - ".ftchinese.com/story/001047413", - ".ftchinese.com/story/001047456", - ".ftchinese.com/story/001047491", - ".ftchinese.com/story/001047545", - ".ftchinese.com/story/001047558", - ".ftchinese.com/story/001047568", - ".ftchinese.com/story/001047627", - ".ftchinese.com/story/001048293", - ".ftchinese.com/story/001048343", - ".ftchinese.com/story/001048710", - ".ftchinese.com/story/001049289", - ".ftchinese.com/story/001049360", - ".ftchinese.com/story/001049896", - ".ftchinese.com/story/001050152", - ".ftchinese.com/story/001051027", - ".ftchinese.com/story/001051161", - ".ftchinese.com/story/001051372", - ".ftchinese.com/story/001051479", - ".ftchinese.com/story/001052138", - ".ftchinese.com/story/001052161", - ".ftchinese.com/story/001052525", - ".ftchinese.com/story/001052549", - ".ftchinese.com/story/001052701", - ".ftchinese.com/story/001052965", - ".ftchinese.com/story/001053149", - ".ftchinese.com/story/001053150", - ".ftchinese.com/story/001053200", - ".ftchinese.com/story/001053425", - ".ftchinese.com/story/001053496", - ".ftchinese.com/story/001053526", - ".ftchinese.com/story/001053557", - ".ftchinese.com/story/001053906", - ".ftchinese.com/story/001054049", - ".ftchinese.com/story/001054103", - ".ftchinese.com/story/001054109", - ".ftchinese.com/story/001054119", - ".ftchinese.com/story/001054123", - ".ftchinese.com/story/001054139", - ".ftchinese.com/story/001054166", - ".ftchinese.com/story/001054168", - ".ftchinese.com/story/001054190", - ".ftchinese.com/story/001054437", - ".ftchinese.com/story/001054526", - ".ftchinese.com/story/001054607", - ".ftchinese.com/story/001054644", - ".ftchinese.com/story/001054786", - ".ftchinese.com/story/001054843", - ".ftchinese.com/story/001054925", - ".ftchinese.com/story/001054940", - ".ftchinese.com/story/001055051", - ".ftchinese.com/story/001055063", - ".ftchinese.com/story/001055069", - ".ftchinese.com/story/001055136", - ".ftchinese.com/story/001055170", - ".ftchinese.com/story/001055202", - ".ftchinese.com/story/001055242", - ".ftchinese.com/story/001055263", - ".ftchinese.com/story/001055274", - ".ftchinese.com/story/001055299", - ".ftchinese.com/story/001055480", - ".ftchinese.com/story/001055551", - ".ftchinese.com/story/001055559", - ".ftchinese.com/story/001055566", - ".ftchinese.com/story/001055840", - ".ftchinese.com/story/001056099", - ".ftchinese.com/story/001056108", - ".ftchinese.com/story/001056131", - ".ftchinese.com/story/001056375", - ".ftchinese.com/story/001056491", - ".ftchinese.com/story/001056529", - ".ftchinese.com/story/001056534", - ".ftchinese.com/story/001056538", - ".ftchinese.com/story/001056541", - ".ftchinese.com/story/001056554", - ".ftchinese.com/story/001056557", - ".ftchinese.com/story/001056560", - ".ftchinese.com/story/001056567", - ".ftchinese.com/story/001056574", - ".ftchinese.com/story/001056588", - ".ftchinese.com/story/001056594", - ".ftchinese.com/story/001056596", - ".ftchinese.com/story/001056684", - ".ftchinese.com/story/001056832", - ".ftchinese.com/story/001056833", - ".ftchinese.com/story/001056851", - ".ftchinese.com/story/001056874", - ".ftchinese.com/story/001056896", - ".ftchinese.com/story/001056927", - ".ftchinese.com/story/001057011", - ".ftchinese.com/story/001057018", - ".ftchinese.com/story/001057044", - ".ftchinese.com/story/001057162", - ".ftchinese.com/story/001057500", - ".ftchinese.com/story/001057504", - ".ftchinese.com/story/001057509", - ".ftchinese.com/story/001057518", - ".ftchinese.com/story/001057532", - ".ftchinese.com/story/001057533", - ".ftchinese.com/story/001057556", - ".ftchinese.com/story/001057580", - ".ftchinese.com/story/001057638", - ".ftchinese.com/story/001057644", - ".ftchinese.com/story/001057817", - ".ftchinese.com/story/001057875", - ".ftchinese.com/story/001058009", - ".ftchinese.com/story/001058056", - ".ftchinese.com/story/001058224", - ".ftchinese.com/story/001058257", - ".ftchinese.com/story/001058295", - ".ftchinese.com/story/001058328", - ".ftchinese.com/story/001058339", - ".ftchinese.com/story/001058344", - ".ftchinese.com/story/001058352", - ".ftchinese.com/story/001058413", - ".ftchinese.com/story/001058421", - ".ftchinese.com/story/001058440", - ".ftchinese.com/story/001058458", - ".ftchinese.com/story/001058468", - ".ftchinese.com/story/001058561", - ".ftchinese.com/story/001058566", - ".ftchinese.com/story/001058567", - ".ftchinese.com/story/001058585", - ".ftchinese.com/story/001058628", - ".ftchinese.com/story/001058656", - ".ftchinese.com/story/001058665", - ".ftchinese.com/story/001058678", - ".ftchinese.com/story/001058691", - ".ftchinese.com/story/001058721", - ".ftchinese.com/story/001058728", - ".ftchinese.com/story/001059464", - ".ftchinese.com/story/001059484", - ".ftchinese.com/story/001059537", - ".ftchinese.com/story/001059538", - ".ftchinese.com/story/001059551", - ".ftchinese.com/story/001059818", - ".ftchinese.com/story/001059914", - ".ftchinese.com/story/001059920", - ".ftchinese.com/story/001059957", - ".ftchinese.com/story/001060088", - ".ftchinese.com/story/001060156", - ".ftchinese.com/story/001060157", - ".ftchinese.com/story/001060160", - ".ftchinese.com/story/001060181", - ".ftchinese.com/story/001060185", - ".ftchinese.com/story/001060493", - ".ftchinese.com/story/001060495", - ".ftchinese.com/story/001060590", - ".ftchinese.com/story/001060846", - ".ftchinese.com/story/001060847", - ".ftchinese.com/story/001060875", - ".ftchinese.com/story/001060921", - ".ftchinese.com/story/001060946", - ".ftchinese.com/story/001061120", - ".ftchinese.com/story/001061474", - ".ftchinese.com/story/001061524", - ".ftchinese.com/story/001061642", - ".ftchinese.com/story/001062017", - ".ftchinese.com/story/001062020", - ".ftchinese.com/story/001062028", - ".ftchinese.com/story/001062092", - ".ftchinese.com/story/001062096", - ".ftchinese.com/story/001062147", - ".ftchinese.com/story/001062176", - ".ftchinese.com/story/001062188", - ".ftchinese.com/story/001062254", - ".ftchinese.com/story/001062374", - ".ftchinese.com/story/001062482", - ".ftchinese.com/story/001062496", - ".ftchinese.com/story/001062501", - ".ftchinese.com/story/001062508", - ".ftchinese.com/story/001062519", - ".ftchinese.com/story/001062554", - ".ftchinese.com/story/001062741", - ".ftchinese.com/story/001062794", - ".ftchinese.com/story/001063160", - ".ftchinese.com/story/001063359", - ".ftchinese.com/story/001063512", - ".ftchinese.com/story/001063668", - ".ftchinese.com/story/001063692", - ".ftchinese.com/story/001063763", - ".ftchinese.com/story/001063764", - ".ftchinese.com/story/001063826", - ".ftchinese.com/story/001064127", - ".ftchinese.com/story/001064312", - ".ftchinese.com/story/001064705", - ".ftchinese.com/story/001064807", - ".ftchinese.com/story/001065120", - ".ftchinese.com/story/001065168", - ".ftchinese.com/story/001065249", - ".ftchinese.com/story/001065287", - ".ftchinese.com/story/001065335", - ".ftchinese.com/story/001065337", - ".ftchinese.com/story/001065541", - ".ftchinese.com/story/001065715", - ".ftchinese.com/story/001065735", - ".ftchinese.com/story/001065756", - ".ftchinese.com/story/001065802", - ".ftchinese.com/story/001066112", - ".ftchinese.com/story/001066136", - ".ftchinese.com/story/001066140", - ".ftchinese.com/story/001066465", - ".ftchinese.com/story/001066881", - ".ftchinese.com/story/001066950", - ".ftchinese.com/story/001066959", - ".ftchinese.com/story/001067435", - "www.ftchinese.com/story/001067479", - ".ftchinese.com/story/001067528", - ".ftchinese.com/story/001067545", - ".ftchinese.com/story/001067572", - ".ftchinese.com/story/001067648", - ".ftchinese.com/story/001067650", - ".ftchinese.com/story/001067680", - ".ftchinese.com/story/001067692", - ".ftchinese.com/story/001067871", - ".ftchinese.com/story/001067923", - ".ftchinese.com/story/001068062", - ".ftchinese.com/story/001068248", - ".ftchinese.com/story/001068278", - ".ftchinese.com/story/001068379", - ".ftchinese.com/story/001068483", - ".ftchinese.com/story/001068506", - ".ftchinese.com/story/001068547", - ".ftchinese.com/story/001068616", - ".ftchinese.com/story/001068622", - ".ftchinese.com/story/001068707", - ".ftchinese.com/story/001069146", - ".ftchinese.com/story/001069373", - ".ftchinese.com/story/001069516", - ".ftchinese.com/story/001069517", - ".ftchinese.com/story/001069687", - ".ftchinese.com/story/001069741", - ".ftchinese.com/story/001069861", - ".ftchinese.com/story/001069952", - ".ftchinese.com/story/001070053", - ".ftchinese.com/story/001070177", - ".ftchinese.com/story/001070307", - ".ftchinese.com/story/001070809", - ".ftchinese.com/story/001070990", - ".ftchinese.com/story/001071042", - ".ftchinese.com/story/001071044", - ".ftchinese.com/story/001071106", - ".ftchinese.com/story/001071166", - ".ftchinese.com/story/001071181", - "ftchinese.com/story/001071200", - ".ftchinese.com/story/001071208", - ".ftchinese.com/story/001071238", - ".ftchinese.com/story/001071683", - ".ftchinese.com/story/001072271", - ".ftchinese.com/story/001072348", - ".ftchinese.com/story/001072677", - ".ftchinese.com/story/001072726", - ".ftchinese.com/story/001072794", - ".ftchinese.com/story/001072853", - ".ftchinese.com/story/001072895", - ".ftchinese.com/story/001072993", - ".ftchinese.com/story/001073043", - ".ftchinese.com/story/001073103", - ".ftchinese.com/story/001073157", - ".ftchinese.com/story/001073216", - ".ftchinese.com/story/001073246", - ".ftchinese.com/story/001073305", - ".ftchinese.com/story/001073307", - ".ftchinese.com/story/001073408", - ".ftchinese.com/story/001073537", - ".ftchinese.com/story/001073672", - ".ftchinese.com/story/001073849", - ".ftchinese.com/story/001073906", - ".ftchinese.com/story/001074089", - ".ftchinese.com/story/001074110", - ".ftchinese.com/story/001074128", - ".ftchinese.com/story/001074157", - ".ftchinese.com/story/001074246", - ".ftchinese.com/story/001074307", - ".ftchinese.com/story/001074347", - ".ftchinese.com/story/001074423", - ".ftchinese.com/story/001074454", - ".ftchinese.com/story/001074467", - ".ftchinese.com/story/001074493", - ".ftchinese.com/story/001074550", - ".ftchinese.com/story/001074562", - ".ftchinese.com/story/001074653", - ".ftchinese.com/story/001074693", - ".ftchinese.com/story/001074699", - ".ftchinese.com/story/001074712", - ".ftchinese.com/story/001074713", - ".ftchinese.com/story/001074768", - ".ftchinese.com/story/001074782", - ".ftchinese.com/story/001074794", - ".ftchinese.com/story/001074822", - ".ftchinese.com/story/001074874", - ".ftchinese.com/story/001074891", - ".ftchinese.com/story/001074918", - ".ftchinese.com/story/001075081", - ".ftchinese.com/story/001075134", - ".ftchinese.com/story/001075142", - ".ftchinese.com/story/001075216", - ".ftchinese.com/story/001075230", - ".ftchinese.com/story/001075238", - ".ftchinese.com/story/001075262", - ".ftchinese.com/story/001075269", - ".ftchinese.com/story/001075491", - ".ftchinese.com/story/001075500", - ".ftchinese.com/story/001075650", - ".ftchinese.com/story/001075678", - ".ftchinese.com/story/001075703", - ".ftchinese.com/story/001075739", - ".ftchinese.com/story/001076066", - ".ftchinese.com/story/001076142", - ".ftchinese.com/story/001076459", - ".ftchinese.com/story/001076470", - ".ftchinese.com/story/001076538", - ".ftchinese.com/story/001076573", - ".ftchinese.com/story/001076901", - ".ftchinese.com/story/001077067", - ".ftchinese.com/story/001077084", - ".ftchinese.com/story/001077235", - ".ftchinese.com/story/001077344", - ".ftchinese.com/story/001077390", - ".ftchinese.com/story/001077392", - ".ftchinese.com/story/001077465", - ".ftchinese.com/story/001077468", - ".ftchinese.com/story/001077492", - ".ftchinese.com/story/001077745", - ".ftchinese.com/story/001077768", - ".ftchinese.com/story/001077804", - ".ftchinese.com/story/001077852", - ".ftchinese.com/story/001078646", - ".ftchinese.com/story/001078928", - ".ftchinese.com/story/001078967", - ".ftchinese.com/story/001079559", - ".ftchinese.com/story/001079641", - ".ftchinese.com/story/001079909", - ".ftchinese.com/story/001079934", - ".ftchinese.com/story/001079992", - ".ftchinese.com/story/001080054", - ".ftchinese.com/story/001080109", - ".ftchinese.com/story/001080169", - ".ftchinese.com/story/001080226", - ".ftchinese.com/story/001080429", - ".ftchinese.com/story/001080471", - ".ftchinese.com/story/001080550", - ".ftchinese.com/story/001080581", - ".ftchinese.com/story/001080647", - ".ftchinese.com/story/001080778", - ".ftchinese.com/story/001080892", - ".ftchinese.com/story/001080915", - ".ftchinese.com/story/001080935", - ".ftchinese.com/story/001081059", - ".ftchinese.com/story/001081127", - ".ftchinese.com/tag/%E5%8D%81%E5%85%AB%E5%B1%8A%E4%B8%89%E4%B8%AD%E5%85%A8%E4%BC%9A", - ".ftchinese.com/tag/%E6%B8%A9%E5%AE%B6%E5%AE%9D", - ".ftchinese.com/tag/%E8%96%84%E7%86%99%E6%9D%A5", - ".ftchinese.com/video/1437", - ".ftchinese.com/video/1882", - ".ftchinese.com/video/2446", - ".ftchinese.com/video/2601", - ".ftchinese.com/comments", + ".ftchinese.com", + "||ftchinese.com", "||1e100.net", "||466453.com", "||abc.xyz", @@ -1595,6 +1155,7 @@ var rules = [ "||2008xianzhang.info", "||2017.hk", "21andy.com/blog", + ".21join.com", ".21pron.com", "21sextury.com", ".228.net.tw", @@ -1636,9 +1197,10 @@ var rules = [ "64wiki.com", ".66.ca", "666kb.com", - "6park.com", + ".6park.com", "||6park.com", "||6parker.com", + "||6parknews.com", "||7capture.com", ".7cow.com", ".8-d.com", @@ -1923,6 +1485,7 @@ var rules = [ ".avdb.tv", "||avdb.tv", ".avfantasy.com", + "||avg.com", ".avgle.com", "||avgle.com", "||avidemux.org", @@ -2716,6 +2279,8 @@ var rules = [ "delicious.com/GFWbookmark", ".democrats.org", "||democrats.org", + ".demosisto.hk", + "||demosisto.hk", "||desc.se", "||dessci.com", ".destroy-china.jp", @@ -3416,6 +2981,7 @@ var rules = [ "||toutyrater.github.io", "wsgzao.github.io", "|https://wsgzao.github.io", + "||raw.githubusercontent.com", ".gizlen.net", "||gizlen.net", ".gjczz.com", @@ -4390,7 +3956,7 @@ var rules = [ ".lsmradio.com/rad_archives", ".lsmwebcast.com", ".ltn.com.tw", - "|http://ltn.com.tw", + "||ltn.com.tw", ".luke54.com", ".luke54.org", ".lupm.org", @@ -4858,6 +4424,7 @@ var rules = [ "|http://nvtongzhisheng.org", ".nwtca.org", "|http://nyaa.eu", + "||nyaa.si", ".nydus.ca", "nylon-angel.com", "nylonstockingsonline.com", @@ -5321,6 +4888,7 @@ var rules = [ "||rapidmoviez.com", "rapidvpn.com", "||rapidvpn.com", + "||rarbgprx.org", ".raremovie.cc", "|http://raremovie.cc", ".raremovie.net", @@ -6861,7 +6429,7 @@ var rules = [ "||windscribe.com", "||community.windy.com", "||wingy.site", - "winning11.com", + ".winning11.com", "winwhispers.info", "||wiredbytes.com", "||wiredpen.com", diff --git a/v2rayN/v2rayN/Resources/pac.txt.gz b/v2rayN/v2rayN/Resources/pac.txt.gz index 4020d6a6..7f621cb7 100644 Binary files a/v2rayN/v2rayN/Resources/pac.txt.gz and b/v2rayN/v2rayN/Resources/pac.txt.gz differ diff --git a/v2rayN/v2rayN/Resources/share.png b/v2rayN/v2rayN/Resources/share.png new file mode 100644 index 00000000..df5e2396 Binary files /dev/null and b/v2rayN/v2rayN/Resources/share.png differ diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 58b42c18..b5b956d6 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -19,7 +19,7 @@ namespace v2rayN.Resx { // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class ResUI { @@ -105,6 +105,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Downloading... 的本地化字符串。 + /// + internal static string Downloading { + get { + return ResourceManager.GetString("Downloading", resourceCulture); + } + } + /// /// 查找类似 DOWN 的本地化字符串。 /// @@ -267,6 +276,24 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 {0} already up to date. 的本地化字符串。 + /// + internal static string IsLatestCore { + get { + return ResourceManager.GetString("IsLatestCore", resourceCulture); + } + } + + /// + /// 查找类似 {0} already up to date. 的本地化字符串。 + /// + internal static string IsLatestN { + get { + return ResourceManager.GetString("IsLatestN", resourceCulture); + } + } + /// /// 查找类似 Address 的本地化字符串。 /// @@ -394,7 +421,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Download V2rayCore successfully 的本地化字符串。 + /// 查找类似 Download V2ray successfully 的本地化字符串。 /// internal static string MsgDownloadV2rayCoreSuccessfully { get { @@ -448,11 +475,11 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Resolve V2rayCore successfully 的本地化字符串。 + /// 查找类似 Resolve {0} successfully 的本地化字符串。 /// - internal static string MsgParsingV2rayCoreSuccessfully { + internal static string MsgParsingSuccessfully { get { - return ResourceManager.GetString("MsgParsingV2rayCoreSuccessfully", resourceCulture); + return ResourceManager.GetString("MsgParsingSuccessfully", resourceCulture); } } @@ -474,6 +501,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Start updating {0}... 的本地化字符串。 + /// + internal static string MsgStartUpdating { + get { + return ResourceManager.GetString("MsgStartUpdating", resourceCulture); + } + } + /// /// 查找类似 Start updating PAC... 的本地化字符串。 /// @@ -483,15 +519,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 Start updating V2rayCore... 的本地化字符串。 - /// - internal static string MsgStartUpdatingV2rayCore { - get { - return ResourceManager.GetString("MsgStartUpdatingV2rayCore", resourceCulture); - } - } - /// /// 查找类似 Subscription content decoding failed (non-BASE64 code) 的本地化字符串。 /// @@ -574,7 +601,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 V2ray-core not found, download address: {0} 的本地化字符串。 + /// 查找类似 V2ray-core not found, please download: {0} 的本地化字符串。 /// internal static string NotFoundCore { get { @@ -645,6 +672,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 + /// + internal static string RemoveDuplicateServerResult { + get { + return ResourceManager.GetString("RemoveDuplicateServerResult", resourceCulture); + } + } + /// /// 查找类似 Are you sure to remove the server? 的本地化字符串。 /// @@ -691,7 +727,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 PAC failed to start. Pls with an administrator. 的本地化字符串。 + /// 查找类似 PAC failed to start. Run it with Admin right. 的本地化字符串。 /// internal static string StartPacFailed { get { @@ -700,7 +736,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Start service ({0})...... 的本地化字符串。 + /// 查找类似 Start service ({0})... 的本地化字符串。 /// internal static string StartService { get { @@ -728,7 +764,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Imported bulk URL from clipboard successfully 的本地化字符串。 + /// 查找类似 {0} servers have been imported from clipboard. 的本地化字符串。 /// internal static string SuccessfullyImportedServerViaClipboard { get { @@ -744,5 +780,14 @@ namespace v2rayN.Resx { return ResourceManager.GetString("SuccessfullyImportedServerViaScan", resourceCulture); } } + + /// + /// 查找类似 The ping of current service: {0} 的本地化字符串。 + /// + internal static string TestMeOutput { + get { + return ResourceManager.GetString("TestMeOutput", resourceCulture); + } + } } } diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 9db82297..50d37abe 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -123,9 +123,39 @@ Batch export share URL to clipboard successfully + + Please check the server settings first + + + configuration format is incorrect + + + Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. + + + Downloading... + + + DOWN + + + Whether to download? {0} + + + Failed to convert configuration file + + + Failed to generate default configuration file + + + Failed to get the default configuration + Failed to import custom configuration server + + Failed to read configuration file + Please fill in the correct format extra ID @@ -147,75 +177,6 @@ Please fill in the user ID - - This feature relies on the Http global proxy, please set it correctly first. - - - non-Vmess service, this feature is invalid - - - Scan completed, no valid QR code found - - - operation failed, please check retry - - - Please Fill Remarks - - - Please select the encryption method - - - Please select an agreement - - - Please select the server first - - - Successfully imported custom configuration server - - - Imported bulk URL from clipboard successfully - - - Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. - - - The client configuration file is saved at: {0} - - - The server configuration file is saved at: {0} - - - Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! - - - Scan import URL successfully - - - Whether to download? {0} - - - Are you sure to remove the server? - - - Please check the server settings first - - - configuration format is incorrect - - - Failed to convert configuration file - - - Failed to generate default configuration file - - - Failed to get the default configuration - - - Failed to read configuration file - is not the correct client configuration file, please check @@ -228,18 +189,11 @@ Initial Configuration - - Non-vmess or ss protocol + + {0} already up to date. - - Successful configuration -{0} - - - V2ray-core not found, download address: {0} - - - Start service ({0})...... + + {0} already up to date. Address @@ -262,14 +216,29 @@ Test Results + + Today download traffic + + + Today upload traffic + + + Total download traffic + + + Total upload traffic + Transport + + MediumFresh + Clear original subscription content - Download V2rayCore successfully + Download V2ray successfully Failed to import subscription content @@ -286,8 +255,8 @@ PAC update succeeded - - Resolve V2rayCore successfully + + Resolve {0} successfully Simplify PAC Success @@ -295,12 +264,12 @@ Start getting subscriptions + + Start updating {0}... + Start updating PAC... - - Start updating V2rayCore... - Subscription content decoding failed (non-BASE64 code) @@ -319,31 +288,77 @@ Update V2rayCore successfully! Restarting service... - - MediumFresh + + This feature relies on the Http global proxy, please set it correctly first. + + + Non-vmess or ss protocol + + + non-Vmess service, this feature is invalid + + + V2ray-core not found, please download: {0} + + + Scan completed, no valid QR code found + + + operation failed, please check retry + + + Please Fill Remarks + + + Please select the encryption method + + + Please select an agreement + + + Please select the server first QuickFresh + + Servers deduplication completed. Old: {0}, New: {1}. + + + Are you sure to remove the server? + + + The client configuration file is saved at: {0} + + + The server configuration file is saved at: {0} + SlowFresh - - DOWN - - - Today download traffic - - - Today upload traffic - - - Total download traffic - - - Total upload traffic + + Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! - PAC failed to start. Pls with an administrator. + PAC failed to start. Run it with Admin right. + + + Start service ({0})... + + + Successful configuration +{0} + + + Successfully imported custom configuration server + + + {0} servers have been imported from clipboard. + + + Scan import URL successfully + + + The ping of current service: {0} \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index b775c152..4b312497 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -123,9 +123,39 @@ 批量导出分享URL至剪贴板成功 + + 请先检查服务器设置 + + + 配置格式不正确 + + + 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时,系统代理才可用 + + + 下载开始... + + + 下载 + + + 是否下载? {0} + + + 转换配置文件失败 + + + 生成默认配置文件失败 + + + 取得默认配置失败 + 导入自定义配置服务器失败 + + 读取配置文件失败 + 请填写正确格式额外ID @@ -147,75 +177,6 @@ 请填写用户ID - - 此功能依赖Http全局代理,请先设置正确。 - - - 非Vmess服务,此功能无效 - - - 扫描完成,未发现有效二维码 - - - 操作失败,请检查重试 - - - 请填写备注 - - - 请选择加密方式 - - - 请选择协议 - - - 请先选择服务器 - - - 成功导入自定义配置服务器 - - - 从剪贴板导入批量URL成功 - - - 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时,系统代理才可用 - - - 客户端配置文件保存在:{0} - - - 服务端配置文件保存在:{0} - - - 注意:此功能依赖Http全局代理!测试完成后,请手工调整Http全局代理和活动节点。 - - - 扫描导入URL成功 - - - 是否下载? {0} - - - 是否确定移除服务器? - - - 请先检查服务器设置 - - - 配置格式不正确 - - - 转换配置文件失败 - - - 生成默认配置文件失败 - - - 取得默认配置失败 - - - 读取配置文件失败 - 不是正确的客户端配置文件,请检查 @@ -228,18 +189,11 @@ 初始化配置 - - 非vmess或ss协议 + + {0} 已是最新版本。 - - 配置成功 -{0} - - - 未找到v2ray-core,下载地址:{0} - - - 启动服务({0})...... + + {0} 已是最新版本。 地址 @@ -254,7 +208,7 @@ 端口 - 服务类型 + 类型 订阅 @@ -262,14 +216,29 @@ 测试结果 + + 今日下载 + + + 今日上传 + + + 总下载 + + + 总上传 + 传输协议 + + 中等 + 清除原订阅内容 - 下载V2rayCore成功 + 下载V2ray成功 导入订阅内容失败 @@ -286,8 +255,8 @@ PAC更新成功 - - 解析V2rayCore成功 + + 解析{0}成功 简化PAC成功 @@ -295,11 +264,11 @@ 开始获取订阅内容 - - 开始更新PAC... + + 开始更新 {0}... - - 开始更新V2rayCore... + + 开始更新 PAC... 订阅内容解码失败(非BASE64码) @@ -319,31 +288,77 @@ 更新V2rayCore成功!正在重启服务... - - 中等 + + 此功能依赖Http全局代理,请先设置正确。 + + + 非vmess或ss协议 + + + 非Vmess服务,此功能无效 + + + 找不到 v2ray-core,下载地址: {0} + + + 扫描完成,未发现有效二维码 + + + 操作失败,请检查重试 + + + 请填写备注 + + + 请选择加密方式 + + + 请选择协议 + + + 请先选择服务器 + + 服务器去重完成。原数量: {0},现数量: {1} + + + 是否确定移除服务器? + + + 客户端配置文件保存在:{0} + + + 服务端配置文件保存在:{0} + - - 下载 - - - 今日下载 - - - 今日上传 - - - 总下载 - - - 总上传 + + 注意:此功能依赖Http全局代理!测试完成后,请手工调整Http全局代理和活动节点。 PAC服务启动失败,请用管理员启动 + + 启动服务({0})... + + + 配置成功 +{0} + + + 成功导入自定义配置服务器 + + + 成功从剪贴板导入 {0} 个服务器 + + + 扫描导入URL成功 + + + 当前服务的真连接延迟: {0} + \ No newline at end of file diff --git a/v2rayN/v2rayN/Tool/FileManager.cs b/v2rayN/v2rayN/Tool/FileManager.cs index 6df1a4bb..bd5ebf93 100644 --- a/v2rayN/v2rayN/Tool/FileManager.cs +++ b/v2rayN/v2rayN/Tool/FileManager.cs @@ -11,7 +11,7 @@ namespace v2rayN.Tool { try { - using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) fs.Write(content, 0, content.Length); return true; } @@ -24,20 +24,27 @@ namespace v2rayN.Tool public static void UncompressFile(string fileName, byte[] content) { - // Because the uncompressed size of the file is unknown, - // we are using an arbitrary buffer size. - byte[] buffer = new byte[4096]; - int n; - - using (var fs = File.Create(fileName)) - using (var input = new GZipStream(new MemoryStream(content), - CompressionMode.Decompress, false)) + try { - while ((n = input.Read(buffer, 0, buffer.Length)) > 0) + // Because the uncompressed size of the file is unknown, + // we are using an arbitrary buffer size. + byte[] buffer = new byte[4096]; + int n; + + using (FileStream fs = File.Create(fileName)) + using (GZipStream input = new GZipStream(new MemoryStream(content), + CompressionMode.Decompress, false)) { - fs.Write(buffer, 0, n); + while ((n = input.Read(buffer, 0, buffer.Length)) > 0) + { + fs.Write(buffer, 0, n); + } } } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } } public static string NonExclusiveReadAllText(string path) @@ -49,8 +56,8 @@ namespace v2rayN.Tool { try { - using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) - using (var sr = new StreamReader(fs, encoding)) + using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (StreamReader sr = new StreamReader(fs, encoding)) { return sr.ReadToEnd(); } @@ -61,5 +68,61 @@ namespace v2rayN.Tool throw ex; } } + public static bool ZipExtractToFile(string fileName) + { + try + { + using (ZipArchive archive = ZipFile.OpenRead(fileName)) + { + foreach (ZipArchiveEntry entry in archive.Entries) + { + if (entry.Length == 0) + { + continue; + } + try + { + entry.ExtractToFile(Utils.GetPath(entry.Name), true); + } + catch (IOException ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return false; + } + return true; + } + + public static bool ZipExtractToFullFile(string fileName) + { + try + { + using (ZipArchive archive = ZipFile.OpenRead(fileName)) + { + foreach (ZipArchiveEntry entry in archive.Entries) + { + if (entry.Length == 0) + continue; + + string entryOuputPath = Utils.GetPath(entry.FullName); + FileInfo fileInfo = new FileInfo(entryOuputPath); + fileInfo.Directory.Create(); + entry.ExtractToFile(entryOuputPath, true); + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return false; + } + return true; + } } } diff --git a/v2rayN/v2rayN/Tool/Job.cs b/v2rayN/v2rayN/Tool/Job.cs index 64415589..e2569b75 100644 --- a/v2rayN/v2rayN/Tool/Job.cs +++ b/v2rayN/v2rayN/Tool/Job.cs @@ -16,13 +16,13 @@ namespace v2rayN public Job() { handle = CreateJobObject(IntPtr.Zero, null); - var extendedInfoPtr = IntPtr.Zero; - var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION + IntPtr extendedInfoPtr = IntPtr.Zero; + JOBOBJECT_BASIC_LIMIT_INFORMATION info = new JOBOBJECT_BASIC_LIMIT_INFORMATION { LimitFlags = 0x2000 }; - var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION + JOBOBJECT_EXTENDED_LIMIT_INFORMATION extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION { BasicLimitInformation = info }; @@ -43,18 +43,17 @@ namespace v2rayN if (extendedInfoPtr != IntPtr.Zero) { Marshal.FreeHGlobal(extendedInfoPtr); - extendedInfoPtr = IntPtr.Zero; } } } public bool AddProcess(IntPtr processHandle) { - var succ = AssignProcessToJobObject(handle, processHandle); + bool succ = AssignProcessToJobObject(handle, processHandle); if (!succ) { - //Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); + Utils.SaveLog("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); } return succ; diff --git a/v2rayN/v2rayN/Tool/QueryableExtension.cs b/v2rayN/v2rayN/Tool/QueryableExtension.cs new file mode 100644 index 00000000..eefb04d2 --- /dev/null +++ b/v2rayN/v2rayN/Tool/QueryableExtension.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace v2rayN.Tool +{ + public static class QueryableExtension + { + public static IOrderedQueryable OrderBy(this IQueryable query, string propertyName) + { + return _OrderBy(query, propertyName, false); + } + public static IOrderedQueryable OrderByDescending(this IQueryable query, string propertyName) + { + return _OrderBy(query, propertyName, true); + } + + static IOrderedQueryable _OrderBy(IQueryable query, string propertyName, bool isDesc) + { + string methodname = (isDesc) ? "OrderByDescendingInternal" : "OrderByInternal"; + + var memberProp = typeof(T).GetProperty(propertyName); + + var method = typeof(QueryableExtension).GetMethod(methodname) + .MakeGenericMethod(typeof(T), memberProp.PropertyType); + + return (IOrderedQueryable)method.Invoke(null, new object[] { query, memberProp }); + } + public static IOrderedQueryable OrderByInternal(IQueryable query, PropertyInfo memberProperty) + {//public + return query.OrderBy(_GetLamba(memberProperty)); + } + public static IOrderedQueryable OrderByDescendingInternal(IQueryable query, PropertyInfo memberProperty) + {//public + return query.OrderByDescending(_GetLamba(memberProperty)); + } + static Expression> _GetLamba(PropertyInfo memberProperty) + { + if (memberProperty.PropertyType != typeof(TProp)) throw new Exception(); + + var thisArg = Expression.Parameter(typeof(T)); + var lamba = Expression.Lambda>(Expression.Property(thisArg, memberProperty), thisArg); + + return lamba; + } + } +} diff --git a/v2rayN/v2rayN/Tool/UI.cs b/v2rayN/v2rayN/Tool/UI.cs index 8225a291..f2cabf75 100644 --- a/v2rayN/v2rayN/Tool/UI.cs +++ b/v2rayN/v2rayN/Tool/UI.cs @@ -1,5 +1,4 @@ -using System.Globalization; -using System.Windows.Forms; +using System.Windows.Forms; namespace v2rayN { @@ -7,12 +6,20 @@ namespace v2rayN { public static void Show(string msg) { - MessageBox.Show(msg); + MessageBox.Show(msg, "v2rayN", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + public static void ShowWarning(string msg) + { + MessageBox.Show(msg, "v2rayN", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + public static void ShowError(string msg) + { + MessageBox.Show(msg, "v2rayN", MessageBoxButtons.OK, MessageBoxIcon.Error); } public static DialogResult ShowYesNo(string msg) { - return MessageBox.Show(msg, "YesNo", MessageBoxButtons.YesNo); + return MessageBox.Show(msg, "v2rayN", MessageBoxButtons.YesNo, MessageBoxIcon.Question); } //public static string GetResourseString(string key) diff --git a/v2rayN/v2rayN/Tool/UIRes.cs b/v2rayN/v2rayN/Tool/UIRes.cs index a6b455a9..f0660435 100644 --- a/v2rayN/v2rayN/Tool/UIRes.cs +++ b/v2rayN/v2rayN/Tool/UIRes.cs @@ -10,7 +10,7 @@ namespace v2rayN static string LoadString(ResourceManager resMgr, string key) { - var value = resMgr.GetString(key); + string value = resMgr.GetString(key); if (value == null) { throw new KeyNotFoundException($"key: {key}"); diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 46f1cec8..09c023de 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -39,7 +39,7 @@ namespace v2rayN try { - var assembly = Assembly.GetExecutingAssembly(); + Assembly assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream(res)) using (StreamReader reader = new StreamReader(stream)) { @@ -121,10 +121,10 @@ namespace v2rayN /// public static int ToJsonFile(Object obj, string filePath) { - int result = -1; + int result; try { - using (StreamWriter file = System.IO.File.CreateText(filePath)) + using (StreamWriter file = File.CreateText(filePath)) { //JsonSerializer serializer = new JsonSerializer(); JsonSerializer serializer = new JsonSerializer() { Formatting = Formatting.Indented }; @@ -155,7 +155,7 @@ namespace v2rayN { if (wrap) { - return string.Join(",\r\n", lst.ToArray()); + return string.Join("," + Environment.NewLine, lst.ToArray()); } else { @@ -176,7 +176,7 @@ namespace v2rayN { try { - str = str.Replace("\r\n", ""); + str = str.Replace(Environment.NewLine, ""); return new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); } catch @@ -194,7 +194,7 @@ namespace v2rayN { try { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); return Convert.ToBase64String(plainTextBytes); } catch (Exception ex) @@ -214,8 +214,8 @@ namespace v2rayN try { plainText = plainText.TrimEx() + .Replace(Environment.NewLine, "") .Replace("\n", "") - .Replace("\r\n", "") .Replace("\r", "") .Replace(" ", ""); @@ -272,27 +272,27 @@ namespace v2rayN /// 单位 public static void ToHumanReadable(ulong amount, out double result, out string unit) { - var factor = 1024u; - var KBs = amount / factor; + uint factor = 1024u; + ulong KBs = amount / factor; if (KBs > 0) { // multi KB - var MBs = KBs / factor; + ulong MBs = KBs / factor; if (MBs > 0) { // multi MB - var GBs = MBs / factor; + ulong GBs = MBs / factor; if (GBs > 0) { // multi GB - var TBs = GBs / factor; + /*ulong TBs = GBs / factor; if (TBs > 0) { // 你是魔鬼吗? 用这么多流量 result = TBs + GBs % factor / (factor + 0.0); unit = "TB"; return; - } + }*/ result = GBs + MBs % factor / (factor + 0.0); unit = "GB"; return; @@ -314,23 +314,39 @@ namespace v2rayN public static string HumanFy(ulong amount) { - double result; - string unit; - ToHumanReadable(amount, out result, out unit); - return $"{string.Format("{0:f1}", result)}{unit}"; + ToHumanReadable(amount, out double result, out string unit); + return $"{string.Format("{0:f1}", result)} {unit}"; } - public static void DedupServerList(List source, out List result) + public static void DedupServerList(List source, out List result, bool keepOlder) { - var list = new List(); - foreach (var item in source) + List list = new List(); + if (!keepOlder) source.Reverse(); // Remove the early items first + + bool _isAdded(Mode.VmessItem o, Mode.VmessItem n) { - if (!list.Exists(i => item.address == i.address && item.port == i.port && item.path == i.path)) + return o.configVersion == n.configVersion && + o.configType == n.configType && + o.address == n.address && + o.port == n.port && + o.id == n.id && + o.alterId == n.alterId && + o.security == n.security && + o.network == n.network && + o.headerType == n.headerType && + o.requestHost == n.requestHost && + o.path == n.path && + o.streamSecurity == n.streamSecurity; + // skip (will remove) different remarks + } + foreach (Mode.VmessItem item in source) + { + if (!list.Exists(i => _isAdded(i, item))) { list.Add(item); } } - + if (!keepOlder) list.Reverse(); result = list; } @@ -348,7 +364,7 @@ namespace v2rayN { try { - int var1 = Utils.ToInt(oText); + int var1 = ToInt(oText); return true; } catch @@ -392,7 +408,7 @@ namespace v2rayN //可能是CIDR if (ip.IndexOf(@"/") > 0) { - var cidr = ip.Split('/'); + string[] cidr = ip.Split('/'); if (cidr.Length == 2) { if (!IsNumberic(cidr[0])) @@ -469,24 +485,16 @@ namespace v2rayN /// /// /// - public static int SetAutoRun(bool run) + public static void SetAutoRun(bool run) { try { - if (run) - { - string exePath = GetExePath(); - RegWriteValue(autoRunRegPath, autoRunName, exePath); - } - else - { - RegWriteValue(autoRunRegPath, autoRunName, ""); - } + string exePath = GetExePath(); + RegWriteValue(autoRunRegPath, autoRunName, run ? exePath : ""); } catch { } - return 0; } /// @@ -497,7 +505,7 @@ namespace v2rayN { try { - var value = RegReadValue(autoRunRegPath, autoRunName, ""); + string value = RegReadValue(autoRunRegPath, autoRunName, ""); string exePath = GetExePath(); if (value?.Equals(exePath) == true) { @@ -517,7 +525,7 @@ namespace v2rayN public static string GetPath(string fileName) { string startupPath = StartupPath(); - if (Utils.IsNullOrEmpty(fileName)) + if (IsNullOrEmpty(fileName)) { return startupPath; } @@ -535,15 +543,7 @@ namespace v2rayN public static string StartupPath() { - try - { - string exePath = GetExePath(); - return exePath.Substring(0, exePath.LastIndexOf("\\", StringComparison.Ordinal)); - } - catch - { - return Application.StartupPath; - } + return Application.StartupPath; } public static string RegReadValue(string path, string name, string def) @@ -609,7 +609,7 @@ namespace v2rayN long roundtripTime = -1; try { - int timeout = 120; + int timeout = 30; int echoNum = 2; Ping pingSender = new Ping(); for (int i = 0; i < echoNum; i++) @@ -657,7 +657,14 @@ namespace v2rayN return lstIPAddress; } - + public static void SetSecurityProtocol() + { + ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 + | SecurityProtocolType.Tls + | SecurityProtocolType.Tls11 + | SecurityProtocolType.Tls12; + ServicePointManager.DefaultConnectionLimit = 256; + } #endregion #region 杂项 @@ -779,16 +786,13 @@ namespace v2rayN #region TempPath - private static string _tempPath = null; - // return path to store temporary files public static string GetTempPath() { - if (_tempPath == null) + string _tempPath = Path.Combine(StartupPath(), "v2ray_win_temp"); + if (!Directory.Exists(_tempPath)) { - Directory.CreateDirectory(Path.Combine(StartupPath(), "v2ray_win_temp")); - // don't use "/", it will fail when we call explorer /select xxx/ss_win_temp\xxx.log - _tempPath = Path.Combine(StartupPath(), "v2ray_win_temp"); + Directory.CreateDirectory(_tempPath); } return _tempPath; } @@ -796,31 +800,18 @@ namespace v2rayN public static string GetTempPath(string filename) { return Path.Combine(GetTempPath(), filename); - } - - public static void ClearTempPath() - { - //Directory.Delete(GetTempPath(), true); - //_tempPath = null; - } + } public static string UnGzip(byte[] buf) { - byte[] buffer = new byte[1024]; - int n; - using (MemoryStream sb = new MemoryStream()) + MemoryStream sb = new MemoryStream(); + using (GZipStream input = new GZipStream(new MemoryStream(buf), + CompressionMode.Decompress, + false)) { - using (GZipStream input = new GZipStream(new MemoryStream(buf), - CompressionMode.Decompress, - false)) - { - while ((n = input.Read(buffer, 0, buffer.Length)) > 0) - { - sb.Write(buffer, 0, n); - } - } - return System.Text.Encoding.UTF8.GetString(sb.ToArray()); + input.CopyTo(sb); } + return Encoding.UTF8.GetString(sb.ToArray()); } #endregion @@ -854,7 +845,7 @@ namespace v2rayN SwWrite.WriteLine(string.Format("{0}{1}[{2}]{3}", "--------------------------------", strTitle, DateTime.Now.ToString("HH:mm:ss"), "--------------------------------")); SwWrite.Write(strContent); - SwWrite.WriteLine("\r\n"); + SwWrite.WriteLine(Environment.NewLine); SwWrite.WriteLine(" "); SwWrite.Flush(); SwWrite.Close(); @@ -869,7 +860,6 @@ namespace v2rayN public static string ScanScreen() { - string ret = string.Empty; try { foreach (Screen screen in Screen.AllScreens) @@ -901,13 +891,13 @@ namespace v2rayN GraphicsUnit.Pixel); } - var source = new BitmapLuminanceSource(target); - var bitmap = new BinaryBitmap(new HybridBinarizer(source)); + BitmapLuminanceSource source = new BitmapLuminanceSource(target); + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); QRCodeReader reader = new QRCodeReader(); - var result = reader.decode(bitmap); + Result result = reader.decode(bitmap); if (result != null) { - ret = result.Text; + string ret = result.Text; return ret; } } diff --git a/v2rayN/v2rayN/packages.config b/v2rayN/v2rayN/packages.config deleted file mode 100644 index 7e993a0a..00000000 --- a/v2rayN/v2rayN/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index 302c50e0..d1f912ba 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -1,6 +1,5 @@  - Debug @@ -45,7 +44,7 @@ AnyCPU - pdbonly + none true bin\Release\ TRACE @@ -74,33 +73,14 @@ + + v2rayN.Program + + + true + - - False - LIB\Google.Protobuf.dll - False - - - False - LIB\Grpc.Core.dll - False - - - False - LIB\Grpc.Core.Api.dll - False - - - False - LIB\Newtonsoft.Json.dll - False - - - False - LIB\System.Buffers.dll - False - @@ -109,32 +89,21 @@ - - False - LIB\System.Memory.dll - False - - - False - LIB\System.Runtime.CompilerServices.Unsafe.dll - False - + + + - - False - LIB\zxing.dll - False - - - False - LIB\zxing.presentation.dll - False - + + Form + + + AddServer6Form.cs + Form @@ -144,6 +113,18 @@ Component + + Form + + + AddServer5Form.cs + + + Form + + + BaseServerForm.cs + Form @@ -187,15 +168,15 @@ - - Component + + @@ -231,7 +212,6 @@ - @@ -248,6 +228,7 @@ + @@ -256,6 +237,14 @@ AddServer2Form.cs Designer + + AddServer6Form.cs + Designer + + + AddServer6Form.cs + Designer + AddServer4Form.cs Designer @@ -268,10 +257,21 @@ AddServer3Form.cs Designer + + AddServer5Form.cs + Designer + + + AddServer5Form.cs + Designer + AddServerForm.cs Designer + + BaseServerForm.cs + MainForm.cs Designer @@ -289,6 +289,7 @@ SubSettingControl.cs + Designer SubSettingControl.cs @@ -331,7 +332,6 @@ Designer - SettingsSingleFileGenerator Settings.Designer.cs @@ -344,13 +344,11 @@ - - - - - + + + @@ -411,39 +409,43 @@ + - - - - - - - - - - + + + 3.11.4 + + + 2.27.0 + + + 2.27.0 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + 12.0.3 + + + 0.16.5 + + - - + copy /y $(SolutionDir)v2rayUpgrade\$(OutDir)* $(TargetDir) + +del $(TargetDir)*.xml $(TargetDir)*.so $(TargetDir)*.dylib +if not "$(ConfigurationName)" == "Debug" del $(TargetDir)*.pdb - - - 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {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 + + \ No newline at end of file diff --git a/v2rayN/v2rayUpgrade/Program.cs b/v2rayN/v2rayUpgrade/Program.cs new file mode 100644 index 00000000..f35e72a4 --- /dev/null +++ b/v2rayN/v2rayUpgrade/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Windows.Forms; + +namespace v2rayUpgrade +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main(string[] args) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm(args)); + } + } +} diff --git a/v2rayN/v2rayUpgrade/Properties/AssemblyInfo.cs b/v2rayN/v2rayUpgrade/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..b0e6d5c3 --- /dev/null +++ b/v2rayN/v2rayUpgrade/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("v2rayUpgrade")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("v2rayUpgrade")] +[assembly: AssemblyCopyright("Copyright © 2019-2020 (GPLv3)")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f82be52a-155c-492c-9e0a-1e917ec62c78")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyFileVersion("1.1.0.0")] diff --git a/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs b/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs new file mode 100644 index 00000000..5ad1ac66 --- /dev/null +++ b/v2rayN/v2rayUpgrade/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayUpgrade.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.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("v2rayUpgrade.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/v2rayN/v2rayUpgrade/Properties/Resources.resx b/v2rayN/v2rayUpgrade/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/v2rayN/v2rayUpgrade/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs b/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs new file mode 100644 index 00000000..5656cdc6 --- /dev/null +++ b/v2rayN/v2rayUpgrade/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayUpgrade.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/v2rayN/v2rayUpgrade/Properties/Settings.settings b/v2rayN/v2rayUpgrade/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/v2rayN/v2rayUpgrade/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj new file mode 100644 index 00000000..b7d6307f --- /dev/null +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj @@ -0,0 +1,88 @@ + + + + + Debug + AnyCPU + {F82BE52A-155C-492C-9E0A-1E917EC62C78} + WinExe + v2rayUpgrade + v2rayUpgrade + v4.6 + 512 + true + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + none + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + Form + + + MainForm.cs + + + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user new file mode 100644 index 00000000..60d6da27 --- /dev/null +++ b/v2rayN/v2rayUpgrade/v2rayUpgrade.csproj.user @@ -0,0 +1,6 @@ + + + + D:\Github\v2rayN\v2rayN\v2rayUpgrade\bin\Debug\v2ray-windows.zip + + \ No newline at end of file